@agile-team/wl-skills-ui 1.9.12 → 1.9.13
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 +16 -0
- package/README.md +12 -4
- package/docs/compat-matrix.md +2 -2
- package/docs/composite-component-contracts.md +8 -0
- package/docs/split-grid-resize.md +68 -0
- package/docs/visual-regression.md +2 -0
- package/es/auto.js +1 -1
- package/es/{chunk-Z2OTWMW6.js → chunk-QLPJLXY6.js} +178 -1
- package/es/common-preset.js +1 -1
- package/es/index.d.ts +12 -2
- package/es/index.js +1 -1
- package/package.json +1 -1
- package/skills/element/el-form/SKILL.md +3 -0
- package/skills/vendors/jh-components/SKILL.md +3 -1
- package/standards/component-structures.json +93 -0
- package/styles/element/_form.scss +125 -0
- package/styles/vendors/_base-components.scss +17 -0
- package/styles/vendors/_jh-drag-row.scss +35 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,22 @@ 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.13] - 2026-08-07
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- 新增 `runtime/split-grid-resize` 分屏表格尺寸守护:只观察 `jh-drag-row` 的直接 pane,支持动态路由晚挂载,连续 Resize 按动画帧合并,并向 grid host 派发局部 `wl-ui:split-grid-resize` 事件。
|
|
12
|
+
- 复合结构清单新增 Element Plus input-group 新旧 DOM 与 common-core drag-row/AG Grid 契约,并补充 Node 行为测试和真实浏览器回归。
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- 修复带 prefix/append 的输入框主体与右侧图标高度、圆角、边框不一致;组合根统一 26px、6px 和五态描边,左右图标统一 14px,纯图标附加段统一 32px,同时兼容旧版 input 直挂和新版 wrapper DOM。
|
|
17
|
+
- 修复上下分屏拖动后 AG Grid 宿主未沿 pane 收缩、上表只被外层 `overflow:hidden` 裁切且缺少内部纵向滚动的问题;只补齐已识别 AG Grid 的 flex 高度链,让 AG Grid 自身 ResizeObserver 完成内部布局。
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- 分屏守护不增加外层滚动条、不广播全局 `window.resize`、不访问 Vue 私有实例或猜测 gridApi;普通分屏、普通表格、非分屏 AG Grid、登录页和显式豁免区域不接管,卸载时清理包内结构标记。
|
|
22
|
+
|
|
7
23
|
## [1.9.12] - 2026-08-06
|
|
8
24
|
|
|
9
25
|
### Added
|
package/README.md
CHANGED
|
@@ -104,8 +104,9 @@ wl-skills-ui/
|
|
|
104
104
|
│ │ ├── common.ts # 通用业务预设(enable/audit/verify + 起步包)
|
|
105
105
|
│ │ └── index.ts
|
|
106
106
|
│ ├── auto.ts # Skin/老项目包级保护自动入口
|
|
107
|
-
│ ├── guards.ts # 主题锁 +
|
|
107
|
+
│ ├── guards.ts # 主题锁 + 长文本 + 分屏表格尺寸保护聚合
|
|
108
108
|
│ ├── overflow-tooltip.ts # 普通表格真实溢出 Tooltip 兜底
|
|
109
|
+
│ ├── split-grid-resize.ts # jh-drag-row 内 AG Grid Resize/高度链守护
|
|
109
110
|
│ └── index.ts # 公共 API 入口
|
|
110
111
|
│
|
|
111
112
|
├── scanner/ # 自动化扫描 / 修复
|
|
@@ -212,7 +213,7 @@ yarn add @agile-team/wl-skills-ui
|
|
|
212
213
|
|---|---|---|
|
|
213
214
|
| `element-plus` | **`2.2.6-prod.3`** | 集团 jh- 定制版;EP 2.3.0 起引入 `.el-input__wrapper`,与 jh-ui 3.x 不兼容 |
|
|
214
215
|
| `@jhlc/jh-ui` | **`3.1.0`** | SCSS 皮肤包,`.com-text` label 包裹 + `.has-colon` 冒号注入(wl-skills-ui 已统一屏蔽表单冒号) |
|
|
215
|
-
| `@agile-team/wl-skills-ui` | `^1.9.
|
|
216
|
+
| `@agile-team/wl-skills-ui` | `^1.9.13` | 已对齐上述组合的 DOM 假设、客户主题锁、圆角契约、input-group 附加段、分屏 AG Grid 重布局、表格长文本兜底与定制页边界 |
|
|
216
217
|
|
|
217
218
|
三种识别方式,任选其一:
|
|
218
219
|
|
|
@@ -226,7 +227,14 @@ yarn add @agile-team/wl-skills-ui
|
|
|
226
227
|
|
|
227
228
|
## 版本亮点
|
|
228
229
|
|
|
229
|
-
当前 v1.9.
|
|
230
|
+
当前 v1.9.13:
|
|
231
|
+
|
|
232
|
+
- **输入附加段不再割裂**:`el-input-group` 由组合根统一 26px 高度、6px 外圆角和 default/hover/focus/error/disabled 描边;左侧 prefix、右侧 append 图标统一 14px,纯图标附加段 32px,文字/单位/按钮仍按内容宽度。
|
|
233
|
+
- **新旧 DOM 同时覆盖**:兼容 jh-ui 配套旧版 input 直挂结构和新版 `.el-input__wrapper` 结构,内部输入不再重复描边;普通 input、普通按钮、登录页和显式豁免区保持原行为。
|
|
234
|
+
- **分屏表格真正重布局**:`runtime/auto` 只观察 `jh-drag-row` 内真实 AG Grid pane,补齐可收缩高度链并按帧派发局部重布局事件;AG Grid 自身 ResizeObserver 生成内部滚动条,不给外层加滚动条、不广播全局 resize、不访问 Vue 私有实例。
|
|
235
|
+
- **回归边界闭环**:结构清单新增 input-group 新旧 DOM 与 drag-row/AG Grid 契约;Node 行为测试覆盖动态挂载、批量 Resize、豁免区,真实浏览器验证附加段计算样式及 220px→120px 收缩后的内部滚动。
|
|
236
|
+
|
|
237
|
+
上一版 v1.9.12:
|
|
230
238
|
|
|
231
239
|
- **复合结构有清单**:`standards/component-structures.json` 登记边框所有者、内部无描边层、高度策略、状态与 Teleport 出口;首批覆盖 common-core 多标签、人员/部门/树选择、多选、混合数字框及 BaseToolbar 分裂按钮。
|
|
232
240
|
- **未知结构先评审**:新增 R040,对疑似复合 Element wrapper 只报告、不自动修复,要求先核对真实 DOM 并登记契约,禁止继续放大普通 Element 选择器。
|
|
@@ -403,7 +411,7 @@ npx wl-ui init --mode native
|
|
|
403
411
|
// 4. src/main.ts
|
|
404
412
|
import { installCommonPreset } from "@agile-team/wl-skills-ui/runtime/common-preset";
|
|
405
413
|
installCommonPreset();
|
|
406
|
-
//
|
|
414
|
+
// 已包含主题锁、普通表格长文本和分屏 AG Grid 尺寸保护,无需重复引入 runtime/auto。
|
|
407
415
|
```
|
|
408
416
|
|
|
409
417
|
```vue
|
package/docs/compat-matrix.md
CHANGED
|
@@ -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.
|
|
14
|
+
| `@agile-team/wl-skills-ui` | `^1.9.13` | 已对齐 jh-ui 3.1.0 + EP 2.2.6-prod.3 的 DOM 假设、客户主题锁、6px 基础圆角、紧凑表单、input-group 附加段、分屏 AG Grid 重布局、复合结构契约、表格长文本提示与定制页边界 |
|
|
15
15
|
|
|
16
16
|
## 项目集群当前实测
|
|
17
17
|
|
|
@@ -35,7 +35,7 @@
|
|
|
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.
|
|
38
|
+
- 集团内项目:**统一锚定 `element-plus@2.2.6-prod.3` + `@jhlc/jh-ui@3.1.0`**,与 wl-skills-ui v1.9.13 三方对齐。
|
|
39
39
|
- Skin 项目除全局样式外,在 `main.ts` 引入一次 `@agile-team/wl-skills-ui/runtime/auto`;Native 项目的 `installCommonPreset()` 已包含相同包级保护,不要重复安装。
|
|
40
40
|
- 升级 `element-plus` 到 2.3+ 前,必须同步升级 `@jhlc/jh-ui` 到对应支持版本,否则 `.com-text` / `.el-input__inner` DOM 与 EP `__wrapper` 体系不兼容。
|
|
41
41
|
- 新项目接入:见 README 「快速接入」章节,默认会按本表声明 peerDependency 范围。
|
|
@@ -38,6 +38,14 @@ wrapper 时,应先按上述流程确认,不能直接扩大全局 Element 选
|
|
|
38
38
|
- 部门选择、树选择和 Element 多选封装。
|
|
39
39
|
- 同节点 wrapper + 子 wrapper 的混合数字输入。
|
|
40
40
|
- BaseToolbar 分裂按钮及其动作菜单 Teleport 出口。
|
|
41
|
+
- Element Plus 新旧两种 input-group prepend/append DOM:组合根负责唯一外轮廓,
|
|
42
|
+
输入主体与附加段统一 26px,纯图标附加段 32px、图标 14px。
|
|
43
|
+
- common-core `jh-drag-row + BaseTable/AG Grid` 高度链:只在真实分屏 AG Grid 中
|
|
44
|
+
补齐可收缩结构并通知表格内部重布局。
|
|
41
45
|
|
|
42
46
|
组件结构变化时,测试会先在 fixture/selector 契约处失败,从而把风险阻断在发版前,
|
|
43
47
|
不会等十余个业务项目升级后再发现。
|
|
48
|
+
|
|
49
|
+
input-group 附加段保留文字、单位、按钮的内容驱动宽度,只有“直接子节点为唯一
|
|
50
|
+
`.el-icon`”时才使用 32px 紧凑宽度;普通 input、普通按钮和非 input-group 不命中。
|
|
51
|
+
分屏重布局的运行机制与接入方式见 `docs/split-grid-resize.md`。
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# 上下分屏 AG Grid 尺寸重布局
|
|
2
|
+
|
|
3
|
+
## 问题与边界
|
|
4
|
+
|
|
5
|
+
`jh-drag-row` 的 `.drager_top/.drager_bottom` 使用 `overflow:hidden` 隔离上下区域。
|
|
6
|
+
拖动分隔条后,如果 BaseTable/AG Grid 宿主没有沿 flex 高度链一起收缩,外层只会裁切
|
|
7
|
+
旧尺寸表格,上表内部不会得到新的 viewport 高度,也就看不到应有的纵向滚动条。
|
|
8
|
+
|
|
9
|
+
本方案只治理以下同时成立的结构:
|
|
10
|
+
|
|
11
|
+
- 根节点是 `.drager_row`;
|
|
12
|
+
- 直接 pane 是 `.drager_top` 或 `.drager_bottom`;
|
|
13
|
+
- pane 内真实存在 `.ag-grid-table` 或 `.ag-root-wrapper`;
|
|
14
|
+
- 不在 `.lp-root`、`.session-login`、`.wl-ui-skin-exempt`、
|
|
15
|
+
`[data-wl-ui-skin="off"]` 中。
|
|
16
|
+
|
|
17
|
+
普通分屏内容、Element Table、非分屏 AG Grid 和定制区域均不接管。
|
|
18
|
+
|
|
19
|
+
## 实现机制
|
|
20
|
+
|
|
21
|
+
1. `runtime/auto` 安装 `ResizeObserver`,只观察已识别分屏的两个直接 pane。
|
|
22
|
+
2. 动态路由晚挂载的新分屏通过仅监听 `childList` 的 `MutationObserver` 注册;不监听
|
|
23
|
+
全站 style/class 变化,也不扫描每一帧。
|
|
24
|
+
3. 发现 AG Grid 后,为 pane、必要祖先和 grid host 增加包内结构标记;SCSS 只对这些
|
|
25
|
+
标记补 `min-height:0`。当 grid 的直接父级本来就是纵向 flex 时,grid 使用
|
|
26
|
+
`flex:1 1 0 + height:0` 占据剩余空间。
|
|
27
|
+
4. grid host 真实尺寸改变后,AG Grid 自身的 `ResizeObserver` 完成布局计算并让内部
|
|
28
|
+
`.ag-body-viewport` 生成滚动条。
|
|
29
|
+
5. 同一动画帧内的连续 Resize 会合并,并在 grid host 上派发局部
|
|
30
|
+
`wl-ui:split-grid-resize` 事件,供特殊平台封装按需调用公开 grid API。
|
|
31
|
+
|
|
32
|
+
本实现不会给 `.drager_top/.drager_bottom` 增加 `overflow:auto`,不会访问 Vue 私有实例,
|
|
33
|
+
不会遍历或猜测 `gridApi`,也不会广播全局 `window.resize`。卸载守护时,本包增加的结构
|
|
34
|
+
标记会一并清理。
|
|
35
|
+
|
|
36
|
+
## 接入
|
|
37
|
+
|
|
38
|
+
Skin 项目必须同时接入样式与一次运行时保护:
|
|
39
|
+
|
|
40
|
+
```scss
|
|
41
|
+
@use "@agile-team/wl-skills-ui/styles/presets/skin" as *;
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
import "@agile-team/wl-skills-ui/runtime/auto";
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Native 项目调用 `installCommonPreset()` 即可,它已经包含相同守护,不要重复引入
|
|
49
|
+
`runtime/auto`。
|
|
50
|
+
|
|
51
|
+
平台封装若确实还需要主动调用 `api.doLayout()`,可选监听局部事件:
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
gridHost.addEventListener("wl-ui:split-grid-resize", () => {
|
|
55
|
+
gridApi.doLayout?.();
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
常规 AG Grid 无需业务代码监听;宿主尺寸变化已经会触发它自己的 ResizeObserver。
|
|
60
|
+
|
|
61
|
+
## 验收
|
|
62
|
+
|
|
63
|
+
- 拖动前后 `.drager_top/.drager_bottom` 仍为 `overflow:hidden`。
|
|
64
|
+
- `.ag-grid-table` 的实际高度随 pane 收缩,并带
|
|
65
|
+
`data-wl-ui-split-grid-host`。
|
|
66
|
+
- `.ag-body-viewport` 的 `scrollHeight > clientHeight` 时出现内部纵向滚动条。
|
|
67
|
+
- 分屏外的 AG Grid、普通表格、登录页和显式豁免区无新增结构标记。
|
|
68
|
+
- `npm run test:visual` 中“上下分屏收缩后由 AG Grid 内部 viewport 滚动”通过。
|
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
- textarea focus 品牌边框与轻焦点环。
|
|
14
14
|
- 数字输入只有一个边框所有者。
|
|
15
15
|
- common-core 复合多标签外壳自然增高、内层无双描边。
|
|
16
|
+
- input-group 输入主体、前后附加段、左右图标的统一高度/尺寸/圆角与 focus 描边。
|
|
17
|
+
- jh-drag-row 收缩后 AG Grid host 跟随变高,纵向滚动只发生在内部 viewport。
|
|
16
18
|
- Element Table 长文本真实溢出、省略号与按需完整提示。
|
|
17
19
|
- 表格选中行柔和状态色、BaseToolbar 分裂按钮与定制区域豁免。
|
|
18
20
|
|
package/es/auto.js
CHANGED
|
@@ -232,10 +232,187 @@ function uninstallOverflowTooltipGuard() {
|
|
|
232
232
|
installedOptions = DEFAULT_OPTIONS;
|
|
233
233
|
}
|
|
234
234
|
|
|
235
|
+
// runtime/split-grid-resize.ts
|
|
236
|
+
var SPLIT_ROOT_SELECTOR = ".drager_row";
|
|
237
|
+
var SPLIT_PANE_SELECTOR = ".drager_top, .drager_bottom";
|
|
238
|
+
var GRID_SELECTOR = ".ag-grid-table, .ag-root-wrapper";
|
|
239
|
+
var EXEMPT_SELECTOR = ".lp-root, .session-login, .wl-ui-skin-exempt, [data-wl-ui-skin='off']";
|
|
240
|
+
var SPLIT_GRID_RESIZE_EVENT = "wl-ui:split-grid-resize";
|
|
241
|
+
var installed = false;
|
|
242
|
+
var resizeObserver = null;
|
|
243
|
+
var mutationObserver = null;
|
|
244
|
+
var observedPanes = /* @__PURE__ */ new WeakSet();
|
|
245
|
+
var pendingPanes = /* @__PURE__ */ new Set();
|
|
246
|
+
var addedMarkers = /* @__PURE__ */ new Map();
|
|
247
|
+
var frameId = null;
|
|
248
|
+
function addMarker(element, name) {
|
|
249
|
+
if (element.hasAttribute(name)) return;
|
|
250
|
+
element.setAttribute(name, "");
|
|
251
|
+
const names = addedMarkers.get(element) ?? /* @__PURE__ */ new Set();
|
|
252
|
+
names.add(name);
|
|
253
|
+
addedMarkers.set(element, names);
|
|
254
|
+
}
|
|
255
|
+
function removeOwnedMarker(element, name) {
|
|
256
|
+
const names = addedMarkers.get(element);
|
|
257
|
+
if (!names?.has(name)) return;
|
|
258
|
+
element.removeAttribute(name);
|
|
259
|
+
names.delete(name);
|
|
260
|
+
if (names.size === 0) addedMarkers.delete(element);
|
|
261
|
+
}
|
|
262
|
+
function isManagedSplitRoot(element) {
|
|
263
|
+
return element instanceof window.HTMLElement && element.matches(SPLIT_ROOT_SELECTOR) && !element.closest(EXEMPT_SELECTOR);
|
|
264
|
+
}
|
|
265
|
+
function getGridHosts(pane) {
|
|
266
|
+
const hosts = /* @__PURE__ */ new Set();
|
|
267
|
+
for (const element of Array.from(
|
|
268
|
+
pane.querySelectorAll(GRID_SELECTOR)
|
|
269
|
+
)) {
|
|
270
|
+
const agGridTable = element.closest(".ag-grid-table");
|
|
271
|
+
if (agGridTable && pane.contains(agGridTable)) {
|
|
272
|
+
hosts.add(agGridTable);
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
if (element.matches(".ag-root-wrapper")) {
|
|
276
|
+
hosts.add(element);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return [...hosts];
|
|
280
|
+
}
|
|
281
|
+
function markHeightChain(pane, gridHost) {
|
|
282
|
+
addMarker(pane, "data-wl-ui-split-pane");
|
|
283
|
+
addMarker(gridHost, "data-wl-ui-split-grid-host");
|
|
284
|
+
let parent = gridHost.parentElement;
|
|
285
|
+
while (parent && parent !== pane) {
|
|
286
|
+
addMarker(parent, "data-wl-ui-split-grid-chain");
|
|
287
|
+
parent = parent.parentElement;
|
|
288
|
+
}
|
|
289
|
+
const directParent = gridHost.parentElement;
|
|
290
|
+
if (!directParent) return;
|
|
291
|
+
const style = window.getComputedStyle(directParent);
|
|
292
|
+
if ((style.display === "flex" || style.display === "inline-flex") && style.flexDirection === "column") {
|
|
293
|
+
addMarker(directParent, "data-wl-ui-split-grid-flex-parent");
|
|
294
|
+
} else {
|
|
295
|
+
removeOwnedMarker(directParent, "data-wl-ui-split-grid-flex-parent");
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
function notifyPane(pane) {
|
|
299
|
+
const hosts = getGridHosts(pane);
|
|
300
|
+
if (hosts.length === 0) return;
|
|
301
|
+
for (const host of hosts) {
|
|
302
|
+
markHeightChain(pane, host);
|
|
303
|
+
const { height, width } = host.getBoundingClientRect();
|
|
304
|
+
host.dispatchEvent(
|
|
305
|
+
new window.CustomEvent(SPLIT_GRID_RESIZE_EVENT, {
|
|
306
|
+
bubbles: true,
|
|
307
|
+
detail: { height, pane, width }
|
|
308
|
+
})
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
function flushPendingPanes() {
|
|
313
|
+
frameId = null;
|
|
314
|
+
const panes = [...pendingPanes];
|
|
315
|
+
pendingPanes.clear();
|
|
316
|
+
for (const pane of panes) notifyPane(pane);
|
|
317
|
+
}
|
|
318
|
+
function schedulePane(pane) {
|
|
319
|
+
if (!pane.isConnected || !pane.querySelector(GRID_SELECTOR)) return;
|
|
320
|
+
pendingPanes.add(pane);
|
|
321
|
+
if (frameId !== null) return;
|
|
322
|
+
frameId = window.requestAnimationFrame(flushPendingPanes);
|
|
323
|
+
}
|
|
324
|
+
function registerSplitRoot(root) {
|
|
325
|
+
for (const pane of Array.from(
|
|
326
|
+
root.querySelectorAll(SPLIT_PANE_SELECTOR)
|
|
327
|
+
)) {
|
|
328
|
+
if (pane.parentElement !== root) continue;
|
|
329
|
+
if (!observedPanes.has(pane)) {
|
|
330
|
+
observedPanes.add(pane);
|
|
331
|
+
resizeObserver?.observe(pane);
|
|
332
|
+
}
|
|
333
|
+
schedulePane(pane);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
function scanNode(node) {
|
|
337
|
+
if (!(node instanceof window.Element)) return;
|
|
338
|
+
if (isManagedSplitRoot(node)) registerSplitRoot(node);
|
|
339
|
+
for (const root of Array.from(
|
|
340
|
+
node.querySelectorAll(SPLIT_ROOT_SELECTOR)
|
|
341
|
+
)) {
|
|
342
|
+
if (isManagedSplitRoot(root)) registerSplitRoot(root);
|
|
343
|
+
}
|
|
344
|
+
const containingRoot = node.closest(SPLIT_ROOT_SELECTOR);
|
|
345
|
+
if (containingRoot && isManagedSplitRoot(containingRoot)) {
|
|
346
|
+
registerSplitRoot(containingRoot);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
function scanDocument() {
|
|
350
|
+
for (const root of Array.from(
|
|
351
|
+
document.querySelectorAll(SPLIT_ROOT_SELECTOR)
|
|
352
|
+
)) {
|
|
353
|
+
if (isManagedSplitRoot(root)) registerSplitRoot(root);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
function handleDragEnd(event) {
|
|
357
|
+
const { target } = event;
|
|
358
|
+
if (!(target instanceof window.Element)) return;
|
|
359
|
+
const root = target.closest(SPLIT_ROOT_SELECTOR);
|
|
360
|
+
if (!root || !isManagedSplitRoot(root)) return;
|
|
361
|
+
registerSplitRoot(root);
|
|
362
|
+
}
|
|
363
|
+
function installSplitGridResizeGuard() {
|
|
364
|
+
if (installed || typeof window === "undefined" || typeof document === "undefined") {
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
installed = true;
|
|
368
|
+
if (typeof window.ResizeObserver !== "undefined") {
|
|
369
|
+
resizeObserver = new window.ResizeObserver((entries) => {
|
|
370
|
+
for (const entry of entries) {
|
|
371
|
+
if (entry.target instanceof window.HTMLElement) schedulePane(entry.target);
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
if (document.body && typeof window.MutationObserver !== "undefined") {
|
|
376
|
+
mutationObserver = new window.MutationObserver((records) => {
|
|
377
|
+
for (const record of records) {
|
|
378
|
+
for (const node of Array.from(record.addedNodes)) scanNode(node);
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
mutationObserver.observe(document.body, { childList: true, subtree: true });
|
|
382
|
+
}
|
|
383
|
+
document.addEventListener("mouseup", handleDragEnd, true);
|
|
384
|
+
document.addEventListener("touchend", handleDragEnd, true);
|
|
385
|
+
if (document.readyState === "loading") {
|
|
386
|
+
document.addEventListener("DOMContentLoaded", scanDocument, { once: true });
|
|
387
|
+
} else {
|
|
388
|
+
scanDocument();
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
function uninstallSplitGridResizeGuard() {
|
|
392
|
+
if (!installed) return;
|
|
393
|
+
installed = false;
|
|
394
|
+
resizeObserver?.disconnect();
|
|
395
|
+
mutationObserver?.disconnect();
|
|
396
|
+
resizeObserver = null;
|
|
397
|
+
mutationObserver = null;
|
|
398
|
+
observedPanes = /* @__PURE__ */ new WeakSet();
|
|
399
|
+
pendingPanes.clear();
|
|
400
|
+
for (const [element, names] of addedMarkers) {
|
|
401
|
+
for (const name of names) element.removeAttribute(name);
|
|
402
|
+
}
|
|
403
|
+
addedMarkers = /* @__PURE__ */ new Map();
|
|
404
|
+
if (frameId !== null) window.cancelAnimationFrame(frameId);
|
|
405
|
+
frameId = null;
|
|
406
|
+
document.removeEventListener("mouseup", handleDragEnd, true);
|
|
407
|
+
document.removeEventListener("touchend", handleDragEnd, true);
|
|
408
|
+
document.removeEventListener("DOMContentLoaded", scanDocument);
|
|
409
|
+
}
|
|
410
|
+
|
|
235
411
|
// runtime/guards.ts
|
|
236
412
|
function installUiRuntimeGuards() {
|
|
237
413
|
installBrandThemeLock();
|
|
238
414
|
installOverflowTooltipGuard();
|
|
415
|
+
installSplitGridResizeGuard();
|
|
239
416
|
}
|
|
240
417
|
|
|
241
|
-
export { installOverflowTooltipGuard, installUiRuntimeGuards, uninstallOverflowTooltipGuard };
|
|
418
|
+
export { SPLIT_GRID_RESIZE_EVENT, installOverflowTooltipGuard, installSplitGridResizeGuard, installUiRuntimeGuards, uninstallOverflowTooltipGuard, uninstallSplitGridResizeGuard };
|
package/es/common-preset.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { installUiRuntimeGuards } from './chunk-
|
|
1
|
+
import { installUiRuntimeGuards } from './chunk-QLPJLXY6.js';
|
|
2
2
|
import { renderTagNode, renderClassifyTag, registerColumnAutoMaps, renderRatingLevel, renderBadge } from './chunk-4IOYRBW4.js';
|
|
3
3
|
export { registerDictColorMap, registerDictColorMaps, renderDictClassifyTag, setDictResolver } from './chunk-4IOYRBW4.js';
|
|
4
4
|
import './chunk-Q3N5QNRZ.js';
|
package/es/index.d.ts
CHANGED
|
@@ -180,10 +180,20 @@ declare function installOverflowTooltipGuard(options?: OverflowTooltipGuardOptio
|
|
|
180
180
|
/** 卸载兜底监听,主要供微前端销毁和回归测试使用。 */
|
|
181
181
|
declare function uninstallOverflowTooltipGuard(): void;
|
|
182
182
|
|
|
183
|
+
declare const SPLIT_GRID_RESIZE_EVENT = "wl-ui:split-grid-resize";
|
|
184
|
+
interface SplitGridResizeDetail {
|
|
185
|
+
height: number;
|
|
186
|
+
pane: HTMLElement;
|
|
187
|
+
width: number;
|
|
188
|
+
}
|
|
189
|
+
declare function installSplitGridResizeGuard(): void;
|
|
190
|
+
declare function uninstallSplitGridResizeGuard(): void;
|
|
191
|
+
|
|
183
192
|
/**
|
|
184
193
|
* 安装不依赖业务页面写法的包级运行时保护。
|
|
185
|
-
*
|
|
194
|
+
* 包含客户主题锁、普通表格长文本溢出提示兜底与分屏 AG Grid 尺寸守护;
|
|
195
|
+
* 重复调用安全。
|
|
186
196
|
*/
|
|
187
197
|
declare function installUiRuntimeGuards(): void;
|
|
188
198
|
|
|
189
|
-
export { BRAND_THEME_TOKENS, ColumnLike, type OverflowTooltipGuardOptions, type PresetConfig, clearColumnAutoMap, createPreset, defineColumns, getColumnAutoMap, getInstalledPresets, installBrandThemeLock, installOverflowTooltipGuard, installPreset, installUiRuntimeGuards, registerColumnAutoMap, registerColumnAutoMaps, uninstallOverflowTooltipGuard };
|
|
199
|
+
export { BRAND_THEME_TOKENS, ColumnLike, type OverflowTooltipGuardOptions, type PresetConfig, SPLIT_GRID_RESIZE_EVENT, type SplitGridResizeDetail, clearColumnAutoMap, createPreset, defineColumns, getColumnAutoMap, getInstalledPresets, installBrandThemeLock, installOverflowTooltipGuard, installPreset, installSplitGridResizeGuard, installUiRuntimeGuards, registerColumnAutoMap, registerColumnAutoMaps, uninstallOverflowTooltipGuard, uninstallSplitGridResizeGuard };
|
package/es/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { installOverflowTooltipGuard, installUiRuntimeGuards, uninstallOverflowTooltipGuard } from './chunk-
|
|
1
|
+
export { SPLIT_GRID_RESIZE_EVENT, installOverflowTooltipGuard, installSplitGridResizeGuard, installUiRuntimeGuards, uninstallOverflowTooltipGuard, uninstallSplitGridResizeGuard } from './chunk-QLPJLXY6.js';
|
|
2
2
|
import { registerColumnAutoMaps } from './chunk-4IOYRBW4.js';
|
|
3
3
|
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 } from './chunk-4IOYRBW4.js';
|
|
4
4
|
export { BRAND_THEME_TOKENS, installBrandThemeLock } from './chunk-Q3N5QNRZ.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agile-team/wl-skills-ui",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.13",
|
|
4
4
|
"description": "企业级 UI 风格对齐框架 — Vue + Element Plus 项目通用化妆/原生双模式(tokens / element / vendors / layouts / runtime / scanner / fixer / skills)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./es/index.js",
|
|
@@ -67,6 +67,9 @@ el-date-picker 默认宽度不会自动撑满 el-form-item,必须显式设置
|
|
|
67
67
|
平台默认阴影。
|
|
68
68
|
- 数字输入框必须同时检查社区版“wrapper 子节点”和 jh-ui“wrapper 与
|
|
69
69
|
input-number 同节点”两种 DOM,并确保只存在一层可见边框。
|
|
70
|
+
- 带 prepend/append 的 input-group 必须由组合根绘制唯一外轮廓;输入主体、附加段
|
|
71
|
+
统一 26px,左右图标统一 14px。纯图标附加段使用 32px,文字/单位/按钮保持内容宽度。
|
|
72
|
+
不允许业务页分别给 `.el-input__inner` 与 `.el-input-group__append` 写不同高度。
|
|
70
73
|
- 登录页和显式定制页继续使用自身样式,不套用上述高权重规则。
|
|
71
74
|
|
|
72
75
|
---
|
|
@@ -49,7 +49,8 @@ applyTo: "**/*.vue"
|
|
|
49
49
|
|
|
50
50
|
- ❌ 自行给 `.jh-tree` 写颜色覆盖(应用全局 `vendors/_jh-tree.scss`)
|
|
51
51
|
- ❌ jh-drag-col 内自定义 padding 破坏拖拽条对齐
|
|
52
|
-
- ❌ jh-drag-row
|
|
52
|
+
- ❌ jh-drag-row 上下分栏缺可收缩高度链,拖动后仅靠 pane 的 `overflow:hidden` 裁切 AG Grid;必须接入 `runtime/auto`,由 ResizeObserver 通知表格内部重布局,禁止给外层随意加滚动条
|
|
53
|
+
- ❌ 页面自行重画 `.slider_row`;手柄必须统一使用 `_jh-drag-row.scss` 的细分隔线 + 三点胶囊
|
|
53
54
|
- ❌ jh-pagination 未对齐到右侧(同 R011)
|
|
54
55
|
- ❌ jh-form 内不用 `size="small"` 控件(同 R006)
|
|
55
56
|
- ❌ 发现新的复杂 `<jh-*>` 组件后只在页面局部写补丁,而不沉淀到 L2 Project Vendors
|
|
@@ -65,6 +66,7 @@ applyTo: "**/*.vue"
|
|
|
65
66
|
### B 类
|
|
66
67
|
|
|
67
68
|
- 直接全局覆盖 `.jh-*` → 改为引入 `wl-skills-ui/styles` 由 vendors 层处理
|
|
69
|
+
- `jh-drag-row + AG Grid` → Skin 项目除样式外在启动入口引入一次 `@agile-team/wl-skills-ui/runtime/auto`;Native 项目使用 `installCommonPreset()`,详见 `docs/split-grid-resize.md`
|
|
68
70
|
- 新的复杂 `<jh-*>` 组件 → 先判断是否只是 Element Plus 薄封装;若不是,应新增 `styles/vendors/_jh-xxx.scss` 和对应 Skill/检测规则
|
|
69
71
|
|
|
70
72
|
## 全局样式来源
|
|
@@ -215,6 +215,99 @@
|
|
|
215
215
|
"open"
|
|
216
216
|
],
|
|
217
217
|
"risk": "主动作和箭头是两个交互区但必须共享一个视觉外轮廓;下拉菜单中的业务按钮需扁平化且不能污染普通菜单。"
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
"id": "element-plus.input-group-affixes",
|
|
221
|
+
"vendor": "element-plus",
|
|
222
|
+
"family": "form-composite",
|
|
223
|
+
"source": "Element Plus Input prepend/append slot DOM;common-core jh-input 沿用该结构",
|
|
224
|
+
"fixture": "scanner/__tests__/component-fixtures/element-input-group-affixes.html",
|
|
225
|
+
"rootSelector": ".el-input.el-input-group",
|
|
226
|
+
"ownerSelector": ".el-input.el-input-group",
|
|
227
|
+
"innerBorderlessSelectors": [
|
|
228
|
+
".el-input.el-input-group > .el-input__wrapper"
|
|
229
|
+
],
|
|
230
|
+
"knownRootClasses": [
|
|
231
|
+
"el-input-group"
|
|
232
|
+
],
|
|
233
|
+
"heightPolicy": "fixed-control-height",
|
|
234
|
+
"states": [
|
|
235
|
+
"default",
|
|
236
|
+
"hover",
|
|
237
|
+
"focus",
|
|
238
|
+
"error",
|
|
239
|
+
"disabled"
|
|
240
|
+
],
|
|
241
|
+
"assertions": [
|
|
242
|
+
{
|
|
243
|
+
"target": "root",
|
|
244
|
+
"selector": ".el-input.el-input-group",
|
|
245
|
+
"matches": true
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
"target": "inner",
|
|
249
|
+
"selector": ".el-input.el-input-group > .el-input__wrapper",
|
|
250
|
+
"matches": true
|
|
251
|
+
}
|
|
252
|
+
],
|
|
253
|
+
"risk": "输入主体、prepend/append 和内部图标原本各自携带高度、圆角与描边;必须由组合根统一外轮廓,仅保留内部接缝,避免附加段独立成块。"
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"id": "common-core.drag-row-ag-grid",
|
|
257
|
+
"vendor": "common-core",
|
|
258
|
+
"family": "layout-composite",
|
|
259
|
+
"source": "lowcode-engine/packages/common/common-lowcode/components-core/src/components/drag-row/drag-row.vue + BaseTable renderType=agGrid DOM",
|
|
260
|
+
"fixture": "scanner/__tests__/component-fixtures/common-core-drag-row-ag-grid.html",
|
|
261
|
+
"rootSelector": ".drager_row",
|
|
262
|
+
"ownerSelector": ".drager_row .ag-grid-table",
|
|
263
|
+
"innerBorderlessSelectors": [],
|
|
264
|
+
"knownRootClasses": [
|
|
265
|
+
"drager_row"
|
|
266
|
+
],
|
|
267
|
+
"heightPolicy": "content-driven",
|
|
268
|
+
"states": [
|
|
269
|
+
"initial",
|
|
270
|
+
"dragging",
|
|
271
|
+
"drag-end",
|
|
272
|
+
"container-resize"
|
|
273
|
+
],
|
|
274
|
+
"risk": "分屏 pane 使用 overflow:hidden,拖动后若 AG Grid 宿主没有沿 flex 高度链收缩,只会裁掉旧尺寸内容而不会生成内部纵向滚动条。"
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
"id": "element-plus.input-group-affixes-legacy",
|
|
278
|
+
"vendor": "element-plus",
|
|
279
|
+
"family": "form-composite",
|
|
280
|
+
"source": "jh-ui 3.1.0 配套 Element Plus 2.2.x Input prepend/append 直挂 DOM",
|
|
281
|
+
"fixture": "scanner/__tests__/component-fixtures/element-input-group-affixes-legacy.html",
|
|
282
|
+
"rootSelector": ".el-input.el-input-group",
|
|
283
|
+
"ownerSelector": ".el-input.el-input-group",
|
|
284
|
+
"innerBorderlessSelectors": [
|
|
285
|
+
".el-input.el-input-group > .el-input__inner"
|
|
286
|
+
],
|
|
287
|
+
"knownRootClasses": [
|
|
288
|
+
"el-input-group"
|
|
289
|
+
],
|
|
290
|
+
"heightPolicy": "fixed-control-height",
|
|
291
|
+
"states": [
|
|
292
|
+
"default",
|
|
293
|
+
"hover",
|
|
294
|
+
"focus",
|
|
295
|
+
"error",
|
|
296
|
+
"disabled"
|
|
297
|
+
],
|
|
298
|
+
"assertions": [
|
|
299
|
+
{
|
|
300
|
+
"target": "root",
|
|
301
|
+
"selector": ".el-input.el-input-group",
|
|
302
|
+
"matches": true
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
"target": "inner",
|
|
306
|
+
"selector": ".el-input.el-input-group > .el-input__inner",
|
|
307
|
+
"matches": true
|
|
308
|
+
}
|
|
309
|
+
],
|
|
310
|
+
"risk": "旧 DOM 没有 el-input__wrapper;若只清理新版 wrapper,直挂 input 会保留第二层边框并与 append 高度错位。"
|
|
218
311
|
}
|
|
219
312
|
]
|
|
220
313
|
}
|
|
@@ -75,6 +75,130 @@ html body {
|
|
|
75
75
|
line-height: calc(var(--wk-form-control-height) - 2px) !important;
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
+
// ── 带前/后附加段的输入框 ────────────────────────────────────────────────
|
|
79
|
+
// Element input-group 把输入主体与 append/prepend 分成多个描边节点;平台或
|
|
80
|
+
// 业务局部高度只改其中一段时,就会出现截图中的右侧图标高低、圆角和边框不齐。
|
|
81
|
+
// 仅命中真实 .el-input.el-input-group,由组合根绘制唯一外轮廓,内部只保留分隔线。
|
|
82
|
+
&.el-input.el-input-group {
|
|
83
|
+
display: inline-flex !important;
|
|
84
|
+
align-items: stretch !important;
|
|
85
|
+
height: var(--wk-form-control-height) !important;
|
|
86
|
+
min-height: var(--wk-form-control-height) !important;
|
|
87
|
+
border: 0 !important;
|
|
88
|
+
border-radius: var(--wk-form-control-radius) !important;
|
|
89
|
+
box-sizing: border-box !important;
|
|
90
|
+
overflow: hidden !important;
|
|
91
|
+
background: var(--el-bg-color, #fff) !important;
|
|
92
|
+
box-shadow: 0 0 0 1px var(--el-border-color, #dcdfe6) inset !important;
|
|
93
|
+
transition: box-shadow 0.15s ease !important;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
&.el-input.el-input-group > .el-input__wrapper {
|
|
97
|
+
flex: 1 1 auto !important;
|
|
98
|
+
min-width: 0 !important;
|
|
99
|
+
height: 100% !important;
|
|
100
|
+
min-height: 0 !important;
|
|
101
|
+
border: 0 !important;
|
|
102
|
+
border-radius: 0 !important;
|
|
103
|
+
background: transparent !important;
|
|
104
|
+
box-shadow: none !important;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// jh-ui 配套的 Element Plus 2.2.x 仍可能使用 input 直挂结构。
|
|
108
|
+
&.el-input.el-input-group > .el-input__inner {
|
|
109
|
+
flex: 1 1 auto !important;
|
|
110
|
+
min-width: 0 !important;
|
|
111
|
+
height: 100% !important;
|
|
112
|
+
min-height: 0 !important;
|
|
113
|
+
border: 0 !important;
|
|
114
|
+
border-radius: 0 !important;
|
|
115
|
+
outline: none !important;
|
|
116
|
+
background: transparent !important;
|
|
117
|
+
box-shadow: none !important;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
&.el-input.el-input-group > .el-input-group__prepend,
|
|
121
|
+
&.el-input.el-input-group > .el-input-group__append {
|
|
122
|
+
display: inline-flex !important;
|
|
123
|
+
flex: 0 0 auto !important;
|
|
124
|
+
align-items: center !important;
|
|
125
|
+
justify-content: center !important;
|
|
126
|
+
width: auto !important;
|
|
127
|
+
height: 100% !important;
|
|
128
|
+
min-height: 0 !important;
|
|
129
|
+
padding: 0 8px !important;
|
|
130
|
+
border: 0 !important;
|
|
131
|
+
border-radius: 0 !important;
|
|
132
|
+
box-sizing: border-box !important;
|
|
133
|
+
color: var(--el-text-color-secondary, #909399) !important;
|
|
134
|
+
background: var(--el-fill-color-light, #f5f7fa) !important;
|
|
135
|
+
box-shadow: none !important;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
&.el-input.el-input-group > .el-input-group__prepend {
|
|
139
|
+
box-shadow: -1px 0 0 var(--el-border-color, #dcdfe6) inset !important;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
&.el-input.el-input-group > .el-input-group__append {
|
|
143
|
+
box-shadow: 1px 0 0 var(--el-border-color, #dcdfe6) inset !important;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
&.el-input.el-input-group
|
|
147
|
+
> :where(.el-input-group__prepend, .el-input-group__append):has(
|
|
148
|
+
> .el-icon:only-child
|
|
149
|
+
) {
|
|
150
|
+
flex-basis: 32px !important;
|
|
151
|
+
width: 32px !important;
|
|
152
|
+
padding: 0 !important;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
&.el-input.el-input-group
|
|
156
|
+
> :where(.el-input-group__prepend, .el-input-group__append)
|
|
157
|
+
> .el-icon,
|
|
158
|
+
&.el-input .el-input__prefix-inner > .el-icon,
|
|
159
|
+
&.el-input .el-input__suffix-inner > .el-icon,
|
|
160
|
+
&.el-input .el-input__prefix > .el-icon,
|
|
161
|
+
&.el-input .el-input__suffix > .el-icon {
|
|
162
|
+
width: 14px !important;
|
|
163
|
+
height: 14px !important;
|
|
164
|
+
font-size: 14px !important;
|
|
165
|
+
line-height: 14px !important;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
&.el-input.el-input-group
|
|
169
|
+
> :where(.el-input-group__prepend, .el-input-group__append)
|
|
170
|
+
> .el-button {
|
|
171
|
+
height: 100% !important;
|
|
172
|
+
min-height: 0 !important;
|
|
173
|
+
margin: 0 -8px !important;
|
|
174
|
+
padding: 0 8px !important;
|
|
175
|
+
border: 0 !important;
|
|
176
|
+
border-radius: 0 !important;
|
|
177
|
+
background: transparent !important;
|
|
178
|
+
box-shadow: none !important;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
&.el-input.el-input-group:not(.is-disabled):hover {
|
|
182
|
+
box-shadow: 0 0 0 1px var(--el-border-color-hover, #c0c4cc) inset !important;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
&.el-input.el-input-group:not(.is-disabled):focus-within {
|
|
186
|
+
box-shadow:
|
|
187
|
+
0 0 0 1.5px var(--el-color-primary, #002a8f) inset,
|
|
188
|
+
0 0 0 2px rgba(var(--el-color-primary-rgb, 0, 42, 143), 0.1) !important;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
&.el-input.el-input-group.is-disabled {
|
|
192
|
+
background: var(--el-disabled-bg-color, #f5f7fa) !important;
|
|
193
|
+
box-shadow: 0 0 0 1px var(--el-disabled-border-color, #e4e7ed) inset !important;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
&.el-input.el-input-group.is-disabled
|
|
197
|
+
> :where(.el-input-group__prepend, .el-input-group__append) {
|
|
198
|
+
color: var(--el-disabled-text-color, #a8abb2) !important;
|
|
199
|
+
background: var(--el-disabled-bg-color, #f5f7fa) !important;
|
|
200
|
+
}
|
|
201
|
+
|
|
78
202
|
// common-core / jh-ui 有两种数字框 DOM:
|
|
79
203
|
// A. .el-input-number > .el-input > .el-input__wrapper(社区版)
|
|
80
204
|
// B. .el-input-number.el-input__wrapper > .el-input(jh 同节点 wrapper)
|
|
@@ -217,4 +341,5 @@ html body {
|
|
|
217
341
|
box-shadow:
|
|
218
342
|
0 0 0 2px rgba(var(--el-color-primary-rgb, 0, 42, 143), 0.12) !important;
|
|
219
343
|
}
|
|
344
|
+
|
|
220
345
|
}
|
|
@@ -612,6 +612,23 @@
|
|
|
612
612
|
> .el-input__wrapper {
|
|
613
613
|
box-shadow: none !important;
|
|
614
614
|
}
|
|
615
|
+
|
|
616
|
+
// 输入组合框由最外层统一绘制轮廓;错误态必须覆盖其 focus-within 品牌色,
|
|
617
|
+
// 同时清空内部 wrapper,避免 append/prepend 场景出现双描边。
|
|
618
|
+
.el-input.el-input-group:not(.is-disabled),
|
|
619
|
+
.el-input.el-input-group:not(.is-disabled):hover {
|
|
620
|
+
box-shadow: 0 0 0 1px var(--el-color-danger, #f56c6c) inset !important;
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
.el-input.el-input-group:not(.is-disabled):focus-within {
|
|
624
|
+
box-shadow:
|
|
625
|
+
0 0 0 1.5px var(--el-color-danger, #f56c6c) inset,
|
|
626
|
+
0 0 0 2px rgba(var(--el-color-danger-rgb, 245, 108, 108), 0.1) !important;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
.el-input.el-input-group > .el-input__wrapper {
|
|
630
|
+
box-shadow: none !important;
|
|
631
|
+
}
|
|
615
632
|
}
|
|
616
633
|
}
|
|
617
634
|
|
|
@@ -81,3 +81,38 @@ html .drager_row > .slider_row {
|
|
|
81
81
|
html .drager_row {
|
|
82
82
|
min-height: 0;
|
|
83
83
|
}
|
|
84
|
+
|
|
85
|
+
// 上下分屏只负责裁切布局边界,滚动仍由 AG Grid 内部 viewport 负责。
|
|
86
|
+
// runtime/auto 会仅在分屏 pane 内发现真实 AG Grid 时打上这些结构标记,
|
|
87
|
+
// 从而补齐可收缩高度链;普通内容、普通表格和定制区域不会命中。
|
|
88
|
+
html .drager_row > [data-wl-ui-split-pane] {
|
|
89
|
+
min-height: 0 !important;
|
|
90
|
+
overflow: hidden !important;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
html .drager_row [data-wl-ui-split-grid-chain] {
|
|
94
|
+
min-height: 0 !important;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
html
|
|
98
|
+
.drager_row
|
|
99
|
+
[data-wl-ui-split-grid-flex-parent]
|
|
100
|
+
> [data-wl-ui-split-grid-host] {
|
|
101
|
+
flex: 1 1 0 !important;
|
|
102
|
+
height: 0 !important;
|
|
103
|
+
min-height: 0 !important;
|
|
104
|
+
max-height: 100% !important;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
html .drager_row [data-wl-ui-split-grid-host] {
|
|
108
|
+
min-height: 0 !important;
|
|
109
|
+
max-height: 100% !important;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
html
|
|
113
|
+
.drager_row
|
|
114
|
+
.ag-grid-table[data-wl-ui-split-grid-host]
|
|
115
|
+
> .ag-root-wrapper {
|
|
116
|
+
height: 100% !important;
|
|
117
|
+
min-height: 0 !important;
|
|
118
|
+
}
|