@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.
- package/CHANGELOG.md +207 -0
- package/README.md +623 -0
- package/SKILL.md +632 -0
- package/bin/wl-ui.js +794 -0
- package/design/spec/color.md +41 -0
- package/design/spec/spacing.md +28 -0
- package/design/spec/typography.md +29 -0
- package/design/tokens/base.css +144 -0
- package/design/tokens/index.css +8 -0
- package/dist/ag-grid-override.scss +1 -0
- package/dist/element.scss +1 -0
- package/dist/index.scss +1 -0
- package/dist/portal.scss +1 -0
- package/dist/style-override.scss +1 -0
- package/dist/tokens.css +144 -0
- package/es/chunk-GBB7LDKQ.js +261 -0
- package/es/chunk-MDI2SCUP.js +281 -0
- package/es/chunk-QDTNMM7W.js +286 -0
- package/es/chunk-YLNAFAWE.js +233 -0
- package/es/common-preset.d.ts +38 -0
- package/es/common-preset.js +157 -0
- package/es/index.d.ts +32 -0
- package/es/index.js +1 -0
- package/es/presets/security.d.ts +16 -0
- package/es/presets/security.js +99 -0
- package/es/renderers-BFRSp2BH.d.ts +51 -0
- package/es/renderers-DMZbi_Gs.d.ts +51 -0
- package/es/renderers-DWhUlI2y.d.ts +47 -0
- package/es/types-04qLKHMt.d.ts +62 -0
- package/es/types-BrCPjAH6.d.ts +62 -0
- package/es/types-QZ1gy9KX.d.ts +63 -0
- package/examples/migration-operations-to-renderOps.md +107 -0
- package/examples/wk-exempt.example.json +30 -0
- package/mcp/server.js +394 -0
- package/package.json +130 -0
- package/reference/SelectPopupCom.vue +634 -0
- package/reference/ag-cell-renders.ts +644 -0
- package/reference/define-columns.ts +185 -0
- package/reference/jhlc.d.ts +1 -0
- package/scanner/coverage.mjs +287 -0
- package/scanner/exempt.mjs +127 -0
- package/scanner/fix.mjs +216 -0
- package/scanner/index.mjs +403 -0
- package/scanner/integration.mjs +155 -0
- package/scanner/report.mjs +459 -0
- package/scanner/rules/_shared.mjs +134 -0
- package/scanner/rules/button.mjs +97 -0
- package/scanner/rules/color.mjs +118 -0
- package/scanner/rules/componentFamily.mjs +184 -0
- package/scanner/rules/dialog.mjs +42 -0
- package/scanner/rules/form.mjs +86 -0
- package/scanner/rules/index.mjs +58 -0
- package/scanner/rules/table.mjs +170 -0
- package/scanner/rules/tag.mjs +245 -0
- package/scanner/snapshot.mjs +198 -0
- package/skills/_flows/full-audit.md +65 -0
- package/skills/_flows/legacy-skin-align.md +71 -0
- package/skills/_flows/new-project-init.md +80 -0
- package/skills/_flows/progressive-migrate.md +49 -0
- package/skills/_meta/_compat/README.md +47 -0
- package/skills/_meta/_compat/editors.json +76 -0
- package/skills/_meta/_compat/headers/agents.txt +7 -0
- package/skills/_meta/_compat/headers/claude-code.txt +7 -0
- package/skills/_meta/_compat/headers/cline.txt +7 -0
- package/skills/_meta/_compat/headers/cursor-mdc.txt +5 -0
- package/skills/_meta/_compat/headers/github-copilot.txt +5 -0
- package/skills/_meta/_compat/headers/kiro.txt +4 -0
- package/skills/_meta/_compat/headers/qoder.txt +4 -0
- package/skills/_meta/_compat/headers/trae.txt +3 -0
- package/skills/_meta/_compat/headers/windsurf.txt +5 -0
- package/skills/_meta/_detection.md +81 -0
- package/skills/_meta/_registry.md +96 -0
- package/skills/element/component-family/SKILL.md +71 -0
- package/skills/element/el-dialog/SKILL.md +124 -0
- package/skills/element/el-form/SKILL.md +84 -0
- package/skills/element/el-table/SKILL.md +86 -0
- package/skills/element/el-tag/SKILL.md +127 -0
- package/skills/layouts/detail-page/SKILL.md +99 -0
- package/skills/layouts/form-dialog/SKILL.md +128 -0
- package/skills/layouts/list-page/SKILL.md +111 -0
- package/skills/layouts/tree-list/SKILL.md +108 -0
- package/skills/ops/audit/SKILL.md +109 -0
- package/skills/ops/fix/SKILL.md +52 -0
- package/skills/ops/fix/USAGE.md +24 -0
- package/skills/ops/migrate/SKILL.md +157 -0
- package/skills/ops/scan/SKILL.md +71 -0
- package/skills/ops/scan/USAGE.md +16 -0
- package/skills/runtime/design-tokens/SKILL.md +88 -0
- package/skills/runtime/design-tokens/USAGE.md +19 -0
- package/skills/runtime/migration/SKILL.md +106 -0
- package/skills/runtime/migration/USAGE.md +34 -0
- package/skills/runtime/style-align/SKILL.md +124 -0
- package/skills/runtime/style-align/USAGE.md +52 -0
- package/skills/vendors/ag-grid/SKILL.md +94 -0
- package/skills/vendors/base-table/SKILL.md +57 -0
- package/skills/vendors/c-components/SKILL.md +36 -0
- package/skills/vendors/custom-wrappers/SKILL.md +45 -0
- package/skills/vendors/jh-components/SKILL.md +42 -0
- package/skills/vendors/unknown-wrapper/SKILL.md +44 -0
- package/standards/engineering/01-import-order.md +46 -0
- package/standards/engineering/02-naming.md +54 -0
- package/standards/engineering/03-scss-structure.md +59 -0
- package/standards/ui/01-table.md +111 -0
- package/standards/ui/02-button.md +83 -0
- package/standards/ui/03-form.md +118 -0
- package/standards/ui/04-tag-status.md +110 -0
- package/standards/ui/05-dialog-pagination.md +118 -0
- package/styles/element/_card.scss +26 -0
- package/styles/element/_descriptions.scss +22 -0
- package/styles/element/_dialog.scss +43 -0
- package/styles/element/_drawer.scss +22 -0
- package/styles/element/_feedback.scss +52 -0
- package/styles/element/_form.scss +22 -0
- package/styles/element/_navigation.scss +36 -0
- package/styles/element/_overlay.scss +32 -0
- package/styles/element/_pagination.scss +16 -0
- package/styles/element/_steps.scss +32 -0
- package/styles/element/_table.scss +13 -0
- package/styles/element/_tabs.scss +40 -0
- package/styles/element/_tree.scss +27 -0
- package/styles/element/_upload.scss +34 -0
- package/styles/element/index.scss +17 -0
- package/styles/index.scss +21 -0
- package/styles/layouts/_detail-page.scss +27 -0
- package/styles/layouts/_form-dialog.scss +19 -0
- package/styles/layouts/_list-page.scss +47 -0
- package/styles/layouts/_tree-list.scss +33 -0
- package/styles/layouts/index.scss +6 -0
- package/styles/presets/element-only.scss +6 -0
- package/styles/presets/full.scss +12 -0
- package/styles/presets/security.scss +37 -0
- package/styles/presets/skin.scss +14 -0
- package/styles/presets/tokens-only.scss +7 -0
- package/styles/tokens/index.scss +79 -0
- package/styles/vendors/_ag-grid.scss +273 -0
- package/styles/vendors/_base-components.scss +480 -0
- package/styles/vendors/_base-query-toolbar.scss +253 -0
- package/styles/vendors/_base-table.scss +41 -0
- package/styles/vendors/_c-components.scss +34 -0
- package/styles/vendors/_custom-wrappers.scss +30 -0
- package/styles/vendors/_jh-drag-col.scss +63 -0
- package/styles/vendors/_jh-pagination.scss +81 -0
- package/styles/vendors/_jh-tree.scss +196 -0
- package/styles/vendors/_portal.scss +114 -0
- package/styles/vendors/index.scss +17 -0
- package/templates/ag-grid-page/TPL-AG-GRID.md +76 -0
- package/templates/form-dialog/TPL-FORM-DIALOG.md +165 -0
- package/templates/list-page/TPL-LIST.md +139 -0
- package/templates/tree-list/TPL-TREE-LIST.md +176 -0
- 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';
|