@agile-team/wl-skills-ui 1.9.9 → 1.9.11

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 CHANGED
@@ -4,6 +4,33 @@ All notable changes to **@agile-team/wl-skills-ui** will be documented in this f
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
+ ## [1.9.11] - 2026-08-06
8
+
9
+ ### Fixed
10
+
11
+ - 精准识别 common-core 多标签输入的复合 wrapper,不再把 `.com-input-multi-tag-wrap.el-input.el-input__wrapper` 当成普通单行输入框强制固定高度;空值保持统一紧凑高度,标签换行时允许容器自然增长,避免外层边框消失或内容裁切。
12
+ - 复合输入严格保持“外层唯一描边、内层编辑器无描边”契约;默认、hover、focus、error、disabled 状态继续使用统一边框色、客户品牌色、危险色、禁用色与 6px 圆角,不产生双描边。
13
+
14
+ ### Changed
15
+
16
+ - 新增复合多标签输入真实 DOM 分类测试,并同时锁定普通输入仍保持 26px 固定高度,防止专项修复放宽其他正常表单规则。
17
+
18
+ ## [1.9.10] - 2026-08-01
19
+
20
+ ### Added
21
+
22
+ - 新增 `@agile-team/wl-skills-ui/runtime/auto` 包级保护入口;Skin 项目一次引入即可获得主题锁和普通表格真实溢出 Tooltip 兜底,Native 项目的 `installCommonPreset()` 自动安装相同保护。
23
+ - 新增长文本 DOM 回归测试,覆盖真实溢出、未溢出、动态/虚拟行、Element 原生 Tooltip 优先以及操作列、Tag、定制区域等排除边界。
24
+
25
+ ### Fixed
26
+
27
+ - 修复平台将 `.ag-cell` 与 `.ag-cell-value` 复用为 flex 节点时 `text-overflow: ellipsis` 只裁切、不绘制省略号的问题。
28
+ - 普通 Element Table、BaseTable 与 AG Grid 不再依赖页面是否调用 `defineColumns()` 才能获得长文本兜底;运行时仅在真实溢出时创建统一提示,不接管已有 Tooltip 或语义组件。
29
+
30
+ ### Changed
31
+
32
+ - SCSS 发布门禁由引用路径检查升级为 full/skin 入口真实编译,避免合法性问题进入 npm 包。
33
+
7
34
  ## [1.9.9] - 2026-07-29
8
35
 
9
36
  ### Fixed
package/README.md CHANGED
@@ -103,18 +103,23 @@ wl-skills-ui/
103
103
  │ │ ├── registry.ts # createPreset / installPreset
104
104
  │ │ ├── common.ts # 通用业务预设(enable/audit/verify + 起步包)
105
105
  │ │ └── index.ts
106
+ │ ├── auto.ts # Skin/老项目包级保护自动入口
107
+ │ ├── guards.ts # 主题锁 + 长文本溢出保护聚合
108
+ │ ├── overflow-tooltip.ts # 普通表格真实溢出 Tooltip 兜底
106
109
  │ └── index.ts # 公共 API 入口
107
110
  │
108
111
  ├── scanner/ # 自动化扫描 / 修复
109
112
  │ ├── index.mjs # CLI(含 --layer/--vendor/--mode 过滤)
110
113
  │ ├── rules/ # 规则集
111
114
  │ │ ├── _shared.mjs # 公共工具 + inferMeta(layer/vendor)
112
- │ │ ├── table.mjs # R001 R002 R003 R014
115
+ │ │ ├── table.mjs # R001 R002 R003 R014 R039
113
116
  │ │ ├── form.mjs # R006 R007 R008
114
- │ │ ├── button.mjs # R004 R005 R015
117
+ │ │ ├── button.mjs # R004 R005 R015 R038
115
118
  │ │ ├── tag.mjs # R009 R010 R012
116
119
  │ │ ├── dialog.mjs # R011
117
120
  │ │ ├── color.mjs # R016 R017 R018
121
+ │ │ ├── semantic.mjs # R025 R026 R027
122
+ │ │ ├── componentFamily.mjs # R031 R032 R033 R034 R035 R036 R037
118
123
  │ │ └── index.mjs # 聚合 + addRules() 插件机制
119
124
  │ ├── fix.mjs # 自动修复引擎
120
125
  │ ├── integration.mjs # 接入完整性检查
@@ -134,7 +139,8 @@ wl-skills-ui/
134
139
  │ │ ├── el-table/SKILL.md
135
140
  │ │ ├── el-form/SKILL.md
136
141
  │ │ ├── el-dialog/SKILL.md
