asterui 0.12.30 → 0.12.32
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/dist/chart.d.ts +2 -0
- package/dist/chart.js +5 -0
- package/dist/chart.js.map +1 -0
- package/dist/{index2.js → components/Affix.js} +1 -1
- package/dist/components/Affix.js.map +1 -0
- package/dist/{index4.js → components/Alert.js} +1 -1
- package/dist/components/Alert.js.map +1 -0
- package/dist/{index3.js → components/Anchor.js} +1 -1
- package/dist/components/Anchor.js.map +1 -0
- package/dist/{index5.js → components/Autocomplete.js} +1 -1
- package/dist/components/Autocomplete.js.map +1 -0
- package/dist/{index6.js → components/Avatar.js} +1 -1
- package/dist/components/Avatar.js.map +1 -0
- package/dist/components/Badge.d.ts +24 -5
- package/dist/components/Badge.js +220 -0
- package/dist/components/Badge.js.map +1 -0
- package/dist/components/Breadcrumb.js +38 -0
- package/dist/components/Breadcrumb.js.map +1 -0
- package/dist/{index53.js → components/Browser.js} +1 -1
- package/dist/components/Browser.js.map +1 -0
- package/dist/{index9.js → components/Button.js} +1 -1
- package/dist/components/Button.js.map +1 -0
- package/dist/{index14.js → components/Card.js} +22 -22
- package/dist/{index14.js.map → components/Card.js.map} +1 -1
- package/dist/components/Carousel.d.ts +47 -6
- package/dist/components/Carousel.js +205 -0
- package/dist/components/Carousel.js.map +1 -0
- package/dist/{index15.js → components/Cascader.js} +1 -1
- package/dist/components/Cascader.js.map +1 -0
- package/dist/{index16.js → components/Chart.js} +1 -1
- package/dist/components/Chart.js.map +1 -0
- package/dist/{index12.js → components/Chat.js} +1 -1
- package/dist/{index12.js.map → components/Chat.js.map} +1 -1
- package/dist/{index11.js → components/Checkbox.js} +15 -15
- package/dist/components/Checkbox.js.map +1 -0
- package/dist/{index54.js → components/Code.js} +5 -5
- package/dist/{index54.js.map → components/Code.js.map} +1 -1
- package/dist/{index18.js → components/Collapse.js} +1 -1
- package/dist/components/Collapse.js.map +1 -0
- package/dist/{index13.js → components/ColorPicker.js} +1 -1
- package/dist/components/ColorPicker.js.map +1 -0
- package/dist/{index19.js → components/Container.js} +1 -1
- package/dist/components/Container.js.map +1 -0
- package/dist/{index20.js → components/ContextMenu.js} +9 -9
- package/dist/components/ContextMenu.js.map +1 -0
- package/dist/{index10.js → components/CopyButton.js} +2 -2
- package/dist/components/CopyButton.js.map +1 -0
- package/dist/{index21.js → components/Countdown.js} +1 -1
- package/dist/components/Countdown.js.map +1 -0
- package/dist/{index22.js → components/DatePicker.js} +2 -2
- package/dist/components/DatePicker.js.map +1 -0
- package/dist/{index23.js → components/Descriptions.js} +23 -23
- package/dist/components/Descriptions.js.map +1 -0
- package/dist/{index24.js → components/Diff.js} +1 -1
- package/dist/{index24.js.map → components/Diff.js.map} +1 -1
- package/dist/{index26.js → components/Divider.js} +1 -1
- package/dist/components/Divider.js.map +1 -0
- package/dist/{index25.js → components/Dock.js} +1 -1
- package/dist/{index25.js.map → components/Dock.js.map} +1 -1
- package/dist/{index27.js → components/Drawer.js} +1 -1
- package/dist/components/Drawer.js.map +1 -0
- package/dist/{index40.js → components/Dropdown.js} +31 -31
- package/dist/components/Dropdown.js.map +1 -0
- package/dist/{index41.js → components/Empty.js} +1 -1
- package/dist/components/Empty.js.map +1 -0
- package/dist/{index29.js → components/Fieldset.js} +1 -1
- package/dist/components/Fieldset.js.map +1 -0
- package/dist/{index30.js → components/FileInput.js} +1 -1
- package/dist/components/FileInput.js.map +1 -0
- package/dist/{index31.js → components/Filter.js} +1 -1
- package/dist/components/Filter.js.map +1 -0
- package/dist/{index32.js → components/Flex.js} +1 -1
- package/dist/{index32.js.map → components/Flex.js.map} +1 -1
- package/dist/{index33.js → components/FloatButton.js} +1 -1
- package/dist/components/FloatButton.js.map +1 -0
- package/dist/{index34.js → components/Footer.js} +1 -1
- package/dist/components/Footer.js.map +1 -0
- package/dist/{index35.js → components/Form.js} +1 -1
- package/dist/{index35.js.map → components/Form.js.map} +1 -1
- package/dist/{index36.js → components/Grid.js} +6 -6
- package/dist/{index36.js.map → components/Grid.js.map} +1 -1
- package/dist/{index37.js → components/Hero.js} +1 -1
- package/dist/{index37.js.map → components/Hero.js.map} +1 -1
- package/dist/{index38.js → components/HoverGallery.js} +1 -1
- package/dist/components/HoverGallery.js.map +1 -0
- package/dist/{index39.js → components/Image.js} +1 -1
- package/dist/components/Image.js.map +1 -0
- package/dist/{index42.js → components/Input.js} +1 -1
- package/dist/components/Input.js.map +1 -0
- package/dist/{index43.js → components/InputNumber.js} +1 -1
- package/dist/components/InputNumber.js.map +1 -0
- package/dist/components/Join.js +18 -0
- package/dist/{index44.js.map → components/Join.js.map} +1 -1
- package/dist/{index45.js → components/Kbd.js} +1 -1
- package/dist/components/Kbd.js.map +1 -0
- package/dist/{index46.js → components/Layout.js} +16 -16
- package/dist/components/Layout.js.map +1 -0
- package/dist/{index47.js → components/List.js} +17 -17
- package/dist/{index47.js.map → components/List.js.map} +1 -1
- package/dist/{index48.js → components/Loading.js} +1 -1
- package/dist/components/Loading.js.map +1 -0
- package/dist/{index49.js → components/Mask.js} +1 -1
- package/dist/{index49.js.map → components/Mask.js.map} +1 -1
- package/dist/{index50.js → components/Masonry.js} +19 -19
- package/dist/components/Masonry.js.map +1 -0
- package/dist/{index51.js → components/Mention.js} +1 -1
- package/dist/components/Mention.js.map +1 -0
- package/dist/{index52.js → components/Menu.js} +1 -1
- package/dist/{index52.js.map → components/Menu.js.map} +1 -1
- package/dist/{index57.js → components/Modal.js} +23 -23
- package/dist/components/Modal.js.map +1 -0
- package/dist/{index58.js → components/Navbar.js} +1 -1
- package/dist/components/Navbar.js.map +1 -0
- package/dist/{index59.js → components/Notification.js} +1 -1
- package/dist/components/Notification.js.map +1 -0
- package/dist/{index60.js → components/OTPInput.js} +1 -1
- package/dist/components/OTPInput.js.map +1 -0
- package/dist/{index62.js → components/PageLayout.js} +1 -1
- package/dist/components/PageLayout.js.map +1 -0
- package/dist/{index61.js → components/Pagination.js} +18 -18
- package/dist/components/Pagination.js.map +1 -0
- package/dist/{index55.js → components/Phone.js} +1 -1
- package/dist/components/Phone.js.map +1 -0
- package/dist/{index63.js → components/Popconfirm.js} +14 -14
- package/dist/components/Popconfirm.js.map +1 -0
- package/dist/{index64.js → components/Popover.js} +1 -1
- package/dist/components/Popover.js.map +1 -0
- package/dist/{index65.js → components/Progress.js} +1 -1
- package/dist/components/Progress.js.map +1 -0
- package/dist/{index66.js → components/QRCode.js} +1 -1
- package/dist/components/QRCode.js.map +1 -0
- package/dist/{index68.js → components/RadialProgress.js} +1 -1
- package/dist/components/RadialProgress.js.map +1 -0
- package/dist/{index67.js → components/Radio.js} +13 -13
- package/dist/components/Radio.js.map +1 -0
- package/dist/{index69.js → components/Range.js} +1 -1
- package/dist/components/Range.js.map +1 -0
- package/dist/{index70.js → components/Rating.js} +20 -20
- package/dist/components/Rating.js.map +1 -0
- package/dist/{index98.js → components/Responsive.js} +2 -2
- package/dist/components/Responsive.js.map +1 -0
- package/dist/{index71.js → components/Result.js} +1 -1
- package/dist/components/Result.js.map +1 -0
- package/dist/{index73.js → components/Segmented.js} +1 -1
- package/dist/components/Segmented.js.map +1 -0
- package/dist/{index72.js → components/Select.js} +1 -1
- package/dist/components/Select.js.map +1 -0
- package/dist/{index28.js → components/SidebarDrawer.js} +3 -3
- package/dist/components/SidebarDrawer.js.map +1 -0
- package/dist/{index74.js → components/Skeleton.js} +1 -1
- package/dist/components/Skeleton.js.map +1 -0
- package/dist/{index75.js → components/Space.js} +10 -10
- package/dist/components/Space.js.map +1 -0
- package/dist/{index76.js → components/Splitter.js} +22 -22
- package/dist/components/Splitter.js.map +1 -0
- package/dist/{index77.js → components/Stat.js} +1 -1
- package/dist/{index77.js.map → components/Stat.js.map} +1 -1
- package/dist/{index78.js → components/Status.js} +1 -1
- package/dist/components/Status.js.map +1 -0
- package/dist/{index79.js → components/Steps.js} +14 -14
- package/dist/components/Steps.js.map +1 -0
- package/dist/{index80.js → components/Table.js} +92 -92
- package/dist/components/Table.js.map +1 -0
- package/dist/components/Tabs.js +83 -0
- package/dist/{index81.js.map → components/Tabs.js.map} +1 -1
- package/dist/{index84.js → components/Tag.js} +1 -1
- package/dist/components/Tag.js.map +1 -0
- package/dist/{index83.js → components/TextRotate.js} +1 -1
- package/dist/components/TextRotate.js.map +1 -0
- package/dist/{index82.js → components/Textarea.js} +1 -1
- package/dist/components/Textarea.js.map +1 -0
- package/dist/{index85.js → components/ThemeController.js} +1 -1
- package/dist/components/ThemeController.js.map +1 -0
- package/dist/{index86.js → components/TimePicker.js} +2 -2
- package/dist/components/TimePicker.js.map +1 -0
- package/dist/{index87.js → components/Timeline.js} +13 -13
- package/dist/components/Timeline.js.map +1 -0
- package/dist/{index88.js → components/Toggle.js} +1 -1
- package/dist/components/Toggle.js.map +1 -0
- package/dist/{index90.js → components/Tooltip.js} +1 -1
- package/dist/components/Tooltip.js.map +1 -0
- package/dist/{index89.js → components/Tour.js} +1 -1
- package/dist/{index89.js.map → components/Tour.js.map} +1 -1
- package/dist/{index91.js → components/Transfer.js} +1 -1
- package/dist/components/Transfer.js.map +1 -0
- package/dist/{index92.js → components/Tree.js} +1 -1
- package/dist/{index92.js.map → components/Tree.js.map} +1 -1
- package/dist/{index93.js → components/TreeSelect.js} +44 -44
- package/dist/components/TreeSelect.js.map +1 -0
- package/dist/{index94.js → components/Typography.js} +1 -1
- package/dist/components/Typography.js.map +1 -0
- package/dist/{index95.js → components/Upload.js} +1 -1
- package/dist/components/Upload.js.map +1 -0
- package/dist/{index96.js → components/VirtualList.js} +2 -2
- package/dist/components/VirtualList.js.map +1 -0
- package/dist/{index97.js → components/Watermark.js} +1 -1
- package/dist/components/Watermark.js.map +1 -0
- package/dist/{index56.js → components/Window.js} +1 -1
- package/dist/components/Window.js.map +1 -0
- package/dist/{index99.js → hooks/useBreakpoint.js} +1 -1
- package/dist/hooks/useBreakpoint.js.map +1 -0
- package/dist/{index104.js → hooks/useClickOutside.js} +1 -1
- package/dist/hooks/useClickOutside.js.map +1 -0
- package/dist/{index101.js → hooks/useClipboard.js} +1 -1
- package/dist/hooks/useClipboard.js.map +1 -0
- package/dist/{index103.js → hooks/useDebounce.js} +1 -1
- package/dist/hooks/useDebounce.js.map +1 -0
- package/dist/{index100.js → hooks/useDisclosure.js} +1 -1
- package/dist/hooks/useDisclosure.js.map +1 -0
- package/dist/{index106.js → hooks/useHover.js} +1 -1
- package/dist/hooks/useHover.js.map +1 -0
- package/dist/{index107.js → hooks/useKeyPress.js} +1 -1
- package/dist/hooks/useKeyPress.js.map +1 -0
- package/dist/{index102.js → hooks/useLocalStorage.js} +1 -1
- package/dist/hooks/useLocalStorage.js.map +1 -0
- package/dist/{index105.js → hooks/usePrevious.js} +1 -1
- package/dist/hooks/usePrevious.js.map +1 -0
- package/dist/{index108.js → hooks/useWindowSize.js} +1 -1
- package/dist/hooks/useWindowSize.js.map +1 -0
- package/dist/index.d.ts +2 -8
- package/dist/index.js +204 -210
- package/dist/index.js.map +1 -1
- package/dist/qrcode.d.ts +2 -0
- package/dist/qrcode.js +5 -0
- package/dist/qrcode.js.map +1 -0
- package/dist/virtuallist.d.ts +2 -0
- package/dist/virtuallist.js +5 -0
- package/dist/virtuallist.js.map +1 -0
- package/package.json +13 -1
- package/dist/index10.js.map +0 -1
- package/dist/index100.js.map +0 -1
- package/dist/index101.js.map +0 -1
- package/dist/index102.js.map +0 -1
- package/dist/index103.js.map +0 -1
- package/dist/index104.js.map +0 -1
- package/dist/index105.js.map +0 -1
- package/dist/index106.js.map +0 -1
- package/dist/index107.js.map +0 -1
- package/dist/index108.js.map +0 -1
- package/dist/index109.js +0 -36
- package/dist/index109.js.map +0 -1
- package/dist/index11.js.map +0 -1
- package/dist/index110.js +0 -523
- package/dist/index110.js.map +0 -1
- package/dist/index111.js +0 -53
- package/dist/index111.js.map +0 -1
- package/dist/index13.js.map +0 -1
- package/dist/index15.js.map +0 -1
- package/dist/index16.js.map +0 -1
- package/dist/index17.js +0 -8
- package/dist/index17.js.map +0 -1
- package/dist/index18.js.map +0 -1
- package/dist/index19.js.map +0 -1
- package/dist/index2.js.map +0 -1
- package/dist/index20.js.map +0 -1
- package/dist/index21.js.map +0 -1
- package/dist/index22.js.map +0 -1
- package/dist/index23.js.map +0 -1
- package/dist/index26.js.map +0 -1
- package/dist/index27.js.map +0 -1
- package/dist/index28.js.map +0 -1
- package/dist/index29.js.map +0 -1
- package/dist/index3.js.map +0 -1
- package/dist/index30.js.map +0 -1
- package/dist/index31.js.map +0 -1
- package/dist/index33.js.map +0 -1
- package/dist/index34.js.map +0 -1
- package/dist/index38.js.map +0 -1
- package/dist/index39.js.map +0 -1
- package/dist/index4.js.map +0 -1
- package/dist/index40.js.map +0 -1
- package/dist/index41.js.map +0 -1
- package/dist/index42.js.map +0 -1
- package/dist/index43.js.map +0 -1
- package/dist/index44.js +0 -18
- package/dist/index45.js.map +0 -1
- package/dist/index46.js.map +0 -1
- package/dist/index48.js.map +0 -1
- package/dist/index5.js.map +0 -1
- package/dist/index50.js.map +0 -1
- package/dist/index51.js.map +0 -1
- package/dist/index53.js.map +0 -1
- package/dist/index55.js.map +0 -1
- package/dist/index56.js.map +0 -1
- package/dist/index57.js.map +0 -1
- package/dist/index58.js.map +0 -1
- package/dist/index59.js.map +0 -1
- package/dist/index6.js.map +0 -1
- package/dist/index60.js.map +0 -1
- package/dist/index61.js.map +0 -1
- package/dist/index62.js.map +0 -1
- package/dist/index63.js.map +0 -1
- package/dist/index64.js.map +0 -1
- package/dist/index65.js.map +0 -1
- package/dist/index66.js.map +0 -1
- package/dist/index67.js.map +0 -1
- package/dist/index68.js.map +0 -1
- package/dist/index69.js.map +0 -1
- package/dist/index7.js +0 -133
- package/dist/index7.js.map +0 -1
- package/dist/index70.js.map +0 -1
- package/dist/index71.js.map +0 -1
- package/dist/index72.js.map +0 -1
- package/dist/index73.js.map +0 -1
- package/dist/index74.js.map +0 -1
- package/dist/index75.js.map +0 -1
- package/dist/index76.js.map +0 -1
- package/dist/index78.js.map +0 -1
- package/dist/index79.js.map +0 -1
- package/dist/index8.js +0 -38
- package/dist/index8.js.map +0 -1
- package/dist/index80.js.map +0 -1
- package/dist/index81.js +0 -83
- package/dist/index82.js.map +0 -1
- package/dist/index83.js.map +0 -1
- package/dist/index84.js.map +0 -1
- package/dist/index85.js.map +0 -1
- package/dist/index86.js.map +0 -1
- package/dist/index87.js.map +0 -1
- package/dist/index88.js.map +0 -1
- package/dist/index9.js.map +0 -1
- package/dist/index90.js.map +0 -1
- package/dist/index91.js.map +0 -1
- package/dist/index93.js.map +0 -1
- package/dist/index94.js.map +0 -1
- package/dist/index95.js.map +0 -1
- package/dist/index96.js.map +0 -1
- package/dist/index97.js.map +0 -1
- package/dist/index98.js.map +0 -1
- package/dist/index99.js.map +0 -1
|
@@ -73,7 +73,7 @@ function dn({
|
|
|
73
73
|
treeCheckable: g,
|
|
74
74
|
treeLine: k,
|
|
75
75
|
treeIcon: V,
|
|
76
|
-
focused:
|
|
76
|
+
focused: W,
|
|
77
77
|
loading: ce,
|
|
78
78
|
baseTestId: U,
|
|
79
79
|
id: le,
|
|
@@ -84,12 +84,12 @@ function dn({
|
|
|
84
84
|
onCheck: M,
|
|
85
85
|
renderChildren: Z
|
|
86
86
|
}) {
|
|
87
|
-
const C = u(r, "children", q), P = u(r, "title", q),
|
|
88
|
-
K.stopPropagation(), E || X(
|
|
87
|
+
const C = u(r, "children", q), P = u(r, "title", q), _ = u(r, "key", q), D = r.icon, G = C && C.length > 0, E = r.isLeaf ?? !G, B = (K) => {
|
|
88
|
+
K.stopPropagation(), E || X(_);
|
|
89
89
|
}, m = () => {
|
|
90
|
-
r.disabled || (g ? M(
|
|
90
|
+
r.disabled || (g ? M(_, r) : Y(_, r));
|
|
91
91
|
}, j = (K) => {
|
|
92
|
-
K.stopPropagation(), r.disabled || M(
|
|
92
|
+
K.stopPropagation(), r.disabled || M(_, r);
|
|
93
93
|
}, J = (K) => {
|
|
94
94
|
(K.key === "Enter" || K.key === " ") && (K.preventDefault(), m());
|
|
95
95
|
}, N = () => ce ? /* @__PURE__ */ v("span", { className: "loading loading-spinner loading-xs" }) : L ? typeof L == "function" ? L({ expanded: p }) : L : /* @__PURE__ */ v(
|
|
@@ -111,7 +111,7 @@ function dn({
|
|
|
111
111
|
id: le,
|
|
112
112
|
"aria-selected": l || f,
|
|
113
113
|
"aria-expanded": G ? p : void 0,
|
|
114
|
-
"data-testid": `${U}-option-${
|
|
114
|
+
"data-testid": `${U}-option-${_}`,
|
|
115
115
|
"data-state": l || f ? "selected" : "unselected",
|
|
116
116
|
"data-disabled": r.disabled || void 0,
|
|
117
117
|
children: [
|
|
@@ -122,7 +122,7 @@ function dn({
|
|
|
122
122
|
"flex items-center py-1.5 px-2 cursor-pointer hover:bg-base-200 transition-colors outline-none",
|
|
123
123
|
(l || f) && "bg-primary/10 text-primary",
|
|
124
124
|
r.disabled && "opacity-50 cursor-not-allowed",
|
|
125
|
-
|
|
125
|
+
W && "ring-2 ring-primary ring-inset",
|
|
126
126
|
k && d > 0 && "border-l border-base-300 ml-2"
|
|
127
127
|
].filter(Boolean).join(" "),
|
|
128
128
|
style: { paddingLeft: `${d * 16 + 8}px` },
|
|
@@ -200,7 +200,7 @@ const fn = {
|
|
|
200
200
|
treeCheckStrictly: g = !1,
|
|
201
201
|
showCheckedStrategy: k = "SHOW_ALL",
|
|
202
202
|
showSearch: V = !1,
|
|
203
|
-
searchValue:
|
|
203
|
+
searchValue: W,
|
|
204
204
|
onSearch: ce,
|
|
205
205
|
filterTreeNode: U,
|
|
206
206
|
placeholder: le = "Please select",
|
|
@@ -212,7 +212,7 @@ const fn = {
|
|
|
212
212
|
onTreeExpand: Z,
|
|
213
213
|
size: C = "md",
|
|
214
214
|
color: P,
|
|
215
|
-
status:
|
|
215
|
+
status: _,
|
|
216
216
|
variant: D = "outlined",
|
|
217
217
|
ghost: G = !1,
|
|
218
218
|
maxTagCount: E,
|
|
@@ -235,15 +235,15 @@ const fn = {
|
|
|
235
235
|
"data-testid": ze,
|
|
236
236
|
...Ve
|
|
237
237
|
}, ee) => {
|
|
238
|
-
const
|
|
238
|
+
const A = ze ?? "treeselect", ne = on(), ke = `${ne}-listbox`, [Ue, qe] = F(!1), [Ce, te] = F(""), [w, I] = F(null), [Le, me] = F(/* @__PURE__ */ new Set()), de = be(null), fe = be(null), re = be(null), Q = W ?? Ce, y = ue ?? Ue, Ke = (e) => e === void 0 ? [] : Array.isArray(e) ? e.map((n) => typeof n == "object" && n !== null ? n.value : n) : typeof e == "object" && e !== null ? [e.value] : [e], Ge = Ke(p), [Je, se] = F(Ge), h = d !== void 0 ? Ke(d) : Je, Qe = oe(() => X ? un(r, i) : Y, [r, X, Y, i]), [Xe, Ye] = F(Qe), H = M ?? Xe, S = oe(() => {
|
|
239
239
|
const e = [], n = (c) => {
|
|
240
240
|
c.forEach((t) => {
|
|
241
241
|
const o = u(t, "key", i), s = u(t, "children", i);
|
|
242
|
-
e.push({ key: o, node: t }), s &&
|
|
242
|
+
e.push({ key: o, node: t }), s && H.includes(o) && n(s);
|
|
243
243
|
});
|
|
244
244
|
};
|
|
245
245
|
return n(r), e;
|
|
246
|
-
}, [r,
|
|
246
|
+
}, [r, H, i]), O = T(
|
|
247
247
|
(e) => {
|
|
248
248
|
ue === void 0 && qe(e), ye?.(e);
|
|
249
249
|
},
|
|
@@ -251,10 +251,10 @@ const fn = {
|
|
|
251
251
|
);
|
|
252
252
|
ve(() => {
|
|
253
253
|
const e = (n) => {
|
|
254
|
-
de.current && !de.current.contains(n.target) && (O(!1),
|
|
254
|
+
de.current && !de.current.contains(n.target) && (O(!1), W === void 0 && te(""));
|
|
255
255
|
};
|
|
256
256
|
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
257
|
-
}, [O,
|
|
257
|
+
}, [O, W]), ve(() => {
|
|
258
258
|
y && V && fe.current ? fe.current.focus() : y && re.current && re.current.focus();
|
|
259
259
|
}, [y, V]), ve(() => {
|
|
260
260
|
y && S.length > 0 ? h.length > 0 ? I(h[0]) : I(S[0].key) : y || I(null);
|
|
@@ -292,10 +292,10 @@ const fn = {
|
|
|
292
292
|
}
|
|
293
293
|
}
|
|
294
294
|
}
|
|
295
|
-
const c =
|
|
295
|
+
const c = H.includes(e) ? H.filter((t) => t !== e) : [...H, e];
|
|
296
296
|
M === void 0 && Ye(c), Z?.(c);
|
|
297
297
|
},
|
|
298
|
-
[
|
|
298
|
+
[H, M, Z, ae, r, i]
|
|
299
299
|
), he = T(
|
|
300
300
|
(e, n) => {
|
|
301
301
|
let c;
|
|
@@ -308,7 +308,7 @@ const fn = {
|
|
|
308
308
|
c = [...h, e];
|
|
309
309
|
}
|
|
310
310
|
else
|
|
311
|
-
c = [e], O(!1),
|
|
311
|
+
c = [e], O(!1), W === void 0 && te("");
|
|
312
312
|
d === void 0 && se(c);
|
|
313
313
|
const t = c.map((o) => {
|
|
314
314
|
const s = $(r, o, i);
|
|
@@ -338,7 +338,7 @@ const fn = {
|
|
|
338
338
|
l,
|
|
339
339
|
r,
|
|
340
340
|
O,
|
|
341
|
-
|
|
341
|
+
W,
|
|
342
342
|
i,
|
|
343
343
|
j
|
|
344
344
|
]
|
|
@@ -416,7 +416,7 @@ const fn = {
|
|
|
416
416
|
l?.(f || b ? c : c[0] || "", t);
|
|
417
417
|
}, De = (e) => {
|
|
418
418
|
const n = e.target.value;
|
|
419
|
-
|
|
419
|
+
W === void 0 && te(n), ce?.(n);
|
|
420
420
|
}, Ne = (e) => {
|
|
421
421
|
if (!L)
|
|
422
422
|
switch (e.key) {
|
|
@@ -431,7 +431,7 @@ const fn = {
|
|
|
431
431
|
}
|
|
432
432
|
break;
|
|
433
433
|
case "Escape":
|
|
434
|
-
e.preventDefault(), O(!1),
|
|
434
|
+
e.preventDefault(), O(!1), W === void 0 && te(""), re.current?.focus();
|
|
435
435
|
break;
|
|
436
436
|
case "ArrowDown":
|
|
437
437
|
if (e.preventDefault(), !y)
|
|
@@ -451,12 +451,12 @@ const fn = {
|
|
|
451
451
|
if (y && w) {
|
|
452
452
|
e.preventDefault();
|
|
453
453
|
const n = $(r, w, i), c = n ? u(n, "children", i) : void 0;
|
|
454
|
-
c && c.length > 0 && !
|
|
454
|
+
c && c.length > 0 && !H.includes(w) && ie(w);
|
|
455
455
|
}
|
|
456
456
|
break;
|
|
457
457
|
case "ArrowLeft":
|
|
458
458
|
if (y && w)
|
|
459
|
-
if (e.preventDefault(),
|
|
459
|
+
if (e.preventDefault(), H.includes(w))
|
|
460
460
|
ie(w);
|
|
461
461
|
else {
|
|
462
462
|
const n = ge(r, w, i);
|
|
@@ -481,7 +481,7 @@ const fn = {
|
|
|
481
481
|
return o.length === 0 ? { checked: h.includes(n), indeterminate: !1 } : o.length === t.length ? { checked: !0, indeterminate: !1 } : { checked: !1, indeterminate: !0 };
|
|
482
482
|
},
|
|
483
483
|
[h, g, i]
|
|
484
|
-
),
|
|
484
|
+
), Ae = T(
|
|
485
485
|
(e, n) => e.map((c) => {
|
|
486
486
|
const t = u(c, "key", i), { checked: o, indeterminate: s } = Ee(c);
|
|
487
487
|
return /* @__PURE__ */ v(
|
|
@@ -489,7 +489,7 @@ const fn = {
|
|
|
489
489
|
{
|
|
490
490
|
node: c,
|
|
491
491
|
level: n,
|
|
492
|
-
expanded:
|
|
492
|
+
expanded: H.includes(t),
|
|
493
493
|
selected: h.includes(t),
|
|
494
494
|
checked: o,
|
|
495
495
|
indeterminate: s,
|
|
@@ -498,27 +498,27 @@ const fn = {
|
|
|
498
498
|
treeIcon: K,
|
|
499
499
|
focused: w === t,
|
|
500
500
|
loading: Le.has(t),
|
|
501
|
-
baseTestId:
|
|
501
|
+
baseTestId: A,
|
|
502
502
|
id: `${ne}-option-${t}`,
|
|
503
503
|
fieldNames: i,
|
|
504
504
|
switcherIcon: we,
|
|
505
505
|
onToggle: ie,
|
|
506
506
|
onSelect: he,
|
|
507
507
|
onCheck: pe,
|
|
508
|
-
renderChildren:
|
|
508
|
+
renderChildren: Ae
|
|
509
509
|
},
|
|
510
510
|
t
|
|
511
511
|
);
|
|
512
512
|
}),
|
|
513
513
|
[
|
|
514
|
-
|
|
514
|
+
H,
|
|
515
515
|
h,
|
|
516
516
|
b,
|
|
517
517
|
N,
|
|
518
518
|
K,
|
|
519
519
|
w,
|
|
520
520
|
Le,
|
|
521
|
-
|
|
521
|
+
A,
|
|
522
522
|
ne,
|
|
523
523
|
i,
|
|
524
524
|
we,
|
|
@@ -542,17 +542,17 @@ const fn = {
|
|
|
542
542
|
let t = e, o = 0;
|
|
543
543
|
E !== void 0 && E !== "responsive" && e.length > E && (t = e.slice(0, E), o = e.length - E);
|
|
544
544
|
const s = t.map((a) => {
|
|
545
|
-
const x = $(r, a, i), R = x ? u(x, "title", i) : a,
|
|
545
|
+
const x = $(r, a, i), R = x ? u(x, "title", i) : a, _e = R, je = !L, tn = () => {
|
|
546
546
|
Se(a, { stopPropagation: () => {
|
|
547
547
|
} });
|
|
548
548
|
};
|
|
549
|
-
return J ? /* @__PURE__ */ v(rn.Fragment, { children: J({ label:
|
|
549
|
+
return J ? /* @__PURE__ */ v(rn.Fragment, { children: J({ label: _e, value: a, closable: je, onClose: tn }) }, a) : /* @__PURE__ */ z(
|
|
550
550
|
"span",
|
|
551
551
|
{
|
|
552
552
|
className: "inline-flex items-center gap-1 px-2 py-0.5 bg-base-200 rounded text-sm mr-1 mb-1",
|
|
553
|
-
"data-testid": `${
|
|
553
|
+
"data-testid": `${A}-tag-${a}`,
|
|
554
554
|
children: [
|
|
555
|
-
|
|
555
|
+
_e,
|
|
556
556
|
je && /* @__PURE__ */ v(
|
|
557
557
|
"button",
|
|
558
558
|
{
|
|
@@ -611,15 +611,15 @@ const fn = {
|
|
|
611
611
|
k,
|
|
612
612
|
E,
|
|
613
613
|
B,
|
|
614
|
-
|
|
614
|
+
A,
|
|
615
615
|
i,
|
|
616
616
|
L,
|
|
617
617
|
J
|
|
618
|
-
]),
|
|
618
|
+
]), He = _ ? pn[_] : P ? hn[P] : "", nn = G ? "bg-transparent border-transparent" : bn[D], We = /* @__PURE__ */ v("div", { className: "py-1", role: "tree", "aria-label": "Tree options", children: $e.length > 0 ? Ae($e, 0) : /* @__PURE__ */ v(
|
|
619
619
|
"div",
|
|
620
620
|
{
|
|
621
621
|
className: "px-4 py-2 text-base-content/50 text-sm text-center",
|
|
622
|
-
"data-testid": `${
|
|
622
|
+
"data-testid": `${A}-empty`,
|
|
623
623
|
children: Re
|
|
624
624
|
}
|
|
625
625
|
) });
|
|
@@ -630,7 +630,7 @@ const fn = {
|
|
|
630
630
|
de.current = e, typeof ee == "function" ? ee(e) : ee && (ee.current = e);
|
|
631
631
|
},
|
|
632
632
|
className: `relative ${Te}`,
|
|
633
|
-
"data-testid":
|
|
633
|
+
"data-testid": A,
|
|
634
634
|
"data-state": y ? "open" : "closed",
|
|
635
635
|
"data-disabled": L || void 0,
|
|
636
636
|
onKeyDown: Ne,
|
|
@@ -651,12 +651,12 @@ const fn = {
|
|
|
651
651
|
"input flex items-center gap-2 cursor-pointer flex-wrap",
|
|
652
652
|
fn[C],
|
|
653
653
|
nn,
|
|
654
|
-
|
|
654
|
+
He,
|
|
655
655
|
L && "input-disabled opacity-50 cursor-not-allowed",
|
|
656
|
-
y && !
|
|
656
|
+
y && !He && "border-primary"
|
|
657
657
|
].filter(Boolean).join(" "),
|
|
658
658
|
onClick: () => !L && O(!y),
|
|
659
|
-
"data-testid": `${
|
|
659
|
+
"data-testid": `${A}-trigger`,
|
|
660
660
|
children: [
|
|
661
661
|
/* @__PURE__ */ v("div", { className: "flex-1 flex flex-wrap items-center gap-1 min-w-0", children: en || /* @__PURE__ */ v("span", { className: "text-base-content/50", children: le }) }),
|
|
662
662
|
q && h.length > 0 && !L && /* @__PURE__ */ v(
|
|
@@ -666,7 +666,7 @@ const fn = {
|
|
|
666
666
|
className: "hover:text-error flex-shrink-0",
|
|
667
667
|
onClick: Ze,
|
|
668
668
|
"aria-label": "Clear selection",
|
|
669
|
-
"data-testid": `${
|
|
669
|
+
"data-testid": `${A}-clear`,
|
|
670
670
|
children: /* @__PURE__ */ v(
|
|
671
671
|
"svg",
|
|
672
672
|
{
|
|
@@ -715,7 +715,7 @@ const fn = {
|
|
|
715
715
|
{
|
|
716
716
|
id: ke,
|
|
717
717
|
className: `absolute z-50 mt-1 w-full bg-base-100 border border-base-300 rounded-lg shadow-lg max-h-64 overflow-auto ${Fe}`,
|
|
718
|
-
"data-testid": `${
|
|
718
|
+
"data-testid": `${A}-dropdown`,
|
|
719
719
|
children: [
|
|
720
720
|
V && /* @__PURE__ */ v("div", { className: "p-2 border-b border-base-300", children: /* @__PURE__ */ v(
|
|
721
721
|
"input",
|
|
@@ -728,10 +728,10 @@ const fn = {
|
|
|
728
728
|
onChange: De,
|
|
729
729
|
onClick: (e) => e.stopPropagation(),
|
|
730
730
|
"aria-label": "Search tree options",
|
|
731
|
-
"data-testid": `${
|
|
731
|
+
"data-testid": `${A}-search`
|
|
732
732
|
}
|
|
733
733
|
) }),
|
|
734
|
-
xe ? xe(
|
|
734
|
+
xe ? xe(We) : We
|
|
735
735
|
]
|
|
736
736
|
}
|
|
737
737
|
)
|
|
@@ -751,4 +751,4 @@ export {
|
|
|
751
751
|
yn as TreeSelectComponent,
|
|
752
752
|
yn as default
|
|
753
753
|
};
|
|
754
|
-
//# sourceMappingURL=
|
|
754
|
+
//# sourceMappingURL=TreeSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TreeSelect.js","sources":["../../src/components/TreeSelect.tsx"],"sourcesContent":["import React, {\n useState,\n useCallback,\n useRef,\n useEffect,\n useMemo,\n forwardRef,\n useId,\n} from 'react'\nimport type { TreeDataNode } from './Tree'\n\nexport type TreeSelectSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\nexport type TreeSelectColor =\n | 'primary'\n | 'secondary'\n | 'accent'\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'error'\nexport type TreeSelectStatus = 'error' | 'warning'\nexport type TreeSelectVariant = 'outlined' | 'filled' | 'borderless'\nexport type ShowCheckedStrategy = 'SHOW_ALL' | 'SHOW_PARENT' | 'SHOW_CHILD'\n\n// Static strategy constants\nconst SHOW_ALL: ShowCheckedStrategy = 'SHOW_ALL'\nconst SHOW_PARENT: ShowCheckedStrategy = 'SHOW_PARENT'\nconst SHOW_CHILD: ShowCheckedStrategy = 'SHOW_CHILD'\n\nexport interface TreeSelectFieldNames {\n label?: string\n value?: string\n children?: string\n}\n\n/** Value type when labelInValue is true */\nexport interface LabeledValue {\n value: string\n label: React.ReactNode\n}\n\nexport interface TreeSelectProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n treeData: TreeDataNode[]\n value?: string | string[] | LabeledValue | LabeledValue[]\n defaultValue?: string | string[] | LabeledValue | LabeledValue[]\n onChange?: (\n value: string | string[] | LabeledValue | LabeledValue[],\n labels: React.ReactNode[],\n extra?: { triggerValue: string; triggerNode: TreeDataNode }\n ) => void\n multiple?: boolean\n treeCheckable?: boolean\n treeCheckStrictly?: boolean\n showCheckedStrategy?: ShowCheckedStrategy\n showSearch?: boolean\n searchValue?: string\n onSearch?: (value: string) => void\n filterTreeNode?: (searchValue: string, node: TreeDataNode) => boolean\n placeholder?: string\n allowClear?: boolean\n disabled?: boolean\n treeDefaultExpandAll?: boolean\n treeDefaultExpandedKeys?: string[]\n treeExpandedKeys?: string[]\n onTreeExpand?: (expandedKeys: string[]) => void\n size?: TreeSelectSize\n color?: TreeSelectColor\n status?: TreeSelectStatus\n /** Visual variant style */\n variant?: TreeSelectVariant\n /** Ghost style with no background */\n ghost?: boolean\n /** Maximum number of tags to show (multiple/treeCheckable mode) */\n maxTagCount?: number | 'responsive'\n maxTagPlaceholder?: React.ReactNode | ((omittedValues: string[]) => React.ReactNode)\n /** Maximum number of selections allowed */\n maxCount?: number\n /** Return object with value and label instead of just value */\n labelInValue?: boolean\n /** Custom tag render function */\n tagRender?: (props: {\n label: React.ReactNode\n value: string\n closable: boolean\n onClose: () => void\n }) => React.ReactNode\n treeLine?: boolean\n /** Show tree node icon */\n treeIcon?: boolean\n loadData?: (node: TreeDataNode) => Promise<void>\n fieldNames?: TreeSelectFieldNames\n open?: boolean\n onDropdownVisibleChange?: (open: boolean) => void\n suffixIcon?: React.ReactNode\n switcherIcon?: React.ReactNode | ((props: { expanded: boolean }) => React.ReactNode)\n notFoundContent?: React.ReactNode\n dropdownRender?: (menu: React.ReactNode) => React.ReactNode\n popupClassName?: string\n 'data-testid'?: string\n}\n\n// Helper to get field value based on fieldNames\nfunction getFieldValue(\n node: TreeDataNode,\n field: 'title' | 'key' | 'children',\n fieldNames?: TreeSelectFieldNames\n): unknown {\n if (field === 'title') {\n const labelField = fieldNames?.label || 'title'\n return (node as unknown as Record<string, unknown>)[labelField]\n }\n if (field === 'key') {\n const valueField = fieldNames?.value || 'key'\n return (node as unknown as Record<string, unknown>)[valueField]\n }\n if (field === 'children') {\n const childrenField = fieldNames?.children || 'children'\n return (node as unknown as Record<string, unknown>)[childrenField]\n }\n return undefined\n}\n\n// Helper to flatten tree data for search\nfunction flattenTree(\n data: TreeDataNode[],\n parentPath: React.ReactNode[] = [],\n fieldNames?: TreeSelectFieldNames\n): Array<{ node: TreeDataNode; path: React.ReactNode[] }> {\n const result: Array<{ node: TreeDataNode; path: React.ReactNode[] }> = []\n\n data.forEach((node) => {\n const title = getFieldValue(node, 'title', fieldNames) as React.ReactNode\n const children = getFieldValue(node, 'children', fieldNames) as TreeDataNode[] | undefined\n const currentPath = [...parentPath, title]\n result.push({ node, path: currentPath })\n if (children) {\n result.push(...flattenTree(children, currentPath, fieldNames))\n }\n })\n\n return result\n}\n\n// Helper to get all keys\nfunction getAllKeys(data: TreeDataNode[], fieldNames?: TreeSelectFieldNames): string[] {\n const keys: string[] = []\n const traverse = (nodes: TreeDataNode[]) => {\n nodes.forEach((node) => {\n const key = getFieldValue(node, 'key', fieldNames) as string\n const children = getFieldValue(node, 'children', fieldNames) as TreeDataNode[] | undefined\n keys.push(key)\n if (children) traverse(children)\n })\n }\n traverse(data)\n return keys\n}\n\n// Helper to find node by key\nfunction findNode(\n data: TreeDataNode[],\n key: string,\n fieldNames?: TreeSelectFieldNames\n): TreeDataNode | null {\n for (const node of data) {\n const nodeKey = getFieldValue(node, 'key', fieldNames) as string\n const children = getFieldValue(node, 'children', fieldNames) as TreeDataNode[] | undefined\n if (nodeKey === key) return node\n if (children) {\n const found = findNode(children, key, fieldNames)\n if (found) return found\n }\n }\n return null\n}\n\n// Helper to get all descendant keys\nfunction getDescendantKeys(node: TreeDataNode, fieldNames?: TreeSelectFieldNames): string[] {\n const keys: string[] = []\n const traverse = (n: TreeDataNode) => {\n const children = getFieldValue(n, 'children', fieldNames) as TreeDataNode[] | undefined\n if (children) {\n children.forEach((child) => {\n const childKey = getFieldValue(child, 'key', fieldNames) as string\n keys.push(childKey)\n traverse(child)\n })\n }\n }\n traverse(node)\n return keys\n}\n\n// Helper to get parent keys for a node\nfunction getParentKeys(\n data: TreeDataNode[],\n targetKey: string,\n fieldNames?: TreeSelectFieldNames,\n parentKeys: string[] = []\n): string[] | null {\n for (const node of data) {\n const nodeKey = getFieldValue(node, 'key', fieldNames) as string\n const children = getFieldValue(node, 'children', fieldNames) as TreeDataNode[] | undefined\n if (nodeKey === targetKey) return parentKeys\n if (children) {\n const found = getParentKeys(children, targetKey, fieldNames, [...parentKeys, nodeKey])\n if (found) return found\n }\n }\n return null\n}\n\ninterface TreeSelectNodeProps {\n node: TreeDataNode\n level: number\n expanded: boolean\n selected: boolean\n checked: boolean\n indeterminate: boolean\n treeCheckable: boolean\n treeLine: boolean\n treeIcon: boolean\n focused: boolean\n loading: boolean\n baseTestId: string\n id: string\n fieldNames?: TreeSelectFieldNames\n switcherIcon?: React.ReactNode | ((props: { expanded: boolean }) => React.ReactNode)\n onToggle: (key: string) => void\n onSelect: (key: string, node: TreeDataNode) => void\n onCheck: (key: string, node: TreeDataNode) => void\n renderChildren: (children: TreeDataNode[], level: number) => React.ReactNode\n}\n\nfunction TreeSelectNode({\n node,\n level,\n expanded,\n selected,\n checked,\n indeterminate,\n treeCheckable,\n treeLine,\n treeIcon: showTreeIcon,\n focused,\n loading,\n baseTestId,\n id,\n fieldNames,\n switcherIcon,\n onToggle,\n onSelect,\n onCheck,\n renderChildren,\n}: TreeSelectNodeProps) {\n const children = getFieldValue(node, 'children', fieldNames) as TreeDataNode[] | undefined\n const title = getFieldValue(node, 'title', fieldNames) as React.ReactNode\n const key = getFieldValue(node, 'key', fieldNames) as string\n const nodeIcon = node.icon\n const hasChildren = children && children.length > 0\n const isLeaf = node.isLeaf ?? !hasChildren\n\n const handleToggle = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (!isLeaf) {\n onToggle(key)\n }\n }\n\n const handleSelect = () => {\n if (!node.disabled) {\n if (treeCheckable) {\n onCheck(key, node)\n } else {\n onSelect(key, node)\n }\n }\n }\n\n const handleCheck = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (!node.disabled) {\n onCheck(key, node)\n }\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleSelect()\n }\n }\n\n const renderSwitcherIcon = () => {\n if (loading) {\n return (\n <span className=\"loading loading-spinner loading-xs\" />\n )\n }\n\n if (switcherIcon) {\n if (typeof switcherIcon === 'function') {\n return switcherIcon({ expanded })\n }\n return switcherIcon\n }\n\n return (\n <svg\n className={`w-3 h-3 transition-transform ${expanded ? 'rotate-90' : ''}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n )\n }\n\n return (\n <div\n className=\"tree-select-node\"\n role=\"treeitem\"\n id={id}\n aria-selected={selected || checked}\n aria-expanded={hasChildren ? expanded : undefined}\n data-testid={`${baseTestId}-option-${key}`}\n data-state={selected || checked ? 'selected' : 'unselected'}\n data-disabled={node.disabled || undefined}\n >\n <div\n className={[\n 'flex items-center py-1.5 px-2 cursor-pointer hover:bg-base-200 transition-colors outline-none',\n (selected || checked) && 'bg-primary/10 text-primary',\n node.disabled && 'opacity-50 cursor-not-allowed',\n focused && 'ring-2 ring-primary ring-inset',\n treeLine && level > 0 && 'border-l border-base-300 ml-2',\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ paddingLeft: `${level * 16 + 8}px` }}\n onClick={handleSelect}\n onKeyDown={handleKeyDown}\n tabIndex={-1}\n >\n {/* Expand/Collapse icon */}\n <span\n className={[\n 'w-4 h-4 flex items-center justify-center flex-shrink-0 mr-1',\n !isLeaf && 'cursor-pointer',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={handleToggle}\n aria-hidden=\"true\"\n >\n {!isLeaf && renderSwitcherIcon()}\n </span>\n\n {/* Checkbox for treeCheckable mode */}\n {treeCheckable && (\n <span className=\"mr-2 flex-shrink-0\" onClick={handleCheck}>\n <input\n type=\"checkbox\"\n className=\"checkbox checkbox-sm checkbox-primary\"\n checked={checked}\n ref={(el) => {\n if (el) el.indeterminate = indeterminate\n }}\n disabled={node.disabled}\n onChange={handleSelect}\n aria-label={typeof title === 'string' ? title : undefined}\n tabIndex={-1}\n />\n </span>\n )}\n\n {/* Node icon */}\n {showTreeIcon && nodeIcon && (\n <span className=\"mr-1.5 flex-shrink-0 flex items-center\">{nodeIcon}</span>\n )}\n\n {/* Title */}\n <span className=\"flex-1 truncate select-none text-sm\">{title}</span>\n </div>\n\n {/* Children */}\n {hasChildren && expanded && (\n <div role=\"group\">{renderChildren(children!, level + 1)}</div>\n )}\n </div>\n )\n}\n\nconst sizeClasses: Record<TreeSelectSize, string> = {\n xs: 'min-h-6 text-xs',\n sm: 'min-h-8 text-sm',\n md: 'min-h-10 text-base',\n lg: 'min-h-12 text-lg',\n xl: 'min-h-14 text-xl',\n}\n\nconst colorClasses: Record<TreeSelectColor, string> = {\n primary: 'border-primary focus-within:border-primary',\n secondary: 'border-secondary focus-within:border-secondary',\n accent: 'border-accent focus-within:border-accent',\n neutral: 'border-neutral focus-within:border-neutral',\n info: 'border-info focus-within:border-info',\n success: 'border-success focus-within:border-success',\n warning: 'border-warning focus-within:border-warning',\n error: 'border-error focus-within:border-error',\n}\n\nconst statusClasses: Record<TreeSelectStatus, string> = {\n error: 'border-error focus-within:border-error',\n warning: 'border-warning focus-within:border-warning',\n}\n\nconst variantClasses: Record<TreeSelectVariant, string> = {\n outlined: 'border border-base-300',\n filled: 'bg-base-200 border-transparent',\n borderless: 'border-transparent',\n}\n\nexport const TreeSelect = forwardRef<HTMLDivElement, TreeSelectProps>(\n (\n {\n treeData,\n value: controlledValue,\n defaultValue = [],\n onChange,\n multiple = false,\n treeCheckable = false,\n treeCheckStrictly = false,\n showCheckedStrategy = 'SHOW_ALL',\n showSearch = false,\n searchValue: controlledSearchValue,\n onSearch,\n filterTreeNode,\n placeholder = 'Please select',\n allowClear = true,\n disabled = false,\n treeDefaultExpandAll = false,\n treeDefaultExpandedKeys = [],\n treeExpandedKeys: controlledExpandedKeys,\n onTreeExpand,\n size = 'md',\n color,\n status,\n variant = 'outlined',\n ghost = false,\n maxTagCount,\n maxTagPlaceholder,\n maxCount,\n labelInValue = false,\n tagRender,\n treeLine = false,\n treeIcon = false,\n loadData,\n fieldNames,\n open: controlledOpen,\n onDropdownVisibleChange,\n suffixIcon,\n switcherIcon,\n notFoundContent = 'No results found',\n dropdownRender,\n popupClassName = '',\n className = '',\n 'data-testid': testId,\n ...rest\n },\n ref\n ) => {\n const baseTestId = testId ?? 'treeselect'\n const instanceId = useId()\n const listboxId = `${instanceId}-listbox`\n const [isOpen, setIsOpen] = useState(false)\n const [internalSearchValue, setInternalSearchValue] = useState('')\n const [focusedKey, setFocusedKey] = useState<string | null>(null)\n const [loadingKeys, setLoadingKeys] = useState<Set<string>>(new Set())\n const containerRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const searchValue = controlledSearchValue ?? internalSearchValue\n const open = controlledOpen ?? isOpen\n\n // Normalize value to array - handle labelInValue format\n const normalizeValue = (val: string | string[] | LabeledValue | LabeledValue[] | undefined): string[] => {\n if (val === undefined) return []\n if (Array.isArray(val)) {\n return val.map((v) => (typeof v === 'object' && v !== null ? v.value : v))\n }\n if (typeof val === 'object' && val !== null) {\n return [(val as LabeledValue).value]\n }\n return [val as string]\n }\n\n const initialValue = normalizeValue(defaultValue)\n const [internalValue, setInternalValue] = useState<string[]>(initialValue)\n\n const value = controlledValue !== undefined ? normalizeValue(controlledValue) : internalValue\n\n // Expanded keys\n const initialExpandedKeys = useMemo(() => {\n if (treeDefaultExpandAll) return getAllKeys(treeData, fieldNames)\n return treeDefaultExpandedKeys\n }, [treeData, treeDefaultExpandAll, treeDefaultExpandedKeys, fieldNames])\n\n const [internalExpandedKeys, setInternalExpandedKeys] = useState<string[]>(initialExpandedKeys)\n const expandedKeys = controlledExpandedKeys ?? internalExpandedKeys\n\n // Get flattened visible nodes for keyboard navigation\n const visibleNodes = useMemo(() => {\n const nodes: { key: string; node: TreeDataNode }[] = []\n const traverse = (data: TreeDataNode[]) => {\n data.forEach((node) => {\n const key = getFieldValue(node, 'key', fieldNames) as string\n const children = getFieldValue(node, 'children', fieldNames) as\n | TreeDataNode[]\n | undefined\n nodes.push({ key, node })\n if (children && expandedKeys.includes(key)) {\n traverse(children)\n }\n })\n }\n traverse(treeData)\n return nodes\n }, [treeData, expandedKeys, fieldNames])\n\n const setOpen = useCallback(\n (newOpen: boolean) => {\n if (controlledOpen === undefined) {\n setIsOpen(newOpen)\n }\n onDropdownVisibleChange?.(newOpen)\n },\n [controlledOpen, onDropdownVisibleChange]\n )\n\n // Close on click outside\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false)\n if (controlledSearchValue === undefined) {\n setInternalSearchValue('')\n }\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [setOpen, controlledSearchValue])\n\n // Focus management\n useEffect(() => {\n if (open && showSearch && inputRef.current) {\n inputRef.current.focus()\n } else if (open && triggerRef.current) {\n triggerRef.current.focus()\n }\n }, [open, showSearch])\n\n // Initialize focused key when opening\n useEffect(() => {\n if (open && visibleNodes.length > 0) {\n if (value.length > 0) {\n setFocusedKey(value[0])\n } else {\n setFocusedKey(visibleNodes[0].key)\n }\n } else if (!open) {\n setFocusedKey(null)\n }\n }, [open, visibleNodes, value])\n\n // Filter tree data based on search\n const filteredData = useMemo(() => {\n if (!searchValue) return treeData\n\n const flatNodes = flattenTree(treeData, [], fieldNames)\n const matchingKeys = new Set<string>()\n\n flatNodes.forEach(({ node }) => {\n const title = getFieldValue(node, 'title', fieldNames)\n const key = getFieldValue(node, 'key', fieldNames) as string\n\n let isMatch = false\n if (filterTreeNode) {\n isMatch = filterTreeNode(searchValue, node)\n } else {\n const titleStr = typeof title === 'string' ? title : String(title)\n isMatch = titleStr.toLowerCase().includes(searchValue.toLowerCase())\n }\n\n if (isMatch) {\n matchingKeys.add(key)\n }\n })\n\n // Include parent keys of matching nodes\n const filterTree = (nodes: TreeDataNode[]): TreeDataNode[] => {\n return nodes\n .map((node) => {\n const children = getFieldValue(node, 'children', fieldNames) as\n | TreeDataNode[]\n | undefined\n const key = getFieldValue(node, 'key', fieldNames) as string\n const hasMatchingChildren = children && filterTree(children).length > 0\n const isMatch = matchingKeys.has(key)\n\n if (isMatch || hasMatchingChildren) {\n return {\n ...node,\n children: children ? filterTree(children) : undefined,\n }\n }\n return null\n })\n .filter(Boolean) as TreeDataNode[]\n }\n\n return filterTree(treeData)\n }, [treeData, searchValue, filterTreeNode, fieldNames])\n\n const handleToggle = useCallback(\n async (key: string) => {\n const node = findNode(treeData, key, fieldNames)\n\n // Handle async loading\n if (loadData && node) {\n const children = getFieldValue(node, 'children', fieldNames) as\n | TreeDataNode[]\n | undefined\n if (!children || children.length === 0) {\n setLoadingKeys((prev) => new Set(prev).add(key))\n try {\n await loadData(node)\n } finally {\n setLoadingKeys((prev) => {\n const next = new Set(prev)\n next.delete(key)\n return next\n })\n }\n }\n }\n\n const newKeys = expandedKeys.includes(key)\n ? expandedKeys.filter((k) => k !== key)\n : [...expandedKeys, key]\n\n if (controlledExpandedKeys === undefined) {\n setInternalExpandedKeys(newKeys)\n }\n onTreeExpand?.(newKeys)\n },\n [expandedKeys, controlledExpandedKeys, onTreeExpand, loadData, treeData, fieldNames]\n )\n\n const handleSelect = useCallback(\n (key: string, triggerNode: TreeDataNode) => {\n let newValue: string[]\n\n if (multiple) {\n if (value.includes(key)) {\n newValue = value.filter((k) => k !== key)\n } else {\n // Check maxCount limit\n if (maxCount !== undefined && value.length >= maxCount) {\n return // Don't add more if at limit\n }\n newValue = [...value, key]\n }\n } else {\n newValue = [key]\n setOpen(false)\n if (controlledSearchValue === undefined) {\n setInternalSearchValue('')\n }\n }\n\n if (controlledValue === undefined) {\n setInternalValue(newValue)\n }\n\n const labels = newValue.map((k) => {\n const node = findNode(treeData, k, fieldNames)\n return node ? getFieldValue(node, 'title', fieldNames) as React.ReactNode : k\n })\n\n // Build return value based on labelInValue setting\n if (labelInValue) {\n const labeledValues: LabeledValue[] = newValue.map((k) => {\n const node = findNode(treeData, k, fieldNames)\n return {\n value: k,\n label: node ? getFieldValue(node, 'title', fieldNames) as React.ReactNode : k,\n }\n })\n onChange?.(\n multiple ? labeledValues : labeledValues[0] || { value: '', label: '' },\n labels,\n { triggerValue: key, triggerNode }\n )\n } else {\n onChange?.(multiple ? newValue : newValue[0] || '', labels, { triggerValue: key, triggerNode })\n }\n },\n [\n value,\n multiple,\n maxCount,\n controlledValue,\n onChange,\n treeData,\n setOpen,\n controlledSearchValue,\n fieldNames,\n labelInValue,\n ]\n )\n\n const handleCheck = useCallback(\n (key: string, triggerNode: TreeDataNode) => {\n const isChecked = value.includes(key)\n let newValue = [...value]\n\n if (treeCheckStrictly) {\n // No parent-child association\n if (isChecked) {\n newValue = newValue.filter((k) => k !== key)\n } else {\n // Check maxCount limit\n if (maxCount !== undefined && value.length >= maxCount) {\n return // Don't add more if at limit\n }\n newValue.push(key)\n }\n } else {\n const descendantKeys = getDescendantKeys(triggerNode, fieldNames)\n\n if (isChecked) {\n newValue = newValue.filter((k) => k !== key && !descendantKeys.includes(k))\n } else {\n // Check maxCount limit for adding multiple\n const keysToAdd = [key, ...descendantKeys.filter((dk) => !newValue.includes(dk))]\n if (maxCount !== undefined && newValue.length + keysToAdd.length > maxCount) {\n // Add only up to maxCount\n const remainingSlots = maxCount - newValue.length\n if (remainingSlots <= 0) return\n keysToAdd.slice(0, remainingSlots).forEach((k) => newValue.push(k))\n } else {\n newValue.push(key)\n descendantKeys.forEach((dk) => {\n if (!newValue.includes(dk)) newValue.push(dk)\n })\n }\n }\n }\n\n if (controlledValue === undefined) {\n setInternalValue(newValue)\n }\n\n const labels = newValue.map((k) => {\n const n = findNode(treeData, k, fieldNames)\n return n ? getFieldValue(n, 'title', fieldNames) as React.ReactNode : k\n })\n\n // Build return value based on labelInValue setting\n if (labelInValue) {\n const labeledValues: LabeledValue[] = newValue.map((k) => {\n const node = findNode(treeData, k, fieldNames)\n return {\n value: k,\n label: node ? getFieldValue(node, 'title', fieldNames) as React.ReactNode : k,\n }\n })\n onChange?.(labeledValues, labels, { triggerValue: key, triggerNode })\n } else {\n onChange?.(newValue, labels, { triggerValue: key, triggerNode })\n }\n },\n [value, controlledValue, onChange, treeData, treeCheckStrictly, fieldNames, maxCount, labelInValue]\n )\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation()\n const newValue: string[] = []\n\n if (controlledValue === undefined) {\n setInternalValue(newValue)\n }\n\n if (labelInValue) {\n onChange?.(multiple || treeCheckable ? [] : { value: '', label: '' }, [])\n } else {\n onChange?.(multiple || treeCheckable ? newValue : '', [])\n }\n }\n\n const removeTag = (key: string, e: React.MouseEvent) => {\n e.stopPropagation()\n const newValue = value.filter((k) => k !== key)\n\n if (controlledValue === undefined) {\n setInternalValue(newValue)\n }\n\n const labels = newValue.map((k) => {\n const n = findNode(treeData, k, fieldNames)\n return n ? getFieldValue(n, 'title', fieldNames) as React.ReactNode : k\n })\n\n if (labelInValue) {\n const labeledValues: LabeledValue[] = newValue.map((k) => {\n const node = findNode(treeData, k, fieldNames)\n return {\n value: k,\n label: node ? getFieldValue(node, 'title', fieldNames) as React.ReactNode : k,\n }\n })\n onChange?.(\n multiple || treeCheckable ? labeledValues : labeledValues[0] || { value: '', label: '' },\n labels\n )\n } else {\n onChange?.(multiple || treeCheckable ? newValue : newValue[0] || '', labels)\n }\n }\n\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value\n if (controlledSearchValue === undefined) {\n setInternalSearchValue(newValue)\n }\n onSearch?.(newValue)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return\n\n switch (e.key) {\n case 'Enter':\n case ' ':\n if (!open) {\n e.preventDefault()\n setOpen(true)\n } else if (focusedKey) {\n e.preventDefault()\n const node = findNode(treeData, focusedKey, fieldNames)\n if (node && !node.disabled) {\n if (treeCheckable) {\n handleCheck(focusedKey, node)\n } else {\n handleSelect(focusedKey, node)\n }\n }\n }\n break\n\n case 'Escape':\n e.preventDefault()\n setOpen(false)\n if (controlledSearchValue === undefined) {\n setInternalSearchValue('')\n }\n triggerRef.current?.focus()\n break\n\n case 'ArrowDown':\n e.preventDefault()\n if (!open) {\n setOpen(true)\n } else {\n const currentIndex = visibleNodes.findIndex((n) => n.key === focusedKey)\n const nextIndex = currentIndex < visibleNodes.length - 1 ? currentIndex + 1 : 0\n setFocusedKey(visibleNodes[nextIndex]?.key || null)\n }\n break\n\n case 'ArrowUp':\n e.preventDefault()\n if (open) {\n const currentIndex = visibleNodes.findIndex((n) => n.key === focusedKey)\n const prevIndex = currentIndex > 0 ? currentIndex - 1 : visibleNodes.length - 1\n setFocusedKey(visibleNodes[prevIndex]?.key || null)\n }\n break\n\n case 'ArrowRight':\n if (open && focusedKey) {\n e.preventDefault()\n const node = findNode(treeData, focusedKey, fieldNames)\n const children = node\n ? (getFieldValue(node, 'children', fieldNames) as TreeDataNode[] | undefined)\n : undefined\n if (children && children.length > 0 && !expandedKeys.includes(focusedKey)) {\n handleToggle(focusedKey)\n }\n }\n break\n\n case 'ArrowLeft':\n if (open && focusedKey) {\n e.preventDefault()\n if (expandedKeys.includes(focusedKey)) {\n handleToggle(focusedKey)\n } else {\n // Move to parent\n const parentKeys = getParentKeys(treeData, focusedKey, fieldNames)\n if (parentKeys && parentKeys.length > 0) {\n setFocusedKey(parentKeys[parentKeys.length - 1])\n }\n }\n }\n break\n\n case 'Home':\n if (open) {\n e.preventDefault()\n setFocusedKey(visibleNodes[0]?.key || null)\n }\n break\n\n case 'End':\n if (open) {\n e.preventDefault()\n setFocusedKey(visibleNodes[visibleNodes.length - 1]?.key || null)\n }\n break\n }\n }\n\n const getCheckedState = useCallback(\n (node: TreeDataNode): { checked: boolean; indeterminate: boolean } => {\n const key = getFieldValue(node, 'key', fieldNames) as string\n const children = getFieldValue(node, 'children', fieldNames) as TreeDataNode[] | undefined\n\n if (treeCheckStrictly) {\n return { checked: value.includes(key), indeterminate: false }\n }\n\n if (!children || children.length === 0) {\n return { checked: value.includes(key), indeterminate: false }\n }\n\n const descendantKeys = getDescendantKeys(node, fieldNames)\n const checkedDescendants = descendantKeys.filter((k) => value.includes(k))\n\n if (checkedDescendants.length === 0) {\n return { checked: value.includes(key), indeterminate: false }\n }\n\n if (checkedDescendants.length === descendantKeys.length) {\n return { checked: true, indeterminate: false }\n }\n\n return { checked: false, indeterminate: true }\n },\n [value, treeCheckStrictly, fieldNames]\n )\n\n const renderNodes = useCallback(\n (nodes: TreeDataNode[], level: number): React.ReactNode => {\n return nodes.map((node) => {\n const key = getFieldValue(node, 'key', fieldNames) as string\n const { checked, indeterminate } = getCheckedState(node)\n\n return (\n <TreeSelectNode\n key={key}\n node={node}\n level={level}\n expanded={expandedKeys.includes(key)}\n selected={value.includes(key)}\n checked={checked}\n indeterminate={indeterminate}\n treeCheckable={treeCheckable}\n treeLine={treeLine}\n treeIcon={treeIcon}\n focused={focusedKey === key}\n loading={loadingKeys.has(key)}\n baseTestId={baseTestId}\n id={`${instanceId}-option-${key}`}\n fieldNames={fieldNames}\n switcherIcon={switcherIcon}\n onToggle={handleToggle}\n onSelect={handleSelect}\n onCheck={handleCheck}\n renderChildren={renderNodes}\n />\n )\n })\n },\n [\n expandedKeys,\n value,\n treeCheckable,\n treeLine,\n treeIcon,\n focusedKey,\n loadingKeys,\n baseTestId,\n instanceId,\n fieldNames,\n switcherIcon,\n handleToggle,\n handleSelect,\n handleCheck,\n getCheckedState,\n ]\n )\n\n // Display value with showCheckedStrategy\n const displayValue = useMemo(() => {\n if (value.length === 0) return null\n\n let displayKeys = value\n\n if ((treeCheckable || multiple) && showCheckedStrategy !== 'SHOW_ALL') {\n if (showCheckedStrategy === 'SHOW_PARENT') {\n // Only show parent nodes when all children are selected\n displayKeys = value.filter((key) => {\n const parentKeys = getParentKeys(treeData, key, fieldNames)\n if (!parentKeys) return true\n // Check if any parent is fully selected\n return !parentKeys.some((pk) => value.includes(pk))\n })\n } else if (showCheckedStrategy === 'SHOW_CHILD') {\n // Only show leaf nodes\n displayKeys = value.filter((key) => {\n const node = findNode(treeData, key, fieldNames)\n if (!node) return true\n const children = getFieldValue(node, 'children', fieldNames) as\n | TreeDataNode[]\n | undefined\n return !children || children.length === 0\n })\n }\n }\n\n if (multiple || treeCheckable) {\n let keysToShow = displayKeys\n let hiddenCount = 0\n\n if (maxTagCount !== undefined && maxTagCount !== 'responsive') {\n if (displayKeys.length > maxTagCount) {\n keysToShow = displayKeys.slice(0, maxTagCount)\n hiddenCount = displayKeys.length - maxTagCount\n }\n }\n\n const tags = keysToShow.map((key) => {\n const node = findNode(treeData, key, fieldNames)\n const title = node ? getFieldValue(node, 'title', fieldNames) : key\n const label = title as React.ReactNode\n const closable = !disabled\n const onClose = () => {\n const fakeEvent = { stopPropagation: () => {} } as React.MouseEvent\n removeTag(key, fakeEvent)\n }\n\n // Use custom tagRender if provided\n if (tagRender) {\n return (\n <React.Fragment key={key}>\n {tagRender({ label, value: key, closable, onClose })}\n </React.Fragment>\n )\n }\n\n return (\n <span\n key={key}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 bg-base-200 rounded text-sm mr-1 mb-1\"\n data-testid={`${baseTestId}-tag-${key}`}\n >\n {label}\n {closable && (\n <button\n type=\"button\"\n className=\"hover:text-error\"\n onClick={(e) => removeTag(key, e)}\n aria-label={`Remove ${typeof title === 'string' ? title : key}`}\n >\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </span>\n )\n })\n\n if (hiddenCount > 0) {\n const hiddenKeys = displayKeys.slice(maxTagCount as number)\n const placeholder =\n typeof maxTagPlaceholder === 'function'\n ? maxTagPlaceholder(hiddenKeys)\n : maxTagPlaceholder || `+${hiddenCount} more`\n\n tags.push(\n <span\n key=\"__more__\"\n className=\"inline-flex items-center px-2 py-0.5 bg-base-200 rounded text-sm mr-1 mb-1\"\n >\n {placeholder}\n </span>\n )\n }\n\n return tags\n }\n\n const node = findNode(treeData, value[0], fieldNames)\n const title = node ? getFieldValue(node, 'title', fieldNames) : value[0]\n return title as React.ReactNode\n }, [\n value,\n treeData,\n multiple,\n treeCheckable,\n showCheckedStrategy,\n maxTagCount,\n maxTagPlaceholder,\n baseTestId,\n fieldNames,\n disabled,\n tagRender,\n ])\n\n const borderClass = status ? statusClasses[status] : color ? colorClasses[color] : ''\n const variantClass = ghost ? 'bg-transparent border-transparent' : variantClasses[variant]\n\n const dropdownContent = (\n <div className=\"py-1\" role=\"tree\" aria-label=\"Tree options\">\n {filteredData.length > 0 ? (\n renderNodes(filteredData, 0)\n ) : (\n <div\n className=\"px-4 py-2 text-base-content/50 text-sm text-center\"\n data-testid={`${baseTestId}-empty`}\n >\n {notFoundContent}\n </div>\n )}\n </div>\n )\n\n return (\n <div\n ref={(node) => {\n containerRef.current = node\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n }}\n className={`relative ${className}`}\n data-testid={baseTestId}\n data-state={open ? 'open' : 'closed'}\n data-disabled={disabled || undefined}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {/* Trigger */}\n <div\n ref={triggerRef}\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"tree\"\n aria-owns={open ? listboxId : undefined}\n aria-activedescendant={open && focusedKey ? `${instanceId}-option-${focusedKey}` : undefined}\n aria-disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n className={[\n 'input flex items-center gap-2 cursor-pointer flex-wrap',\n sizeClasses[size],\n variantClass,\n borderClass,\n disabled && 'input-disabled opacity-50 cursor-not-allowed',\n open && !borderClass && 'border-primary',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => !disabled && setOpen(!open)}\n data-testid={`${baseTestId}-trigger`}\n >\n <div className=\"flex-1 flex flex-wrap items-center gap-1 min-w-0\">\n {displayValue || <span className=\"text-base-content/50\">{placeholder}</span>}\n </div>\n\n {/* Clear button */}\n {allowClear && value.length > 0 && !disabled && (\n <button\n type=\"button\"\n className=\"hover:text-error flex-shrink-0\"\n onClick={handleClear}\n aria-label=\"Clear selection\"\n data-testid={`${baseTestId}-clear`}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n\n {/* Suffix icon / Dropdown arrow */}\n {suffixIcon || (\n <svg\n className={`w-4 h-4 flex-shrink-0 transition-transform ${open ? 'rotate-180' : ''}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n )}\n </div>\n\n {/* Dropdown */}\n {open && (\n <div\n id={listboxId}\n className={`absolute z-50 mt-1 w-full bg-base-100 border border-base-300 rounded-lg shadow-lg max-h-64 overflow-auto ${popupClassName}`}\n data-testid={`${baseTestId}-dropdown`}\n >\n {/* Search input */}\n {showSearch && (\n <div className=\"p-2 border-b border-base-300\">\n <input\n ref={inputRef}\n type=\"text\"\n className=\"input input-sm w-full\"\n placeholder=\"Search...\"\n value={searchValue}\n onChange={handleSearchChange}\n onClick={(e) => e.stopPropagation()}\n aria-label=\"Search tree options\"\n data-testid={`${baseTestId}-search`}\n />\n </div>\n )}\n\n {/* Tree */}\n {dropdownRender ? dropdownRender(dropdownContent) : dropdownContent}\n </div>\n )}\n </div>\n )\n }\n)\n\nTreeSelect.displayName = 'TreeSelect'\n\n// Attach static strategy constants to TreeSelect\nexport const TreeSelectComponent = Object.assign(TreeSelect, {\n SHOW_ALL,\n SHOW_PARENT,\n SHOW_CHILD,\n})\n\nexport { TreeSelectComponent as default }\n"],"names":["SHOW_ALL","SHOW_PARENT","SHOW_CHILD","getFieldValue","node","field","fieldNames","labelField","valueField","childrenField","flattenTree","data","parentPath","result","title","children","currentPath","getAllKeys","keys","traverse","nodes","key","findNode","nodeKey","found","getDescendantKeys","n","child","childKey","getParentKeys","targetKey","parentKeys","TreeSelectNode","level","expanded","selected","checked","indeterminate","treeCheckable","treeLine","showTreeIcon","focused","loading","baseTestId","id","switcherIcon","onToggle","onSelect","onCheck","renderChildren","nodeIcon","hasChildren","isLeaf","handleToggle","e","handleSelect","handleCheck","handleKeyDown","renderSwitcherIcon","jsx","jsxs","el","sizeClasses","colorClasses","statusClasses","variantClasses","TreeSelect","forwardRef","treeData","controlledValue","defaultValue","onChange","multiple","treeCheckStrictly","showCheckedStrategy","showSearch","controlledSearchValue","onSearch","filterTreeNode","placeholder","allowClear","disabled","treeDefaultExpandAll","treeDefaultExpandedKeys","controlledExpandedKeys","onTreeExpand","size","color","status","variant","ghost","maxTagCount","maxTagPlaceholder","maxCount","labelInValue","tagRender","treeIcon","loadData","controlledOpen","onDropdownVisibleChange","suffixIcon","notFoundContent","dropdownRender","popupClassName","className","testId","rest","ref","instanceId","useId","listboxId","isOpen","setIsOpen","useState","internalSearchValue","setInternalSearchValue","focusedKey","setFocusedKey","loadingKeys","setLoadingKeys","containerRef","useRef","inputRef","triggerRef","searchValue","open","normalizeValue","val","v","initialValue","internalValue","setInternalValue","value","initialExpandedKeys","useMemo","internalExpandedKeys","setInternalExpandedKeys","expandedKeys","visibleNodes","setOpen","useCallback","newOpen","useEffect","handleClickOutside","filteredData","flatNodes","matchingKeys","isMatch","filterTree","hasMatchingChildren","prev","next","newKeys","k","triggerNode","newValue","labels","labeledValues","isChecked","descendantKeys","keysToAdd","dk","remainingSlots","handleClear","removeTag","handleSearchChange","currentIndex","nextIndex","prevIndex","getCheckedState","checkedDescendants","renderNodes","displayValue","displayKeys","pk","keysToShow","hiddenCount","tags","label","closable","onClose","React","hiddenKeys","borderClass","variantClass","dropdownContent","TreeSelectComponent"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Typography.js","sources":["../../src/components/Typography.tsx"],"sourcesContent":["import React, { useState } from 'react'\n\nexport type TypographySize = 'sm' | 'base' | 'lg' | 'xl' | '2xl'\nexport type TitleLevel = 1 | 2 | 3 | 4 | 5\n\nexport interface TypographyProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n size?: TypographySize\n}\n\nexport interface TitleProps extends Omit<React.HTMLAttributes<HTMLHeadingElement>, 'title'> {\n level?: TitleLevel\n children: React.ReactNode\n copyable?: boolean\n ellipsis?: boolean\n}\n\nexport interface ParagraphProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n ellipsis?: boolean | { rows?: number; expandable?: boolean; onExpand?: () => void }\n copyable?: boolean\n size?: TypographySize\n align?: 'left' | 'center' | 'right'\n}\n\nexport interface TextProps extends React.HTMLAttributes<HTMLSpanElement> {\n children: React.ReactNode\n code?: boolean\n mark?: boolean\n strong?: boolean\n italic?: boolean\n underline?: boolean\n delete?: boolean\n type?: 'default' | 'secondary' | 'success' | 'warning' | 'error'\n copyable?: boolean\n}\n\nexport interface TypographyLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n href?: string\n children: React.ReactNode\n external?: boolean\n size?: TypographySize\n}\n\nfunction CopyButton({ text }: { text: string }) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(text)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }\n\n return (\n <button\n onClick={handleCopy}\n className=\"btn btn-ghost btn-xs ml-2 opacity-0 group-hover:opacity-100 transition-opacity\"\n title=\"Copy to clipboard\"\n >\n {copied ? (\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n ) : (\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z\" />\n <path d=\"M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z\" />\n </svg>\n )}\n </button>\n )\n}\n\nfunction TypographyRoot({ children, size = 'base', className = '', ...rest }: TypographyProps) {\n const sizeClasses = {\n sm: 'prose-sm text-sm',\n base: 'prose-base text-base',\n lg: 'prose-lg text-lg',\n xl: 'prose-xl text-xl',\n '2xl': 'prose-2xl text-2xl',\n }\n\n const classes = [\n // Prose classes (only apply if @tailwindcss/typography is installed)\n 'prose dark:prose-invert max-w-none',\n // Fallback styles (always apply)\n 'text-base-content leading-relaxed',\n sizeClasses[size],\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return <div className={classes} {...rest}>{children}</div>\n}\n\nfunction Title({ level = 1, children, copyable, ellipsis, className = '', id, ...rest }: TitleProps) {\n const textContent = typeof children === 'string' ? children : ''\n const generatedId = id || (textContent ? textContent.toLowerCase().replace(/\\s+/g, '-') : undefined)\n\n const levelClasses = {\n 1: 'text-4xl font-bold mb-4',\n 2: 'text-3xl font-bold mb-3',\n 3: 'text-2xl font-semibold mb-3',\n 4: 'text-xl font-semibold mb-2',\n 5: 'text-lg font-semibold mb-2',\n }\n\n const ellipsisClass = ellipsis ? 'truncate' : ''\n const classes = `group ${levelClasses[level]} ${ellipsisClass} ${className}`.trim()\n\n const content = (\n <>\n {children}\n {copyable && <CopyButton text={textContent} />}\n </>\n )\n\n switch (level) {\n case 1:\n return <h1 id={generatedId} className={classes} {...rest}>{content}</h1>\n case 2:\n return <h2 id={generatedId} className={classes} {...rest}>{content}</h2>\n case 3:\n return <h3 id={generatedId} className={classes} {...rest}>{content}</h3>\n case 4:\n return <h4 id={generatedId} className={classes} {...rest}>{content}</h4>\n case 5:\n return <h5 id={generatedId} className={classes} {...rest}>{content}</h5>\n default:\n return <h1 id={generatedId} className={classes} {...rest}>{content}</h1>\n }\n}\n\nconst lineClampClasses = {\n 1: 'line-clamp-1',\n 2: 'line-clamp-2',\n 3: 'line-clamp-3',\n 4: 'line-clamp-4',\n 5: 'line-clamp-5',\n 6: 'line-clamp-6',\n} as const\n\nfunction Paragraph({ children, ellipsis, copyable, size, align, className = '', ...rest }: ParagraphProps) {\n const [expanded, setExpanded] = useState(false)\n const textContent = typeof children === 'string' ? children : ''\n\n const isEllipsisObject = typeof ellipsis === 'object'\n const rows = isEllipsisObject ? ellipsis.rows || 3 : 3\n const expandable = isEllipsisObject ? ellipsis.expandable : false\n\n const clampedRows = Math.min(Math.max(rows, 1), 6) as 1 | 2 | 3 | 4 | 5 | 6\n const ellipsisClass =\n ellipsis && !expanded ? lineClampClasses[clampedRows] : ''\n\n const classes = [\n 'group',\n 'mb-4',\n ellipsisClass,\n size === 'sm' && 'text-sm',\n size === 'base' && 'text-base',\n size === 'lg' && 'text-lg',\n size === 'xl' && 'text-xl',\n size === '2xl' && 'text-2xl',\n align === 'left' && 'text-left',\n align === 'center' && 'text-center',\n align === 'right' && 'text-right',\n className,\n ].filter(Boolean).join(' ')\n\n return (\n <div {...rest}>\n <p className={classes}>\n {children}\n {copyable && <CopyButton text={textContent} />}\n </p>\n {expandable && ellipsis && (\n <button\n onClick={() => {\n setExpanded(!expanded)\n if (isEllipsisObject && ellipsis.onExpand) {\n ellipsis.onExpand()\n }\n }}\n className=\"text-primary text-sm hover:underline\"\n >\n {expanded ? 'Show less' : 'Show more'}\n </button>\n )}\n </div>\n )\n}\n\nfunction Text({\n children,\n code,\n mark,\n strong,\n italic,\n underline,\n delete: del,\n type = 'default',\n copyable,\n className = '',\n ...rest\n}: TextProps) {\n const textContent = typeof children === 'string' ? children : ''\n\n const typeClasses = {\n default: '',\n secondary: 'text-base-content/70',\n success: 'text-success',\n warning: 'text-warning',\n error: 'text-error',\n }\n\n let content = children\n\n if (code) {\n content = (\n <code className=\"px-1.5 py-0.5 bg-base-200 rounded text-sm font-mono\">{content}</code>\n )\n }\n\n if (mark) {\n content = <mark className=\"bg-warning/30 px-1\">{content}</mark>\n }\n\n if (strong) {\n content = <strong className=\"font-bold\">{content}</strong>\n }\n\n if (italic) {\n content = <em className=\"italic\">{content}</em>\n }\n\n if (underline) {\n content = <u className=\"underline\">{content}</u>\n }\n\n if (del) {\n content = <del className=\"line-through opacity-70\">{content}</del>\n }\n\n const classes = `group inline ${typeClasses[type]} ${className}`.trim()\n\n return (\n <span className={classes} {...rest}>\n {content}\n {copyable && <CopyButton text={textContent} />}\n </span>\n )\n}\n\nfunction Link({ href = '#', children, target, external, size, className = '', ...rest }: TypographyLinkProps) {\n const isExternal = external || (href && href.startsWith('http'))\n const linkTarget = target || (isExternal ? '_blank' : undefined)\n const rel = isExternal ? 'noopener noreferrer' : undefined\n\n const classes = [\n 'link',\n 'link-primary',\n size === 'sm' && 'text-sm',\n size === 'base' && 'text-base',\n size === 'lg' && 'text-lg',\n size === 'xl' && 'text-xl',\n size === '2xl' && 'text-2xl',\n className,\n ].filter(Boolean).join(' ')\n\n return (\n <a\n href={href}\n target={linkTarget}\n rel={rel}\n className={classes}\n {...rest}\n >\n {children}\n {isExternal && (\n <svg className=\"w-3 h-3 inline-block ml-1\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z\" />\n <path d=\"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z\" />\n </svg>\n )}\n </a>\n )\n}\n\nexport const Typography = Object.assign(TypographyRoot, {\n Title,\n Paragraph,\n Text,\n Link,\n})\n\nexport default Typography\n"],"names":["CopyButton","text","copied","setCopied","useState","jsx","err","jsxs","TypographyRoot","children","size","className","rest","classes","Title","level","copyable","ellipsis","id","textContent","generatedId","levelClasses","ellipsisClass","content","Fragment","lineClampClasses","Paragraph","align","expanded","setExpanded","isEllipsisObject","rows","expandable","clampedRows","Text","code","mark","strong","italic","underline","del","type","typeClasses","Link","href","target","external","isExternal","linkTarget","rel","Typography"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Upload.js","sources":["../../src/components/Upload.tsx"],"sourcesContent":["import React, { useState, useRef, DragEvent, ChangeEvent } from 'react'\n\nexport interface UploadFile {\n uid: string\n name: string\n status: 'uploading' | 'done' | 'error'\n percent?: number\n url?: string\n response?: any\n error?: any\n originFileObj?: File\n}\n\nexport interface UploadProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n action?: string\n accept?: string\n multiple?: boolean\n maxCount?: number\n maxSize?: number // in bytes\n listType?: 'text' | 'picture' | 'picture-card'\n fileList?: UploadFile[]\n defaultFileList?: UploadFile[]\n beforeUpload?: (file: File, fileList: File[]) => boolean | Promise<boolean>\n onChange?: (info: { file: UploadFile; fileList: UploadFile[] }) => void\n onRemove?: (file: UploadFile) => void | boolean | Promise<void | boolean>\n customRequest?: (options: {\n file: File\n onProgress: (percent: number) => void\n onSuccess: (response: any) => void\n onError: (error: any) => void\n }) => void\n showUploadList?: boolean\n disabled?: boolean\n children?: React.ReactNode\n}\n\nexport const Upload: React.FC<UploadProps> = ({\n action,\n accept,\n multiple = false,\n maxCount,\n maxSize,\n listType = 'text',\n fileList: controlledFileList,\n defaultFileList = [],\n beforeUpload,\n onChange,\n onRemove,\n customRequest,\n showUploadList = true,\n disabled = false,\n children,\n className = '',\n ...rest\n}) => {\n const [internalFileList, setInternalFileList] = useState<UploadFile[]>(defaultFileList)\n const [isDragging, setIsDragging] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n const uidCounter = useRef(0)\n const dragCounter = useRef(0)\n\n const fileList = controlledFileList !== undefined ? controlledFileList : internalFileList\n\n const generateUid = () => {\n uidCounter.current += 1\n return `upload-${Date.now()}-${uidCounter.current}`\n }\n\n const updateFileList = (newFileList: UploadFile[]) => {\n if (controlledFileList === undefined) {\n setInternalFileList(newFileList)\n }\n }\n\n const uploadFile = (file: File) => {\n const uploadFile: UploadFile = {\n uid: generateUid(),\n name: file.name,\n status: 'uploading',\n percent: 0,\n originFileObj: file,\n }\n\n const newFileList = [...fileList, uploadFile]\n updateFileList(newFileList)\n onChange?.({ file: uploadFile, fileList: newFileList })\n\n const updateProgress = (percent: number) => {\n const updatedList = newFileList.map((f) =>\n f.uid === uploadFile.uid ? { ...f, percent } : f\n )\n updateFileList(updatedList)\n onChange?.({ file: { ...uploadFile, percent }, fileList: updatedList })\n }\n\n const onSuccess = (response: any) => {\n const successFile = {\n ...uploadFile,\n status: 'done' as const,\n percent: 100,\n response,\n }\n const updatedList = newFileList.map((f) =>\n f.uid === uploadFile.uid ? successFile : f\n )\n updateFileList(updatedList)\n onChange?.({ file: successFile, fileList: updatedList })\n }\n\n const onError = (error: any) => {\n const errorFile = {\n ...uploadFile,\n status: 'error' as const,\n error,\n }\n const updatedList = newFileList.map((f) =>\n f.uid === uploadFile.uid ? errorFile : f\n )\n updateFileList(updatedList)\n onChange?.({ file: errorFile, fileList: updatedList })\n }\n\n if (customRequest) {\n customRequest({\n file,\n onProgress: updateProgress,\n onSuccess,\n onError,\n })\n } else if (action) {\n const formData = new FormData()\n formData.append('file', file)\n\n const xhr = new XMLHttpRequest()\n\n xhr.upload.addEventListener('progress', (e) => {\n if (e.lengthComputable) {\n const percent = Math.round((e.loaded / e.total) * 100)\n updateProgress(percent)\n }\n })\n\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n onSuccess(xhr.response)\n } else {\n onError(new Error(`Upload failed with status ${xhr.status}`))\n }\n })\n\n xhr.addEventListener('error', () => {\n onError(new Error('Upload failed'))\n })\n\n xhr.open('POST', action)\n xhr.send(formData)\n } else {\n // No upload action, just mark as done\n onSuccess(null)\n }\n }\n\n const handleFiles = async (files: FileList | File[]) => {\n if (disabled) return\n\n const fileArray = Array.from(files)\n\n // Check maxCount\n if (maxCount && fileList.length + fileArray.length > maxCount) {\n console.warn(`Cannot upload more than ${maxCount} files`)\n return\n }\n\n // Check maxSize\n if (maxSize) {\n const oversizedFiles = fileArray.filter((file) => file.size > maxSize)\n if (oversizedFiles.length > 0) {\n console.warn(\n `Files exceed maximum size of ${maxSize} bytes:`,\n oversizedFiles.map((f) => f.name)\n )\n return\n }\n }\n\n // beforeUpload hook\n if (beforeUpload) {\n const results = await Promise.all(\n fileArray.map((file) => beforeUpload(file, fileArray))\n )\n const filteredFiles = fileArray.filter((_, index) => results[index] !== false)\n filteredFiles.forEach(uploadFile)\n } else {\n fileArray.forEach(uploadFile)\n }\n }\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n if (e.target.files) {\n handleFiles(e.target.files)\n }\n // Reset input value to allow uploading the same file again\n e.target.value = ''\n }\n\n const handleDragEnter = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (!disabled) {\n dragCounter.current++\n setIsDragging(true)\n }\n }\n\n const handleDragLeave = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (!disabled) {\n dragCounter.current--\n if (dragCounter.current === 0) {\n setIsDragging(false)\n }\n }\n }\n\n const handleDragOver = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n }\n\n const handleDrop = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n dragCounter.current = 0\n setIsDragging(false)\n\n if (disabled) return\n\n if (e.dataTransfer.files) {\n handleFiles(e.dataTransfer.files)\n }\n }\n\n const handleRemove = async (file: UploadFile) => {\n if (onRemove) {\n const result = await onRemove(file)\n if (result === false) return\n }\n\n const newFileList = fileList.filter((f) => f.uid !== file.uid)\n updateFileList(newFileList)\n onChange?.({ file, fileList: newFileList })\n }\n\n const renderFileList = () => {\n if (!showUploadList || fileList.length === 0) return null\n\n if (listType === 'picture-card') {\n return (\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {fileList.map((file) => (\n <div\n key={file.uid}\n className=\"relative w-24 h-24 border border-base-content/20 rounded-lg overflow-hidden\"\n >\n {file.status === 'uploading' && (\n <div className=\"absolute inset-0 bg-base-300/80 flex items-center justify-center\">\n <span className=\"loading loading-spinner loading-sm\"></span>\n </div>\n )}\n {file.status === 'done' && file.url && (\n <img\n src={file.url}\n alt={file.name}\n className=\"w-full h-full object-cover\"\n />\n )}\n {file.status === 'error' && (\n <div className=\"absolute inset-0 bg-error/10 flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-error\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </div>\n )}\n <button\n onClick={() => handleRemove(file)}\n className=\"absolute top-1 right-1 btn btn-xs btn-circle btn-error\"\n type=\"button\"\n >\n ✕\n </button>\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div className=\"mt-2 space-y-2\">\n {fileList.map((file) => (\n <div\n key={file.uid}\n className=\"flex items-center gap-2 p-2 border border-base-content/10 rounded-lg\"\n >\n {listType === 'picture' && file.url && (\n <img\n src={file.url}\n alt={file.name}\n className=\"w-12 h-12 object-cover rounded\"\n />\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"truncate text-sm\">{file.name}</div>\n {file.status === 'uploading' && file.percent !== undefined && (\n <div className=\"w-full bg-base-200 rounded-full h-1.5 mt-1\">\n <div\n className=\"bg-primary h-1.5 rounded-full transition-all\"\n style={{ width: `${file.percent}%` }}\n />\n </div>\n )}\n {file.status === 'error' && (\n <div className=\"text-xs text-error mt-1\">Upload failed</div>\n )}\n </div>\n <button\n onClick={() => handleRemove(file)}\n className=\"btn btn-xs btn-ghost btn-circle\"\n type=\"button\"\n >\n ✕\n </button>\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div className={className} data-state={isDragging ? 'dragging' : 'idle'} {...rest}>\n <div\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={() => !disabled && fileInputRef.current?.click()}\n className={`\n border-2 border-dashed rounded-lg p-4 cursor-pointer transition-colors\n ${isDragging ? 'border-primary bg-primary/5' : 'border-base-content/20'}\n ${disabled ? 'opacity-50 cursor-not-allowed' : 'hover:border-primary'}\n `}\n >\n {children || (\n <div className=\"flex flex-col items-center gap-2 py-4\">\n <svg\n className=\"w-12 h-12 text-base-content/40\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\"\n />\n </svg>\n <div className=\"text-sm text-center\">\n <span className=\"font-semibold text-primary\">Click to upload</span>\n <span className=\"text-base-content/60\"> or drag and drop</span>\n </div>\n </div>\n )}\n </div>\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n onChange={handleChange}\n disabled={disabled}\n className=\"hidden\"\n />\n\n {renderFileList()}\n </div>\n )\n}\n\nUpload.displayName = 'Upload'\n\nexport default Upload\n"],"names":["Upload","action","accept","multiple","maxCount","maxSize","listType","controlledFileList","defaultFileList","beforeUpload","onChange","onRemove","customRequest","showUploadList","disabled","children","className","rest","internalFileList","setInternalFileList","useState","isDragging","setIsDragging","fileInputRef","useRef","uidCounter","dragCounter","fileList","generateUid","updateFileList","newFileList","uploadFile","file","updateProgress","percent","updatedList","f","onSuccess","response","successFile","onError","error","errorFile","formData","xhr","e","handleFiles","files","fileArray","oversizedFiles","results","_","index","handleChange","handleDragEnter","handleDragLeave","handleDragOver","handleDrop","handleRemove","jsxs","jsx"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as n } from "react/jsx-runtime";
|
|
2
2
|
import { useRef as o } from "react";
|
|
3
|
-
import { useVirtualizer as S } from "
|
|
3
|
+
import { useVirtualizer as S } from "@tanstack/react-virtual";
|
|
4
4
|
function N({
|
|
5
5
|
items: e,
|
|
6
6
|
height: u,
|
|
@@ -66,4 +66,4 @@ N.displayName = "VirtualList";
|
|
|
66
66
|
export {
|
|
67
67
|
N as VirtualList
|
|
68
68
|
};
|
|
69
|
-
//# sourceMappingURL=
|
|
69
|
+
//# sourceMappingURL=VirtualList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VirtualList.js","sources":["../../src/components/VirtualList.tsx"],"sourcesContent":["import React, { useRef } from 'react'\nimport { useVirtualizer } from '@tanstack/react-virtual'\n\nexport interface VirtualListProps<T> {\n /** Array of items to render */\n items: T[]\n /** Height of the scrollable container */\n height: number | string\n /** Height of each item, or function returning estimated height per item */\n itemHeight: number | ((item: T, index: number) => number)\n /** Render function for each item */\n renderItem: (item: T, index: number) => React.ReactNode\n /** Number of items to render outside visible area */\n overscan?: number\n /** Additional class for the scroll container */\n className?: string\n /** Additional class for the inner container */\n innerClassName?: string\n /** Additional class for each item wrapper */\n itemClassName?: string\n /** Width of the container */\n width?: number | string\n /** Gap between items */\n gap?: number\n /** Callback when scroll position changes */\n onScroll?: (scrollTop: number) => void\n}\n\nexport function VirtualList<T>({\n items,\n height,\n itemHeight,\n renderItem,\n overscan = 5,\n className = '',\n innerClassName = '',\n itemClassName = '',\n width,\n gap = 0,\n onScroll,\n}: VirtualListProps<T>) {\n const parentRef = useRef<HTMLDivElement>(null)\n const itemHeightRef = useRef(itemHeight)\n const itemsRef = useRef(items)\n itemHeightRef.current = itemHeight\n itemsRef.current = items\n\n const virtualizer = useVirtualizer({\n count: items.length,\n getScrollElement: () => parentRef.current,\n estimateSize: (index) => {\n const h = typeof itemHeightRef.current === 'function'\n ? itemHeightRef.current(itemsRef.current[index], index)\n : itemHeightRef.current\n return h + gap\n },\n overscan,\n })\n\n const virtualItems = virtualizer.getVirtualItems()\n\n const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {\n onScroll?.(e.currentTarget.scrollTop)\n }\n\n return (\n <div\n ref={parentRef}\n className={`overflow-auto ${className}`}\n style={{ height, width }}\n onScroll={handleScroll}\n >\n <div\n className={innerClassName}\n style={{\n height: virtualizer.getTotalSize(),\n width: '100%',\n position: 'relative',\n }}\n >\n {virtualItems.map((virtualItem) => (\n <div\n key={virtualItem.key}\n className={itemClassName}\n data-index={virtualItem.index}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: virtualItem.size - gap,\n transform: `translateY(${virtualItem.start}px)`,\n }}\n >\n {renderItem(items[virtualItem.index], virtualItem.index)}\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nVirtualList.displayName = 'VirtualList'\n"],"names":["VirtualList","items","height","itemHeight","renderItem","overscan","className","innerClassName","itemClassName","width","gap","onScroll","parentRef","useRef","itemHeightRef","itemsRef","virtualizer","useVirtualizer","index","virtualItems","handleScroll","e","jsx","virtualItem"],"mappings":";;;AA4BO,SAASA,EAAe;AAAA,EAC7B,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,YAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,gBAAAC,IAAiB;AAAA,EACjB,eAAAC,IAAgB;AAAA,EAChB,OAAAC;AAAA,EACA,KAAAC,IAAM;AAAA,EACN,UAAAC;AACF,GAAwB;AACtB,QAAMC,IAAYC,EAAuB,IAAI,GACvCC,IAAgBD,EAAOV,CAAU,GACjCY,IAAWF,EAAOZ,CAAK;AAC7B,EAAAa,EAAc,UAAUX,GACxBY,EAAS,UAAUd;AAEnB,QAAMe,IAAcC,EAAe;AAAA,IACjC,OAAOhB,EAAM;AAAA,IACb,kBAAkB,MAAMW,EAAU;AAAA,IAClC,cAAc,CAACM,OACH,OAAOJ,EAAc,WAAY,aACvCA,EAAc,QAAQC,EAAS,QAAQG,CAAK,GAAGA,CAAK,IACpDJ,EAAc,WACPJ;AAAA,IAEb,UAAAL;AAAA,EAAA,CACD,GAEKc,IAAeH,EAAY,gBAAA,GAE3BI,IAAe,CAACC,MAAqC;AACzD,IAAAV,IAAWU,EAAE,cAAc,SAAS;AAAA,EACtC;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKV;AAAA,MACL,WAAW,iBAAiBN,CAAS;AAAA,MACrC,OAAO,EAAE,QAAAJ,GAAQ,OAAAO,EAAA;AAAA,MACjB,UAAUW;AAAA,MAEV,UAAA,gBAAAE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWf;AAAA,UACX,OAAO;AAAA,YACL,QAAQS,EAAY,aAAA;AAAA,YACpB,OAAO;AAAA,YACP,UAAU;AAAA,UAAA;AAAA,UAGX,UAAAG,EAAa,IAAI,CAACI,MACjB,gBAAAD;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAWd;AAAA,cACX,cAAYe,EAAY;AAAA,cACxB,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,QAAQA,EAAY,OAAOb;AAAA,gBAC3B,WAAW,cAAca,EAAY,KAAK;AAAA,cAAA;AAAA,cAG3C,YAAWtB,EAAMsB,EAAY,KAAK,GAAGA,EAAY,KAAK;AAAA,YAAA;AAAA,YAZlDA,EAAY;AAAA,UAAA,CAcpB;AAAA,QAAA;AAAA,MAAA;AAAA,IACH;AAAA,EAAA;AAGN;AAEAvB,EAAY,cAAc;"}
|