@jc-times/business-ui 0.3.2 → 0.4.0

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 (52) hide show
  1. package/AGENTS.md +15 -0
  2. package/CHANGELOG.md +17 -0
  3. package/README.md +2 -0
  4. package/THIRD_PARTY_NOTICES.md +3 -0
  5. package/bin/business-ui-gate.mjs +2 -2
  6. package/dist/AntDateWheelView.js +131 -0
  7. package/dist/AntOptionWheelView.js +76 -0
  8. package/dist/Cascader.js +56 -51
  9. package/dist/DateInput.js +84 -66
  10. package/dist/DateWheelPicker.js +58 -0
  11. package/dist/ModalShell.js +84 -72
  12. package/dist/MultiSelect.js +5 -1
  13. package/dist/OptionWheelDialog.js +99 -0
  14. package/dist/Select.js +116 -61
  15. package/dist/StructuredAddressInput.js +72 -70
  16. package/dist/TreeSelect.js +4 -1
  17. package/dist/WheelCascader.js +123 -0
  18. package/dist/WheelDateInput.js +97 -0
  19. package/dist/business-ui.js +42 -39
  20. package/dist/date-wheel-model.js +27 -0
  21. package/dist/option-wheel-model.js +49 -0
  22. package/dist/styles.css +1 -1
  23. package/dist/types/AntDateWheelView.d.ts +9 -0
  24. package/dist/types/AntOptionWheelView.d.ts +8 -0
  25. package/dist/types/Cascader.d.ts +2 -0
  26. package/dist/types/DateInput.d.ts +4 -0
  27. package/dist/types/DateWheelPicker.d.ts +13 -0
  28. package/dist/types/ModalShell.d.ts +3 -1
  29. package/dist/types/OptionWheelDialog.d.ts +18 -0
  30. package/dist/types/Select.d.ts +4 -1
  31. package/dist/types/StructuredAddressInput.d.ts +3 -1
  32. package/dist/types/WheelCascader.d.ts +6 -0
  33. package/dist/types/WheelDateInput.d.ts +11 -0
  34. package/dist/types/date-wheel-model.d.ts +8 -0
  35. package/dist/types/index.d.ts +3 -0
  36. package/dist/types/option-wheel-model.d.ts +19 -0
  37. package/dist/types/usePhoneWheel.d.ts +2 -0
  38. package/dist/types/useSheetViewport.d.ts +3 -0
  39. package/dist/usePhoneWheel.js +16 -0
  40. package/dist/useSheetViewport.js +26 -0
  41. package/docs/agent-guide.md +13 -5
  42. package/docs/api.md +14 -0
  43. package/docs/cascader.md +2 -0
  44. package/docs/component-strategy.md +3 -0
  45. package/docs/date-wheel.md +25 -0
  46. package/docs/dependencies.md +2 -0
  47. package/docs/mobile-controls.md +54 -0
  48. package/docs/modal-shell-migration.md +25 -0
  49. package/docs/release.md +7 -0
  50. package/docs/viewport-qa.md +38 -0
  51. package/licenses/antd-mobile-MIT.txt +22 -0
  52. package/package.json +11 -2
package/AGENTS.md CHANGED
@@ -1,6 +1,21 @@
1
1
  # 公共组件维护入口
2
2
 
3
+ 本仓同时维护根目录UI包与packages/business-sdk统一业务SDK。SDK开发先读[SDK维护入口](packages/business-sdk/AGENTS.md);UI本身不承担业务接口,SDK允许封装受信服务协议,两者独立构建/版本。不得递归公开发布工作区。
4
+
3
5
  - 开始组件使用、选型或修改前,先读 [Agent 使用指南](docs/agent-guide.md),再按需读取 API 和专题文档。
4
6
  - 公共参数以当前源码和导出为准;消费项目以其安装版本的类型声明为准,不把本地新增能力当成已发布能力。
5
7
  - 新增或改变公共能力时,同步指南的场景选型、对应 API/专题和 package.json 发布文件清单。README 保持入口与导航,详细用法集中维护。
6
8
  - 通用交互、无障碍与响应式在本库实现;业务权限、接口、领域状态与文案由消费方组合。验证和发布遵循 docs/viewport-qa.md 与 docs/release.md。