137
- │ │ └── el-tag/SKILL.md
142
+ │ │ ├── el-tag/SKILL.md
143
+ │ │ └── component-family/ # 扩展组件族(card/tabs/descriptions/drawer/upload/steps/feedback)
138
144
  │ ├── vendors/ # ⭐ L2 封装识别 SKILL
139
145
  │ │ ├── base-table/SKILL.md # 优先级 #1
140
146
  │ │ ├── jh-components/SKILL.md # 优先级 #2
@@ -149,7 +155,9 @@ wl-skills-ui/
149
155
  │ │ └── migration/SKILL.md
150
156
  │ └── ops/ # 操作类 SKILL
151
157
  │ ├── scan/SKILL.md
152
- │ └── fix/SKILL.md
158
+ │ ├── audit/SKILL.md
159
+ │ ├── fix/SKILL.md
160
+ │ └── migrate/SKILL.md
153
161
  │
154
162
  ├── templates/ # 代码生成模板
155
163
  │ ├── list-page/TPL-LIST.md
@@ -200,7 +208,7 @@ yarn add @agile-team/wl-skills-ui
200
208
  |---|---|---|
201
209
  | `element-plus` | **`2.2.6-prod.3`** | 集团 jh- 定制版;EP 2.3.0 起引入 `.el-input__wrapper`,与 jh-ui 3.x 不兼容 |
202
210
  | `@jhlc/jh-ui` | **`3.1.0`** | SCSS 皮肤包,`.com-text` label 包裹 + `.has-colon` 冒号注入(wl-skills-ui 已统一屏蔽表单冒号) |
203
- | `@agile-team/wl-skills-ui` | `^1.9.9` | 已对齐上述组合的 DOM 假设、客户主题锁、圆角契约与定制页样式边界 |
211
+ | `@agile-team/wl-skills-ui` | `^1.9.11` | 已对齐上述组合的 DOM 假设、客户主题锁、圆角契约、复合输入、表格长文本兜底与定制页样式边界 |
204
212
 
205
213
  三种识别方式,任选其一:
206
214
 
@@ -214,7 +222,19 @@ yarn add @agile-team/wl-skills-ui
214
222
 
215
223
  ## 版本亮点
216
224
 
217
- 当前 v1.9.9:
225
+ 当前 v1.9.11:
226
+
227
+ - **复合输入不再误伤**:common-core 多标签/人员选择器不再被普通 input 的固定高度压缩;无标签时保持 26px 紧凑基线,标签换行时容器自然增高。
228
+ - **视觉契约保持统一**:复合输入外层继续使用统一 6px 圆角及默认、hover、品牌 focus、error、disabled 边框,内部编辑 input 不重复描边;普通 input/select/date/input-number 原有规则不变。
229
+ - **结构级防回归**:新增与 common-core 实际 DOM 一致的分类测试,明确区分复合外壳、内部编辑器和普通输入框,防止后续通用选择器再次误命中。
230
+
231
+ 上一版 v1.9.10:
232
+
233
+ - **长文本真正包级闭环**:普通 Element Table、BaseTable 与 AG Grid 即使没有经过 `defineColumns()`,真实超宽时也会稳定显示省略号,并由 `runtime/auto` 在悬停或键盘聚焦时兜底完整文本提示;动态行和虚拟滚动无需额外处理。
234
+ - **严格防污染边界**:已有组件 Tooltip 优先,编辑列、操作列、Tag、复选框、自定义 renderer、主动换行列、登录页及显式皮肤豁免区域均不接管;没有溢出时不创建 Tooltip。
235
+ - **发布验证补强**:新增真实 DOM 行为测试,并将 SCSS 门禁从路径存在检查升级为完整入口编译,防止 flex 省略冲突或无效选择器再次漏发。
236
+
237
+ 上一版 v1.9.9:
218
238
 
219
239
  - **主操作按钮不再漏色**:新增/新建/添加/创建类按钮强制使用客户主题 `primary` 填充样式,扫描器可识别并自动修复漏写 `type` 或误带 `plain` 的存量代码。
220
240
  - **长文本交互统一**:普通数据列在空间不足时单行省略,悬停显示完整内容;Tag、操作列、自定义渲染和主动换行列不被机械覆盖。
@@ -278,7 +298,7 @@ yarn add @agile-team/wl-skills-ui
278
298
  - **R025** 语义合规:`options:[]` 退化检测 → 升级 `renderTagSlot` / `renderDictClassifyTag`
279
299
  - **R026** 原生 HTML 拦截:`<table>/<input>/<select>/<button>/<textarea>` → 替换 el-* 组件
280
300
  - `scan --only/--skip` 规则过滤 + `exempt init` 智能豁免脚手架
