@jc-times/business-ui 0.2.43
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/AGENTS.md +6 -0
- package/CHANGELOG.md +267 -0
- package/README.md +55 -0
- package/THIRD_PARTY_NOTICES.md +29 -0
- package/bin/business-ui-gate.mjs +171 -0
- package/dist/Alert.js +47 -0
- package/dist/AsyncDirectoryPicker.js +134 -0
- package/dist/AsyncSearchPicker.js +155 -0
- package/dist/AutoComplete.js +34 -0
- package/dist/Badge.js +14 -0
- package/dist/Button.js +54 -0
- package/dist/Cascader.js +141 -0
- package/dist/Combobox.js +106 -0
- package/dist/ConfirmDialog.js +48 -0
- package/dist/DataTableHorizontalScrollbar.js +38 -0
- package/dist/DataTableIcons.js +37 -0
- package/dist/DataTableMergedRows.js +45 -0
- package/dist/DataTableTheme.js +135 -0
- package/dist/DateInput.js +223 -0
- package/dist/DropdownMenu.js +130 -0
- package/dist/EmptyState.js +27 -0
- package/dist/ExplainableButton.js +68 -0
- package/dist/FileDropzone.js +70 -0
- package/dist/FilePreparationDialog.js +33 -0
- package/dist/FloatingControls.js +120 -0
- package/dist/FormField.js +143 -0
- package/dist/MetricCard.js +38 -0
- package/dist/ModalShell.js +139 -0
- package/dist/MultiSelect.js +137 -0
- package/dist/NumericInput.js +97 -0
- package/dist/OverlayContainer.js +9 -0
- package/dist/PageHeader.js +36 -0
- package/dist/Pagination.js +115 -0
- package/dist/PreparedFileDropzone.js +30 -0
- package/dist/RecoverableAsyncState.js +35 -0
- package/dist/RovingTabs.js +54 -0
- package/dist/SectionCard.js +35 -0
- package/dist/SegmentedControl.js +46 -0
- package/dist/Select.js +73 -0
- package/dist/Skeleton.js +25 -0
- package/dist/SortableList.js +55 -0
- package/dist/StructuredAddressInput.js +157 -0
- package/dist/Toast.js +100 -0
- package/dist/ToggleSwitch.js +34 -0
- package/dist/TreeSelect.js +444 -0
- package/dist/amount-format.js +20 -0
- package/dist/business-ui.js +44 -0
- package/dist/chinese-address-regions.js +15 -0
- package/dist/classNames.js +6 -0
- package/dist/data-table.js +257 -0
- package/dist/document-render-budget.js +22 -0
- package/dist/document-viewer/ContinuousPdfViewer.js +145 -0
- package/dist/document-viewer/DocumentViewer.js +123 -0
- package/dist/document-viewer/DocumentViewerViewport.js +36 -0
- package/dist/document-viewer/ImagePage.js +39 -0
- package/dist/document-viewer/PdfCanvasPage.js +26 -0
- package/dist/document-viewer/PdfThumbnailRail.js +116 -0
- package/dist/document-viewer/PdfToolbar.js +61 -0
- package/dist/document-viewer/PdfWorkspace.js +42 -0
- package/dist/document-viewer/pdf-render-budget.js +7 -0
- package/dist/document-viewer/usePdfCanvas.js +69 -0
- package/dist/document-viewer/usePdfViewport.js +48 -0
- package/dist/document-viewer-v2/DocumentViewerV2.js +171 -0
- package/dist/document-viewer-v2/HeadlessPdfViewer.js +420 -0
- package/dist/document-viewer-v2/HeadlessSearch.js +66 -0
- package/dist/document-viewer-v2.js +13 -0
- package/dist/document-viewer.js +12 -0
- package/dist/pdfium-viewer.js +18 -0
- package/dist/styles.css +2 -0
- package/dist/types/Alert.d.ts +11 -0
- package/dist/types/AmountFormat.d.ts +15 -0
- package/dist/types/AsyncDirectoryPicker.d.ts +32 -0
- package/dist/types/AsyncSearchPicker.d.ts +26 -0
- package/dist/types/AutoComplete.d.ts +9 -0
- package/dist/types/Badge.d.ts +13 -0
- package/dist/types/Button.d.ts +36 -0
- package/dist/types/Cascader.d.ts +57 -0
- package/dist/types/ChineseAddressRegions.d.ts +4 -0
- package/dist/types/Combobox.d.ts +37 -0
- package/dist/types/ConfirmDialog.d.ts +20 -0
- package/dist/types/DataTable.d.ts +68 -0
- package/dist/types/DataTableHorizontalScrollbar.d.ts +8 -0
- package/dist/types/DataTableIcons.d.ts +19 -0
- package/dist/types/DataTableMergedRows.d.ts +11 -0
- package/dist/types/DataTableTheme.d.ts +4 -0
- package/dist/types/DateInput.d.ts +25 -0
- package/dist/types/DocumentRenderBudget.d.ts +9 -0
- package/dist/types/DocumentViewer.d.ts +11 -0
- package/dist/types/DocumentViewerV2.d.ts +10 -0
- package/dist/types/DropdownMenu.d.ts +73 -0
- package/dist/types/EmptyState.d.ts +9 -0
- package/dist/types/ExplainableButton.d.ts +7 -0
- package/dist/types/FileDropzone.d.ts +20 -0
- package/dist/types/FilePreparationDialog.d.ts +12 -0
- package/dist/types/FloatingControls.d.ts +39 -0
- package/dist/types/FormField.d.ts +35 -0
- package/dist/types/MetricCard.d.ts +17 -0
- package/dist/types/ModalShell.d.ts +33 -0
- package/dist/types/MultiSelect.d.ts +12 -0
- package/dist/types/NumericInput.d.ts +54 -0
- package/dist/types/OverlayContainer.d.ts +2 -0
- package/dist/types/PageHeader.d.ts +23 -0
- package/dist/types/Pagination.d.ts +14 -0
- package/dist/types/PdfiumViewer.d.ts +5 -0
- package/dist/types/PreparedFileDropzone.d.ts +7 -0
- package/dist/types/RecoverableAsyncState.d.ts +11 -0
- package/dist/types/RovingTabs.d.ts +21 -0
- package/dist/types/SectionCard.d.ts +18 -0
- package/dist/types/SegmentedControl.d.ts +26 -0
- package/dist/types/Select.d.ts +31 -0
- package/dist/types/Skeleton.d.ts +11 -0
- package/dist/types/SortableList.d.ts +17 -0
- package/dist/types/StructuredAddressInput.d.ts +57 -0
- package/dist/types/Toast.d.ts +22 -0
- package/dist/types/ToggleSwitch.d.ts +15 -0
- package/dist/types/TreeSelect.d.ts +58 -0
- package/dist/types/classNames.d.ts +1 -0
- package/dist/types/document-viewer/ContinuousPdfViewer.d.ts +16 -0
- package/dist/types/document-viewer/DocumentViewer.d.ts +31 -0
- package/dist/types/document-viewer/DocumentViewerViewport.d.ts +23 -0
- package/dist/types/document-viewer/ImagePage.d.ts +9 -0
- package/dist/types/document-viewer/PdfCanvasPage.d.ts +7 -0
- package/dist/types/document-viewer/PdfThumbnailRail.d.ts +12 -0
- package/dist/types/document-viewer/PdfToolbar.d.ts +13 -0
- package/dist/types/document-viewer/PdfWorkspace.d.ts +5 -0
- package/dist/types/document-viewer/pdf-render-budget.d.ts +2 -0
- package/dist/types/document-viewer/usePdfCanvas.d.ts +22 -0
- package/dist/types/document-viewer/usePdfViewport.d.ts +14 -0
- package/dist/types/document-viewer-v2/DocumentViewerV2.d.ts +50 -0
- package/dist/types/document-viewer-v2/HeadlessPdfViewer.d.ts +39 -0
- package/dist/types/document-viewer-v2/HeadlessSearch.d.ts +9 -0
- package/dist/types/index.d.ts +41 -0
- package/dist/types/useDebouncedValue.d.ts +2 -0
- package/dist/types/useFilePreparation.d.ts +28 -0
- package/dist/types/useModalFocusTrap.d.ts +3 -0
- package/dist/useDebouncedValue.js +16 -0
- package/dist/useFilePreparation.js +51 -0
- package/dist/useModalFocusTrap.js +71 -0
- package/docs/agent-guide.md +145 -0
- package/docs/api.md +220 -0
- package/docs/cascader.md +56 -0
- package/docs/component-strategy.md +94 -0
- package/docs/data-table.md +123 -0
- package/docs/dependencies.md +57 -0
- package/docs/document-viewer-v2.md +259 -0
- package/docs/document-viewer.md +28 -0
- package/docs/file-preparation.md +11 -0
- package/docs/maturity-migration.md +62 -0
- package/docs/modal-shell-migration.md +43 -0
- package/docs/mrt-poc.md +205 -0
- package/docs/release.md +32 -0
- package/docs/viewport-qa.md +99 -0
- package/licenses/rc-cascader-MIT.txt +21 -0
- package/package.json +163 -0
package/dist/Skeleton.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as e } from "react/jsx-runtime";
|
|
2
|
+
//#region src/Skeleton.tsx
|
|
3
|
+
function t({ width: t, height: n, rounded: r = !1, className: i = "", style: a, ...o }) {
|
|
4
|
+
return /* @__PURE__ */ e("span", {
|
|
5
|
+
...o,
|
|
6
|
+
className: `ui-skeleton${r ? " rounded" : ""} ${i}`.trim(),
|
|
7
|
+
style: {
|
|
8
|
+
width: t,
|
|
9
|
+
height: n,
|
|
10
|
+
...a
|
|
11
|
+
},
|
|
12
|
+
"aria-hidden": "true"
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
function n({ lines: n = 3, className: r = "", ...i }) {
|
|
16
|
+
let a = Math.max(1, Math.floor(n));
|
|
17
|
+
return /* @__PURE__ */ e("div", {
|
|
18
|
+
...i,
|
|
19
|
+
className: `ui-skeleton-text ${r}`.trim(),
|
|
20
|
+
"aria-hidden": "true",
|
|
21
|
+
children: Array.from({ length: a }, (n, r) => /* @__PURE__ */ e(t, { width: r === a - 1 ? "72%" : "100%" }, r))
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//#endregion
|
|
25
|
+
export { t as Skeleton, n as SkeletonText };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { GripVertical as e } from "lucide-react";
|
|
2
|
+
import { useMemo as t } from "react";
|
|
3
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
|
+
import { Button as i, GridList as a, GridListItem as o, useDragAndDrop as s } from "react-aria-components";
|
|
5
|
+
//#region src/SortableList.tsx
|
|
6
|
+
function c(c) {
|
|
7
|
+
let u = t(() => c.items.map((e, t) => ({
|
|
8
|
+
item: e,
|
|
9
|
+
index: t,
|
|
10
|
+
key: c.getKey(e)
|
|
11
|
+
})), [c.items, c.getKey]), { dragAndDropHooks: d } = s({
|
|
12
|
+
isDisabled: c.disabled,
|
|
13
|
+
getItems: (e) => [...e].map((e) => ({ "text/plain": String(e) })),
|
|
14
|
+
getAllowedDropOperations: () => ["move"],
|
|
15
|
+
onReorder: (e) => c.onReorder(l(c.items, e.keys, e.target.key, e.target.dropPosition, c.getKey))
|
|
16
|
+
});
|
|
17
|
+
return /* @__PURE__ */ n(a, {
|
|
18
|
+
"aria-label": c["aria-label"],
|
|
19
|
+
items: u,
|
|
20
|
+
selectionMode: "none",
|
|
21
|
+
dragAndDropHooks: d,
|
|
22
|
+
className: ["ui-sortable-list", c.className].filter(Boolean).join(" "),
|
|
23
|
+
children: ({ item: t, index: a, key: s }) => /* @__PURE__ */ r(o, {
|
|
24
|
+
id: s,
|
|
25
|
+
textValue: c.getTextValue(t, a),
|
|
26
|
+
className: "ui-sortable-item",
|
|
27
|
+
children: [!c.disabled && /* @__PURE__ */ n(i, {
|
|
28
|
+
slot: "drag",
|
|
29
|
+
className: "ui-sortable-handle",
|
|
30
|
+
"aria-label": c.dragLabel?.(t, a) ?? `拖动第 ${a + 1} 项排序`,
|
|
31
|
+
children: /* @__PURE__ */ n(e, {
|
|
32
|
+
"aria-hidden": "true",
|
|
33
|
+
size: 18
|
|
34
|
+
})
|
|
35
|
+
}), /* @__PURE__ */ n("div", {
|
|
36
|
+
className: "ui-sortable-content",
|
|
37
|
+
children: c.renderItem(t, a)
|
|
38
|
+
})]
|
|
39
|
+
})
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function l(e, t, n, r, i) {
|
|
43
|
+
let a = e.filter((e) => t.has(i(e)));
|
|
44
|
+
if (!a.length || r === "on") return e;
|
|
45
|
+
let o = e.filter((e) => !t.has(i(e))), s = o.findIndex((e) => i(e) === n);
|
|
46
|
+
if (s < 0) return e;
|
|
47
|
+
let c = s + +(r === "after");
|
|
48
|
+
return [
|
|
49
|
+
...o.slice(0, c),
|
|
50
|
+
...a,
|
|
51
|
+
...o.slice(c)
|
|
52
|
+
];
|
|
53
|
+
}
|
|
54
|
+
//#endregion
|
|
55
|
+
export { c as SortableList, l as moveSortableItems };
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { Select as e } from "./Select.js";
|
|
2
|
+
import { Cascader as t } from "./Cascader.js";
|
|
3
|
+
import { useId as n, useMemo as r, useRef as i } from "react";
|
|
4
|
+
import { Fragment as a, jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
5
|
+
//#region src/StructuredAddressInput.tsx
|
|
6
|
+
function c({ regions: c, value: l, onValueChange: u, label: d = "地址", required: f = !1, disabled: m = !1, annotation: h, dataVersion: g, className: _ = "", structuredModeLabel: v = "结构化地址", freeformModeLabel: y = "海外或非标准地址", showModeSelector: b = !1, regionLabel: x = "所在地区", detailLabel: S = "详细地址", freeformLabel: C = "完整地址", searchPlaceholder: w = "请选择或搜索地区", emptyText: T = "没有匹配的地区", maxLength: E = 500, regionInputRef: D, detailInputRef: O, freeformInputRef: k, regionInputProps: A, detailInputProps: j, freeformInputProps: M }) {
|
|
7
|
+
let N = n().replaceAll(":", ""), P = A?.id ?? `ui-address-${N}-region`, F = i(null), I = r(() => {
|
|
8
|
+
function e(t) {
|
|
9
|
+
return t.map((t) => ({
|
|
10
|
+
value: t.id,
|
|
11
|
+
label: t.label,
|
|
12
|
+
disabled: t.disabled,
|
|
13
|
+
children: t.children ? e(t.children) : void 0
|
|
14
|
+
}));
|
|
15
|
+
}
|
|
16
|
+
return e(c);
|
|
17
|
+
}, [c]);
|
|
18
|
+
function L(e) {
|
|
19
|
+
u({
|
|
20
|
+
...l,
|
|
21
|
+
...b ? {} : { mode: "structured" },
|
|
22
|
+
...e
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return /* @__PURE__ */ s("fieldset", {
|
|
26
|
+
className: `ui-structured-address ${_}`.trim(),
|
|
27
|
+
disabled: m,
|
|
28
|
+
children: [
|
|
29
|
+
/* @__PURE__ */ s("legend", { children: [
|
|
30
|
+
f && /* @__PURE__ */ o("span", {
|
|
31
|
+
className: "ui-required-mark",
|
|
32
|
+
"aria-hidden": "true",
|
|
33
|
+
children: "*"
|
|
34
|
+
}),
|
|
35
|
+
d,
|
|
36
|
+
h !== void 0 && /* @__PURE__ */ o("span", {
|
|
37
|
+
className: "ui-structured-address-annotation",
|
|
38
|
+
children: h
|
|
39
|
+
})
|
|
40
|
+
] }),
|
|
41
|
+
b && /* @__PURE__ */ o("div", {
|
|
42
|
+
className: "ui-structured-address-mode",
|
|
43
|
+
children: /* @__PURE__ */ o(e, {
|
|
44
|
+
label: "地址类型",
|
|
45
|
+
value: l.mode,
|
|
46
|
+
disabled: m,
|
|
47
|
+
onValueChange: (e) => L({ mode: e }),
|
|
48
|
+
options: [{
|
|
49
|
+
value: "structured",
|
|
50
|
+
label: v
|
|
51
|
+
}, {
|
|
52
|
+
value: "freeform",
|
|
53
|
+
label: y
|
|
54
|
+
}]
|
|
55
|
+
})
|
|
56
|
+
}),
|
|
57
|
+
b && l.mode === "freeform" ? /* @__PURE__ */ s("label", {
|
|
58
|
+
className: "ui-structured-address-full",
|
|
59
|
+
children: [/* @__PURE__ */ o("span", { children: C }), /* @__PURE__ */ o("input", {
|
|
60
|
+
...M,
|
|
61
|
+
ref: k,
|
|
62
|
+
className: "ui-input",
|
|
63
|
+
autoComplete: "street-address",
|
|
64
|
+
maxLength: E,
|
|
65
|
+
required: f,
|
|
66
|
+
value: l.freeform,
|
|
67
|
+
onChange: (e) => L({ freeform: e.target.value })
|
|
68
|
+
})]
|
|
69
|
+
}) : /* @__PURE__ */ s(a, { children: [
|
|
70
|
+
/* @__PURE__ */ o("div", {
|
|
71
|
+
className: "ui-structured-address-region",
|
|
72
|
+
children: /* @__PURE__ */ o(t, {
|
|
73
|
+
options: I,
|
|
74
|
+
value: l.regionIds,
|
|
75
|
+
label: x,
|
|
76
|
+
id: P,
|
|
77
|
+
disabled: m,
|
|
78
|
+
required: f,
|
|
79
|
+
placeholder: w,
|
|
80
|
+
emptyText: T,
|
|
81
|
+
inputProps: A,
|
|
82
|
+
inputRef: D,
|
|
83
|
+
changeOnSelect: !0,
|
|
84
|
+
onValueChange: (e, t) => {
|
|
85
|
+
L({ regionIds: e });
|
|
86
|
+
let n = t.at(-1);
|
|
87
|
+
n && !n.children?.length && queueMicrotask(() => F.current?.focus());
|
|
88
|
+
}
|
|
89
|
+
})
|
|
90
|
+
}),
|
|
91
|
+
/* @__PURE__ */ s("label", {
|
|
92
|
+
className: "ui-structured-address-detail",
|
|
93
|
+
children: [/* @__PURE__ */ o("span", { children: S }), /* @__PURE__ */ o("input", {
|
|
94
|
+
...j,
|
|
95
|
+
ref: (e) => {
|
|
96
|
+
F.current = e, p(O, e);
|
|
97
|
+
},
|
|
98
|
+
className: "ui-input",
|
|
99
|
+
autoComplete: "street-address",
|
|
100
|
+
maxLength: E,
|
|
101
|
+
required: f,
|
|
102
|
+
value: l.detail,
|
|
103
|
+
onChange: (e) => L({ detail: e.target.value })
|
|
104
|
+
})]
|
|
105
|
+
}),
|
|
106
|
+
g !== void 0 && /* @__PURE__ */ o("small", {
|
|
107
|
+
className: "ui-structured-address-version",
|
|
108
|
+
children: g
|
|
109
|
+
})
|
|
110
|
+
] })
|
|
111
|
+
]
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function l(e) {
|
|
115
|
+
let t = [];
|
|
116
|
+
function n(e, r, i) {
|
|
117
|
+
for (let a of e) {
|
|
118
|
+
let e = {
|
|
119
|
+
ids: [...r, a.id],
|
|
120
|
+
labels: [...i, a.label],
|
|
121
|
+
leaf: a
|
|
122
|
+
};
|
|
123
|
+
t.push(e), a.children?.length && n(a.children, e.ids, e.labels);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return n(e, [], []), t;
|
|
127
|
+
}
|
|
128
|
+
function u(e, t, n = 20) {
|
|
129
|
+
let r = f(t);
|
|
130
|
+
if (!r) return [];
|
|
131
|
+
let i = (e) => {
|
|
132
|
+
let t = f(e.labels.at(-1) ?? "");
|
|
133
|
+
return t === r ? 0 : t.includes(r) ? 1 : 2;
|
|
134
|
+
};
|
|
135
|
+
return l(e).filter((e) => f(e.labels.join("/")).includes(r)).sort((e, t) => i(e) - i(t) || e.labels.join("/").localeCompare(t.labels.join("/"), "zh-CN")).slice(0, n);
|
|
136
|
+
}
|
|
137
|
+
function d(e, t) {
|
|
138
|
+
if (!t.length) return;
|
|
139
|
+
let n = e, r = [], i = [], a;
|
|
140
|
+
for (let e of t) {
|
|
141
|
+
if (a = n.find((t) => t.id === e), !a) return;
|
|
142
|
+
i.push(a.id), r.push(a.label), n = a.children ?? [];
|
|
143
|
+
}
|
|
144
|
+
return a ? {
|
|
145
|
+
ids: i,
|
|
146
|
+
labels: r,
|
|
147
|
+
leaf: a
|
|
148
|
+
} : void 0;
|
|
149
|
+
}
|
|
150
|
+
function f(e) {
|
|
151
|
+
return e.replace(/[\s/]+/gu, "").toLocaleLowerCase();
|
|
152
|
+
}
|
|
153
|
+
function p(e, t) {
|
|
154
|
+
typeof e == "function" ? e(t) : e && (e.current = t);
|
|
155
|
+
}
|
|
156
|
+
//#endregion
|
|
157
|
+
export { c as StructuredAddressInput, d as findAddressRegionPath, l as flattenAddressRegions, u as searchAddressRegions };
|
package/dist/Toast.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { Button as e } from "./Button.js";
|
|
2
|
+
import { useOverlayContainer as t } from "./OverlayContainer.js";
|
|
3
|
+
import { AlertCircle as n, CheckCircle2 as r, Info as i, TriangleAlert as a, X as o } from "lucide-react";
|
|
4
|
+
import { createContext as s, useCallback as c, useContext as l, useMemo as u, useRef as d, useState as f } from "react";
|
|
5
|
+
import { jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
6
|
+
import { createPortal as h } from "react-dom";
|
|
7
|
+
import * as g from "@radix-ui/react-toast";
|
|
8
|
+
//#region src/Toast.tsx
|
|
9
|
+
var _ = s(null), v = {
|
|
10
|
+
info: i,
|
|
11
|
+
success: r,
|
|
12
|
+
warning: a,
|
|
13
|
+
danger: n
|
|
14
|
+
};
|
|
15
|
+
function y({ children: e, maxVisible: n = 4 }) {
|
|
16
|
+
let r = t(), [i, a] = f([]), o = d(0), s = Number.isFinite(n) ? Math.max(1, Math.floor(n)) : 4, l = c((e) => a((t) => t.filter((t) => t.id !== e)), []), v = c(() => a([]), []), y = c((e) => {
|
|
17
|
+
let t = ++o.current, n = e.id ?? `ui-toast-${t}`, r = e.tone ?? "info", i = e.duration ?? (r === "danger" ? 0 : r === "warning" ? 6e3 : 4e3);
|
|
18
|
+
return a((a) => {
|
|
19
|
+
let o = {
|
|
20
|
+
...e,
|
|
21
|
+
id: n,
|
|
22
|
+
tone: r,
|
|
23
|
+
duration: i,
|
|
24
|
+
revision: t
|
|
25
|
+
};
|
|
26
|
+
return a.some((e) => e.id === n) ? a.map((e) => e.id === n ? o : e) : [...a, o];
|
|
27
|
+
}), n;
|
|
28
|
+
}, []), b = u(() => ({
|
|
29
|
+
toast: y,
|
|
30
|
+
dismiss: l,
|
|
31
|
+
dismissAll: v
|
|
32
|
+
}), [
|
|
33
|
+
y,
|
|
34
|
+
l,
|
|
35
|
+
v
|
|
36
|
+
]);
|
|
37
|
+
return /* @__PURE__ */ p(_.Provider, {
|
|
38
|
+
value: b,
|
|
39
|
+
children: /* @__PURE__ */ m(g.Provider, {
|
|
40
|
+
label: "通知",
|
|
41
|
+
children: [
|
|
42
|
+
e,
|
|
43
|
+
i.slice(0, s).map((e) => /* @__PURE__ */ p(x, {
|
|
44
|
+
item: e,
|
|
45
|
+
dismiss: l
|
|
46
|
+
}, `${e.id}-${e.revision}`)),
|
|
47
|
+
typeof document > "u" ? null : h(/* @__PURE__ */ p(g.Viewport, {
|
|
48
|
+
className: "ui-toast-viewport",
|
|
49
|
+
label: "通知(F8)"
|
|
50
|
+
}), r ?? document.body)
|
|
51
|
+
]
|
|
52
|
+
})
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function b() {
|
|
56
|
+
let e = l(_);
|
|
57
|
+
if (!e) throw Error("useToast 必须在 ToastProvider 内使用");
|
|
58
|
+
return e;
|
|
59
|
+
}
|
|
60
|
+
function x({ item: t, dismiss: n }) {
|
|
61
|
+
let r = v[t.tone];
|
|
62
|
+
return /* @__PURE__ */ m(g.Root, {
|
|
63
|
+
className: `ui-toast ui-toast-${t.tone}`,
|
|
64
|
+
duration: t.duration <= 0 ? Infinity : t.duration,
|
|
65
|
+
type: t.tone === "danger" ? "foreground" : "background",
|
|
66
|
+
open: !0,
|
|
67
|
+
onOpenChange: (e) => {
|
|
68
|
+
e || n(t.id);
|
|
69
|
+
},
|
|
70
|
+
children: [
|
|
71
|
+
/* @__PURE__ */ p(r, {
|
|
72
|
+
className: "ui-toast-icon",
|
|
73
|
+
size: 19,
|
|
74
|
+
"aria-hidden": "true"
|
|
75
|
+
}),
|
|
76
|
+
/* @__PURE__ */ m("div", {
|
|
77
|
+
className: "ui-toast-content",
|
|
78
|
+
children: [/* @__PURE__ */ p(g.Title, {
|
|
79
|
+
asChild: !0,
|
|
80
|
+
children: /* @__PURE__ */ p("strong", { children: t.title })
|
|
81
|
+
}), t.description === void 0 ? null : /* @__PURE__ */ p(g.Description, { children: t.description })]
|
|
82
|
+
}),
|
|
83
|
+
t.actionLabel === void 0 ? null : /* @__PURE__ */ p(e, {
|
|
84
|
+
size: "compact",
|
|
85
|
+
variant: "ghost",
|
|
86
|
+
onClick: () => {
|
|
87
|
+
t.onAction?.(), n(t.id);
|
|
88
|
+
},
|
|
89
|
+
children: t.actionLabel
|
|
90
|
+
}),
|
|
91
|
+
/* @__PURE__ */ p(g.Close, {
|
|
92
|
+
className: "ui-toast-close",
|
|
93
|
+
"aria-label": "关闭通知",
|
|
94
|
+
children: /* @__PURE__ */ p(o, { size: 16 })
|
|
95
|
+
})
|
|
96
|
+
]
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//#endregion
|
|
100
|
+
export { y as ToastProvider, b as useToast };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { forwardRef as e } from "react";
|
|
2
|
+
import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
3
|
+
//#region src/ToggleSwitch.tsx
|
|
4
|
+
var r = e(function({ checked: e, children: r, className: i = "", disabled: a, disabledDescriptionId: o, onChange: s, ...c }, l) {
|
|
5
|
+
let u = !!(a && o);
|
|
6
|
+
return /* @__PURE__ */ n("label", {
|
|
7
|
+
className: `ui-toggle ${i}`.trim(),
|
|
8
|
+
children: [
|
|
9
|
+
/* @__PURE__ */ t("input", {
|
|
10
|
+
...c,
|
|
11
|
+
ref: l,
|
|
12
|
+
type: "checkbox",
|
|
13
|
+
checked: e,
|
|
14
|
+
disabled: a && !u,
|
|
15
|
+
"aria-disabled": u || c["aria-disabled"],
|
|
16
|
+
"aria-describedby": u ? o : c["aria-describedby"],
|
|
17
|
+
onChange: (e) => {
|
|
18
|
+
a || s(e.target.checked);
|
|
19
|
+
}
|
|
20
|
+
}),
|
|
21
|
+
/* @__PURE__ */ t("span", {
|
|
22
|
+
className: "ui-toggle-track",
|
|
23
|
+
"aria-hidden": "true",
|
|
24
|
+
children: /* @__PURE__ */ t("i", {})
|
|
25
|
+
}),
|
|
26
|
+
/* @__PURE__ */ t("span", {
|
|
27
|
+
className: "ui-toggle-copy",
|
|
28
|
+
children: r
|
|
29
|
+
})
|
|
30
|
+
]
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//#endregion
|
|
34
|
+
export { r as ToggleSwitch };
|