9
+
10
+ ## 统一版本号治理
11
+
12
+ - 产品、服务和公共包统一采用语义化版本 `MAJOR.MINOR.PATCH`。不再默认“每个完成批次都提升 PATCH”;一个发布批次按其中影响最大的变更决定版本级别,并在 PR、提交说明或发布记录中标明 `major`、`minor`、`patch` 或 `none`。
13
+ - `MAJOR`:任何不向后兼容的外部契约变化,包括删除或改变 API 字段/语义、认证或权限契约、配置格式、必须由调用方同步改造的行为,或不可逆/不兼容的数据迁移。
14
+ - `MINOR`:向后兼容的新业务能力、新接口、可选字段、可选配置或增量数据结构;已有调用方无需修改即可继续工作。版本级别按兼容性和能力变化判断,不按代码行数或实现工作量判断,因此代码很少但新增独立能力时仍属于 `MINOR`。
15
+ - `PATCH`:向后兼容的缺陷、安全、兼容性、性能和依赖修复,且不新增独立业务能力。小范围样式、交互或内部实现调整只要没有新增能力,通常属于 `PATCH`。仅文档、测试、注释、开发工具或不进入运行制品的变化使用 `none`,不提升产品版本;`none` 仍需要正常提交。
16
+ - 每个逻辑完整、经过相应基本验证的修改批次都必须及时提交 Git;不得把多个无关事项长期堆积为未提交改动,也不得等到正式发布才一次性提交。一个提交聚焦一个可说明、可审查、可回退的事项。只提交当前任务拥有的文件或精确变更,不得夹带用户或其他任务的既有改动。普通开发提交不强制修改产品版本或版本清单,commit 数量与版本号递增次数不绑定。
17
+ - 只有生成可部署、可安装或需要交付测试的开发制品时,才生成目标正式版本对应的 `X.Y.Z-dev.N`;进入验收使用 `X.Y.Z-rc.N`,正式版本不得带预发布后缀。每个开发/候选制品必须绑定准确 Git SHA,`N` 应由 CI 或仓库发布脚本按已存在制品自动分配,避免多人手工抢号;普通 commit 不为增加 `dev.N` 而修改清单。现有 `0.x` 历史不重排,不机械跳到 `1.0.0`;是否建立 `1.0.0` 稳定基线须单独明确决定。
18
+ - 产品版本、Git 提交、构建身份、镜像身份、API 路径版本、数据库迁移号和业务数据修订号是不同事实,不得混用。构建身份建议包含“服务名 + 产品版本 + 时间 + 短提交”;镜像必须可按不可变标签和 digest 追溯;API 只有不兼容契约才从 `/v1` 升 `/v2`;数据库迁移继续使用独立顺序;合同等业务 `V2/V3` 不属于软件版本。
19
+ - 每个正式发布必须使用唯一版本和 `v<版本>` 标签,并指向干净、已验证的提交;已发布或已打标签的版本不可覆盖、移动或复用。失败候选不占用新的正式版本。版本须通过仓库既有版本命令或唯一清单统一更新,禁止只手改部分清单;同时提交相应锁文件和生成元数据。
20
+ - 配置变化若改变可观察行为或契约,按上述规则提升版本;仅密钥轮换、同源码重建或无行为变化的重新部署不提升产品版本,只增加部署/构建记录。回滚是重新激活旧的不可变制品,不降低、重发或伪造版本;修复后前进发布使用新的 PATCH 或更高版本。
21
+ - CI/发布门禁应校验所有版本清单一致、目标版本大于现有正式版本、标签与提交一致、版本未被制品库占用,并保留“产品版本 + Git SHA + 构建 ID + 镜像 digest/运行时指纹”的核验链。本节优先于仓库中过去“每批固定加 PATCH”的笼统约定;更严格且不冲突的仓库发布门禁继续有效。
package/CHANGELOG.md CHANGED
@@ -1,3 +1,20 @@
1
+ ## 0.4.0 — 2026-09-28(minor)
2
+
3
+ - 修复滚轮控件外部 ref 转发在 React 18 类型定义下无法编译的问题,兼容 React 18/19。
4
+
5
+ - 修复 MultiSelect 同时控制选中项与搜索词时,Escape/失焦关闭后因重放选中状态而重新打开候选层;自由搜索文本不成为业务 ID。桌面、手机弹窗内回归通过。
6
+
7
+ - 修复长单选值、勾选/开关标签及Alert编号在窄网格中的溢出;触屏展开、清空、关闭按钮及多选标签布局统一优化。
8
+ - 公开usePhoneWheel供消费方按需组合手机控件,电脑/平板保持既有交互。
9
+
10
+ - ModalShell/Dialog新增手机bottom-sheet模式,小表单内容高度贴底、上滑进入、固定底栏、安全区和VisualViewport键盘适配;默认全屏及桌面居中行为保留。
11
+
12
+ - Select、静态叶子单选Cascader与StructuredAddressInput新增可选手机滚轮;复用antd-mobile PickerView,确认式提交、父子联动、动态候选失效及键盘读屏支持,桌面/平板保持原模式。
13
+
14
+ - 新增独立年月日滚轮DateWheelPicker/WheelDateInput,DateInput可选手机滚轮适配;有界渲染、日期限制、取消/确认、键盘与触屏操作。
15
+ - ModalShell补齐嵌套重绘后Escape仅关闭最上层的回退,保留Radix焦点与浮层管理。
16
+ - 增加绑定SHA的私有UI开发包生成入口,不公开发布SDK或业务内容。
17
+
1
18
  # 0.3.1
