@agile-team/wl-skills-ui 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/CHANGELOG.md +207 -0
  2. package/README.md +623 -0
  3. package/SKILL.md +632 -0
  4. package/bin/wl-ui.js +794 -0
  5. package/design/spec/color.md +41 -0
  6. package/design/spec/spacing.md +28 -0
  7. package/design/spec/typography.md +29 -0
  8. package/design/tokens/base.css +144 -0
  9. package/design/tokens/index.css +8 -0
  10. package/dist/ag-grid-override.scss +1 -0
  11. package/dist/element.scss +1 -0
  12. package/dist/index.scss +1 -0
  13. package/dist/portal.scss +1 -0
  14. package/dist/style-override.scss +1 -0
  15. package/dist/tokens.css +144 -0
  16. package/es/chunk-GBB7LDKQ.js +261 -0
  17. package/es/chunk-MDI2SCUP.js +281 -0
  18. package/es/chunk-QDTNMM7W.js +286 -0
  19. package/es/chunk-YLNAFAWE.js +233 -0
  20. package/es/common-preset.d.ts +38 -0
  21. package/es/common-preset.js +157 -0
  22. package/es/index.d.ts +32 -0
  23. package/es/index.js +1 -0
  24. package/es/presets/security.d.ts +16 -0
  25. package/es/presets/security.js +99 -0
  26. package/es/renderers-BFRSp2BH.d.ts +51 -0
  27. package/es/renderers-DMZbi_Gs.d.ts +51 -0
  28. package/es/renderers-DWhUlI2y.d.ts +47 -0
  29. package/es/types-04qLKHMt.d.ts +62 -0
  30. package/es/types-BrCPjAH6.d.ts +62 -0
  31. package/es/types-QZ1gy9KX.d.ts +63 -0
  32. package/examples/migration-operations-to-renderOps.md +107 -0
  33. package/examples/wk-exempt.example.json +30 -0
  34. package/mcp/server.js +394 -0
  35. package/package.json +130 -0
  36. package/reference/SelectPopupCom.vue +634 -0
  37. package/reference/ag-cell-renders.ts +644 -0
  38. package/reference/define-columns.ts +185 -0
  39. package/reference/jhlc.d.ts +1 -0
  40. package/scanner/coverage.mjs +287 -0
  41. package/scanner/exempt.mjs +127 -0
  42. package/scanner/fix.mjs +216 -0
  43. package/scanner/index.mjs +403 -0
  44. package/scanner/integration.mjs +155 -0
  45. package/scanner/report.mjs +459 -0
  46. package/scanner/rules/_shared.mjs +134 -0
  47. package/scanner/rules/button.mjs +97 -0
  48. package/scanner/rules/color.mjs +118 -0
  49. package/scanner/rules/componentFamily.mjs +184 -0
  50. package/scanner/rules/dialog.mjs +42 -0
  51. package/scanner/rules/form.mjs +86 -0
  52. package/scanner/rules/index.mjs +58 -0
  53. package/scanner/rules/table.mjs +170 -0
  54. package/scanner/rules/tag.mjs +245 -0
  55. package/scanner/snapshot.mjs +198 -0
  56. package/skills/_flows/full-audit.md +65 -0
  57. package/skills/_flows/legacy-skin-align.md +71 -0
  58. package/skills/_flows/new-project-init.md +80 -0
  59. package/skills/_flows/progressive-migrate.md +49 -0
  60. package/skills/_meta/_compat/README.md +47 -0
  61. package/skills/_meta/_compat/editors.json +76 -0
  62. package/skills/_meta/_compat/headers/agents.txt +7 -0
  63. package/skills/_meta/_compat/headers/claude-code.txt +7 -0
  64. package/skills/_meta/_compat/headers/cline.txt +7 -0
  65. package/skills/_meta/_compat/headers/cursor-mdc.txt +5 -0
  66. package/skills/_meta/_compat/headers/github-copilot.txt +5 -0
  67. package/skills/_meta/_compat/headers/kiro.txt +4 -0
  68. package/skills/_meta/_compat/headers/qoder.txt +4 -0
  69. package/skills/_meta/_compat/headers/trae.txt +3 -0
  70. package/skills/_meta/_compat/headers/windsurf.txt +5 -0
  71. package/skills/_meta/_detection.md +81 -0
  72. package/skills/_meta/_registry.md +96 -0
  73. package/skills/element/component-family/SKILL.md +71 -0
  74. package/skills/element/el-dialog/SKILL.md +124 -0
  75. package/skills/element/el-form/SKILL.md +84 -0
  76. package/skills/element/el-table/SKILL.md +86 -0
  77. package/skills/element/el-tag/SKILL.md +127 -0
  78. package/skills/layouts/detail-page/SKILL.md +99 -0
  79. package/skills/layouts/form-dialog/SKILL.md +128 -0
  80. package/skills/layouts/list-page/SKILL.md +111 -0
  81. package/skills/layouts/tree-list/SKILL.md +108 -0
  82. package/skills/ops/audit/SKILL.md +109 -0
  83. package/skills/ops/fix/SKILL.md +52 -0
  84. package/skills/ops/fix/USAGE.md +24 -0
  85. package/skills/ops/migrate/SKILL.md +157 -0
  86. package/skills/ops/scan/SKILL.md +71 -0
  87. package/skills/ops/scan/USAGE.md +16 -0
  88. package/skills/runtime/design-tokens/SKILL.md +88 -0
  89. package/skills/runtime/design-tokens/USAGE.md +19 -0
  90. package/skills/runtime/migration/SKILL.md +106 -0
  91. package/skills/runtime/migration/USAGE.md +34 -0
  92. package/skills/runtime/style-align/SKILL.md +124 -0
  93. package/skills/runtime/style-align/USAGE.md +52 -0
  94. package/skills/vendors/ag-grid/SKILL.md +94 -0
  95. package/skills/vendors/base-table/SKILL.md +57 -0
  96. package/skills/vendors/c-components/SKILL.md +36 -0
  97. package/skills/vendors/custom-wrappers/SKILL.md +45 -0
  98. package/skills/vendors/jh-components/SKILL.md +42 -0
  99. package/skills/vendors/unknown-wrapper/SKILL.md +44 -0
  100. package/standards/engineering/01-import-order.md +46 -0
  101. package/standards/engineering/02-naming.md +54 -0
  102. package/standards/engineering/03-scss-structure.md +59 -0
  103. package/standards/ui/01-table.md +111 -0
  104. package/standards/ui/02-button.md +83 -0
  105. package/standards/ui/03-form.md +118 -0
  106. package/standards/ui/04-tag-status.md +110 -0
  107. package/standards/ui/05-dialog-pagination.md +118 -0
  108. package/styles/element/_card.scss +26 -0
  109. package/styles/element/_descriptions.scss +22 -0
  110. package/styles/element/_dialog.scss +43 -0
  111. package/styles/element/_drawer.scss +22 -0
  112. package/styles/element/_feedback.scss +52 -0
  113. package/styles/element/_form.scss +22 -0
  114. package/styles/element/_navigation.scss +36 -0
  115. package/styles/element/_overlay.scss +32 -0
  116. package/styles/element/_pagination.scss +16 -0
  117. package/styles/element/_steps.scss +32 -0
  118. package/styles/element/_table.scss +13 -0
  119. package/styles/element/_tabs.scss +40 -0
  120. package/styles/element/_tree.scss +27 -0
  121. package/styles/element/_upload.scss +34 -0
  122. package/styles/element/index.scss +17 -0
  123. package/styles/index.scss +21 -0
  124. package/styles/layouts/_detail-page.scss +27 -0
  125. package/styles/layouts/_form-dialog.scss +19 -0
  126. package/styles/layouts/_list-page.scss +47 -0
  127. package/styles/layouts/_tree-list.scss +33 -0
  128. package/styles/layouts/index.scss +6 -0
  129. package/styles/presets/element-only.scss +6 -0
  130. package/styles/presets/full.scss +12 -0
  131. package/styles/presets/security.scss +37 -0
  132. package/styles/presets/skin.scss +14 -0
  133. package/styles/presets/tokens-only.scss +7 -0
  134. package/styles/tokens/index.scss +79 -0
  135. package/styles/vendors/_ag-grid.scss +273 -0
  136. package/styles/vendors/_base-components.scss +480 -0
  137. package/styles/vendors/_base-query-toolbar.scss +253 -0
  138. package/styles/vendors/_base-table.scss +41 -0
  139. package/styles/vendors/_c-components.scss +34 -0
  140. package/styles/vendors/_custom-wrappers.scss +30 -0
  141. package/styles/vendors/_jh-drag-col.scss +63 -0
  142. package/styles/vendors/_jh-pagination.scss +81 -0
  143. package/styles/vendors/_jh-tree.scss +196 -0
  144. package/styles/vendors/_portal.scss +114 -0
  145. package/styles/vendors/index.scss +17 -0
  146. package/templates/ag-grid-page/TPL-AG-GRID.md +76 -0
  147. package/templates/form-dialog/TPL-FORM-DIALOG.md +165 -0
  148. package/templates/list-page/TPL-LIST.md +139 -0
  149. package/templates/tree-list/TPL-TREE-LIST.md +176 -0
  150. package/templates/ui-optimization-report/TPL-UI-OPTIM-REPORT.md +343 -0
