You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dianshang-qianduan/.trae/skills/ink-training-theme/SKILL.md

290 lines
14 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
name: ink-training-theme
description: Apply ink-minimal style to student training pages (Vue 3 + Element Plus). Use when restyling student pages, sidebar el-menu, step tabs, buttons, tables, or type scale in this repo. Do not use for admin pages or business-logic changes.
---
# 墨黑极简 · 学生实训页设计规范
本技能用于把学生端实训页(`.student-training-shell` 体系)统一为当前已在
`src/views/foundation/new-product-survey.vue` 落地的「墨黑极简」风格:纯白画布、
墨黑主操作、中性灰层次、紧凑排版。该 Vue 文件是整体标准样例;**步骤导航**
以本规范「步骤导航:按钮切换风」一节为准(foundation 三页均已落地),
**左侧课程菜单**换肤见「侧边栏 el-menu 墨黑换肤」与「折叠把手」两节。
拿不准时先读这些文件。
## 边界
- 只动 template 结构与样式;script 业务逻辑(判题/保存/草稿/上传/接口)一律不碰。
- 仅作用于当前页根类,不得影响其他页面;不修改全局 `student-training.scss`。
- 表格类内容区不铺任何底色,对错只靠文字反馈,不靠行背景。
## 实施流程
1. 读目标页,确认根类(如 `.xxx-page.student-training-shell`)和现有 DOM。
2. 在页面 scoped 样式的根类块内定义全部令牌(见下),让所有
`var(--student-*)` 规则自动重着色,不要逐处打补丁。
3. 新增一个非 scoped `<style lang="scss">` 块,选择器全部以页面根类为锚:
- 覆盖祖先 `app-main` 画布背景(scoped 触及不到祖先);
- 重写步骤导航(全局规则带 `!important`,scoped 无法取胜,见步骤导航一节);
- 给子组件(AI 侧栏、工具栏等)换肤。
4. 按按钮四级层级、字号梯度、间距规则逐区收紧。
5. 完成后用 GetDiagnostics 校验,并全文搜索蓝色旧值确认无残留。
## 颜色令牌
在页面根类中定义:
```scss
.xxx-page {
/* 主色:墨黑 */
--student-accent: #1f2937;
--student-accent-deep: #111827;
--student-accent-light: #4b5563;
--student-accent-soft: #f3f4f6;
/* 不使用橙色点缀;需要强调时只用墨黑或语义红/绿 */
/* 语义色 */
--student-danger: #d9554c;
--student-success: #4a9d6e;
/* 三层次标识:石墨 / 青灰 / 灰紫(仅小色条,不做行底色) */
--student-layer-1: #374151;
--student-layer-2: #43a294;
--student-layer-3: #8b6fc0;
/* 结构色 */
--student-panel-border: #e5e7eb;
--student-card-bg: #ffffff;
--student-panel-bg: #fafbfc;
--student-text: #1f2937;
--student-text-secondary: #6b7280;
}
```
非 scoped 块中的画布与行高:
```scss
#app .studentLayout .app-main:has(.xxx-page) {
background: #ffffff !important; /* 纯白,无渐变 */
}
#app .studentLayout .app-main:has(.xxx-page) .xxx-page {
line-height: 1.55 !important; /* 全局为 1.8,本页收紧 */
}
```
## 字号层级(紧凑)
覆盖全局字号令牌,整体下调一档:
| 令牌 | 值 | 用途 |
|------|----|------|
| --student-fs-display | 17px | 页面主标题(700,行高 1.35) |
| --student-fs-h1 | 15px | 步骤大标题(700) |
| --student-fs-h2 | 14px | 面板/行标题(600) |
| --student-fs-h3 | 13px | 区块小标题 |
| --student-fs-body | 13px | 正文 |
| --student-fs-body-sm | 12px | 表格/次要文字 |
| --student-fs-caption | 11px | 标签/徽章 |
| --student-fs-button / -lg | 13px | 按钮文字 |
| --student-fs-data | 14px | 数字/成绩,配等宽字体 |
标题区三级关系:上方灰色宽字距小标签(11px,`#6b7280`,letter-spacing 0.12em,
无底色胶囊)→ 黑色步骤标题 → 灰色说明文字。禁止再用实底色 "STEP 01" 胶囊。
## 步骤导航:按钮切换风
每个步骤是一枚等宽分段按钮:白底灰边、圆角矩形,编号收成左侧小徽章;
当前步骤墨黑实底,切换感明确。已在 foundation 三页全部落地,DOM 结构
(`.step-indicator > .step-tab > .step-bar/.step-no/.step-name`)保持不变,
只换样式。
### 视觉规格
| 元素 | 规格 |
|------|------|
| `.step-indicator` | flex 水平居中,`align-items: stretch`,gap 10px;无 border/底色;margin `4px 0 20px` |
| `.step-tab` | `flex: 1 1 0`,max-width 220px;横向排列(徽章+名称)居中,gap 8px;min-height 42px;padding `8px 12px`;border `1px solid #e5e7eb`;radius 8px;白底;字 `#6b7280`、13px/600,名称允许换行 |
| `.step-bar` | `display: none`(按钮风不需要引导线) |
| `.step-no` | 22px 小徽章:radius 6px、`#f3f4f6` 底、等宽 12px/700;`::after` 圆点隐藏 |
| `.step-name` | `color: inherit` |
三态:
- **未到达**:白底灰边灰字;hover 边转 `#1f2937`、底 `#f9fafb`、字墨黑,
徽章变墨黑底白字。
- **已完成**:边 `#dce9e2`、字 `#374151`,徽章 12% 绿底 + `#3f8a5f` 字;
hover 边转绿、徽章变绿实底白字。
- **当前**:墨黑实底白字(边同色),徽章反转为白底黑字;hover 加深 `#111827`。
### 覆盖机制(不做这步,页面仍是浅蓝大胶囊)
全局 `student-training.scss` 对 `.student-training-shell .step-indicator` 与
`.step-tab` 全部以 `!important` 锁定浅蓝底(`#f0f6fd`)、全胶囊圆角、固定高度、
`white-space: nowrap`,并在 ≤1100px 用 `!important` 强制纵向堆叠。
**scoped 样式无论怎么写特异性都打不赢**(scoped 属性选择器不增加 id 级特异性)。
正确做法——规则放进页面**非 scoped** 块,选择器带 id 锚点且每条声明 `!important`:
```scss
#app .studentLayout section.app-main:has(.xxx-page) .step-indicator {
/* 容器 */ !important;
.step-tab {
/* 按钮 + 三态,全部 !important;推荐直接嵌套,减少重复书写 */
}
}
```
必须显式重置的全局残留:容器的 `padding / border / border-radius / background /
box-shadow`;tab 的 `min-height / height / padding / border / border-radius`。
窄屏在非 scoped 块自行处理,**不要**接受全局 1100px 纵向规则:
```scss
@media (max-width: 900px) {
#app …:has(.xxx-page) .step-indicator {
justify-content: flex-start;
overflow-x: auto; /* 横向滑动 */
}
#app …:has(.xxx-page) .step-tab { flex: 0 0 148px; max-width: none; }
}
```
## 侧边栏 el-menu 墨黑换肤
学生端左侧课程菜单使用 Element Plus `el-menu`(替代手写 nav)。
样例:`src/layout/components/Sidebar/index.vue` + `src/assets/styles/sidebar.scss`。
### 组件配置(script/template)
```html
<el-menu
class="student-course-menu"
mode="vertical"
:default-active="activeMenu"
:default-openeds="studentDefaultOpens"
:collapse="isCollapse"
:collapse-transition="false"
background-color="#ffffff"
text-color="#374151"
popper-class="student-menu-popper"
@select="handleStudentMenuSelect"
>
```
- 一级直跳用 `el-menu-item`;分组用 `el-sub-menu`;二级 `el-menu-item`,
无路径时 `:disabled="!child.path"`。
- **不要传 `active-text-color`**:会污染折叠弹出层(白底白字)。
- `default-openeds` 非受控:异步分组加载完成后,递增菜单的 `:key`
强制重建(项目内 `bumpStudentMenu()`),否则分组不展开。
### Element Plus 2.2.x 关键机制(踩坑点)
- EP 给 `el-sub-menu__title` 注入**内联 color**(取自 textColor prop)——
菜单文字色一律 `!important`,普通声明无效。
- 一级菜单自定义墨黑块:`#1f2937` 底白字 14px/600,hover `#111827`,
激活 `#111827` + 左 3px 白条;color/background 全部 `!important`。
- 二级菜单:hover `#f3f4f6`、激活墨黑底白字,**背景必须 `!important`**
(sidebar.scss 旧规则把二级项背景强制 transparent,白字会落白底像消失)。
- disabled 项:EP 默认 `opacity: .25`,覆写为 `opacity: 1` + 字色 `#c0c5cd`。
- 折叠态弹出层 **teleport 到 body**,脱离 sidebar 作用域——用全局非 scoped
样式按 `popper-class` 换肤:`.el-popper.student-menu-popper,
.el-menu--popup-container.student-menu-popper`(白底、10px 圆角、
`#e5e7eb` 边、6px padding;项常态 `#374151`,激活墨黑)。
- toggle collapse 后 EP 更新 DOM 类有约 **1 秒延迟**;自动化测试中切换后
先等待再读类,立即读到的是旧值。
## 折叠把手
折叠按钮不放在菜单右上角,而是贴侧边栏**右缘垂直居中**的极小竖条
(`.course-sidebar-toggle`,学生/教师共享块):
- `position: absolute; top: 50%; right: 0; transform: translateY(-50%)`;
14×44px;白底;`1px solid #e5e7eb`、`border-right: 0`;
圆角 `8px 0 0 8px`;箭头常态 `#9ca3af`;阴影 `-2px 0 6px rgba(17,24,39,.08)`。
- 默认展开显 `ArrowLeftBold`;`.sidebar-container.is-collapse` 下隐藏左箭头、
显 `ArrowRightBold`;hover/focus 墨黑底白箭头。图标 10px。
- **尺寸声明也要 `!important`**:旧深色/蓝色块选择器更长、特异性更高。
- SCSS 嵌套坑:`.sidebar-container.is-collapse …` 规则不能写在
`.sidebar-container { }` 块内部,否则编译出双容器
(`.sidebar-container .sidebar-container.is-collapse`)永不命中;
折叠态规则与 `.sidebar-container` 块**同级**书写。
## 按钮规范
扁平无渐变,强制 `text-shadow: none`;圆角矩形而非全胶囊。标准页有两个按钮位置,
规格不同,不要混用:
### 四级层级
1. **一级主操作**:墨黑实底 `#1f2937` 白字 + 中性柔影,hover `#111827`。
用于下一步/提交任务/AI 发送/智能评分。
2. **二级描边**:白底 + 描边 + `#1f2937` 字,hover 墨黑描边 + `#f3f4f6` 底。
用于上一步/下载/重新实训/导出/清空。
3. **三级浅灰底**:`#f3f4f6` 底 + `#374151` 字,hover `#e9ecef`。用于保存草稿。
4. **危险文字**:无底色,`#d9554c` 文字链接,hover 深红加下划线。用于删除。
禁用态统一 `opacity: 0.5` + `not-allowed`,`transform: none`、去掉阴影,形状不跳变。
loading 态保持原配色。
### 位置 A:底部步骤导航(40px 标准按钮)
结构(原生 `<button>`,容器 `.step-navigation` 居中 flex,gap 14px):
```html
<div class="step-navigation">
<button class="btn-nav btn-ghost" @click="prevStep"><el-icon><ArrowLeft /></el-icon>上一步</button>
<button class="btn-nav btn-save" @click="saveCurrentProgress"><el-icon><CircleCheck /></el-icon>保存当前进度</button>
<button class="btn-nav btn-primary" @click="nextStep">下一步<el-icon><ArrowRight /></el-icon></button>
<span class="step-progress">Step 01 / 04</span>
</div>
```
- 三按钮统一 **40px 高、10px 圆角、700 字重、13px 字、gap 8px**;
ghost/primary 横向 padding 18px(primary 可 22px)。
- 次按钮基类(`.outline-action, .btn-nav` 共用):白底,描边
`1px solid rgba(31, 41, 55, 0.4)`,字色 `var(--student-accent)`。
- hover:`translateY(-1px)` + 描边变实色墨黑 + 底变 `var(--student-accent-soft)`
+ 阴影 `0 3px 10px rgba(31,41,55,.12)`;active 回落 `translateY(0)`。
- primary:墨黑实底 + 阴影 `0 3px 10px rgba(31,41,55,.28)`,hover 加深为
`#111827`、阴影 `0 5px 14px rgba(31,41,55,.32)`。
- save:`#f3f4f6` 底、`#e5e7eb` 描边、`#374151` 字,无重投影;视觉权重
低于 ghost,形成 实底黑 > 描边白 > 浅灰底 的层级。
- `.step-progress`:绝对定位右侧,12px 等宽数字、`#6b7280`、800 字重;
≤1100px 时改为静态独占一行居中。
- ≤900px:导航纵向排列,`.btn-nav` 全部 `width: 100%`。
### 位置 B:顶部任务工具栏(36px 紧凑小按钮)
工具栏是子组件(Element Plus `.el-button`),在页面非 scoped 块中以页面根类为锚
换肤(如 `.xxx-page .task-toolbar-button.el-button`),容器 gap 8px:
- 次按钮(下载案例资料/重新实训/导出实训成果):**36px 高、8px 圆角、600 字重、
13px 字**,白底 + `#d1d5db` 描边 + `#374151` 字;hover 描边和字变 `#1f2937`、
底 `#f9fafb`、阴影 `0 2px 6px rgba(17,24,39,.1)`。图标 14px 且 `color: inherit`。
- 提交按钮(`.task-toolbar-button--submit`):墨黑实底白字 +
`0 2px 8px rgba(17,24,39,.22)`,hover `#111827` + 阴影加深。
- loading 态强制保持白底灰描边,不随 Element Plus 默认变蓝。
- 无资料时的 plain 态:字色 `#9ca3af`,hover 只到 `#6b7280` + `#f9fafb`。
- 步骤标题行内的小号导出按钮可再缩到 32px 高、12px 字。
## 表格规则
- 表头、单元格、外容器一律不设 background(默认透明白),包括 hover、选中、判题后。
- 表头仅用 12–13px、800–900 字重,无渐变底。
- 只保留 `#e5e7eb` 浅灰边框与行间分隔线。
- 序号用 22px 浅灰圆角方块(`#f3f4f6`)+ 等宽数字。
- 判题结果:单元格内文字反馈(绿/红)+ 底部汇总横幅(8–10px 圆角、8% 同色底)。
- 三层次概念仅靠维度名前 3–4px 小色条标识。
## 间距(紧凑)
- 主列 gap 10px;卡片内 padding 12px;字段组 padding 12px。
- 步骤标题下 10px、说明下 14px、字段块间 12px、表格上 14px。
- 行高:页面 1.55,标题 1.35,说明 1.6,表格次要文字 1.55。
## 子组件换肤要点
- AI 侧栏面板、气泡、输入框、发送按钮全部中性灰白;其内部 Element Plus
主色按钮通过覆盖组件内 CSS 变量或 `.el-button--primary` 改墨黑。
- 工具栏 `TrainingTaskToolbar` / `TrainingMaterialButton` 按「按钮规范 · 位置 B」
换肤;提交按钮保留墨黑实底作为主操作。
- Element Plus 单选:选中圆点 `#1f2937` 填充白勾,覆盖默认蓝;带边框单选项
选中墨黑描边黑字。下拉选中值用深色 + `-webkit-text-fill-color` 防透明。