281
- - `scan --baseline` 漂移对比 + SCSS 链路检查 + R-rule 单一事实源(32 条)
301
+ - `scan --baseline` 漂移对比 + SCSS 链路检查 + R-rule 单一事实源(35 条)
282
302
 
283
303
  历史亮点(v1.7.1):
284
304
 
@@ -302,7 +322,7 @@ yarn add @agile-team/wl-skills-ui
302
322
  - 优化 BaseToolbar 下拉/分裂按钮组,让“主动作 + 下拉动作”按一个动作组展示,避免视觉割裂
303
323
  - 优化 AG Grid 操作列 `jh-op-*` 图标/胶囊/文字按钮,取消按压缩放抖动,并提升选中行下的可读性
304
324
  - 补齐输入控件 focus 品牌色边框、统一圆角、长 label 单行省略和自定义弹窗图标居中尺寸规则
305
- - 全量移除旧 `wk-` 前缀命名(包名 / CLI / 快照目录 / 豁免配置 / MCP 工具名),不再兼容(详见 CHANGELOG v1.6.10)
325
+ - 移除旧 `wk-` 工程命名(包名 / CLI / 快照目录 / 豁免配置 / MCP 工具名);`--wk-*` 设计 token 作为既有公共契约继续保留,避免破坏消费项目的变量覆盖,它不代表加载了旧包
306
326
  - 新增 `skills/_meta/_compat/vendors.json` 作为 L2 Project Vendors 的单一事实源(id / priority / patterns / baseline / styles),`scanner/coverage.mjs` 启动时一次性编译 RegExp,零运行时开销
307
327
  - 新增 `wl-ui add-vendor <tag> [--family <id>] [--dry-run]` 脚手架命令:一键生成专项 SCSS、`@forward` 注册、`vendors.json` baseline 追加、scanner 规则草稿
308
328
  - MCP 工具前缀统一为 `wl_ui_*`(`wl_ui_check` / `wl_ui_scan` / `wl_ui_fix_dry_run` / `wl_ui_skill_prompt` / `wl_ui_route_intent` / `wl_ui_recommend_flow`)
@@ -373,6 +393,7 @@ npx wl-ui init --mode native
373
393
  // 4. src/main.ts
374
394
  import { installCommonPreset } from "@agile-team/wl-skills-ui/runtime/common-preset";
375
395
  installCommonPreset();
396
+ // installCommonPreset 已包含主题锁和普通表格长文本包级保护,无需重复引入 runtime/auto。
376
397
  ```
377
398
 
378
399
  ```vue
@@ -412,8 +433,13 @@ npx wl-ui init --mode skin
412
433
  @use "@agile-team/wl-skills-ui/styles/presets/skin" as *;
413
434
  ```
414
435
 
436
+ ```ts
437
+ // 3. src/main.ts:只安装包级保护,不接管页面布局或业务列定义
438
+ import "@agile-team/wl-skills-ui/runtime/auto";
439
+ ```
440
+
415
441
  ```bash
416
- # 3. AI 编辑器中触发:
442
+ # 4. AI 编辑器中触发:
417
443
  # "用 wl-ui 的 legacy-skin-align 流程跑一下当前项目"
418
444
  # → AI 按 _flows/legacy-skin-align.md 顺序执行 6 个 phase
419
445
 
