@mdigital_ui/ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +296 -0
- package/dist/accordion/index.js +5 -0
- package/dist/accordion/index.js.map +1 -0
- package/dist/badge/index.js +5 -0
- package/dist/badge/index.js.map +1 -0
- package/dist/button/index.js +6 -0
- package/dist/button/index.js.map +1 -0
- package/dist/card/index.js +4 -0
- package/dist/card/index.js.map +1 -0
- package/dist/carousel/index.js +3 -0
- package/dist/carousel/index.js.map +1 -0
- package/dist/cascader/index.js +4 -0
- package/dist/cascader/index.js.map +1 -0
- package/dist/chart/index.js +4 -0
- package/dist/chart/index.js.map +1 -0
- package/dist/checkbox/index.js +5 -0
- package/dist/checkbox/index.js.map +1 -0
- package/dist/checkbox-group/index.js +4 -0
- package/dist/checkbox-group/index.js.map +1 -0
- package/dist/chunk-2JGAYDZR.js +181 -0
- package/dist/chunk-2JGAYDZR.js.map +1 -0
- package/dist/chunk-3PFA3YG6.js +228 -0
- package/dist/chunk-3PFA3YG6.js.map +1 -0
- package/dist/chunk-4OMLQCUV.js +96 -0
- package/dist/chunk-4OMLQCUV.js.map +1 -0
- package/dist/chunk-4P5EMRFI.js +298 -0
- package/dist/chunk-4P5EMRFI.js.map +1 -0
- package/dist/chunk-5UEWVFF6.js +212 -0
- package/dist/chunk-5UEWVFF6.js.map +1 -0
- package/dist/chunk-5VCGW53O.js +332 -0
- package/dist/chunk-5VCGW53O.js.map +1 -0
- package/dist/chunk-75XESYGN.js +49 -0
- package/dist/chunk-75XESYGN.js.map +1 -0
- package/dist/chunk-7AEGBABZ.js +1102 -0
- package/dist/chunk-7AEGBABZ.js.map +1 -0
- package/dist/chunk-AOITJRSV.js +134 -0
- package/dist/chunk-AOITJRSV.js.map +1 -0
- package/dist/chunk-AWPKZYHT.js +152 -0
- package/dist/chunk-AWPKZYHT.js.map +1 -0
- package/dist/chunk-BNILRB4T.js +37 -0
- package/dist/chunk-BNILRB4T.js.map +1 -0
- package/dist/chunk-BP434VYV.js +448 -0
- package/dist/chunk-BP434VYV.js.map +1 -0
- package/dist/chunk-C7SXY3ZV.js +65 -0
- package/dist/chunk-C7SXY3ZV.js.map +1 -0
- package/dist/chunk-CLLQDCDR.js +560 -0
- package/dist/chunk-CLLQDCDR.js.map +1 -0
- package/dist/chunk-CWHFK7ZC.js +128 -0
- package/dist/chunk-CWHFK7ZC.js.map +1 -0
- package/dist/chunk-D3JWPGCA.js +123 -0
- package/dist/chunk-D3JWPGCA.js.map +1 -0
- package/dist/chunk-DOKTHDG3.js +55 -0
- package/dist/chunk-DOKTHDG3.js.map +1 -0
- package/dist/chunk-DPOSWW22.js +126 -0
- package/dist/chunk-DPOSWW22.js.map +1 -0
- package/dist/chunk-E2CYDDYC.js +39 -0
- package/dist/chunk-E2CYDDYC.js.map +1 -0
- package/dist/chunk-EYTOKUBM.js +401 -0
- package/dist/chunk-EYTOKUBM.js.map +1 -0
- package/dist/chunk-FGWSUPVW.js +356 -0
- package/dist/chunk-FGWSUPVW.js.map +1 -0
- package/dist/chunk-FPOXTCYV.js +166 -0
- package/dist/chunk-FPOXTCYV.js.map +1 -0
- package/dist/chunk-FTJOSVTY.js +104 -0
- package/dist/chunk-FTJOSVTY.js.map +1 -0
- package/dist/chunk-FYHQDFKE.js +164 -0
- package/dist/chunk-FYHQDFKE.js.map +1 -0
- package/dist/chunk-H2HIBD5Y.js +158 -0
- package/dist/chunk-H2HIBD5Y.js.map +1 -0
- package/dist/chunk-J3G5WWGR.js +53 -0
- package/dist/chunk-J3G5WWGR.js.map +1 -0
- package/dist/chunk-JZCHZ4B3.js +487 -0
- package/dist/chunk-JZCHZ4B3.js.map +1 -0
- package/dist/chunk-KBCBVH7B.js +51 -0
- package/dist/chunk-KBCBVH7B.js.map +1 -0
- package/dist/chunk-KNQ7UQ2W.js +143 -0
- package/dist/chunk-KNQ7UQ2W.js.map +1 -0
- package/dist/chunk-KTBPIEP2.js +102 -0
- package/dist/chunk-KTBPIEP2.js.map +1 -0
- package/dist/chunk-L3SP7GHC.js +1023 -0
- package/dist/chunk-L3SP7GHC.js.map +1 -0
- package/dist/chunk-LBJG2UWT.js +100 -0
- package/dist/chunk-LBJG2UWT.js.map +1 -0
- package/dist/chunk-MLDX3Z67.js +470 -0
- package/dist/chunk-MLDX3Z67.js.map +1 -0
- package/dist/chunk-NNSS366W.js +331 -0
- package/dist/chunk-NNSS366W.js.map +1 -0
- package/dist/chunk-OQANRZPV.js +197 -0
- package/dist/chunk-OQANRZPV.js.map +1 -0
- package/dist/chunk-OW5A5IIF.js +175 -0
- package/dist/chunk-OW5A5IIF.js.map +1 -0
- package/dist/chunk-R225A5II.js +187 -0
- package/dist/chunk-R225A5II.js.map +1 -0
- package/dist/chunk-ROR4E6IE.js +119 -0
- package/dist/chunk-ROR4E6IE.js.map +1 -0
- package/dist/chunk-RPAQAZTI.js +54 -0
- package/dist/chunk-RPAQAZTI.js.map +1 -0
- package/dist/chunk-RQBXZKTH.js +452 -0
- package/dist/chunk-RQBXZKTH.js.map +1 -0
- package/dist/chunk-S5XJXU52.js +178 -0
- package/dist/chunk-S5XJXU52.js.map +1 -0
- package/dist/chunk-SAVE5ACL.js +324 -0
- package/dist/chunk-SAVE5ACL.js.map +1 -0
- package/dist/chunk-SERJ3TZE.js +640 -0
- package/dist/chunk-SERJ3TZE.js.map +1 -0
- package/dist/chunk-SK5ECBBK.js +175 -0
- package/dist/chunk-SK5ECBBK.js.map +1 -0
- package/dist/chunk-SOV4PE3P.js +218 -0
- package/dist/chunk-SOV4PE3P.js.map +1 -0
- package/dist/chunk-W7BQYIXF.js +687 -0
- package/dist/chunk-W7BQYIXF.js.map +1 -0
- package/dist/chunk-XMAH5PDW.js +59 -0
- package/dist/chunk-XMAH5PDW.js.map +1 -0
- package/dist/chunk-XOBGEMQY.js +94 -0
- package/dist/chunk-XOBGEMQY.js.map +1 -0
- package/dist/chunk-YNNAOXU5.js +57 -0
- package/dist/chunk-YNNAOXU5.js.map +1 -0
- package/dist/chunk-YZVSDRJD.js +253 -0
- package/dist/chunk-YZVSDRJD.js.map +1 -0
- package/dist/collapse/index.js +4 -0
- package/dist/collapse/index.js.map +1 -0
- package/dist/command/index.js +5 -0
- package/dist/command/index.js.map +1 -0
- package/dist/date-picker/index.js +5 -0
- package/dist/date-picker/index.js.map +1 -0
- package/dist/descriptions/index.js +4 -0
- package/dist/descriptions/index.js.map +1 -0
- package/dist/drawer/index.js +4 -0
- package/dist/drawer/index.js.map +1 -0
- package/dist/dropdown/index.js +5 -0
- package/dist/dropdown/index.js.map +1 -0
- package/dist/empty/index.js +4 -0
- package/dist/empty/index.js.map +1 -0
- package/dist/fetching-overlay/index.js +5 -0
- package/dist/fetching-overlay/index.js.map +1 -0
- package/dist/image/index.js +4 -0
- package/dist/image/index.js.map +1 -0
- package/dist/index.d.ts +2672 -0
- package/dist/index.js +976 -0
- package/dist/index.js.map +1 -0
- package/dist/input/index.js +5 -0
- package/dist/input/index.js.map +1 -0
- package/dist/input-group/index.js +4 -0
- package/dist/input-group/index.js.map +1 -0
- package/dist/input-otp/index.js +4 -0
- package/dist/input-otp/index.js.map +1 -0
- package/dist/input-password/index.js +6 -0
- package/dist/input-password/index.js.map +1 -0
- package/dist/kbd/index.js +4 -0
- package/dist/kbd/index.js.map +1 -0
- package/dist/modal/index.js +4 -0
- package/dist/modal/index.js.map +1 -0
- package/dist/multi-select/index.js +5 -0
- package/dist/multi-select/index.js.map +1 -0
- package/dist/notification/index.js +4 -0
- package/dist/notification/index.js.map +1 -0
- package/dist/pagination/index.js +4 -0
- package/dist/pagination/index.js.map +1 -0
- package/dist/popover/index.js +4 -0
- package/dist/popover/index.js.map +1 -0
- package/dist/progress/index.js +4 -0
- package/dist/progress/index.js.map +1 -0
- package/dist/radio/index.js +4 -0
- package/dist/radio/index.js.map +1 -0
- package/dist/radio-group/index.js +4 -0
- package/dist/radio-group/index.js.map +1 -0
- package/dist/rating/index.js +4 -0
- package/dist/rating/index.js.map +1 -0
- package/dist/ribbon/index.js +4 -0
- package/dist/ribbon/index.js.map +1 -0
- package/dist/select/index.js +6 -0
- package/dist/select/index.js.map +1 -0
- package/dist/skeleton/index.js +4 -0
- package/dist/skeleton/index.js.map +1 -0
- package/dist/slider/index.js +4 -0
- package/dist/slider/index.js.map +1 -0
- package/dist/spinner/index.js +4 -0
- package/dist/spinner/index.js.map +1 -0
- package/dist/stepper/index.js +4 -0
- package/dist/stepper/index.js.map +1 -0
- package/dist/styles/base.css +161 -0
- package/dist/styles/global.css +633 -0
- package/dist/styles/themes/dark.css +84 -0
- package/dist/styles/themes/light.css +84 -0
- package/dist/switch/index.js +4 -0
- package/dist/switch/index.js.map +1 -0
- package/dist/table/index.js +12 -0
- package/dist/table/index.js.map +1 -0
- package/dist/tabs/index.js +5 -0
- package/dist/tabs/index.js.map +1 -0
- package/dist/textarea/index.js +4 -0
- package/dist/textarea/index.js.map +1 -0
- package/dist/toggle/index.js +4 -0
- package/dist/toggle/index.js.map +1 -0
- package/dist/toggle-group/index.js +4 -0
- package/dist/toggle-group/index.js.map +1 -0
- package/dist/tooltip/index.js +4 -0
- package/dist/tooltip/index.js.map +1 -0
- package/dist/transfer/index.js +6 -0
- package/dist/transfer/index.js.map +1 -0
- package/dist/tree/index.js +4 -0
- package/dist/tree/index.js.map +1 -0
- package/dist/tree-select/index.js +6 -0
- package/dist/tree-select/index.js.map +1 -0
- package/package.json +107 -0
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
import { checkbox_default } from './chunk-H2HIBD5Y.js';
|
|
2
|
+
import { cn, getValidationStatus, iconSizes, statusMessageVariants } from './chunk-YNNAOXU5.js';
|
|
3
|
+
import { Search, ChevronRight, ChevronLeft, ChevronsRight, ChevronsLeft } from 'lucide-react';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { cva } from 'class-variance-authority';
|
|
6
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var transferHeaderVariants = cva(
|
|
9
|
+
"flex items-center justify-between px-4 py-2 border-b border-border bg-surface"
|
|
10
|
+
);
|
|
11
|
+
var transferBodyVariants = cva("overflow-y-auto");
|
|
12
|
+
var transferItemVariants = cva(
|
|
13
|
+
"flex items-center gap-2 px-4 py-2 cursor-pointer transition-colors hover:bg-surface",
|
|
14
|
+
{
|
|
15
|
+
variants: {
|
|
16
|
+
selected: {
|
|
17
|
+
true: "bg-primary/10",
|
|
18
|
+
false: ""
|
|
19
|
+
},
|
|
20
|
+
disabled: {
|
|
21
|
+
true: "opacity-50 cursor-not-allowed hover:bg-transparent",
|
|
22
|
+
false: ""
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
defaultVariants: {
|
|
26
|
+
selected: false,
|
|
27
|
+
disabled: false
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
var transferButtonVariants = cva("flex flex-col gap-2");
|
|
32
|
+
var transferActionButtonVariants = cva(
|
|
33
|
+
"flex items-center justify-center p-2 rounded-md border border-border bg-background text-text-muted hover:bg-primary hover:text-white hover:border-primary transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-background disabled:hover:text-text-muted disabled:hover:border-border"
|
|
34
|
+
);
|
|
35
|
+
var filterItems = (items, searchValue) => {
|
|
36
|
+
if (!searchValue) return items;
|
|
37
|
+
const lowerSearch = searchValue.toLowerCase();
|
|
38
|
+
return items.filter(
|
|
39
|
+
(item) => item.label.toLowerCase().includes(lowerSearch) || item.description?.toLowerCase().includes(lowerSearch)
|
|
40
|
+
);
|
|
41
|
+
};
|
|
42
|
+
var getItemsByKeys = (items, keys) => {
|
|
43
|
+
return items.filter((item) => keys.includes(item.key));
|
|
44
|
+
};
|
|
45
|
+
var getEnabledItems = (items) => {
|
|
46
|
+
return items.filter((item) => !item.disabled);
|
|
47
|
+
};
|
|
48
|
+
var TransferList = React.memo(
|
|
49
|
+
({
|
|
50
|
+
title,
|
|
51
|
+
dataSource,
|
|
52
|
+
selectedKeys,
|
|
53
|
+
disabled = false,
|
|
54
|
+
showSearch = false,
|
|
55
|
+
searchPlaceholder = "Search...",
|
|
56
|
+
listHeight = 300,
|
|
57
|
+
showSelectAll = true,
|
|
58
|
+
onItemSelect,
|
|
59
|
+
onItemSelectAll,
|
|
60
|
+
onSearch,
|
|
61
|
+
render,
|
|
62
|
+
footer
|
|
63
|
+
}) => {
|
|
64
|
+
const [searchValue, setSearchValue] = React.useState("");
|
|
65
|
+
const filteredData = React.useMemo(
|
|
66
|
+
() => filterItems(dataSource, searchValue),
|
|
67
|
+
[dataSource, searchValue]
|
|
68
|
+
);
|
|
69
|
+
const enabledItems = React.useMemo(
|
|
70
|
+
() => getEnabledItems(filteredData),
|
|
71
|
+
[filteredData]
|
|
72
|
+
);
|
|
73
|
+
const selectedCount = React.useMemo(
|
|
74
|
+
() => filteredData.filter((item) => selectedKeys.includes(item.key)).length,
|
|
75
|
+
[filteredData, selectedKeys]
|
|
76
|
+
);
|
|
77
|
+
const allChecked = enabledItems.length > 0 && selectedCount === enabledItems.length;
|
|
78
|
+
const indeterminate = selectedCount > 0 && selectedCount < enabledItems.length;
|
|
79
|
+
const handleSearchChange = React.useCallback(
|
|
80
|
+
(e) => {
|
|
81
|
+
const value = e.target.value;
|
|
82
|
+
setSearchValue(value);
|
|
83
|
+
onSearch?.(value);
|
|
84
|
+
},
|
|
85
|
+
[onSearch]
|
|
86
|
+
);
|
|
87
|
+
const handleSelectAll = React.useCallback(
|
|
88
|
+
(e) => {
|
|
89
|
+
const checked = e.target.checked;
|
|
90
|
+
const keys = enabledItems.map((item) => item.key);
|
|
91
|
+
onItemSelectAll(keys, checked);
|
|
92
|
+
},
|
|
93
|
+
[enabledItems, onItemSelectAll]
|
|
94
|
+
);
|
|
95
|
+
const handleItemSelect = React.useCallback(
|
|
96
|
+
(item) => {
|
|
97
|
+
if (item.disabled) return;
|
|
98
|
+
const checked = !selectedKeys.includes(item.key);
|
|
99
|
+
onItemSelect(item.key, checked);
|
|
100
|
+
},
|
|
101
|
+
[selectedKeys, onItemSelect]
|
|
102
|
+
);
|
|
103
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col border border-border rounded-lg bg-card overflow-hidden min-w-72", children: [
|
|
104
|
+
/* @__PURE__ */ jsx("div", { className: transferHeaderVariants(), children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-1", children: [
|
|
105
|
+
showSelectAll && /* @__PURE__ */ jsx(
|
|
106
|
+
checkbox_default,
|
|
107
|
+
{
|
|
108
|
+
checked: allChecked,
|
|
109
|
+
indeterminate,
|
|
110
|
+
onChange: handleSelectAll,
|
|
111
|
+
disabled: disabled || enabledItems.length === 0,
|
|
112
|
+
size: "sm"
|
|
113
|
+
}
|
|
114
|
+
),
|
|
115
|
+
/* @__PURE__ */ jsxs("span", { className: "text-sm font-medium text-text-primary", children: [
|
|
116
|
+
title,
|
|
117
|
+
/* @__PURE__ */ jsxs("span", { className: "text-text-muted ml-1", children: [
|
|
118
|
+
"(",
|
|
119
|
+
selectedCount,
|
|
120
|
+
"/",
|
|
121
|
+
filteredData.length,
|
|
122
|
+
")"
|
|
123
|
+
] })
|
|
124
|
+
] })
|
|
125
|
+
] }) }),
|
|
126
|
+
showSearch && /* @__PURE__ */ jsx("div", { className: "p-2 border-b border-border", children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
127
|
+
/* @__PURE__ */ jsx(Search, { className: "absolute left-2 top-1/2 -translate-y-1/2 w-4 h-4 text-text-muted" }),
|
|
128
|
+
/* @__PURE__ */ jsx(
|
|
129
|
+
"input",
|
|
130
|
+
{
|
|
131
|
+
type: "text",
|
|
132
|
+
className: "w-full pl-8 pr-3 py-1.5 text-sm bg-background border border-border rounded-md outline-none focus:border-primary transition-colors",
|
|
133
|
+
placeholder: searchPlaceholder,
|
|
134
|
+
value: searchValue,
|
|
135
|
+
onChange: handleSearchChange,
|
|
136
|
+
disabled
|
|
137
|
+
}
|
|
138
|
+
)
|
|
139
|
+
] }) }),
|
|
140
|
+
/* @__PURE__ */ jsx(
|
|
141
|
+
"div",
|
|
142
|
+
{
|
|
143
|
+
className: transferBodyVariants(),
|
|
144
|
+
style: { height: listHeight },
|
|
145
|
+
children: filteredData.length === 0 ? /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full text-sm text-text-muted", children: "No data" }) : filteredData.map((item) => /* @__PURE__ */ jsxs(
|
|
146
|
+
"div",
|
|
147
|
+
{
|
|
148
|
+
className: cn(
|
|
149
|
+
transferItemVariants({
|
|
150
|
+
selected: selectedKeys.includes(item.key),
|
|
151
|
+
disabled: !!item.disabled || disabled
|
|
152
|
+
})
|
|
153
|
+
),
|
|
154
|
+
onClick: () => handleItemSelect(item),
|
|
155
|
+
children: [
|
|
156
|
+
/* @__PURE__ */ jsx(
|
|
157
|
+
checkbox_default,
|
|
158
|
+
{
|
|
159
|
+
checked: selectedKeys.includes(item.key),
|
|
160
|
+
disabled: !!item.disabled || disabled,
|
|
161
|
+
size: "sm",
|
|
162
|
+
onChange: () => {
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
),
|
|
166
|
+
render ? render(item) : /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
167
|
+
/* @__PURE__ */ jsx("div", { className: "text-sm text-text-primary truncate", children: item.label }),
|
|
168
|
+
item.description && /* @__PURE__ */ jsx("div", { className: "text-xs text-text-muted truncate", children: item.description })
|
|
169
|
+
] })
|
|
170
|
+
]
|
|
171
|
+
},
|
|
172
|
+
item.key
|
|
173
|
+
))
|
|
174
|
+
}
|
|
175
|
+
),
|
|
176
|
+
footer && /* @__PURE__ */ jsx("div", { className: "px-4 py-2 border-t border-border bg-surface text-sm text-text-muted", children: footer })
|
|
177
|
+
] });
|
|
178
|
+
}
|
|
179
|
+
);
|
|
180
|
+
TransferList.displayName = "TransferList";
|
|
181
|
+
var Transfer = React.memo(
|
|
182
|
+
({
|
|
183
|
+
dataSource = [],
|
|
184
|
+
targetKeys,
|
|
185
|
+
defaultTargetKeys = [],
|
|
186
|
+
titles = ["Source", "Target"],
|
|
187
|
+
size = "md",
|
|
188
|
+
showSearch = false,
|
|
189
|
+
searchPlaceholder = "Search...",
|
|
190
|
+
listHeight = 300,
|
|
191
|
+
showSelectAll = true,
|
|
192
|
+
oneWay = false,
|
|
193
|
+
disabled = false,
|
|
194
|
+
render,
|
|
195
|
+
footer,
|
|
196
|
+
onChange,
|
|
197
|
+
onSelectChange,
|
|
198
|
+
onSearch,
|
|
199
|
+
label,
|
|
200
|
+
helperText,
|
|
201
|
+
error,
|
|
202
|
+
warning,
|
|
203
|
+
info,
|
|
204
|
+
success,
|
|
205
|
+
className,
|
|
206
|
+
ref
|
|
207
|
+
}) => {
|
|
208
|
+
const [internalTargetKeys, setInternalTargetKeys] = React.useState(defaultTargetKeys);
|
|
209
|
+
const [leftSelectedKeys, setLeftSelectedKeys] = React.useState([]);
|
|
210
|
+
const [rightSelectedKeys, setRightSelectedKeys] = React.useState(
|
|
211
|
+
[]
|
|
212
|
+
);
|
|
213
|
+
const currentTargetKeys = targetKeys !== void 0 ? targetKeys : internalTargetKeys;
|
|
214
|
+
const { status, message: helperMessage } = getValidationStatus({
|
|
215
|
+
error,
|
|
216
|
+
warning,
|
|
217
|
+
info,
|
|
218
|
+
success,
|
|
219
|
+
helperText
|
|
220
|
+
});
|
|
221
|
+
const leftDataSource = React.useMemo(
|
|
222
|
+
() => dataSource.filter((item) => !currentTargetKeys.includes(item.key)),
|
|
223
|
+
[dataSource, currentTargetKeys]
|
|
224
|
+
);
|
|
225
|
+
const rightDataSource = React.useMemo(
|
|
226
|
+
() => getItemsByKeys(dataSource, currentTargetKeys),
|
|
227
|
+
[dataSource, currentTargetKeys]
|
|
228
|
+
);
|
|
229
|
+
const handleLeftItemSelect = React.useCallback(
|
|
230
|
+
(key, checked) => {
|
|
231
|
+
const newKeys = checked ? [...leftSelectedKeys, key] : leftSelectedKeys.filter((k) => k !== key);
|
|
232
|
+
setLeftSelectedKeys(newKeys);
|
|
233
|
+
onSelectChange?.(newKeys, rightSelectedKeys);
|
|
234
|
+
},
|
|
235
|
+
[leftSelectedKeys, rightSelectedKeys, onSelectChange]
|
|
236
|
+
);
|
|
237
|
+
const handleRightItemSelect = React.useCallback(
|
|
238
|
+
(key, checked) => {
|
|
239
|
+
const newKeys = checked ? [...rightSelectedKeys, key] : rightSelectedKeys.filter((k) => k !== key);
|
|
240
|
+
setRightSelectedKeys(newKeys);
|
|
241
|
+
onSelectChange?.(leftSelectedKeys, newKeys);
|
|
242
|
+
},
|
|
243
|
+
[leftSelectedKeys, rightSelectedKeys, onSelectChange]
|
|
244
|
+
);
|
|
245
|
+
const handleLeftSelectAll = React.useCallback(
|
|
246
|
+
(keys, checked) => {
|
|
247
|
+
const newKeys = checked ? keys : [];
|
|
248
|
+
setLeftSelectedKeys(newKeys);
|
|
249
|
+
onSelectChange?.(newKeys, rightSelectedKeys);
|
|
250
|
+
},
|
|
251
|
+
[rightSelectedKeys, onSelectChange]
|
|
252
|
+
);
|
|
253
|
+
const handleRightSelectAll = React.useCallback(
|
|
254
|
+
(keys, checked) => {
|
|
255
|
+
const newKeys = checked ? keys : [];
|
|
256
|
+
setRightSelectedKeys(newKeys);
|
|
257
|
+
onSelectChange?.(leftSelectedKeys, newKeys);
|
|
258
|
+
},
|
|
259
|
+
[leftSelectedKeys, onSelectChange]
|
|
260
|
+
);
|
|
261
|
+
const moveToRight = React.useCallback(() => {
|
|
262
|
+
const newTargetKeys = [...currentTargetKeys, ...leftSelectedKeys];
|
|
263
|
+
if (targetKeys === void 0) {
|
|
264
|
+
setInternalTargetKeys(newTargetKeys);
|
|
265
|
+
}
|
|
266
|
+
onChange?.(newTargetKeys, "right", leftSelectedKeys);
|
|
267
|
+
setLeftSelectedKeys([]);
|
|
268
|
+
}, [currentTargetKeys, leftSelectedKeys, targetKeys, onChange]);
|
|
269
|
+
const moveToLeft = React.useCallback(() => {
|
|
270
|
+
const newTargetKeys = currentTargetKeys.filter(
|
|
271
|
+
(key) => !rightSelectedKeys.includes(key)
|
|
272
|
+
);
|
|
273
|
+
if (targetKeys === void 0) {
|
|
274
|
+
setInternalTargetKeys(newTargetKeys);
|
|
275
|
+
}
|
|
276
|
+
onChange?.(newTargetKeys, "left", rightSelectedKeys);
|
|
277
|
+
setRightSelectedKeys([]);
|
|
278
|
+
}, [currentTargetKeys, rightSelectedKeys, targetKeys, onChange]);
|
|
279
|
+
const moveAllToRight = React.useCallback(() => {
|
|
280
|
+
const enabledLeftItems = getEnabledItems(leftDataSource);
|
|
281
|
+
const keysToMove = enabledLeftItems.map((item) => item.key);
|
|
282
|
+
const newTargetKeys = [...currentTargetKeys, ...keysToMove];
|
|
283
|
+
if (targetKeys === void 0) {
|
|
284
|
+
setInternalTargetKeys(newTargetKeys);
|
|
285
|
+
}
|
|
286
|
+
onChange?.(newTargetKeys, "right", keysToMove);
|
|
287
|
+
setLeftSelectedKeys([]);
|
|
288
|
+
}, [leftDataSource, currentTargetKeys, targetKeys, onChange]);
|
|
289
|
+
const moveAllToLeft = React.useCallback(() => {
|
|
290
|
+
const enabledRightItems = getEnabledItems(rightDataSource);
|
|
291
|
+
const keysToMove = enabledRightItems.map((item) => item.key);
|
|
292
|
+
const newTargetKeys = currentTargetKeys.filter(
|
|
293
|
+
(key) => !keysToMove.includes(key)
|
|
294
|
+
);
|
|
295
|
+
if (targetKeys === void 0) {
|
|
296
|
+
setInternalTargetKeys(newTargetKeys);
|
|
297
|
+
}
|
|
298
|
+
onChange?.(newTargetKeys, "left", keysToMove);
|
|
299
|
+
setRightSelectedKeys([]);
|
|
300
|
+
}, [rightDataSource, currentTargetKeys, targetKeys, onChange]);
|
|
301
|
+
const leftFooter = footer?.({ direction: "left" });
|
|
302
|
+
const rightFooter = footer?.({ direction: "right" });
|
|
303
|
+
return /* @__PURE__ */ jsxs("div", { ref, children: [
|
|
304
|
+
label && /* @__PURE__ */ jsx("label", { className: "block mb-2", children: /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-text-muted", children: label }) }),
|
|
305
|
+
/* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-4", className), children: [
|
|
306
|
+
/* @__PURE__ */ jsx(
|
|
307
|
+
TransferList,
|
|
308
|
+
{
|
|
309
|
+
title: titles[0],
|
|
310
|
+
dataSource: leftDataSource,
|
|
311
|
+
selectedKeys: leftSelectedKeys,
|
|
312
|
+
disabled,
|
|
313
|
+
showSearch,
|
|
314
|
+
searchPlaceholder,
|
|
315
|
+
listHeight,
|
|
316
|
+
showSelectAll,
|
|
317
|
+
direction: "left",
|
|
318
|
+
onItemSelect: handleLeftItemSelect,
|
|
319
|
+
onItemSelectAll: handleLeftSelectAll,
|
|
320
|
+
onSearch: (value) => onSearch?.("left", value),
|
|
321
|
+
render,
|
|
322
|
+
footer: leftFooter,
|
|
323
|
+
size
|
|
324
|
+
}
|
|
325
|
+
),
|
|
326
|
+
/* @__PURE__ */ jsxs("div", { className: transferButtonVariants(), children: [
|
|
327
|
+
/* @__PURE__ */ jsx(
|
|
328
|
+
"button",
|
|
329
|
+
{
|
|
330
|
+
type: "button",
|
|
331
|
+
className: transferActionButtonVariants(),
|
|
332
|
+
onClick: moveToRight,
|
|
333
|
+
disabled: disabled || leftSelectedKeys.length === 0,
|
|
334
|
+
title: "Move selected to right",
|
|
335
|
+
children: /* @__PURE__ */ jsx(ChevronRight, { className: iconSizes[size] })
|
|
336
|
+
}
|
|
337
|
+
),
|
|
338
|
+
!oneWay && /* @__PURE__ */ jsx(
|
|
339
|
+
"button",
|
|
340
|
+
{
|
|
341
|
+
type: "button",
|
|
342
|
+
className: transferActionButtonVariants(),
|
|
343
|
+
onClick: moveToLeft,
|
|
344
|
+
disabled: disabled || rightSelectedKeys.length === 0,
|
|
345
|
+
title: "Move selected to left",
|
|
346
|
+
children: /* @__PURE__ */ jsx(ChevronLeft, { className: iconSizes[size] })
|
|
347
|
+
}
|
|
348
|
+
),
|
|
349
|
+
/* @__PURE__ */ jsx(
|
|
350
|
+
"button",
|
|
351
|
+
{
|
|
352
|
+
type: "button",
|
|
353
|
+
className: transferActionButtonVariants(),
|
|
354
|
+
onClick: moveAllToRight,
|
|
355
|
+
disabled: disabled || leftDataSource.length === 0,
|
|
356
|
+
title: "Move all to right",
|
|
357
|
+
children: /* @__PURE__ */ jsx(ChevronsRight, { className: iconSizes[size] })
|
|
358
|
+
}
|
|
359
|
+
),
|
|
360
|
+
!oneWay && /* @__PURE__ */ jsx(
|
|
361
|
+
"button",
|
|
362
|
+
{
|
|
363
|
+
type: "button",
|
|
364
|
+
className: transferActionButtonVariants(),
|
|
365
|
+
onClick: moveAllToLeft,
|
|
366
|
+
disabled: disabled || rightDataSource.length === 0,
|
|
367
|
+
title: "Move all to left",
|
|
368
|
+
children: /* @__PURE__ */ jsx(ChevronsLeft, { className: iconSizes[size] })
|
|
369
|
+
}
|
|
370
|
+
)
|
|
371
|
+
] }),
|
|
372
|
+
/* @__PURE__ */ jsx(
|
|
373
|
+
TransferList,
|
|
374
|
+
{
|
|
375
|
+
title: titles[1],
|
|
376
|
+
dataSource: rightDataSource,
|
|
377
|
+
selectedKeys: rightSelectedKeys,
|
|
378
|
+
disabled,
|
|
379
|
+
showSearch,
|
|
380
|
+
searchPlaceholder,
|
|
381
|
+
listHeight,
|
|
382
|
+
showSelectAll,
|
|
383
|
+
direction: "right",
|
|
384
|
+
onItemSelect: handleRightItemSelect,
|
|
385
|
+
onItemSelectAll: handleRightSelectAll,
|
|
386
|
+
onSearch: (value) => onSearch?.("right", value),
|
|
387
|
+
render,
|
|
388
|
+
footer: rightFooter,
|
|
389
|
+
size
|
|
390
|
+
}
|
|
391
|
+
)
|
|
392
|
+
] }),
|
|
393
|
+
helperMessage && /* @__PURE__ */ jsx("p", { className: cn(statusMessageVariants({ status }), "mt-1"), children: helperMessage })
|
|
394
|
+
] });
|
|
395
|
+
}
|
|
396
|
+
);
|
|
397
|
+
Transfer.displayName = "Transfer";
|
|
398
|
+
|
|
399
|
+
export { Transfer };
|
|
400
|
+
//# sourceMappingURL=chunk-EYTOKUBM.js.map
|
|
401
|
+
//# sourceMappingURL=chunk-EYTOKUBM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/transfer/utils.ts","../src/transfer/index.tsx"],"names":[],"mappings":"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","file":"chunk-EYTOKUBM.js","sourcesContent":["import { cva } from 'class-variance-authority'\n\nexport const transferHeaderVariants = cva(\n 'flex items-center justify-between px-4 py-2 border-b border-border bg-surface',\n)\n\nexport const transferBodyVariants = cva('overflow-y-auto')\n\nexport const transferItemVariants = cva(\n 'flex items-center gap-2 px-4 py-2 cursor-pointer transition-colors hover:bg-surface',\n {\n variants: {\n selected: {\n true: 'bg-primary/10',\n false: '',\n },\n disabled: {\n true: 'opacity-50 cursor-not-allowed hover:bg-transparent',\n false: '',\n },\n },\n defaultVariants: {\n selected: false,\n disabled: false,\n },\n },\n)\n\nexport const transferButtonVariants = cva('flex flex-col gap-2')\n\nexport const transferActionButtonVariants = cva(\n 'flex items-center justify-center p-2 rounded-md border border-border bg-background text-text-muted hover:bg-primary hover:text-white hover:border-primary transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-background disabled:hover:text-text-muted disabled:hover:border-border',\n)\n\nexport const filterItems = (items: any[], searchValue: string): any[] => {\n if (!searchValue) return items\n\n const lowerSearch = searchValue.toLowerCase()\n return items.filter(\n (item) =>\n item.label.toLowerCase().includes(lowerSearch) ||\n item.description?.toLowerCase().includes(lowerSearch),\n )\n}\n\nexport const getItemsByKeys = (items: any[], keys: string[]): any[] => {\n return items.filter((item) => keys.includes(item.key))\n}\n\nexport const getEnabledItems = (items: any[]): any[] => {\n return items.filter((item) => !item.disabled)\n}\n","import {\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n Search,\n} from 'lucide-react'\nimport React from 'react'\n\nimport Checkbox from '../checkbox'\nimport {\n cn,\n getValidationStatus,\n iconSizes,\n statusMessageVariants,\n} from '../utils'\nimport type { TransferItem, TransferListProps, TransferProps } from './types'\nimport {\n filterItems,\n getEnabledItems,\n getItemsByKeys,\n transferActionButtonVariants,\n transferBodyVariants,\n transferButtonVariants,\n transferHeaderVariants,\n transferItemVariants,\n} from './utils'\n\nconst TransferList = React.memo<TransferListProps>(\n ({\n title,\n dataSource,\n selectedKeys,\n disabled = false,\n showSearch = false,\n searchPlaceholder = 'Search...',\n listHeight = 300,\n showSelectAll = true,\n onItemSelect,\n onItemSelectAll,\n onSearch,\n render,\n footer,\n }) => {\n const [searchValue, setSearchValue] = React.useState('')\n\n const filteredData = React.useMemo(\n () => filterItems(dataSource, searchValue),\n [dataSource, searchValue],\n )\n\n const enabledItems = React.useMemo(\n () => getEnabledItems(filteredData),\n [filteredData],\n )\n\n const selectedCount = React.useMemo(\n () =>\n filteredData.filter((item) => selectedKeys.includes(item.key)).length,\n [filteredData, selectedKeys],\n )\n\n const allChecked =\n enabledItems.length > 0 && selectedCount === enabledItems.length\n const indeterminate =\n selectedCount > 0 && selectedCount < enabledItems.length\n\n const handleSearchChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setSearchValue(value)\n onSearch?.(value)\n },\n [onSearch],\n )\n\n const handleSelectAll = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const checked = e.target.checked\n const keys = enabledItems.map((item) => item.key)\n onItemSelectAll(keys, checked)\n },\n [enabledItems, onItemSelectAll],\n )\n\n const handleItemSelect = React.useCallback(\n (item: TransferItem) => {\n if (item.disabled) return\n const checked = !selectedKeys.includes(item.key)\n onItemSelect(item.key, checked)\n },\n [selectedKeys, onItemSelect],\n )\n\n return (\n <div className=\"flex flex-col border border-border rounded-lg bg-card overflow-hidden min-w-72\">\n {/* Header */}\n <div className={transferHeaderVariants()}>\n <div className=\"flex items-center gap-2 flex-1\">\n {showSelectAll && (\n <Checkbox\n checked={allChecked}\n indeterminate={indeterminate}\n onChange={handleSelectAll}\n disabled={disabled || enabledItems.length === 0}\n size=\"sm\"\n />\n )}\n <span className=\"text-sm font-medium text-text-primary\">\n {title}\n <span className=\"text-text-muted ml-1\">\n ({selectedCount}/{filteredData.length})\n </span>\n </span>\n </div>\n </div>\n\n {/* Search */}\n {showSearch && (\n <div className=\"p-2 border-b border-border\">\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-1/2 -translate-y-1/2 w-4 h-4 text-text-muted\" />\n <input\n type=\"text\"\n className=\"w-full pl-8 pr-3 py-1.5 text-sm bg-background border border-border rounded-md outline-none focus:border-primary transition-colors\"\n placeholder={searchPlaceholder}\n value={searchValue}\n onChange={handleSearchChange}\n disabled={disabled}\n />\n </div>\n </div>\n )}\n\n {/* Body */}\n <div\n className={transferBodyVariants()}\n style={{ height: listHeight }}\n >\n {filteredData.length === 0 ? (\n <div className=\"flex items-center justify-center h-full text-sm text-text-muted\">\n No data\n </div>\n ) : (\n filteredData.map((item) => (\n <div\n key={item.key}\n className={cn(\n transferItemVariants({\n selected: selectedKeys.includes(item.key),\n disabled: !!item.disabled || disabled,\n }),\n )}\n onClick={() => handleItemSelect(item)}\n >\n <Checkbox\n checked={selectedKeys.includes(item.key)}\n disabled={!!item.disabled || disabled}\n size=\"sm\"\n onChange={() => {}} // Handled by parent click\n />\n {render ? (\n render(item)\n ) : (\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm text-text-primary truncate\">\n {item.label}\n </div>\n {item.description && (\n <div className=\"text-xs text-text-muted truncate\">\n {item.description}\n </div>\n )}\n </div>\n )}\n </div>\n ))\n )}\n </div>\n\n {/* Footer */}\n {footer && (\n <div className=\"px-4 py-2 border-t border-border bg-surface text-sm text-text-muted\">\n {footer}\n </div>\n )}\n </div>\n )\n },\n)\n\nTransferList.displayName = 'TransferList'\n\nexport const Transfer = React.memo<TransferProps>(\n ({\n dataSource = [],\n targetKeys,\n defaultTargetKeys = [],\n titles = ['Source', 'Target'],\n size = 'md',\n showSearch = false,\n searchPlaceholder = 'Search...',\n listHeight = 300,\n showSelectAll = true,\n oneWay = false,\n disabled = false,\n render,\n footer,\n onChange,\n onSelectChange,\n onSearch,\n label,\n helperText,\n error,\n warning,\n info,\n success,\n className,\n ref,\n }) => {\n const [internalTargetKeys, setInternalTargetKeys] =\n React.useState<string[]>(defaultTargetKeys)\n const [leftSelectedKeys, setLeftSelectedKeys] = React.useState<string[]>([])\n const [rightSelectedKeys, setRightSelectedKeys] = React.useState<string[]>(\n [],\n )\n\n const currentTargetKeys =\n targetKeys !== undefined ? targetKeys : internalTargetKeys\n\n const { status, message: helperMessage } = getValidationStatus({\n error,\n warning,\n info,\n success,\n helperText,\n })\n\n // Split data into source and target\n const leftDataSource = React.useMemo(\n () => dataSource.filter((item) => !currentTargetKeys.includes(item.key)),\n [dataSource, currentTargetKeys],\n )\n\n const rightDataSource = React.useMemo(\n () => getItemsByKeys(dataSource, currentTargetKeys),\n [dataSource, currentTargetKeys],\n )\n\n const handleLeftItemSelect = React.useCallback(\n (key: string, checked: boolean) => {\n const newKeys = checked\n ? [...leftSelectedKeys, key]\n : leftSelectedKeys.filter((k) => k !== key)\n setLeftSelectedKeys(newKeys)\n onSelectChange?.(newKeys, rightSelectedKeys)\n },\n [leftSelectedKeys, rightSelectedKeys, onSelectChange],\n )\n\n const handleRightItemSelect = React.useCallback(\n (key: string, checked: boolean) => {\n const newKeys = checked\n ? [...rightSelectedKeys, key]\n : rightSelectedKeys.filter((k) => k !== key)\n setRightSelectedKeys(newKeys)\n onSelectChange?.(leftSelectedKeys, newKeys)\n },\n [leftSelectedKeys, rightSelectedKeys, onSelectChange],\n )\n\n const handleLeftSelectAll = React.useCallback(\n (keys: string[], checked: boolean) => {\n const newKeys = checked ? keys : []\n setLeftSelectedKeys(newKeys)\n onSelectChange?.(newKeys, rightSelectedKeys)\n },\n [rightSelectedKeys, onSelectChange],\n )\n\n const handleRightSelectAll = React.useCallback(\n (keys: string[], checked: boolean) => {\n const newKeys = checked ? keys : []\n setRightSelectedKeys(newKeys)\n onSelectChange?.(leftSelectedKeys, newKeys)\n },\n [leftSelectedKeys, onSelectChange],\n )\n\n const moveToRight = React.useCallback(() => {\n const newTargetKeys = [...currentTargetKeys, ...leftSelectedKeys]\n\n if (targetKeys === undefined) {\n setInternalTargetKeys(newTargetKeys)\n }\n\n onChange?.(newTargetKeys, 'right', leftSelectedKeys)\n setLeftSelectedKeys([])\n }, [currentTargetKeys, leftSelectedKeys, targetKeys, onChange])\n\n const moveToLeft = React.useCallback(() => {\n const newTargetKeys = currentTargetKeys.filter(\n (key) => !rightSelectedKeys.includes(key),\n )\n\n if (targetKeys === undefined) {\n setInternalTargetKeys(newTargetKeys)\n }\n\n onChange?.(newTargetKeys, 'left', rightSelectedKeys)\n setRightSelectedKeys([])\n }, [currentTargetKeys, rightSelectedKeys, targetKeys, onChange])\n\n const moveAllToRight = React.useCallback(() => {\n const enabledLeftItems = getEnabledItems(leftDataSource)\n const keysToMove = enabledLeftItems.map((item) => item.key)\n const newTargetKeys = [...currentTargetKeys, ...keysToMove]\n\n if (targetKeys === undefined) {\n setInternalTargetKeys(newTargetKeys)\n }\n\n onChange?.(newTargetKeys, 'right', keysToMove)\n setLeftSelectedKeys([])\n }, [leftDataSource, currentTargetKeys, targetKeys, onChange])\n\n const moveAllToLeft = React.useCallback(() => {\n const enabledRightItems = getEnabledItems(rightDataSource)\n const keysToMove = enabledRightItems.map((item) => item.key)\n const newTargetKeys = currentTargetKeys.filter(\n (key) => !keysToMove.includes(key),\n )\n\n if (targetKeys === undefined) {\n setInternalTargetKeys(newTargetKeys)\n }\n\n onChange?.(newTargetKeys, 'left', keysToMove)\n setRightSelectedKeys([])\n }, [rightDataSource, currentTargetKeys, targetKeys, onChange])\n\n const leftFooter = footer?.({ direction: 'left' })\n const rightFooter = footer?.({ direction: 'right' })\n\n return (\n <div ref={ref}>\n {label && (\n <label className=\"block mb-2\">\n <span className=\"text-sm font-medium text-text-muted\">{label}</span>\n </label>\n )}\n\n <div className={cn('flex items-center gap-4', className)}>\n {/* Left List */}\n <TransferList\n title={titles[0]}\n dataSource={leftDataSource}\n selectedKeys={leftSelectedKeys}\n disabled={disabled}\n showSearch={showSearch}\n searchPlaceholder={searchPlaceholder}\n listHeight={listHeight}\n showSelectAll={showSelectAll}\n direction=\"left\"\n onItemSelect={handleLeftItemSelect}\n onItemSelectAll={handleLeftSelectAll}\n onSearch={(value) => onSearch?.('left', value)}\n render={render}\n footer={leftFooter}\n size={size}\n />\n\n {/* Action Buttons */}\n <div className={transferButtonVariants()}>\n <button\n type=\"button\"\n className={transferActionButtonVariants()}\n onClick={moveToRight}\n disabled={disabled || leftSelectedKeys.length === 0}\n title=\"Move selected to right\"\n >\n <ChevronRight className={iconSizes[size]} />\n </button>\n {!oneWay && (\n <button\n type=\"button\"\n className={transferActionButtonVariants()}\n onClick={moveToLeft}\n disabled={disabled || rightSelectedKeys.length === 0}\n title=\"Move selected to left\"\n >\n <ChevronLeft className={iconSizes[size]} />\n </button>\n )}\n <button\n type=\"button\"\n className={transferActionButtonVariants()}\n onClick={moveAllToRight}\n disabled={disabled || leftDataSource.length === 0}\n title=\"Move all to right\"\n >\n <ChevronsRight className={iconSizes[size]} />\n </button>\n {!oneWay && (\n <button\n type=\"button\"\n className={transferActionButtonVariants()}\n onClick={moveAllToLeft}\n disabled={disabled || rightDataSource.length === 0}\n title=\"Move all to left\"\n >\n <ChevronsLeft className={iconSizes[size]} />\n </button>\n )}\n </div>\n\n {/* Right List */}\n <TransferList\n title={titles[1]}\n dataSource={rightDataSource}\n selectedKeys={rightSelectedKeys}\n disabled={disabled}\n showSearch={showSearch}\n searchPlaceholder={searchPlaceholder}\n listHeight={listHeight}\n showSelectAll={showSelectAll}\n direction=\"right\"\n onItemSelect={handleRightItemSelect}\n onItemSelectAll={handleRightSelectAll}\n onSearch={(value) => onSearch?.('right', value)}\n render={render}\n footer={rightFooter}\n size={size}\n />\n </div>\n\n {helperMessage && (\n <p className={cn(statusMessageVariants({ status }), 'mt-1')}>\n {helperMessage}\n </p>\n )}\n </div>\n )\n },\n)\n\nTransfer.displayName = 'Transfer'\n\nexport type * from './types'\nexport type * from './types'\n"]}
|