@@ -0,0 +1,110 @@
1
+ # 规范 04:状态标签(Tag / Status)
2
+
3
+ ## 基础颜色语义
4
+
5
+ | type | 颜色 | 适用语义 |
6
+ |-----------|--------|----------------------------------|
7
+ | `success` | 绿色 | 已完成、启用、已核实、已审批、正常 |
8
+ | `warning` | 橙色 | 临时、待处理、审批中、未完成 |
9
+ | `danger` | 红色 | 停用、驳回、作废、超期 |
10
+ | `info` | 灰色 | 未处理、未提交、初始状态 |
11
+ | `''` | 蓝色 | 一般状态、默认 |
12
+
13
+ ---
14
+
15
+ ## 渲染模式(推荐)
16
+
17
+ ```typescript
18
+ // ✅ 文件顶部定义映射表 + 渲染函数
19
+ import { h } from 'vue'
20
+ import { ElTag } from 'element-plus'
21
+
22
+ const STATUS_TAG_MAP: Record<string, { label: string; type: '' | 'success' | 'warning' | 'danger' | 'info' }> = {
23
+ '0': { label: '停用', type: 'danger' },
24
+ '1': { label: '启用', type: 'success' },
25
+ }
26
+
27
+ function renderStatusTag(val: string) {
28
+ const cfg = STATUS_TAG_MAP[String(val)]
29
+ // 注意:type 可能为空字符串,需用 undefined 判断
30
+ if (cfg === undefined) return ''
31
+ return h(ElTag, { type: cfg.type || undefined }, { default: () => cfg.label })
32
+ }
33
+ ```
34
+
35
+ ### 在 defineColumns 中使用
36
+
37
+ ```typescript
38
+ { field: 'enableStatus', headerName: '启用状态', pinned: 'right', defaultSlot: renderStatusTag }
39
+ ```
40
+
41
+ ### 在 el-table-column 中使用
42
+
43
+ ```vue
44
+ <el-table-column label="状态" align="center" fixed="right">
45
+ <template #default="{ row }">
46
+ <el-tag :type="STATUS_TAG_MAP[row.status]?.type">
47
+ {{ STATUS_TAG_MAP[row.status]?.label }}
48
+ </el-tag>
49
+ </template>
50
+ </el-table-column>
51
+ ```
52
+
53
+ ---
54
+
55
+ ## 分级标签(renderClassifyTag)
56
+
57
+ 用于隐患级别、检查级别等分级数据:
58
+
59
+ ```typescript
60
+ import { renderClassifyTag } from '@/components/ag-cell-renders'
61
+
62
+ const LEVEL_MAP = {
63
+ '1': { label: '一般', type: 'info' },
64
+ '2': { label: '较大', type: 'warning' },
65
+ '3': { label: '重大', type: 'danger' },
66
+ }
67
+
68
+ // defineColumns 中
69
+ { field: 'checkLevel', headerName: '隐患级别', defaultSlot: (val) => renderClassifyTag(val, LEVEL_MAP) }
70
+ ```
71
+
72
+ ---
73
+
74
+ ## 状态列固定右侧
75
+
76
+ 所有状态类列(启用/停用、审批状态、核实状态等)**必须** `fixed="right"` / `pinned: 'right'`:
77
+
78
+ ```vue
79
+ <!-- el-table -->
80
+ <el-table-column label="启用状态" align="center" fixed="right" width="90">
81
+
82
+ <!-- defineColumns -->
83
+ { field: 'enableStatus', headerName: '启用状态', pinned: 'right', width: 90 }
84
+ ```
85
+
86
+ ---
87
+
88
+ ## 常见状态枚举参考
89
+
90
+ ```typescript
91
+ // 审批状态
92
+ const APPROVAL_STATUS_MAP = {
93
+ '0': { label: '未提交', type: 'info' },
94
+ '1': { label: '审批中', type: 'warning' },
95
+ '2': { label: '已审批', type: 'success' },
96
+ '3': { label: '已驳回', type: 'danger' },
97
+ }
98
+
99
+ // 核实状态
100
+ const VERIFY_STATUS_MAP = {
101
+ '0': { label: '未核实', type: 'info' },
102
+ '1': { label: '已核实', type: 'success' },
103
+ }
104
+
105
+ // 启用状态
106
+ const ENABLE_STATUS_MAP = {
107
+ '0': { label: '停用', type: 'danger' },
108
+ '1': { label: '启用', type: 'success' },
109
+ }
110
+ ```
@@ -0,0 +1,118 @@
1
+ # 规范 05:弹窗内分页(Dialog + Pagination)
2
+
3
+ ## 核心原则
4
+
5
+ **分页必须放在内容区(content area),不得放在 `#footer` 插槽中。**
6
+
7
+ 原因:`el-pagination` 组件内部有 fixed/absolute 定位逻辑,放入 `#footer` 后会逃出弹窗容器,导致分页漂浮在页面底部。
8
+
9
+ ---
10
+
11
+ ## 正确布局(SelectPopupCom 标准)
12
+
13
+ ```vue
14
+ <el-dialog v-model="visible" width="80%" title="选择">
15
+ <el-row :gutter="8">
16
+ <!-- 主内容区:表格 + 分页 -->
17
+ <el-col :span="18">
18
+ <!-- 搜索区 -->
19
+ <div class="search-bar">...</div>
20
+
21
+ <!-- 表格 -->
22
+ <el-table :data="tableData" empty-text="暂无数据">
23
+ <el-table-column type="selection" width="55" align="center" />
24
+ <el-table-column type="index" label="序号" width="60" align="center" />
25
+ <!-- 数据列 -->
26
+ </el-table>
27
+
28
+ <!-- ✅ 分页:放在内容区,右对齐 -->
29
+ <div class="popup-pagination">
30
+ <el-pagination
31
+ v-model:current-page="page.current"
32
+ v-model:page-size="page.size"
33
+ :total="page.total"
34
+ layout="total, prev, pager, next"
35
+ background
36
+ small
37
+ />
38
+ </div>
39
+ </el-col>
40
+
41
+ <!-- 已选项区 -->
42
+ <el-col :span="6">
43
+ <div class="selected-panel">...</div>
44
+ </el-col>
45
+ </el-row>
46
+
47
+ <!-- ✅ footer:只放操作按钮,不放分页 -->
48
+ <template #footer>
49
+ <div class="dialog-footer">
50
+ <el-button @click="handleClose">取 消</el-button>
51
+ <el-button type="primary" @click="handleConfirm">确 认</el-button>
52
+ </div>
53
+ </template>
54
+ </el-dialog>
55
+ ```
56
+
57
+ ---
58
+
59
+ ## 必要 CSS
60
+
61
+ ```scss
62
+ // 分页右对齐
63
+ .popup-pagination {
64
+ display: flex;
65
+ justify-content: flex-end;
66
+ margin-top: 4px;
67
+ }
68
+
69
+ // footer 按钮右对齐(全局已有,参考 dist/style-override.scss)
70
+ .el-dialog__footer .dialog-footer {
71
+ display: flex;
72
+ justify-content: flex-end;
73
+ gap: 8px;
74
+ }
75
+ ```
76
+
77
+ ---
78
+
79
+ ## 规则 R011(scanner 检测)
80
+
81
+ scanner 会扫描 `#footer` 插槽中是否包含 `el-pagination`,若有则报 **error** 级别警告:
82
+
83
+ ```
84
+ R011 [error] el-pagination 位于 #footer 插槽中 — 请移至内容区域
85
+ ```
86
+
87
+ 修复方法:将 `<el-pagination>` 从 `<template #footer>` 中移出,放入 `el-col` 内容区,包裹在 `<div class="popup-pagination">` 中。
88
+
89
+ ---
90
+
91
+ ## 分页常用配置
92
+
93
+ ```vue
94
+ <!-- 标准小型分页(弹窗内) -->
95
+ <el-pagination
96
+ v-model:current-page="page.current"
97
+ v-model:page-size="page.size"
98
+ :total="page.total"
99
+ :page-sizes="[10, 20, 50]"
100
+ layout="total, sizes, prev, pager, next"
101
+ background
102
+ small
103
+ @size-change="handleSizeChange"
104
+ @current-change="handlePageChange"
105
+ />
106
+
107
+ <!-- 标准普通分页(列表页底部) -->
108
+ <el-pagination
109
+ v-model:current-page="page.current"
110
+ v-model:page-size="page.size"
111
+ :total="page.total"
112
+ :page-sizes="[20, 50, 100]"
113
+ layout="total, sizes, prev, pager, next, jumper"
114
+ background
115
+ @size-change="handleSizeChange"
116
+ @current-change="handlePageChange"
117
+ />
118
+ ```
@@ -0,0 +1,26 @@
1
+ html body .el-card {
2
+ border-color: var(--el-border-color-light);
3
+ border-radius: 10px;
4
+ box-shadow: var(--el-box-shadow);
5
+ overflow: hidden;
6
+
7
+ .el-card__header {
8
+ min-height: 44px;
9
+ padding: 12px 16px;
10
+ color: var(--el-text-color-primary);
11
+ font-weight: var(--el-font-weight-medium);
12
+ background: var(--el-fill-color-blank);
13
+ border-bottom-color: var(--el-border-color-light);
14
+ }
15
+
16
+ .el-card__body {
17
+ padding: 16px;
18
+ color: var(--el-text-color-regular);
19
+ }
20
+
21
+ &.is-always-shadow,
22
+ &.is-hover-shadow:focus,
23
+ &.is-hover-shadow:hover {
24
+ box-shadow: var(--el-box-shadow-light);
25
+ }
26
+ }
@@ -0,0 +1,22 @@
1
+ html body .el-descriptions {
2
+ .el-descriptions__title {
3
+ color: var(--el-text-color-primary);
4
+ font-size: var(--el-font-size-medium);
5
+ font-weight: var(--el-font-weight-medium);
6
+ }
7
+
8
+ .el-descriptions__label.el-descriptions__cell.is-bordered-label,
9
+ .el-descriptions__label:not(.is-bordered-label) {
10
+ color: var(--el-text-color-regular);
11
+ font-weight: var(--el-font-weight-medium);
12
+ background: var(--el-fill-color-lighter);
13
+ }
14
+
15
+ .el-descriptions__content {
16
+ color: var(--el-text-color-primary);
17
+ }
18
+
19
+ .el-descriptions__table.is-bordered .el-descriptions__cell {
20
+ border-color: var(--el-border-color-light);
21
+ }
22
+ }
@@ -0,0 +1,43 @@
1
+ // styles/element/_dialog.scss — el-dialog / el-message-box 覆盖
2
+
3
+ .el-message-box .el-message-box__status {
4
+ top: 12px !important;
5
+ }
6
+
7
+ // jh-ui dialog.scss 标题色为硬编码 #262626,覆盖为 Token
8
+ html .el-dialog__title {
9
+ color: var(--el-text-color-primary);
10
+ }
11
+
12
+ // EP 原生 fullscreen prop 场景:全屏与关闭两个 headerbtn 间距收紧
13
+ // 注:自定义全屏图标(.dialog-fullscreen-action)不受此影响
14
+ .el-dialog__headerbtn {
15
+ right: 8px;
16
+ }
17
+ .el-dialog__headerbtn + .el-dialog__headerbtn {
18
+ right: 30px;
19
+ }
20
+
21
+ // jh-dialog / @jhlc/common-core DialogComponent 全屏图标
22
+ // 紧贴 EP 关闭按钮左侧,svg-icon 14px 与其视觉大小匹配
23
+ .dialog-header-fullscreen-icon {
24
+ position: absolute !important;
25
+ top: 16px !important;
26
+ right: 44px !important;
27
+ display: flex !important;
28
+ align-items: center !important;
29
+ cursor: pointer !important;
30
+ z-index: 10 !important;
31
+ color: var(--el-color-info);
32
+ transition: color 0.2s;
33
+
34
+ &:hover {
35
+ color: var(--el-color-primary);
36
+ }
37
+
38
+ .svg-icon {
39
+ font-size: 12px !important;
40
+ width: 1em !important;
41
+ height: 1em !important;
42
+ }
43
+ }
@@ -0,0 +1,22 @@
1
+ html body .el-drawer {
2
+ background: var(--el-fill-color-blank);
3
+
4
+ .el-drawer__header {
5
+ min-height: 48px;
6
+ padding: 14px 16px;
7
+ margin-bottom: 0;
8
+ color: var(--el-text-color-primary);
9
+ font-weight: var(--el-font-weight-medium);
10
+ border-bottom: 1px solid var(--el-border-color-light);
11
+ }
12
+
13
+ .el-drawer__body {
14
+ padding: 16px;
15
+ color: var(--el-text-color-regular);
16
+ }
17
+
18
+ .el-drawer__footer {
19
+ padding: 12px 16px;
20
+ border-top: 1px solid var(--el-border-color-light);
21
+ }
22
+ }
@@ -0,0 +1,52 @@
1
+ html body .el-empty {
2
+ --el-empty-padding: 32px 0;
3
+
4
+ .el-empty__description p {
5
+ color: var(--el-text-color-secondary);
6
+ font-size: var(--el-font-size-base);
7
+ }
8
+
9
+ .el-empty__bottom {
10
+ margin-top: 12px;
11
+ }
12
+ }
13
+
14
+ html body .el-alert {
15
+ border-radius: 8px;
16
+
17
+ .el-alert__title {
18
+ font-weight: var(--el-font-weight-medium);
19
+ }
20
+
21
+ .el-alert__description {
22
+ color: var(--el-text-color-regular);
23
+ }
24
+ }
25
+
26
+ html body .el-badge {
27
+ .el-badge__content {
28
+ border-color: var(--el-fill-color-blank);
29
+ box-shadow: var(--el-box-shadow);
30
+ }
31
+ }
32
+
33
+ html body .el-result {
34
+ .el-result__title p {
35
+ color: var(--el-text-color-primary);
36
+ font-weight: var(--el-font-weight-medium);
37
+ }
38
+
39
+ .el-result__subtitle p {
40
+ color: var(--el-text-color-secondary);
41
+ }
42
+ }
43
+
44
+ html body .el-timeline {
45
+ .el-timeline-item__timestamp {
46
+ color: var(--el-text-color-secondary);
47
+ }
48
+
49
+ .el-timeline-item__content {
50
+ color: var(--el-text-color-regular);
51
+ }
52
+ }
@@ -0,0 +1,22 @@
1
+ // styles/element/_form.scss — el-form / el-input 覆盖
2
+
3
+ .el-form-item--small {
4
+ margin-bottom: 8px;
5
+ }
6
+
7
+ // 解决 el-form-item 出现错误提示时底部 margin 增加的问题
8
+ .is-error.el-form-item--small {
9
+ margin-bottom: 18px !important;
10
+ }
11
+
12
+ // ── 全局输入框圆角统一(6px,与搜索区保持一致)──────────────────────────────
13
+ .el-input__wrapper {
14
+ border-radius: 6px;
15
+ }
16
+ .el-select .el-select__wrapper {
17
+ border-radius: 6px;
18
+ }
19
+ .el-date-editor.el-input__wrapper,
20
+ .el-date-editor .el-input__wrapper {
21
+ border-radius: 6px;
22
+ }
@@ -0,0 +1,36 @@
1
+ html body .el-breadcrumb {
2
+ .el-breadcrumb__inner,
3
+ .el-breadcrumb__separator {
4
+ color: var(--el-text-color-secondary);
5
+ }
6
+
7
+ .el-breadcrumb__inner.is-link,
8
+ .el-breadcrumb__inner a {
9
+ color: var(--el-text-color-regular);
10
+ font-weight: var(--el-font-weight-regular);
11
+ }
12
+
13
+ .el-breadcrumb__inner.is-link:hover,
14
+ .el-breadcrumb__inner a:hover {
15
+ color: var(--el-color-primary);
16
+ }
17
+ }
18
+
19
+ html body .el-menu {
20
+ border-right-color: var(--el-border-color-light);
21
+
22
+ .el-menu-item,
23
+ .el-sub-menu__title {
24
+ height: var(--el-menu-item-height, 40px);
25
+ line-height: var(--el-menu-item-height, 40px);
26
+ color: var(--el-text-color-regular);
27
+ font-size: var(--el-menu-item-font-size, 14px);
28
+ }
29
+
30
+ .el-menu-item.is-active,
31
+ .el-menu-item:hover,
32
+ .el-sub-menu__title:hover {
33
+ color: var(--el-color-primary);
34
+ background: var(--el-color-primary-light-9);
35
+ }
36
+ }
@@ -0,0 +1,32 @@
1
+ html body .el-popper,
2
+ html body .el-popover,
3
+ html body .el-tooltip__popper,
4
+ html body .el-dropdown__popper {
5
+ border-color: var(--el-border-color-light);
6
+ border-radius: 8px;
7
+ box-shadow: var(--el-box-shadow-light);
8
+ }
9
+
10
+ html body .el-popover {
11
+ color: var(--el-text-color-regular);
12
+ }
13
+
14
+ html body .el-dropdown-menu {
15
+ padding: 6px;
16
+
17
+ .el-dropdown-menu__item {
18
+ min-height: 32px;
19
+ border-radius: 6px;
20
+ color: var(--el-text-color-regular);
21
+ }
22
+
23
+ .el-dropdown-menu__item:not(.is-disabled):focus,
24
+ .el-dropdown-menu__item:not(.is-disabled):hover {
25
+ color: var(--el-color-primary);
26
+ background: var(--el-color-primary-light-9);
27
+ }
28
+
29
+ .el-dropdown-menu__item.is-disabled {
30
+ color: var(--el-text-color-disabled);
31
+ }
32
+ }
@@ -0,0 +1,16 @@
1
+ // styles/element/_pagination.scss — el-pagination 精致化覆盖
2
+
3
+ .el-pagination {
4
+ --el-pagination-button-width: 24px;
5
+ --el-pagination-button-height: 24px;
6
+ --el-pagination-button-font-size: 12px;
7
+
8
+ .el-input__wrapper {
9
+ height: 24px;
10
+ }
11
+
12
+ // jh-ui pagination.scss 中激活页码边框为硬编码色,此处用变量覆盖
13
+ .el-pager li.is-active {
14
+ border-color: var(--el-color-primary) !important;
15
+ }
16
+ }
@@ -0,0 +1,32 @@
1
+ html body .el-steps {
2
+ .el-step__title {
3
+ color: var(--el-text-color-regular);
4
+ font-weight: var(--el-font-weight-medium);
5
+ }
6
+
7
+ .el-step__description {
8
+ color: var(--el-text-color-secondary);
9
+ }
10
+
11
+ .el-step__head.is-process,
12
+ .el-step__title.is-process {
13
+ color: var(--el-color-primary);
14
+ border-color: var(--el-color-primary);
15
+ }
16
+
17
+ .el-step__head.is-success,
18
+ .el-step__title.is-success {
19
+ color: var(--el-color-success);
20
+ border-color: var(--el-color-success);
21
+ }
22
+
23
+ .el-step__head.is-error,
24
+ .el-step__title.is-error {
25
+ color: var(--el-color-danger);
26
+ border-color: var(--el-color-danger);
27
+ }
28
+
29
+ .el-step__line {
30
+ background-color: var(--el-border-color-light);
31
+ }
32
+ }
@@ -0,0 +1,13 @@
1
+ // styles/element/_table.scss — el-table 表头颜色覆盖
2
+ // jh-ui table.scss 表头颜色为硬编码,此处用 CSS 变量覆盖
3
+
4
+ html .el-table {
5
+ .el-table__header-wrapper th,
6
+ .el-table__fixed-header-wrapper th {
7
+ color: var(--el-text-color-primary);
8
+ background: var(--el-fill-color-lighter);
9
+ }
10
+ .el-table__header tr {
11
+ --el-table-tr-bg-color: var(--el-fill-color-lighter);
12
+ }
13
+ }
@@ -0,0 +1,40 @@
1
+ html body .el-tabs {
2
+ --el-tabs-header-height: 40px;
3
+
4
+ .el-tabs__header {
5
+ margin-bottom: 12px;
6
+ }
7
+
8
+ .el-tabs__nav-wrap::after {
9
+ height: 1px;
10
+ background-color: var(--el-border-color-light);
11
+ }
12
+
13
+ .el-tabs__item {
14
+ color: var(--el-text-color-regular);
15
+ font-weight: var(--el-font-weight-regular);
16
+ }
17
+
18
+ .el-tabs__item.is-active,
19
+ .el-tabs__item:hover {
20
+ color: var(--el-color-primary);
21
+ }
22
+
23
+ .el-tabs__active-bar {
24
+ height: 2px;
25
+ border-radius: 2px;
26
+ background-color: var(--el-color-primary);
27
+ }
28
+
29
+ &.el-tabs--border-card {
30
+ border-color: var(--el-border-color-light);
31
+ border-radius: 10px;
32
+ box-shadow: var(--el-box-shadow);
33
+ overflow: hidden;
34
+
35
+ > .el-tabs__header {
36
+ background-color: var(--el-fill-color-lighter);
37
+ border-bottom-color: var(--el-border-color-light);
38
+ }
39
+ }
40
+ }
@@ -0,0 +1,27 @@
1
+ html body .el-tree {
2
+ --el-tree-node-hover-bg-color: var(--el-color-primary-light-9);
3
+ color: var(--el-text-color-regular);
4
+ background: transparent;
5
+
6
+ .el-tree-node__content {
7
+ min-height: 32px;
8
+ border-radius: 6px;
9
+ transition: background-color 0.2s, color 0.2s;
10
+ }
11
+
12
+ .el-tree-node__content:hover,
13
+ .el-tree-node:focus > .el-tree-node__content {
14
+ color: var(--el-color-primary);
15
+ background: var(--el-color-primary-light-9);
16
+ }
17
+
18
+ .el-tree-node.is-current > .el-tree-node__content {
19
+ color: var(--el-color-primary);
20
+ font-weight: var(--el-font-weight-medium);
21
+ background: var(--el-color-primary-light-9);
22
+ }
23
+
24
+ .el-tree-node__expand-icon {
25
+ color: var(--el-text-color-secondary);
26
+ }
27
+ }
@@ -0,0 +1,34 @@
1
+ html body .el-upload {
2
+ .el-upload-dragger {
3
+ border-color: var(--el-border-color);
4
+ border-radius: 10px;
5
+ background: var(--el-fill-color-light);
6
+ transition: border-color 0.2s, background-color 0.2s;
7
+ }
8
+
9
+ .el-upload-dragger:hover,
10
+ .el-upload-dragger.is-dragover {
11
+ border-color: var(--el-color-primary);
12
+ background: var(--el-color-primary-light-9);
13
+ }
14
+
15
+ .el-upload__tip {
16
+ color: var(--el-text-color-secondary);
17
+ font-size: var(--el-font-size-small);
18
+ }
19
+ }
20
+
21
+ html body .el-upload-list {
22
+ .el-upload-list__item {
23
+ border-radius: 6px;
24
+ transition: background-color 0.2s;
25
+ }
26
+
27
+ .el-upload-list__item:hover {
28
+ background: var(--el-fill-color-lighter);
29
+ }
30
+
31
+ .el-upload-list__item-name {
32
+ color: var(--el-text-color-regular);
33
+ }
34
+ }
@@ -0,0 +1,17 @@
1
+ // styles/element/index.scss — Element Plus 覆盖层汇总
2
+ // 前置:design/tokens/base.css 必须最先在 index.html 中加载
3
+
4
+ @forward './pagination';
5
+ @forward './form';
6
+ @forward './table';
7
+ @forward './dialog';
8
+ @forward './card';
9
+ @forward './tabs';
10
+ @forward './descriptions';
11
+ @forward './tree';
12
+ @forward './drawer';
13
+ @forward './upload';
14
+ @forward './steps';
15
+ @forward './overlay';
16
+ @forward './navigation';
17
+ @forward './feedback';