2
19
 
3
20
  - 修复 `form-controls` 中图标从 `lucide-react` 根入口导入导致消费者打入完整图标集的问题。
package/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ > 本仓也维护统一业务SDK(含反馈子入口),见 [SDK文档](packages/business-sdk/README.md)。UI包名、版本和公开发布流程保持独立。
2
+
1
3
  # @jc-times/business-ui
2
4
 
3
5
  精诚时代业务应用共用的 React 基础组件与交互标准。公共包负责通用 UI、无障碍与响应式;权限、接口、业务文案和合同、客户、订单、ERP 等领域状态由消费应用提供。
@@ -34,3 +34,6 @@ MIT, Copyright (c) 2019-present react-component. Source: https://github.com/reac
34
34
  `assets/pdf-fonts` contains unmodified Noto Sans Hans and Noto Sans fonts from
35
35
  `@embedpdf/fonts-sc@1.0.0` and `@embedpdf/fonts-latin@1.0.0`, under SIL OFL 1.1.
36
36
  See the accompanying `OFL-CJK.txt`, `OFL-Latin.txt`, and source README.
37
+
38
+ ## antd-mobile 5.43.0
39
+ MIT,来源https://github.com/ant-design/ant-design-mobile。仅按需使用DatePickerView与PickerView子模块,外置依赖;许可证见licenses/antd-mobile-MIT.txt,不复制源码或全量导入主题。
@@ -82,8 +82,8 @@ function scan(directory) {
82
82
  }