@@ -625,15 +651,19 @@ export const myRules = [
625
651
 
626
652
  ---
627
653
 
628
- ## AI/MCP 智能引导
654
+ ## AI/MCP 智能引导(10 个工具)
629
655
 
630
656
  | MCP Tool | 作用 |
631
657
  | ----------------------- | ---------------------------------------------------------- |
632
658
  | `wl_ui_check` | 检查 tokens/styles/runtime 接入完整性 |
633
659
  | `wl_ui_scan` | 扫描 UI 风格偏差,输出 Markdown 或 JSON |
634
660
  | `wl_ui_fix_dry_run` | 预览自动修复,不实际写入 |
661
+ | `wl_ui_detect_skin` | 检测项目 vendor 版本配对 |
635
662
  | `wl_ui_skill_prompt` | 输出 AI 触发提示 |
636
663
  | `wl_ui_route_intent` | 根据自然语言识别 UI 治理意图并推荐 flow/tool/skill |
664
+ | `wl_ui_list_rules` | 列出全部扫描规则及说明 |
665
+ | `wl_ui_describe_rule` | 查询单条规则详情 |
666
+ | `wl_ui_drift` | 对比基线漂移 |
637
667
  | `wl_ui_recommend_flow` | 根据扫描 JSON 推荐 nextActions 和 `wl-skills-kit` 桥接动作 |
638
668
 
639
669
  推荐智能体流程:
@@ -661,9 +691,14 @@ export const myRules = [
661
691
  | `renderRatingLevel(v)` | 评级颜色 |
662
692
  | `registerColumnAutoMap(field, config)` | 注册新字段自动渲染 |
663
693
  | `installCommonPreset()` | 安装通用业务预设 |
694
+ | `installUiRuntimeGuards()` | 安装主题锁与普通表格长文本包级保护 |
695
+ | `installOverflowTooltipGuard()` | 单独安装真实溢出 Tooltip 兜底 |
664
696
  | `setDictResolver(fn)` | 解耦动态字典查询 |
665
697
  | `createPreset(config)` / `installPreset(config)` | 自定义 preset 工厂 |
666
698
 
699
+ 长文本兜底的接入方式、排除边界和验收方法见
700
+ [表格长文本包级兜底机制](docs/table-overflow-tooltip.md)。
701
+
667
702
  ---
668
703
 
669
704
  ## 设计令牌
package/bin/wl-ui.js CHANGED
@@ -573,7 +573,8 @@ ${
573
573
  installCommonPreset();
574
574
  `
575
575
  : `
576
- ℹ️ skin 模式不需要引入 runtime,页面布局 / 业务代码均保持现状。
576
+ ⚠️ 请手动在 src/main.ts 添加包级保护(不接管页面布局 / 业务列定义):
577
+ import '@agile-team/wl-skills-ui/runtime/auto';
577
578
  `
578
579
  }`);
579
580
  }
@@ -11,7 +11,7 @@
11
11
  | `element-plus` | **`2.2.6-prod.3`** | 集团 jh- 定制版,搭配 `@jhlc/jh-ui` 使用,DOM 仍为 `.el-input > .el-input__inner` 直挂结构(**EP 2.3.0 起才引入 `.el-input__wrapper`**) |
12
12
  | `@jhlc/jh-ui` | **`3.1.0`** | SCSS 皮肤包,`.com-text` label 包裹、`.has-colon ::after` 冒号注入、`.el-form-item--default { margin-bottom: 24px }` 等强约束 |
13
13
  | `@jhlc/common-core` | `3.1.0` 或 `3.1.0-prod.x` | 基础 util/types,`@jhlc/jh-ui` 间接依赖 |
14
- | `@agile-team/wl-skills-ui` | `^1.9.9` | 已对齐 jh-ui 3.1.0 + EP 2.2.6-prod.3 的 DOM 假设、客户主题锁、6px 基础圆角、紧凑表单、表格行状态、分裂按钮、长文本提示、定制页样式边界与 Vite 4 开发转换 |
14
+ | `@agile-team/wl-skills-ui` | `^1.9.11` | 已对齐 jh-ui 3.1.0 + EP 2.2.6-prod.3 的 DOM 假设、客户主题锁、6px 基础圆角、紧凑表单、复合多标签输入、表格行状态、分裂按钮、包级长文本提示、定制页样式边界与 Vite 4 开发转换 |
15
15
 
16
16
  ## 项目集群当前实测
17
17
 
@@ -35,7 +35,8 @@
35
35
 
36
36
  ## 适配建议
37
37
 
38
- - 集团内项目:**统一锚定 `element-plus@2.2.6-prod.3` + `@jhlc/jh-ui@3.1.0`**,与 wl-skills-ui v1.9.9 三方对齐。
38
+ - 集团内项目:**统一锚定 `element-plus@2.2.6-prod.3` + `@jhlc/jh-ui@3.1.0`**,与 wl-skills-ui v1.9.11 三方对齐。
39
+ - Skin 项目除全局样式外,在 `main.ts` 引入一次 `@agile-team/wl-skills-ui/runtime/auto`;Native 项目的 `installCommonPreset()` 已包含相同包级保护,不要重复安装。
39
40
  - 升级 `element-plus` 到 2.3+ 前,必须同步升级 `@jhlc/jh-ui` 到对应支持版本,否则 `.com-text` / `.el-input__inner` DOM 与 EP `__wrapper` 体系不兼容。
40
41
  - 新项目接入:见 README 「快速接入」章节,默认会按本表声明 peerDependency 范围。
41
42
 
@@ -0,0 +1,66 @@
1
+ # 表格长文本包级兜底机制
2
+
3
+ ## 目标
4
+
5
+ 凡完整接入 `@agile-team/wl-skills-ui` 的普通 Element Table、BaseTable 与 AG Grid,普通文本单元格在空间不足时统一单行省略;鼠标悬停或键盘聚焦后显示完整文本。业务页面不需要逐列补丁,也不依赖列定义是否经过 `defineColumns()`。
6
+
7
+ 该能力只治理普通文本。Tag、操作按钮、编辑控件、复选框、自定义 renderer 和主动换行内容保留业务组件自身行为。
8
+
9
+ ## 接入
10
+
11
+ Native 项目调用 `installCommonPreset()` 时会自动安装包级保护:
12
+
13
+ ```ts
14
+ import { installCommonPreset } from "@agile-team/wl-skills-ui/runtime/common-preset";
15
+
16
+ installCommonPreset();
17
+ ```
18
+
19
+ Skin/老项目在保留 `skin` 样式入口的同时,在启动文件引入一次自动入口:
20
+
21
+ ```ts
22
+ import "@agile-team/wl-skills-ui/runtime/auto";
23
+ ```
24
+
25
+ 不要同时重复调用 `installCommonPreset()` 和引入 `runtime/auto`。内部安装函数具备幂等保护,但项目应保留单一、清晰的启动入口。
26
+
27
+ ## 工作机制
28
+
29
+ 1. 样式层只对没有子元素的普通纯文本单元格修正单行省略,解决 AG Grid 同一节点同时为 flex 容器时省略号不绘制的问题。
30
+ 2. Runtime 在 `document` 上使用事件委托,不扫描整页,也不使用 `MutationObserver` 监听表格结构。
31
+ 3. 用户悬停或键盘聚焦后才计算 `scrollWidth > clientWidth`;没有真实溢出时不创建 Tooltip。
32
+ 4. Element/AG Grid 已有 Tooltip、`title` 或 `aria-describedby` 时由原组件优先处理,兜底不会重复弹出。
33
+ 5. 动态行、Picker 与虚拟滚动复用相同事件入口,新插入的单元格不需要重新注册。
34
+
35
+ ## 防污染边界
36
+
37
+ 以下内容默认排除:
38
+
39
+ - `.editable-cell`、`.always-editable-cell`、`.ag-cell-inline-editing` 等编辑单元格;
40
+ - `.operations-cell`、`.default-slot-cell`、`.ag-cell-wrap-text`;
41
+ - input、textarea、select、button、Tag、Link、Checkbox、Radio、Switch、日期和数字输入;
42
+ - Element Table 已带 `.el-tooltip` 的原生溢出提示列;
43
+ - `.lp-root`、`.session-login`、`.wl-ui-skin-exempt`、`data-wl-ui-skin="off"` 定制区域。
44
+
45
+ 局部显式退出:
46
+
47
+ ```html
48
+ <div data-wl-ui-overflow="off">保持业务自身长文本行为</div>
49
+ ```
50
+
51
+ 自定义纯文本 renderer 确认需要包级提示时,可在实际文本单元格上标记:
52
+
53
+ ```html
54
+ <div data-wl-ui-overflow="on">自定义但仍按普通文本处理</div>
55
+ ```
56
+
57
+ ## 验收
58
+
59
+ - 短文本:无省略号、无兜底 Tooltip。
60
+ - 长文本:单行省略,悬停或键盘聚焦显示完整内容。
61
+ - 选中行/hover 行:省略和 Tooltip 不受行状态底色影响。
62
+ - 动态/虚拟行:滚动复用 DOM 后仍然有效。
63
+ - 操作列、Tag、编辑态、自定义 renderer:布局与交互保持原样。
64
+ - 登录页和显式豁免区域:不增加任何长文本接管行为。
65
+
66
+ 自动回归测试位于 `scanner/__tests__/overflow-tooltip.test.mjs`;发布前 `npm run verify` 会同时执行 DOM 行为、SCSS 实际编译、构建与包导出检查。
package/es/auto.d.ts ADDED
@@ -0,0 +1,2 @@
1
+
2
+ export { }
package/es/auto.js ADDED
@@ -0,0 +1,5 @@
1
+ import { installUiRuntimeGuards } from './chunk-Z2OTWMW6.js';
2
+ import './chunk-Q3N5QNRZ.js';
3
+
4
+ // runtime/auto.ts
5
+ installUiRuntimeGuards();
@@ -328,132 +328,4 @@ registerColumnAutoMaps({
328
328
  }
329
329
  });
