@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,480 @@
1
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
2
+ // 通用组件样式 — wl-ui-safe 统一设计规范
3
+ // 包含:操作按钮组、状态标签、徽标、兼容旧按钮
4
+ // 适用:所有 AG Grid 单元格内的交互组件
5
+ // 维护:只改这一个文件,全项目生效
6
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
7
+
8
+ // ── 操作列图标按钮组 ──────────────────────────────────────────────────────────
9
+ // 用法(Vue h 函数):
10
+ // import { renderOps } from '@/util/ag-cell-renders';
11
+ // defaultSlot: ({ row }) => renderOps([
12
+ // { type: 'view', onClick: () => modal.open(row.id, 'view') },
13
+ // { type: 'edit', onClick: () => modal.open(row.id, 'edit') },
14
+ // { type: 'del', onClick: () => handleDel(row.id) },
15
+ // { type: 'chip', label: '流程', onClick: () => showLog(row) },
16
+ // { type: 'link', label: '维护排查标准', onClick: () => openStd(row) },
17
+ // ])
18
+ .jh-op-group {
19
+ display: flex;
20
+ gap: 4px; // 宽松 4px,不紧凑
21
+ align-items: center;
22
+ justify-content: center;
23
+ flex-wrap: nowrap;
24
+ }
25
+
26
+ // ── 第一层:纯图标按钮(26×26px,hover 变语义色)──────────────────────────
27
+ .jh-op-btn {
28
+ width: 26px;
29
+ height: 26px;
30
+ padding: 0;
31
+ display: inline-flex;
32
+ align-items: center;
33
+ justify-content: center;
34
+ border-radius: 5px;
35
+ cursor: pointer;
36
+ outline: none;
37
+ border: none;
38
+ background: transparent;
39
+ transition: background-color 0.13s ease, color 0.13s ease;
40
+ flex-shrink: 0;
41
+
42
+ svg { width: 14px; height: 14px; }
43
+ &:active { opacity: 0.6; transform: scale(0.92); }
44
+
45
+ // 查看 — hover 蓝
46
+ &.jh-op-view {
47
+ color: #C0C4CC;
48
+ &:hover {
49
+ color: var(--el-color-primary);
50
+ background: rgba(34, 84, 244, 0.09);
51
+ }
52
+ }
53
+ // 编辑 — hover 翠绿
54
+ &.jh-op-edit {
55
+ color: #C0C4CC;
56
+ &:hover {
57
+ color: var(--el-color-success);
58
+ background: rgba(43, 178, 104, 0.09);
59
+ }
60
+ }
61
+ // 删除/作废 — hover 红
62
+ &.jh-op-del {
63
+ color: #C0C4CC;
64
+ &:hover {
65
+ color: var(--el-color-danger);
66
+ background: rgba(187, 45, 63, 0.09);
67
+ }
68
+ }
69
+ // 记录 — hover 靛蓝
70
+ &.jh-op-log {
71
+ color: #C0C4CC;
72
+ &:hover {
73
+ color: var(--el-color-primary);
74
+ background: rgba(34, 84, 244, 0.09);
75
+ }
76
+ }
77
+ // 审核 — hover 翠绿
78
+ &.jh-op-ok {
79
+ color: #C0C4CC;
80
+ &:hover {
81
+ color: var(--el-color-success);
82
+ background: rgba(43, 178, 104, 0.09);
83
+ }
84
+ }
85
+ // 提交 — hover 主色
86
+ &.jh-op-send {
87
+ color: #C0C4CC;
88
+ &:hover {
89
+ color: var(--el-color-primary, #2254f4);
90
+ background: rgba(34, 84, 244, 0.09);
91
+ }
92
+ }
93
+ // 保存(内联表格用)— hover 翠绿
94
+ &.jh-op-save {
95
+ color: #C0C4CC;
96
+ &:hover {
97
+ color: var(--el-color-success);
98
+ background: rgba(43, 178, 104, 0.09);
99
+ }
100
+ &:disabled { opacity: 0.45; cursor: not-allowed; }
101
+ }
102
+ // 取消(内联表格用)— hover 中灰
103
+ &.jh-op-cancel {
104
+ color: #C0C4CC;
105
+ &:hover { color: #6B7280; background: rgba(107, 114, 128, 0.10); }
106
+ }
107
+ }
108
+
109
+ // ── 竖分隔线(图标组与文字组之间)────────────────────────────────────────────
110
+ .jh-op-sep {
111
+ display: inline-block;
112
+ width: 1px;
113
+ height: 14px;
114
+ background: rgba(0, 0, 0, 0.10);
115
+ flex-shrink: 0;
116
+ margin: 0 1px;
117
+ }
118
+
119
+ // ── 第二层:胶囊按钮(图标+短文字,圆角胶囊,半通用操作)────────────────────
120
+ // 视觉:极轻灰底 → hover 淡蓝底+主色文字,圆润胶囊感
121
+ .jh-op-chip {
122
+ display: inline-flex;
123
+ align-items: center;
124
+ gap: 3px;
125
+ height: 22px;
126
+ padding: 0 8px 0 6px;
127
+ border-radius: 99px;
128
+ border: none;
129
+ background: rgba(0, 0, 0, 0.04);
130
+ color: #6B7280;
131
+ font-size: 11.5px;
132
+ font-weight: 500;
133
+ cursor: pointer;
134
+ outline: none;
135
+ white-space: nowrap;
136
+ transition: background 0.13s, color 0.13s;
137
+ flex-shrink: 0;
138
+
139
+ svg { width: 12px; height: 12px; flex-shrink: 0; }
140
+ &:hover {
141
+ background: rgba(34, 84, 244, 0.10);
142
+ color: var(--el-color-primary, #2254f4);
143
+ }
144
+ &:active { opacity: 0.65; transform: scale(0.96); }
145
+ }
146
+
147
+ // ── 第三层:文字按钮(业务专属长名称)────────────────────────────────────────
148
+ // 设计原则:纯文字链接风格,无边框无背景,靠颜色区分"动作"和"状态标签"
149
+ // 状态标签 = 有颜色填充的矩形框;动作按钮 = 只有颜色的文字(点击语义)
150
+ // 参考:Ant Design Button type="link"、GitHub table inline action
151
+ .jh-op-link {
152
+ display: inline-flex;
153
+ align-items: center;
154
+ height: 22px;
155
+ padding: 0 6px;
156
+ border-radius: 4px;
157
+ border: none;
158
+ background: transparent;
159
+ color: var(--el-color-primary, #2254f4);
160
+ font-size: 12px;
161
+ font-weight: 500;
162
+ cursor: pointer;
163
+ outline: none;
164
+ white-space: nowrap;
165
+ letter-spacing: 0.01em;
166
+ transition: background 0.13s, color 0.13s;
167
+ flex-shrink: 0;
168
+
169
+ &:hover {
170
+ background: rgba(34, 84, 244, 0.08);
171
+ color: var(--el-color-primary, #2254f4);
172
+ }
173
+ &:active { opacity: 0.55; }
174
+ }
175
+
176
+ // ── 状态标签 — 精致小标签(GitHub/Linear label 风格)────────────────────────
177
+ // 实色填充 + 轻柔圆角 + 克制字号
178
+ .ag-cell .el-tag {
179
+ display: inline-flex !important;
180
+ align-items: center !important;
181
+ justify-content: center !important;
182
+ height: 20px !important;
183
+ line-height: 1 !important;
184
+ padding: 0 8px !important;
185
+ font-size: 11px !important;
186
+ font-weight: 600 !important;
187
+ border-radius: 4px !important;
188
+ border: none !important;
189
+ letter-spacing: 0.03em;
190
+ flex-shrink: 0;
191
+
192
+ &.el-tag--danger {
193
+ background: var(--el-color-danger) !important;
194
+ color: #fff !important;
195
+ }
196
+
197
+ &.el-tag--warning {
198
+ background: var(--el-color-warning) !important;
199
+ color: #fff !important;
200
+ }
201
+
202
+ &.el-tag--success {
203
+ background: var(--el-color-success) !important;
204
+ color: #fff !important;
205
+ }
206
+
207
+ &.el-tag--info {
208
+ background: var(--el-color-primary) !important;
209
+ color: #fff !important;
210
+ }
211
+
212
+ // type="" 时无修饰类
213
+ &:not(.el-tag--danger):not(.el-tag--warning):not(.el-tag--success):not(.el-tag--info) {
214
+ background: var(--el-color-primary) !important;
215
+ color: #fff !important;
216
+ }
217
+ }
218
+
219
+ // ── 数值型徽标(考核基数/评分等)────────────────────────────────────────────
220
+ .jh-count-badge {
221
+ display: inline-block;
222
+ padding: 2px 6px;
223
+ background: rgba(43, 178, 104, 0.08);
224
+ color: var(--el-color-success);
225
+ border-radius: 4px;
226
+ font-family: 'SFMono-Regular', 'Consolas', 'Monaco', monospace;
227
+ font-size: 11.5px;
228
+ font-weight: 600;
229
+ letter-spacing: 0.03em;
230
+ border: 1px solid rgba(43, 178, 104, 0.22);
231
+ white-space: nowrap;
232
+ }
233
+
234
+ // ── 风险点编号徽标 ────────────────────────────────────────────────────────────
235
+ .jh-riskno-badge {
236
+ display: inline-block;
237
+ padding: 2px 6px;
238
+ background: rgba(34, 84, 244, 0.08);
239
+ color: var(--el-color-primary);
240
+ border-radius: 4px;
241
+ font-family: 'SFMono-Regular', 'Consolas', 'Monaco', monospace;
242
+ font-size: 11.5px;
243
+ font-weight: 600;
244
+ letter-spacing: 0.03em;
245
+ border: 1px solid rgba(34, 84, 244, 0.18);
246
+ white-space: nowrap;
247
+ max-width: 100%;
248
+ overflow: hidden;
249
+ text-overflow: ellipsis;
250
+ }
251
+
252
+ // ── 评价级别圆形徽标 ──────────────────────────────────────────────────────────
253
+ // 颜色通过 Vue 内联 style 传入 --lv-bg / --lv-color
254
+ .jh-rating-lv {
255
+ display: inline-flex;
256
+ align-items: center;
257
+ justify-content: center;
258
+ width: 24px;
259
+ height: 24px;
260
+ border-radius: 50%;
261
+ background: var(--lv-bg, rgba(107, 114, 128, 0.12));
262
+ color: var(--lv-color, #374151);
263
+ font-size: 12px;
264
+ font-weight: 700;
265
+ flex-shrink: 0;
266
+ line-height: 1;
267
+ }
268
+
269
+ // ── jh-cell-tag:轻量纯 CSS 状态标签(供 ag-cell-renders.ts 的 renderTagSlot 使用)────
270
+ // 无需引入 Element Plus el-tag,适合 ag grid defaultSlot 渲染
271
+ .jh-cell-tag {
272
+ display: inline-flex;
273
+ align-items: center;
274
+ height: 20px;
275
+ padding: 0 7px;
276
+ border-radius: 4px;
277
+ font-size: 11px;
278
+ font-weight: 600;
279
+ white-space: nowrap;
280
+ line-height: 1;
281
+
282
+ &--success {
283
+ background: rgba(43, 178, 104, 0.12);
284
+ color: var(--el-color-success);
285
+ }
286
+
287
+ &--warning {
288
+ background: rgba(234, 154, 19, 0.12);
289
+ color: var(--el-color-warning);
290
+ }
291
+
292
+ &--danger {
293
+ background: rgba(187, 45, 63, 0.12);
294
+ color: var(--el-color-danger);
295
+ }
296
+
297
+ &--info {
298
+ background: rgba(34, 84, 244, 0.10);
299
+ color: var(--el-color-primary);
300
+ }
301
+
302
+ &--default {
303
+ background: rgba(34, 84, 244, 0.10);
304
+ color: var(--el-color-primary);
305
+ }
306
+ }
307
+
308
+ // ── 兼容旧 el-button 操作列(其他页面渐进迁移)──────────────────────────────.ag-cell .el-button + .el-button { margin-left: 4px; }
309
+
310
+ .ag-cell .el-button.el-button--link,
311
+ .ag-cell .el-button.el-button--text {
312
+ padding: 2px 6px !important;
313
+ border-radius: 3px !important;
314
+ font-size: 12px !important;
315
+ transition: background-color 0.15s, color 0.15s;
316
+
317
+ &:not(.el-button--danger):hover {
318
+ background-color: rgba(34, 84, 244, 0.08) !important;
319
+ color: var(--el-color-primary) !important;
320
+ }
321
+ }
322
+
323
+ .ag-cell .el-button.el-button--danger.is-link,
324
+ .ag-cell .el-button.el-button--danger.el-button--text {
325
+ color: var(--el-color-danger);
326
+ &:hover {
327
+ color: var(--el-color-danger) !important;
328
+ background-color: rgba(187, 45, 63, 0.08) !important;
329
+ }
330
+ }
331
+
332
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
333
+ // FullScreenDialog — 全屏/关闭按钮尺寸对齐 + 弹窗底部按钮风格
334
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
335
+
336
+ // 让 El Plus 自带关闭按钮(headerbtn)视觉与自定义全屏按钮完全对齐
337
+ .el-dialog__headerbtn {
338
+ display: flex !important;
339
+ align-items: center !important;
340
+ justify-content: center !important;
341
+ width: 24px !important;
342
+ height: 24px !important;
343
+ // jh-ui header: padding 11.5px, content 24px → total ~47px
344
+ // 24px 按钮垂直居中: (47 - 24) / 2 ≈ 12px (headerbtn position:absolute 相对 .el-dialog,不是 header)
345
+ top: 12px !important;
346
+ right: 14px !important;
347
+ border-radius: 6px !important;
348
+ transition: background-color 0.15s !important;
349
+
350
+ &:hover {
351
+ background-color: rgba(0, 0, 0, 0.06) !important;
352
+ }
353
+
354
+ .el-dialog__close {
355
+ font-size: 14px !important;
356
+ color: rgba(0, 0, 0, 0.55) !important;
357
+ line-height: 1 !important;
358
+ }
359
+
360
+ &:hover .el-dialog__close {
361
+ color: rgba(0, 0, 0, 0.88) !important;
362
+ }
363
+ }
364
+
365
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
366
+ // ElMessageBox 确认弹窗按钮 — 与 dialog-footer 保持统一圆角风格
367
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
368
+ .el-message-box__btns {
369
+ .el-button {
370
+ height: 24px;
371
+ padding: 0 14px;
372
+ font-size: 13px;
373
+ border-radius: 6px !important;
374
+ font-weight: 500;
375
+
376
+ &:not(.el-button--primary):not(.el-button--danger) {
377
+ border-color: rgba(0, 0, 0, 0.15);
378
+ color: #374151;
379
+ background: #fff;
380
+ &:hover {
381
+ border-color: var(--el-color-primary);
382
+ color: var(--el-color-primary);
383
+ background: rgba(34, 84, 244, 0.04);
384
+ }
385
+ }
386
+ }
387
+ }
388
+
389
+ // 底部按钮:与设计风格统一(紧凑、圆角、精致)
390
+ // 注意:selector 用 el-dialog__footer 而非 .dialog-footer,确保 jh-dialog 等
391
+ // 直接在 #footer slot 放 el-button(无 wrapper class)时也能命中
392
+ .el-dialog__footer {
393
+ .base-toolbar-box {
394
+ justify-content: flex-end !important;
395
+ padding: 0 !important;
396
+ background: transparent !important;
397
+ border-bottom: 0 !important;
398
+
399
+ .base-toolbar-content {
400
+ justify-content: flex-end !important;
401
+ gap: 8px !important;
402
+ }
403
+ }
404
+
405
+ .el-button {
406
+ height: 24px !important;
407
+ padding: 0 14px !important;
408
+ font-size: 13px !important;
409
+ border-radius: 6px !important;
410
+ font-weight: 500 !important;
411
+ // 默认(取消/关闭):细边框灰色风格
412
+ &:not(.el-button--primary):not(.el-button--danger) {
413
+ border-color: rgba(0, 0, 0, 0.15) !important;
414
+ color: #374151 !important;
415
+ background: #fff !important;
416
+ &:hover {
417
+ border-color: var(--el-color-primary) !important;
418
+ color: var(--el-color-primary) !important;
419
+ background: rgba(34, 84, 244, 0.04) !important;
420
+ }
421
+ }
422
+ }
423
+ }
424
+
425
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
426
+ // el-textarea 编辑模式精致化
427
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
428
+ .el-textarea {
429
+ .el-textarea__inner {
430
+ border-radius: 6px !important;
431
+ font-size: 13px !important;
432
+ line-height: 1.65 !important;
433
+ padding: 7px 10px !important;
434
+ resize: vertical !important; // 只允许垂直拉伸,不允许水平
435
+ transition: border-color 0.15s, box-shadow 0.15s;
436
+
437
+ &:hover:not(:focus) {
438
+ border-color: var(--el-border-color-hover, #c0c4cc) !important;
439
+ }
440
+ &:focus {
441
+ border-color: var(--el-color-primary) !important;
442
+ box-shadow: 0 0 0 2px rgba(34, 84, 244, 0.12) !important;
443
+ }
444
+ }
445
+
446
+ // 字数统计:更小、更淡、不遮挡内容
447
+ .el-input__count {
448
+ font-size: 10px !important;
449
+ color: #c0c4cc !important;
450
+ background: transparent !important;
451
+ line-height: 1 !important;
452
+ bottom: 5px !important;
453
+ right: 8px !important;
454
+ padding: 0 !important;
455
+ }
456
+ }
457
+
458
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
459
+ // MenuDivider 分区标题分割线 — 颜色 Token 化
460
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
461
+ .menu-divider-color-block,
462
+ .menu-divider__indicator,
463
+ [class*="menu-divider"] [class*="indicator"],
464
+ [class*="menu-divider"] [class*="line-left"] {
465
+ background-color: var(--el-color-primary) !important;
466
+ }
467
+ [class*="menu-divider"] [class*="line"],
468
+ [class*="menu-divider"] hr {
469
+ border-color: var(--el-border-color-light) !important;
470
+ background-color: var(--el-border-color-light) !important;
471
+ }
472
+
473
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
474
+ // BaseTree / el-tree 通用修复
475
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
476
+ // el-tree 的节点内容区 white-space:nowrap 会撑出宽度,
477
+ // 但实际内容并未溢出容器,出现横向滚动条体验很差 → 裁掉即可
478
+ .el-tree {
479
+ overflow-x: hidden !important;
480
+ }