83
83
  if (ts.isJsxOpeningElement(node) || ts.isJsxSelfClosingElement(node)) {
84
84
  const tag = node.tagName.getText(sourceFile);
85
- const hasClass = hasAttribute(node, "className");
86
- if (tag === "button" && !hasClass) counts.bareButton += 1;
85
+ // Styling does not provide the shared Button behavior or accessibility contract.
86
+ if (tag === "button") counts.bareButton += 1;
87
87
  if (tag === "input" && !exemptInput(node)) counts.bareInput += 1;
88
88
  if (tag === "select") counts.bareSelect += 1;
89
89
  if (tag === "textarea") counts.bareTextarea += 1;
@@ -0,0 +1,131 @@
1
+ import { clampWheelDate as e } from "./date-wheel-model.js";
2
+ import { useEffect as t, useLayoutEffect as n, useMemo as r, useRef as i } from "react";
3
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
4
+ import { CalendarDate as s } from "@internationalized/date";
5
+ import c from "antd-mobile/es/components/date-picker-view";
6
+ //#region src/AntDateWheelView.tsx
7
+ function l(e) {
8
+ let t = /* @__PURE__ */ new Date(0);
9
+ return t.setFullYear(e.year, e.month - 1, e.day), t.setHours(12, 0, 0, 0), t;
10
+ }
11
+ function u(e) {
12
+ return new s(e.getFullYear(), e.getMonth() + 1, e.getDate());
13
+ }
14
+ var d = [
15
+ "年",
16
+ "月",
17
+ "日"
18
+ ];
19
+ function f({ date: f, bounds: p, onValueChange: m, isDateUnavailable: h, disabled: g, readOnly: _, onPendingChange: v, "aria-label": y = "选择日期" }) {
20
+ let b = i(null), x = i(0), S = i(!1), C = i(v);
21
+ C.current = v;
22
+ let w = !!(g || _), T = r(() => l(e(new s(Math.max(1, f.year - 50), 1, 1), p)), [f.year, p.min.toString()]), E = r(() => l(e(new s(Math.min(9999, f.year + 50), 12, 31), p)), [f.year, p.max.toString()]), D = r(() => l(f), [f.toString()]), O = r(() => ({ day: (e, { date: t }) => !h?.(u(t).toString()) }), [h]);
23
+ function k(t) {
24
+ let n = e(t, p);
25
+ if (!w) {
26
+ if (h?.(n.toString())) {
27
+ let e;
28
+ for (let t = 1; t <= 30 && !e; t++) for (let r of [n.add({ days: t }), n.subtract({ days: t })]) if (r.year === n.year && r.month === n.month && r.compare(p.min) >= 0 && r.compare(p.max) <= 0 && !h(r.toString())) {
29
+ e = r;
30
+ break;
31
+ }
32
+ if (!e) return;
33
+ n = e;
34
+ }
35
+ m(n.toString());
36
+ }
37
+ }
38
+ n(() => {
39
+ let e = [
40
+ f.year,
41
+ f.month,
42
+ f.day
43
+ ], t = [
44
+ p.min.year,
45
+ f.year === p.min.year ? p.min.month : 1,
46
+ f.year === p.min.year && f.month === p.min.month ? p.min.day : 1
47
+ ], n = [
48
+ p.max.year,
49
+ f.year === p.max.year ? p.max.month : 12,
50
+ f.year === p.max.year && f.month === p.max.month ? p.max.day : f.calendar.getDaysInMonth(f)
51
+ ];
52
+ b.current?.querySelectorAll(".adm-picker-view-column").forEach((r, i) => {
53
+ r.tabIndex = w ? -1 : 0, r.setAttribute("role", "spinbutton"), r.setAttribute("aria-label", d[i]), r.setAttribute("aria-valuenow", String(e[i])), r.setAttribute("aria-valuetext", `${e[i]}${d[i]}`), r.setAttribute("aria-valuemin", String(t[i])), r.setAttribute("aria-valuemax", String(n[i])), r.setAttribute("aria-disabled", String(w)), r.querySelector(".adm-picker-view-column-accessible")?.setAttribute("aria-hidden", "true");
54
+ });
55
+ }), t(() => (C.current?.(!1), () => {
56
+ cancelAnimationFrame(x.current), C.current?.(!1);
57
+ }), []);
58
+ function A() {
59
+ w || (S.current = !0, cancelAnimationFrame(x.current), C.current?.(!0));
60
+ }
61
+ function j() {
62
+ S.current = !1, cancelAnimationFrame(x.current);
63
+ let e = "", t = performance.now();
64
+ function n(r) {
65
+ if (!b.current || S.current) return;
66
+ let i = [...b.current.querySelectorAll(".adm-picker-view-column-wheel")].map((e) => getComputedStyle(e).transform).join(";");
67
+ if (i !== e && (e = i, t = r), r - t >= 120) {
68
+ C.current?.(!1);
69
+ return;
70
+ }
71
+ x.current = requestAnimationFrame(n);
72
+ }
73
+ x.current = requestAnimationFrame(n);
74
+ }
75
+ function M(e) {
76
+ if (w) return;
77
+ let t = [...b.current?.querySelectorAll(".adm-picker-view-column") ?? []], n = t.indexOf(e.target);
78
+ if (n < 0) return;
79
+ if (e.key === "ArrowLeft" || e.key === "ArrowRight") {
80
+ e.preventDefault(), t[(n + (e.key === "ArrowLeft" ? 2 : 1)) % 3]?.focus();
81
+ return;
82
+ }
83
+ if (![
84
+ "ArrowUp",
85
+ "ArrowDown",
86
+ "PageUp",
87
+ "PageDown",
88
+ "Home",
89
+ "End"
90
+ ].includes(e.key)) return;
91
+ e.preventDefault();
92
+ let r = [
93
+ "year",
94
+ "month",
95
+ "day"
96
+ ][n], i = e.key.includes("Up") ? -1 : 1;
97
+ if (e.key === "Home" || e.key === "End") {
98
+ let t = e.key === "Home";
99
+ k(f.set({ [r]: n === 0 ? t ? p.min.year : p.max.year : t ? 1 : n === 1 ? 12 : f.calendar.getDaysInMonth(f) }));
100
+ } else k(f.set({ [r]: f[r] + i * (e.key.startsWith("Page") ? 5 : 1) }));
101
+ }
102
+ return /* @__PURE__ */ o("div", {
103
+ ref: b,
104
+ className: "ui-date-wheel",
105
+ role: "group",
106
+ "aria-label": y,
107
+ "aria-disabled": w || void 0,
108
+ onKeyDown: M,
109
+ onTouchStartCapture: A,
110
+ onTouchEndCapture: j,
111
+ onTouchCancelCapture: j,
112
+ onMouseDownCapture: A,
113
+ onMouseUpCapture: j,
114
+ children: [/* @__PURE__ */ a("div", {
115
+ className: "ui-date-wheel-labels",
116
+ "aria-hidden": "true",
117
+ children: d.map((e) => /* @__PURE__ */ a("span", { children: e }, e))
118
+ }), /* @__PURE__ */ a(c, {
119
+ value: D,
120
+ min: T,
121
+ max: E,
122
+ precision: "day",
123
+ filter: O,
124
+ mouseWheel: !1,
125
+ renderLabel: (e, t) => `${t}${e === "year" ? "年" : e === "month" ? "月" : "日"}`,
126
+ onChange: (e) => k(u(e))
127
+ })]
128
+ });
129
+ }
130
+ //#endregion
131
+ export { f as default };
@@ -0,0 +1,76 @@
1
+ import { wheelText as e } from "./option-wheel-model.js";
2
+ import { useEffect as t, useLayoutEffect as n, useRef as r } from "react";
3
+ import { jsx as i } from "react/jsx-runtime";
4
+ import a from "antd-mobile/es/components/picker-view";
5
+ //#region src/AntOptionWheelView.tsx
6
+ function o({ columns: o, value: s, onChange: c, onPendingChange: l }) {
7
+ let u = r(null), d = r(0), f = r(!1), p = r(l);
8
+ p.current = l, n(() => {
9
+ u.current?.querySelectorAll(".adm-picker-view-column").forEach((t, n) => {
10
+ let r = o[n], i = r.findIndex((e) => e.value === s[n]);
11
+ t.tabIndex = 0, t.setAttribute("role", "spinbutton"), t.setAttribute("aria-label", o.length === 1 ? "选项" : `第${n + 1}级`), t.setAttribute("aria-valuenow", String(i + 1)), t.setAttribute("aria-valuemin", "1"), t.setAttribute("aria-valuemax", String(r.length)), t.setAttribute("aria-valuetext", i >= 0 ? e(r[i]) : "无可选项"), t.querySelector(".adm-picker-view-column-accessible")?.setAttribute("aria-hidden", "true");
12
+ });
13
+ }), t(() => (p.current(!1), () => {
14
+ cancelAnimationFrame(d.current);
15
+ }), []);
16
+ function m() {
17
+ f.current = !0, cancelAnimationFrame(d.current), p.current(!0);
18
+ }
19
+ function h() {
20
+ f.current = !1, cancelAnimationFrame(d.current);
21
+ let e = "", t = performance.now();
22
+ function n(r) {
23
+ if (!u.current || f.current) return;
24
+ let i = [...u.current.querySelectorAll(".adm-picker-view-column-wheel")].map((e) => getComputedStyle(e).transform).join(";");
25
+ if (i !== e && (e = i, t = r), r - t >= 120) {
26
+ p.current(!1);
27
+ return;
28
+ }
29
+ d.current = requestAnimationFrame(n);
30
+ }
31
+ d.current = requestAnimationFrame(n);
32
+ }
33
+ function g(e) {
34
+ let t = [...u.current?.querySelectorAll(".adm-picker-view-column") ?? []], n = t.indexOf(e.target);
35
+ if (n < 0 || f.current) return;
36
+ if (e.key === "ArrowLeft" || e.key === "ArrowRight") {
37
+ e.preventDefault(), t[(n + (e.key === "ArrowLeft" ? t.length - 1 : 1)) % t.length]?.focus();
38
+ return;
39
+ }
40
+ if (![
41
+ "ArrowUp",
42
+ "ArrowDown",
43
+ "PageUp",
44
+ "PageDown",
45
+ "Home",
46
+ "End"
47
+ ].includes(e.key)) return;
48
+ e.preventDefault();
49
+ let r = o[n], i = r.findIndex((e) => e.value === s[n]), a = e.key.includes("Up") ? -1 : 1, l = e.key === "Home" ? 0 : e.key === "End" ? r.length - 1 : Math.max(0, Math.min(r.length - 1, i + a * (e.key.startsWith("Page") ? 5 : 1)));
50
+ c([...s.slice(0, n), r[l].value]);
51
+ }
52
+ return /* @__PURE__ */ i("div", {
53
+ ref: u,
54
+ className: "ui-date-wheel ui-option-wheel",
55
+ onKeyDown: g,
56
+ onTouchStartCapture: m,
57
+ onTouchEndCapture: h,
58
+ onTouchCancelCapture: h,
59
+ onMouseDownCapture: m,
60
+ onMouseUpCapture: h,
61
+ children: /* @__PURE__ */ i(a, {
62
+ columns: o.map((t) => t.map((t) => ({
63
+ value: t.value,
64
+ label: e(t)
65
+ }))),
66
+ value: s,
67
+ mouseWheel: !1,
68
+ onChange: (e) => {
69
+ let t = e.findIndex((e, t) => e !== s[t]);
70
+ t >= 0 && c(e.slice(0, t + 1).filter((e) => typeof e == "string"));
71
+ }
72
+ })
73
+ });
74
+ }
75
+ //#endregion
76
+ export { o as default };
package/dist/Cascader.js CHANGED
@@ -1,52 +1,57 @@
1
1
  import { useOverlayContainer as e } from "./OverlayContainer.js";
2
2
  import { FormField as t } from "./FormField.js";
3
- import { useCallback as n, useEffect as r, useId as i, useRef as a, useState as o } from "react";
4
- import { jsx as s, jsxs as c } from "react/jsx-runtime";
5
- import { ChevronDown as l, ChevronRight as u, LoaderCircle as d, X as f } from "lucide-react";
6
- import p from "@rc-component/cascader";
3
+ import { usePhoneWheel as n } from "./usePhoneWheel.js";
4
+ import { WheelCascader as r } from "./WheelCascader.js";
5
+ import { useCallback as i, useEffect as a, useId as o, useRef as s, useState as c } from "react";
6
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
7
+ import { ChevronDown as d, ChevronRight as f, LoaderCircle as p, X as m } from "lucide-react";
8
+ import h from "@rc-component/cascader";
7
9
  //#region src/Cascader.tsx
8
- function m(m) {
9
- let g = i(), [_, v] = o(!1);
10
- r(() => {
11
- m.disabled && v(!1);
12
- }, [m.disabled]);
13
- let y = !m.disabled && (m.open ?? _), b = m.id ?? m.inputProps?.id ?? g, x = e(), { inputProps: S, inputRef: C, label: w, helpText: T, error: E } = m, D = a(null), O = n((e) => {
10
+ function g(e) {
11
+ return n(e.mobileMode === "wheel") && !e.multiple && !e.loadData && !e.changeOnSelect ? /* @__PURE__ */ l(r, { ...e }) : /* @__PURE__ */ l(_, { ...e });
12
+ }
13
+ function _(n) {
14
+ let r = o(), [g, _] = c(!1);
15
+ a(() => {
16
+ n.disabled && _(!1);
17
+ }, [n.disabled]);
18
+ let y = !n.disabled && (n.open ?? g), b = n.id ?? n.inputProps?.id ?? r, x = e(), { inputProps: S, inputRef: C, label: w, helpText: T, error: E } = n, D = s(null), O = i((e) => {
14
19
  D.current = e, typeof C == "function" ? C(e) : C && (C.current = e);
15
20
  }, [C]);
16
- r(() => {
17
- D.current?.setCustomValidity(m.required && !m.value.length ? "请选择一个选项" : "");
18
- }, [m.required, m.value.length]);
21
+ a(() => {
22
+ D.current?.setCustomValidity(n.required && !n.value.length ? "请选择一个选项" : "");
23
+ }, [n.required, n.value.length]);
19
24
  let k = [
20
25
  S?.["aria-describedby"],
21
26
  T !== void 0 && `${b}-help`,
22
27
  E && `${b}-error`
23
28
  ].filter(Boolean).join(" ") || void 0, A = {
24
29
  id: b,
25
- options: m.options,
30
+ options: n.options,
26
31
  prefixCls: "ui-cascader",
27
- className: m.className,
28
- disabled: m.disabled,
32
+ className: n.className,
33
+ disabled: n.disabled,
29
34
  open: y,
30
35
  onPopupVisibleChange: (e) => {
31
- v(e), m.onOpenChange?.(e);
36
+ _(e), n.onOpenChange?.(e);
32
37
  },
33
38
  onInputKeyDown: (e) => {
34
- e.key === "Escape" && y && !e.nativeEvent.isComposing && (e.preventDefault(), e.stopPropagation(), v(!1), m.onOpenChange?.(!1));
39
+ e.key === "Escape" && y && !e.nativeEvent.isComposing && (e.preventDefault(), e.stopPropagation(), _(!1), n.onOpenChange?.(!1));
35
40
  },
36
41
  showAction: [],
37
- placeholder: m.placeholder ?? "请选择或搜索",
38
- notFoundContent: m.emptyText ?? "没有匹配的选项",
39
- allowClear: m.allowClear !== !1 && {
40
- clearIcon: /* @__PURE__ */ s(f, { size: 14 }),
41
- label: m.clearLabel ?? "清除选择"
42
+ placeholder: n.placeholder ?? "请选择或搜索",
43
+ notFoundContent: n.emptyText ?? "没有匹配的选项",
44
+ allowClear: n.allowClear !== !1 && {
45
+ clearIcon: /* @__PURE__ */ l(m, { size: 14 }),
46
+ label: n.clearLabel ?? "清除选择"
42
47
  },
43
- suffix: /* @__PURE__ */ s(l, { size: 16 }),
44
- expandIcon: /* @__PURE__ */ s(u, { size: 14 }),
45
- loadingIcon: /* @__PURE__ */ s(d, { size: 14 }),
46
- changeOnSelect: m.changeOnSelect,
47
- loadData: m.loadData,
48
- showSearch: m.searchable ?? !m.loadData ? {
49
- filter: (e, t) => h(t.map((e) => e.label).join("/")).includes(h(e)),
48
+ suffix: /* @__PURE__ */ l(d, { size: 16 }),
49
+ expandIcon: /* @__PURE__ */ l(f, { size: 14 }),
50
+ loadingIcon: /* @__PURE__ */ l(p, { size: 14 }),
51
+ changeOnSelect: n.changeOnSelect,
52
+ loadData: n.loadData,
53
+ showSearch: n.searchable ?? !n.loadData ? {
54
+ filter: (e, t) => v(t.map((e) => e.label).join("/")).includes(v(e)),
50
55
  render: (e, t) => t.map((e) => e.label).join(" / "),
51
56
  limit: 50
52
57
  } : !1,
@@ -61,19 +66,19 @@ function m(m) {
61
66
  shiftX: !0
62
67
  }
63
68
  },
64
- components: { input: /* @__PURE__ */ s("input", {
69
+ components: { input: /* @__PURE__ */ l("input", {
65
70
  ...S,
66
71
  ref: O,
67
72
  id: b,
68
73
  placeholder: "",
69
- required: m.required && !m.value.length,
70
- "aria-required": m.required || void 0,
74
+ required: n.required && !n.value.length,
75
+ "aria-required": n.required || void 0,
71
76
  "aria-invalid": E ? !0 : S?.["aria-invalid"],
72
77
  "aria-describedby": k
73
78
  }) },
74
- tagRender: ({ label: e, closable: t, onClose: n }) => /* @__PURE__ */ c("span", {
79
+ tagRender: ({ label: e, closable: t, onClose: n }) => /* @__PURE__ */ u("span", {
75
80
  className: "ui-cascader-tag",
76
- children: [/* @__PURE__ */ s("span", { children: e }), t && /* @__PURE__ */ s("button", {
81
+ children: [/* @__PURE__ */ l("span", { children: e }), t && /* @__PURE__ */ l("button", {
77
82
  type: "button",
78
83
  "aria-label": `移除 ${String(e)}`,
79
84
  onMouseDown: (e) => {
@@ -82,37 +87,37 @@ function m(m) {
82
87
  onClick: (e) => {
83
88
  e.stopPropagation(), n();
84
89
  },
85
- children: /* @__PURE__ */ s(f, { size: 12 })
90
+ children: /* @__PURE__ */ l(m, { size: 12 })
86
91
  })]
87
92
  })
88
93
  };
89
- return /* @__PURE__ */ c(t, {
94
+ return /* @__PURE__ */ u(t, {
90
95
  controlId: b,
91
96
  label: w,
92
97
  helpText: T,
93
98
  error: E,
94
- required: m.required,
95
- children: [y && /* @__PURE__ */ s("span", {
99
+ required: n.required,
100
+ children: [y && /* @__PURE__ */ l("span", {
96
101
  hidden: !0,
97
102
  "data-ui-aria-overlay": ""
98
- }), m.multiple ? /* @__PURE__ */ s(p, {
103
+ }), n.multiple ? /* @__PURE__ */ l(h, {
99
104
  ...A,
100
105
  checkable: !0,
101
- checkStrictly: m.checkStrictly ?? !0,
102
- maxTagCount: m.maxTagCount ?? 3,
103
- value: m.value,
104
- onChange: (e, t) => m.onValueChange(e ?? [], t ?? [])
105
- }) : /* @__PURE__ */ s(p, {
106
+ checkStrictly: n.checkStrictly ?? !0,
107
+ maxTagCount: n.maxTagCount ?? 3,
108
+ value: n.value,
109
+ onChange: (e, t) => n.onValueChange(e ?? [], t ?? [])
110
+ }) : /* @__PURE__ */ l(h, {
106
111
  ...A,
107
- value: m.value,
108
- onChange: (e, t) => m.onValueChange(e ?? [], t ?? [])
112
+ value: n.value,
113
+ onChange: (e, t) => n.onValueChange(e ?? [], t ?? [])
109
114
  })]
110
115
  });
111
116
  }
112
- function h(e) {
117
+ function v(e) {
113
118
  return e.replace(/[\s/]+/gu, "").toLocaleLowerCase();
114
119
  }
115
- function g(e) {
120
+ function y(e) {
116
121
  let t = /* @__PURE__ */ new Map(), n = new Map(e.map((e) => [e.id, e.parentId]));
117
122
  for (let n of e) {
118
123
  if (!n.id || t.has(n.id)) throw Error("Cascader IDs must be nonempty and unique");
@@ -134,7 +139,7 @@ function g(e) {
134
139
  }
135
140
  return r;
136
141
  }
137
- function _(e) {
142
+ function b(e) {
138
143
  let t = /* @__PURE__ */ new Map();
139
144
  function n(e, r) {
140
145
  for (let i of e) {
@@ -146,4 +151,4 @@ function _(e) {
146
151
  return n(e, []), t;
147
152
  }
148
153
  //#endregion
149
- export { m as Cascader, g as buildCascaderOptions, _ as indexCascaderPaths };
154
+ export { g as Cascader, y as buildCascaderOptions, b as indexCascaderPaths };