330
330
 
331
- // runtime/theme-lock.ts
332
- var BRAND_THEME_TOKENS = Object.freeze({
333
- "--el-color-primary": "#002a8f",
334
- "--el-color-primary-rgb": "0, 42, 143",
335
- "--el-color-primary-light-1": "#1a3f9a",
336
- "--el-color-primary-light-2": "#3355a5",
337
- "--el-color-primary-light-3": "#4d6ab1",
338
- "--el-color-primary-light-4": "#667fbc",
339
- "--el-color-primary-light-5": "#8094c7",
340
- "--el-color-primary-light-6": "#99aad2",
341
- "--el-color-primary-light-7": "#b2bfdd",
342
- "--el-color-primary-light-8": "#ccd4e9",
343
- "--el-color-primary-light-9": "#e5eaf4",
344
- "--el-color-primary-dark-1": "#002681",
345
- "--el-color-primary-dark-2": "#002272",
346
- "--el-color-primary-dark-3": "#001d64",
347
- "--el-color-primary-dark-4": "#001956",
348
- "--el-color-success": "#2bb268",
349
- "--el-color-success-light-1": "#40ba77",
350
- "--el-color-success-light-2": "#55c286",
351
- "--el-color-success-light-3": "#6bcb95",
352
- "--el-color-success-light-4": "#80d3a4",
353
- "--el-color-success-light-5": "#95dbb4",
354
- "--el-color-success-light-6": "#aae3c3",
355
- "--el-color-success-light-7": "#bfebd2",
356
- "--el-color-success-light-8": "#d5f4e1",
357
- "--el-color-success-light-9": "#eaf9f0",
358
- "--el-color-success-dark-1": "#229051",
359
- "--el-color-success-dark-2": "#1b733f",
360
- "--el-color-success-dark-3": "#14562f",
361
- "--el-color-success-dark-4": "#0d3a20",
362
- "--el-color-warning": "#ea9a13",
363
- "--el-color-warning-light-1": "#eca42b",
364
- "--el-color-warning-light-2": "#efae42",
365
- "--el-color-warning-light-3": "#f1b85a",
366
- "--el-color-warning-light-4": "#f3c171",
367
- "--el-color-warning-light-5": "#f5cb89",
368
- "--el-color-warning-light-6": "#f7d5a1",
369
- "--el-color-warning-light-7": "#f9dfb8",
370
- "--el-color-warning-light-8": "#fce8d0",
371
- "--el-color-warning-light-9": "#fef2e7",
372
- "--el-color-warning-dark-1": "#c47f0e",
373
- "--el-color-warning-dark-2": "#9d650a",
374
- "--el-color-warning-dark-3": "#754a07",
375
- "--el-color-warning-dark-4": "#4e3004",
376
- "--el-color-danger": "#bb2d3f",
377
- "--el-color-danger-light-1": "#c34253",
378
- "--el-color-danger-light-2": "#ca5766",
379
- "--el-color-danger-light-3": "#d16b78",
380
- "--el-color-danger-light-4": "#d8808b",
381
- "--el-color-danger-light-5": "#dd969f",
382
- "--el-color-danger-light-6": "#e4abb2",
383
- "--el-color-danger-light-7": "#e8c0c5",
384
- "--el-color-danger-light-8": "#f0d5d9",
385
- "--el-color-danger-light-9": "#f7eaec",
386
- "--el-color-danger-dark-1": "#962433",
387
- "--el-color-danger-dark-2": "#711b26",
388
- "--el-color-danger-dark-3": "#4b1219",
389
- "--el-color-danger-dark-4": "#26090d",
390
- "--el-color-error": "#bb2d3f",
391
- "--el-color-error-light-1": "#c34253",
392
- "--el-color-error-light-2": "#ca5766",
393
- "--el-color-error-light-3": "#d16b78",
394
- "--el-color-error-light-4": "#d8808b",
395
- "--el-color-error-light-5": "#dd969f",
396
- "--el-color-error-light-6": "#e4abb2",
397
- "--el-color-error-light-7": "#e8c0c5",
398
- "--el-color-error-light-8": "#f0d5d9",
399
- "--el-color-error-light-9": "#f7eaec",
400
- "--el-color-error-dark-1": "#962433",
401
- "--el-color-error-dark-2": "#711b26",
402
- "--el-color-error-dark-3": "#4b1219",
403
- "--el-color-error-dark-4": "#26090d",
404
- "--el-border-radius-base": "6px",
405
- "--el-border-radius-small": "2px",
406
- "--el-border-radius-round": "20px",
407
- "--el-border-radius-circle": "100%"
408
- });
409
- var observer;
410
- var waitingForBody = false;
411
- function enforceOn(target) {
412
- if (!target) return;
413
- for (const [name, value] of Object.entries(BRAND_THEME_TOKENS)) {
414
- if (target.style.getPropertyValue(name).trim().toLowerCase() !== value || target.style.getPropertyPriority(name) !== "important") {
415
- target.style.setProperty(name, value, "important");
416
- }
417
- }
418
- }
419
- function bindObserver() {
420
- if (typeof document === "undefined") return;
421
- enforceOn(document.documentElement);
422
- enforceOn(document.body);
423
- if (typeof MutationObserver === "undefined") return;
424
- observer ?? (observer = new MutationObserver((mutations) => {
425
- const bodyChanged = mutations.some((mutation) => mutation.type === "childList");
426
- enforceOn(document.documentElement);
427
- enforceOn(document.body);
428
- if (bodyChanged) bindObserver();
429
- }));
430
- observer.disconnect();
431
- observer.observe(document.documentElement, {
432
- attributes: true,
433
- attributeFilter: ["style"],
434
- childList: true
435
- });
436
- if (document.body) {
437
- observer.observe(document.body, {
438
- attributes: true,
439
- attributeFilter: ["style"]
440
- });
441
- }
442
- }
443
- function installBrandThemeLock() {
444
- if (typeof document === "undefined") return;
445
- bindObserver();
446
- if (!document.body && !waitingForBody) {
447
- waitingForBody = true;
448
- document.addEventListener(
449
- "DOMContentLoaded",
450
- () => {
451
- waitingForBody = false;
452
- bindObserver();
453
- },
454
- { once: true }
455
- );
456
- }
457
- }
458
-
459
- export { AUDIT_STATUS_MAP, BRAND_THEME_TOKENS, ENABLE_STATUS_MAP, RATING_LEVEL_COLORS, VERIFY_STATUS_MAP, clearColumnAutoMap, defineColumns, getColumnAutoMap, installBrandThemeLock, registerColumnAutoMap, registerColumnAutoMaps, registerDictColorMap, registerDictColorMaps, renderAuditStatus, renderBadge, renderClassifyTag, renderCountBadge, renderDangerText, renderDictClassifyTag, renderEnableStatus, renderOps, renderRatingLevel, renderTagNode, renderTagSlot, renderVerifyStatus, setDictResolver };
331
+ export { AUDIT_STATUS_MAP, ENABLE_STATUS_MAP, RATING_LEVEL_COLORS, VERIFY_STATUS_MAP, clearColumnAutoMap, defineColumns, getColumnAutoMap, registerColumnAutoMap, registerColumnAutoMaps, registerDictColorMap, registerDictColorMaps, renderAuditStatus, renderBadge, renderClassifyTag, renderCountBadge, renderDangerText, renderDictClassifyTag, renderEnableStatus, renderOps, renderRatingLevel, renderTagNode, renderTagSlot, renderVerifyStatus, setDictResolver };
@@ -0,0 +1,129 @@
1
+ // runtime/theme-lock.ts
2
+ var BRAND_THEME_TOKENS = Object.freeze({
3
+ "--el-color-primary": "#002a8f",
4
+ "--el-color-primary-rgb": "0, 42, 143",
5
+ "--el-color-primary-light-1": "#1a3f9a",
6
+ "--el-color-primary-light-2": "#3355a5",
7
+ "--el-color-primary-light-3": "#4d6ab1",
8
+ "--el-color-primary-light-4": "#667fbc",
9
+ "--el-color-primary-light-5": "#8094c7",
10
+ "--el-color-primary-light-6": "#99aad2",
11
+ "--el-color-primary-light-7": "#b2bfdd",
12
+ "--el-color-primary-light-8": "#ccd4e9",
13
+ "--el-color-primary-light-9": "#e5eaf4",
14
+ "--el-color-primary-dark-1": "#002681",
15
+ "--el-color-primary-dark-2": "#002272",
16
+ "--el-color-primary-dark-3": "#001d64",
17
+ "--el-color-primary-dark-4": "#001956",
18
+ "--el-color-success": "#2bb268",
19
+ "--el-color-success-light-1": "#40ba77",
20
+ "--el-color-success-light-2": "#55c286",
21
+ "--el-color-success-light-3": "#6bcb95",
22
+ "--el-color-success-light-4": "#80d3a4",
23
+ "--el-color-success-light-5": "#95dbb4",
24
+ "--el-color-success-light-6": "#aae3c3",
25
+ "--el-color-success-light-7": "#bfebd2",
26
+ "--el-color-success-light-8": "#d5f4e1",
27
+ "--el-color-success-light-9": "#eaf9f0",
28
+ "--el-color-success-dark-1": "#229051",
29
+ "--el-color-success-dark-2": "#1b733f",
30
+ "--el-color-success-dark-3": "#14562f",
31
+ "--el-color-success-dark-4": "#0d3a20",
32
+ "--el-color-warning": "#ea9a13",
33
+ "--el-color-warning-light-1": "#eca42b",
34
+ "--el-color-warning-light-2": "#efae42",
35
+ "--el-color-warning-light-3": "#f1b85a",
36
+ "--el-color-warning-light-4": "#f3c171",
37
+ "--el-color-warning-light-5": "#f5cb89",
38
+ "--el-color-warning-light-6": "#f7d5a1",
39
+ "--el-color-warning-light-7": "#f9dfb8",
40
+ "--el-color-warning-light-8": "#fce8d0",
41
+ "--el-color-warning-light-9": "#fef2e7",
42
+ "--el-color-warning-dark-1": "#c47f0e",
43
+ "--el-color-warning-dark-2": "#9d650a",
44
+ "--el-color-warning-dark-3": "#754a07",
45
+ "--el-color-warning-dark-4": "#4e3004",
46
+ "--el-color-danger": "#bb2d3f",
47
+ "--el-color-danger-light-1": "#c34253",
48
+ "--el-color-danger-light-2": "#ca5766",
49
+ "--el-color-danger-light-3": "#d16b78",
50
+ "--el-color-danger-light-4": "#d8808b",
51
+ "--el-color-danger-light-5": "#dd969f",
52
+ "--el-color-danger-light-6": "#e4abb2",
53
+ "--el-color-danger-light-7": "#e8c0c5",
54
+ "--el-color-danger-light-8": "#f0d5d9",
55
+ "--el-color-danger-light-9": "#f7eaec",
56
+ "--el-color-danger-dark-1": "#962433",
57
+ "--el-color-danger-dark-2": "#711b26",
58
+ "--el-color-danger-dark-3": "#4b1219",
59
+ "--el-color-danger-dark-4": "#26090d",
60
+ "--el-color-error": "#bb2d3f",
61
+ "--el-color-error-light-1": "#c34253",
62
+ "--el-color-error-light-2": "#ca5766",
63
+ "--el-color-error-light-3": "#d16b78",
64
+ "--el-color-error-light-4": "#d8808b",
65
+ "--el-color-error-light-5": "#dd969f",
66
+ "--el-color-error-light-6": "#e4abb2",
67
+ "--el-color-error-light-7": "#e8c0c5",
68
+ "--el-color-error-light-8": "#f0d5d9",
69
+ "--el-color-error-light-9": "#f7eaec",
70
+ "--el-color-error-dark-1": "#962433",
71
+ "--el-color-error-dark-2": "#711b26",
72
+ "--el-color-error-dark-3": "#4b1219",
73
+ "--el-color-error-dark-4": "#26090d",
74
+ "--el-border-radius-base": "6px",
75
+ "--el-border-radius-small": "2px",
76
+ "--el-border-radius-round": "20px",
77
+ "--el-border-radius-circle": "100%"
78
+ });
79
+ var observer;
80
+ var waitingForBody = false;
81
+ function enforceOn(target) {
82
+ if (!target) return;
83
+ for (const [name, value] of Object.entries(BRAND_THEME_TOKENS)) {
84
+ if (target.style.getPropertyValue(name).trim().toLowerCase() !== value || target.style.getPropertyPriority(name) !== "important") {
85
+ target.style.setProperty(name, value, "important");
86
+ }
87
+ }
88
+ }
89
+ function bindObserver() {
90
+ if (typeof document === "undefined") return;
91
+ enforceOn(document.documentElement);
92
+ enforceOn(document.body);
93
+ if (typeof MutationObserver === "undefined") return;
94
+ observer ?? (observer = new MutationObserver((mutations) => {
95
+ const bodyChanged = mutations.some((mutation) => mutation.type === "childList");
96
+ enforceOn(document.documentElement);
97
+ enforceOn(document.body);
98
+ if (bodyChanged) bindObserver();
99
+ }));
100
+ observer.disconnect();
101
+ observer.observe(document.documentElement, {
102
+ attributes: true,
103
+ attributeFilter: ["style"],
104
+ childList: true
105
+ });
106
+ if (document.body) {
107
+ observer.observe(document.body, {
108
+ attributes: true,
109
+ attributeFilter: ["style"]
110
+ });
111
+ }
112
+ }
113
+ function installBrandThemeLock() {
114
+ if (typeof document === "undefined") return;
115
+ bindObserver();
116
+ if (!document.body && !waitingForBody) {
117
+ waitingForBody = true;
118
+ document.addEventListener(
119
+ "DOMContentLoaded",
120
+ () => {
121
+ waitingForBody = false;
122
+ bindObserver();
123
+ },
124
+ { once: true }
125
+ );
126
+ }
127
+ }
128
+
129
+ export { BRAND_THEME_TOKENS, installBrandThemeLock };