@ttoss/components 2.14.20 → 2.14.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/Accordion/index.d.mts +157 -0
  2. package/dist/Accordion/index.mjs +175 -0
  3. package/dist/DatePicker/index.d.mts +26 -0
  4. package/dist/DatePicker/index.mjs +339 -0
  5. package/dist/Drawer/index.d.mts +17 -0
  6. package/dist/{esm/Drawer/index.js → Drawer/index.mjs} +21 -14
  7. package/dist/EnhancedTitle/{index.d.ts → index.d.mts} +57 -47
  8. package/dist/EnhancedTitle/index.mjs +234 -0
  9. package/dist/FileUploader/index.d.mts +77 -0
  10. package/dist/FileUploader/index.mjs +386 -0
  11. package/dist/InstallPwa/index.d.mts +13 -0
  12. package/dist/InstallPwa/index.mjs +64 -0
  13. package/dist/JsonEditor/index.d.mts +3 -0
  14. package/dist/{esm/JsonEditor/index.js → JsonEditor/index.mjs} +0 -3
  15. package/dist/JsonView/index.d.mts +3 -0
  16. package/dist/{esm/JsonView/index.js → JsonView/index.mjs} +0 -3
  17. package/dist/List/{index.d.ts → index.d.mts} +9 -6
  18. package/dist/List/index.mjs +34 -0
  19. package/dist/LockedOverlay/index.d.mts +162 -0
  20. package/dist/LockedOverlay/index.mjs +386 -0
  21. package/dist/Markdown/index.d.mts +16 -0
  22. package/dist/Markdown/index.mjs +26 -0
  23. package/dist/Menu/index.d.mts +16 -0
  24. package/dist/{esm/Menu/index.js → Menu/index.mjs} +56 -51
  25. package/dist/MetricCard/index.d.mts +153 -0
  26. package/dist/MetricCard/index.mjs +408 -0
  27. package/dist/Modal/index.d.mts +11 -0
  28. package/dist/{esm/Modal/index.js → Modal/index.mjs} +11 -12
  29. package/dist/NavList/index.d.mts +64 -0
  30. package/dist/{esm/NavList/index.js → NavList/index.mjs} +79 -73
  31. package/dist/NotificationCard/index.d.mts +22 -0
  32. package/dist/NotificationCard/index.mjs +173 -0
  33. package/dist/NotificationsMenu/index.d.mts +47 -0
  34. package/dist/NotificationsMenu/index.mjs +380 -0
  35. package/dist/Search/index.d.mts +18 -0
  36. package/dist/{esm/Search/index.js → Search/index.mjs} +11 -9
  37. package/dist/SpotlightCard/index.d.mts +36 -0
  38. package/dist/SpotlightCard/index.mjs +219 -0
  39. package/dist/Table/index.d.mts +17 -0
  40. package/dist/Table/index.mjs +64 -0
  41. package/dist/Tabs/index.d.mts +17 -0
  42. package/dist/{esm/Tabs/index.js → Tabs/index.mjs} +24 -12
  43. package/dist/Toast/index.d.mts +8 -0
  44. package/dist/Toast/index.mjs +43 -0
  45. package/package.json +15 -15
  46. package/dist/Accordion/index.d.ts +0 -148
  47. package/dist/DatePicker/index.d.ts +0 -20
  48. package/dist/Drawer/index.d.ts +0 -12
  49. package/dist/LockedOverlay/index.d.ts +0 -151
  50. package/dist/Markdown/index.d.ts +0 -11
  51. package/dist/Menu/index.d.ts +0 -11
  52. package/dist/MetricCard/index.d.ts +0 -148
  53. package/dist/Modal/index.d.ts +0 -10
  54. package/dist/NavList/index.d.ts +0 -55
  55. package/dist/NotificationCard/index.d.ts +0 -21
  56. package/dist/NotificationsMenu/index.d.ts +0 -36
  57. package/dist/Search/index.d.ts +0 -11
  58. package/dist/SpotlightCard/index.d.ts +0 -27
  59. package/dist/Table/index.d.ts +0 -16
  60. package/dist/esm/Accordion/index.js +0 -119
  61. package/dist/esm/DatePicker/index.js +0 -331
  62. package/dist/esm/EnhancedTitle/index.js +0 -190
  63. package/dist/esm/FileUploader/index.js +0 -401
  64. package/dist/esm/InstallPwa/index.js +0 -61
  65. package/dist/esm/List/index.js +0 -30
  66. package/dist/esm/LockedOverlay/index.js +0 -316
  67. package/dist/esm/Markdown/index.js +0 -23
  68. package/dist/esm/MetricCard/index.js +0 -327
  69. package/dist/esm/NotificationCard/index.js +0 -156
  70. package/dist/esm/NotificationsMenu/index.js +0 -359
  71. package/dist/esm/SpotlightCard/index.js +0 -212
  72. package/dist/esm/Table/index.js +0 -63
  73. package/dist/esm/Toast/index.js +0 -38
  74. package/dist/esm/chunk-V4MHYKRI.js +0 -7
@@ -0,0 +1,386 @@
1
+ /** Powered by @ttoss/config. https://ttoss.dev/docs/modules/packages/config/ */
2
+ import * as React from "react";
3
+ import { Box, Button, Flex, Stack, Text } from "@ttoss/ui";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { useI18n } from "@ttoss/react-i18n";
6
+
7
+ //#region src/components/FileUploader/FileUploader.tsx
8
+ const FileUploader = ({
9
+ onUpload,
10
+ onUploadStart,
11
+ onUploadProgress,
12
+ onUploadComplete,
13
+ onUploadError,
14
+ onFilesChange,
15
+ onRemove,
16
+ accept,
17
+ multiple = true,
18
+ maxSize = 10 * 1024 * 1024,
19
+ maxFiles = 5,
20
+ disabled = false,
21
+ autoUpload = true,
22
+ retryAttempts = 2,
23
+ placeholder,
24
+ error,
25
+ children,
26
+ showFileList = true,
27
+ FileListComponent,
28
+ files: uploadedFiles = []
29
+ }) => {
30
+ const {
31
+ intl
32
+ } = useI18n();
33
+ const [files, setFiles] = React.useState([]);
34
+ const [isDragOver, setIsDragOver] = React.useState(false);
35
+ const fileInputRef = React.useRef(null);
36
+ const formatFileSize = bytes => {
37
+ if (bytes === 0) return "0 Bytes";
38
+ const k = 1024;
39
+ const sizes = ["Bytes", "KB", "MB", "GB"];
40
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
41
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
42
+ };
43
+ const validateFiles = newFiles => {
44
+ const fileArray = Array.from(newFiles);
45
+ const validFiles = [];
46
+ const currentFileCount = files.length;
47
+ if (currentFileCount >= maxFiles) return [];
48
+ for (const file of fileArray) {
49
+ if (maxSize && file.size > maxSize) continue;
50
+ if (validFiles.length + currentFileCount >= maxFiles) break;
51
+ validFiles.push(file);
52
+ }
53
+ return validFiles;
54
+ };
55
+ const updateFileState = React.useCallback((file, updates) => {
56
+ setFiles(prevFiles => {
57
+ const newFiles = prevFiles.map(f => {
58
+ return f.file === file ? {
59
+ ...f,
60
+ ...updates
61
+ } : f;
62
+ });
63
+ onFilesChange?.(newFiles);
64
+ return newFiles;
65
+ });
66
+ }, [onFilesChange]);
67
+ const uploadFile = React.useCallback(async (fileState, attempts = 0) => {
68
+ try {
69
+ onUploadStart?.(fileState.file);
70
+ updateFileState(fileState.file, {
71
+ status: "uploading",
72
+ progress: 0
73
+ });
74
+ const result = await onUpload(fileState.file, progress => {
75
+ updateFileState(fileState.file, {
76
+ progress
77
+ });
78
+ onUploadProgress?.(fileState.file, progress);
79
+ });
80
+ updateFileState(fileState.file, {
81
+ status: "completed",
82
+ progress: 100,
83
+ result
84
+ });
85
+ onUploadComplete?.(fileState.file, result);
86
+ } catch (error_) {
87
+ const error = error_;
88
+ if (attempts < retryAttempts) setTimeout(() => {
89
+ return uploadFile(fileState, attempts + 1);
90
+ }, 1e3 * (attempts + 1));else {
91
+ updateFileState(fileState.file, {
92
+ status: "error",
93
+ error
94
+ });
95
+ onUploadError?.(fileState.file, error);
96
+ }
97
+ }
98
+ }, [onUpload, onUploadStart, onUploadProgress, onUploadComplete, onUploadError, retryAttempts, updateFileState]);
99
+ const addFiles = newFiles => {
100
+ const newFileStates = newFiles.map(file => {
101
+ return {
102
+ file,
103
+ status: "pending"
104
+ };
105
+ });
106
+ setFiles(prevFiles => {
107
+ const updatedFiles = [...prevFiles, ...newFileStates];
108
+ onFilesChange?.(updatedFiles);
109
+ return updatedFiles;
110
+ });
111
+ if (autoUpload) for (const fileState of newFileStates) uploadFile(fileState);
112
+ };
113
+ const handleFileChange = event => {
114
+ if (event.target.files) addFiles(validateFiles(event.target.files));
115
+ };
116
+ const handleDrop = event => {
117
+ event.preventDefault();
118
+ setIsDragOver(false);
119
+ if (disabled || files.length >= maxFiles) return;
120
+ const droppedFiles = event.dataTransfer.files;
121
+ if (droppedFiles) addFiles(validateFiles(droppedFiles));
122
+ };
123
+ const handleDragOver = event => {
124
+ event.preventDefault();
125
+ if (!disabled && files.length < maxFiles) setIsDragOver(true);
126
+ };
127
+ const handleDragLeave = event => {
128
+ event.preventDefault();
129
+ setIsDragOver(false);
130
+ };
131
+ const handleClick = () => {
132
+ if (!disabled && files.length < maxFiles && fileInputRef.current) fileInputRef.current.click();
133
+ };
134
+ const handleRemoveFile = React.useCallback(index => {
135
+ const fileToRemove = uploadedFiles[index];
136
+ onRemove?.(fileToRemove, index);
137
+ }, [uploadedFiles, onRemove]);
138
+ const isUploading = files.some(f => {
139
+ return f.status === "uploading";
140
+ });
141
+ const isMaxFilesReached = files.length >= maxFiles;
142
+ const fileListNode = React.useMemo(() => {
143
+ if (!showFileList || files.length === 0 && uploadedFiles.length === 0) return null;
144
+ if (FileListComponent) return /* @__PURE__ */jsx(FileListComponent, {
145
+ files: uploadedFiles,
146
+ onRemove: handleRemoveFile
147
+ });
148
+ return /* @__PURE__ */jsx(Stack, {
149
+ sx: {
150
+ gap: 1,
151
+ width: "100%"
152
+ },
153
+ children: uploadedFiles.map((file, index) => {
154
+ return /* @__PURE__ */jsxs(Flex, {
155
+ sx: {
156
+ width: "full",
157
+ alignItems: "center",
158
+ justifyContent: "space-between",
159
+ p: 2,
160
+ backgroundColor: "display.background.secondary.default",
161
+ borderRadius: "md",
162
+ gap: 2
163
+ },
164
+ children: [/* @__PURE__ */jsxs(Flex, {
165
+ sx: {
166
+ alignItems: "center",
167
+ gap: 2,
168
+ flex: 1
169
+ },
170
+ children: [file.imageUrl && /* @__PURE__ */jsx(Box, {
171
+ sx: {
172
+ width: 32,
173
+ height: 32
174
+ },
175
+ children: /* @__PURE__ */jsx("img", {
176
+ src: file.imageUrl,
177
+ alt: file.name,
178
+ style: {
179
+ width: "100%",
180
+ height: "100%",
181
+ objectFit: "cover",
182
+ borderRadius: 4
183
+ }
184
+ })
185
+ }), /* @__PURE__ */jsx(Box, {
186
+ sx: {
187
+ flex: 1
188
+ },
189
+ children: /* @__PURE__ */jsx("a", {
190
+ href: file.url,
191
+ target: "_blank",
192
+ rel: "noopener noreferrer",
193
+ style: {
194
+ textDecoration: "none",
195
+ color: "inherit"
196
+ },
197
+ children: /* @__PURE__ */jsx(Text, {
198
+ variant: "body",
199
+ sx: {
200
+ fontWeight: "medium",
201
+ "&:hover": {
202
+ textDecoration: "underline",
203
+ color: "primary.default"
204
+ }
205
+ },
206
+ children: file.name
207
+ })
208
+ })
209
+ })]
210
+ }), /* @__PURE__ */jsx(Button, {
211
+ variant: "destructive",
212
+ onClick: () => {
213
+ return handleRemoveFile(index);
214
+ },
215
+ sx: {
216
+ fontSize: "sm",
217
+ color: "text.muted",
218
+ "&:hover": {
219
+ color: "error.default"
220
+ }
221
+ },
222
+ children: intl.formatMessage({
223
+ id: "G/yZLu",
224
+ defaultMessage: [{
225
+ "type": 0,
226
+ "value": "Remove"
227
+ }]
228
+ })
229
+ })]
230
+ }, file.id);
231
+ })
232
+ });
233
+ }, [files.length, uploadedFiles, handleRemoveFile, intl, showFileList, FileListComponent]);
234
+ const placeholderTexts = React.useMemo(() => {
235
+ const texts = [];
236
+ if (isUploading) texts.push(intl.formatMessage({
237
+ id: "JEsxDw",
238
+ defaultMessage: [{
239
+ "type": 0,
240
+ "value": "Uploading..."
241
+ }]
242
+ }));else if (isMaxFilesReached) texts.push(intl.formatMessage({
243
+ id: "eRShvB",
244
+ defaultMessage: [{
245
+ "type": 0,
246
+ "value": "Maximum files reached"
247
+ }]
248
+ }));else texts.push(placeholder || intl.formatMessage({
249
+ id: "gy0Ynb",
250
+ defaultMessage: [{
251
+ "type": 0,
252
+ "value": "Click or drag files here"
253
+ }]
254
+ }));
255
+ if (!isUploading && !isMaxFilesReached) {
256
+ if (accept) texts.push(accept);
257
+ if (maxSize) texts.push(`Max ${formatFileSize(maxSize)}`);
258
+ if (multiple && maxFiles) texts.push(intl.formatMessage({
259
+ id: "fOOwej",
260
+ defaultMessage: [{
261
+ "type": 6,
262
+ "value": "max_files",
263
+ "options": {
264
+ "one": {
265
+ "value": [{
266
+ "type": 0,
267
+ "value": "Up to "
268
+ }, {
269
+ "type": 7
270
+ }, {
271
+ "type": 0,
272
+ "value": " file"
273
+ }]
274
+ },
275
+ "other": {
276
+ "value": [{
277
+ "type": 0,
278
+ "value": "Up to "
279
+ }, {
280
+ "type": 7
281
+ }, {
282
+ "type": 0,
283
+ "value": " files"
284
+ }]
285
+ }
286
+ },
287
+ "offset": 0,
288
+ "pluralType": "cardinal"
289
+ }]
290
+ }, {
291
+ max_files: maxFiles
292
+ }));
293
+ }
294
+ return texts.filter(Boolean).join(" • ");
295
+ }, [isUploading, isMaxFilesReached, intl, placeholder, accept, maxSize, multiple, maxFiles]);
296
+ return /* @__PURE__ */jsxs(Stack, {
297
+ sx: {
298
+ gap: 3,
299
+ justifyContent: "stretch",
300
+ width: "100%"
301
+ },
302
+ children: [/* @__PURE__ */jsxs(Box, {
303
+ onDrop: handleDrop,
304
+ onDragOver: handleDragOver,
305
+ onDragLeave: handleDragLeave,
306
+ onClick: handleClick,
307
+ sx: {
308
+ width: "100%",
309
+ border: "2px dashed",
310
+ borderColor: error ? "error.default" : isDragOver ? "primary.default" : "display.border.muted.default",
311
+ borderRadius: "xl",
312
+ padding: 6,
313
+ textAlign: "center",
314
+ cursor: disabled || isUploading || isMaxFilesReached ? "not-allowed" : "pointer",
315
+ backgroundColor: isDragOver ? "primary.muted" : "display.background.secondary.default",
316
+ transition: "all 0.2s ease",
317
+ opacity: disabled || isMaxFilesReached ? .6 : 1,
318
+ "&:hover": {
319
+ borderColor: !disabled && !isUploading && !error && !isMaxFilesReached ? "primary.default" : void 0,
320
+ backgroundColor: !disabled && !isUploading && !isMaxFilesReached ? "primary.muted" : void 0
321
+ }
322
+ },
323
+ children: [/* @__PURE__ */jsx("input", {
324
+ ref: fileInputRef,
325
+ type: "file",
326
+ accept,
327
+ multiple,
328
+ onChange: handleFileChange,
329
+ disabled: disabled || isUploading || isMaxFilesReached,
330
+ style: {
331
+ display: "none"
332
+ }
333
+ }), children || /* @__PURE__ */jsxs(Flex, {
334
+ sx: {
335
+ flexDirection: "column",
336
+ alignItems: "center",
337
+ gap: 3,
338
+ justifyContent: "center"
339
+ },
340
+ children: [/* @__PURE__ */jsx(Text, {
341
+ sx: {
342
+ fontSize: "2xl"
343
+ },
344
+ children: intl.formatMessage({
345
+ id: "XKyo5X",
346
+ defaultMessage: [{
347
+ "type": 0,
348
+ "value": "File Upload"
349
+ }]
350
+ })
351
+ }), /* @__PURE__ */jsx(Box, {
352
+ sx: {
353
+ textAlign: "center"
354
+ },
355
+ children: /* @__PURE__ */jsx(Text, {
356
+ variant: "body",
357
+ sx: {
358
+ color: "text.default",
359
+ mb: 1
360
+ },
361
+ children: placeholderTexts
362
+ })
363
+ }), !isUploading && !isMaxFilesReached && /* @__PURE__ */jsx(Button, {
364
+ variant: "secondary",
365
+ disabled,
366
+ children: intl.formatMessage({
367
+ id: "fDCMA6",
368
+ defaultMessage: [{
369
+ "type": 0,
370
+ "value": "Select Files"
371
+ }]
372
+ })
373
+ })]
374
+ })]
375
+ }), error && /* @__PURE__ */jsx(Text, {
376
+ variant: "caption",
377
+ sx: {
378
+ color: "error.default"
379
+ },
380
+ children: error
381
+ }), fileListNode]
382
+ });
383
+ };
384
+
385
+ //#endregion
386
+ export { FileUploader };
@@ -0,0 +1,13 @@
1
+
2
+ import * as React from "react";
3
+
4
+ //#region src/components/InstallPwa/InstallPwa.d.ts
5
+ type InstallPwaUiProps = {
6
+ onInstall: React.MouseEventHandler<HTMLButtonElement>;
7
+ };
8
+ declare const InstallPwaUi: ({
9
+ onInstall
10
+ }: InstallPwaUiProps) => import("react/jsx-runtime").JSX.Element;
11
+ declare const InstallPwa: () => import("react/jsx-runtime").JSX.Element | null;
12
+ //#endregion
13
+ export { InstallPwa, InstallPwaUi, InstallPwaUiProps };
@@ -0,0 +1,64 @@
1
+ /** Powered by @ttoss/config. https://ttoss.dev/docs/modules/packages/config/ */
2
+ import * as React from "react";
3
+ import { Button, Flex, Text } from "@ttoss/ui";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+
6
+ //#region src/components/InstallPwa/InstallPwa.tsx
7
+ const InstallPwaUi = ({
8
+ onInstall
9
+ }) => {
10
+ return /* @__PURE__ */jsx(Flex, {
11
+ sx: {
12
+ position: "absolute",
13
+ bottom: 4,
14
+ width: "100%",
15
+ justifyContent: "center"
16
+ },
17
+ children: /* @__PURE__ */jsxs(Flex, {
18
+ sx: {
19
+ backgroundColor: "background",
20
+ justifyContent: "center",
21
+ alignItems: "center",
22
+ gap: 3,
23
+ width: "auto",
24
+ border: "1px solid",
25
+ borderColor: "muted",
26
+ borderRadius: 1,
27
+ padding: 4
28
+ },
29
+ children: [/* @__PURE__ */jsx(Text, {
30
+ children: "Deseja instalar o nosso aplicativo?"
31
+ }), /* @__PURE__ */jsx(Button, {
32
+ onClick: onInstall,
33
+ children: "Instalar"
34
+ })]
35
+ })
36
+ });
37
+ };
38
+ const InstallPwa = () => {
39
+ const [supportsPwa, setSupportsPwa] = React.useState(false);
40
+ const [promptInstall, setPromptInstall] = React.useState(null);
41
+ React.useEffect(() => {
42
+ const handler = e => {
43
+ e.preventDefault();
44
+ setSupportsPwa(true);
45
+ setPromptInstall(e);
46
+ };
47
+ window.addEventListener("beforeinstallprompt", handler);
48
+ return () => {
49
+ return window.removeEventListener("transitionend", handler);
50
+ };
51
+ }, []);
52
+ const onInstall = e => {
53
+ e.preventDefault();
54
+ if (!promptInstall) return;
55
+ promptInstall.prompt();
56
+ };
57
+ if (!supportsPwa) return null;
58
+ return /* @__PURE__ */jsx(InstallPwaUi, {
59
+ onInstall
60
+ });
61
+ };
62
+
63
+ //#endregion
64
+ export { InstallPwa, InstallPwaUi };
@@ -0,0 +1,3 @@
1
+
2
+ import { JsonEditor } from "json-edit-react";
3
+ export { JsonEditor };
@@ -1,6 +1,3 @@
1
1
  /** Powered by @ttoss/config. https://ttoss.dev/docs/modules/packages/config/ */
2
- import "../chunk-V4MHYKRI.js";
3
-
4
- // src/components/JsonEditor/index.ts
5
2
  import { JsonEditor } from "json-edit-react";
6
3
  export { JsonEditor };
@@ -0,0 +1,3 @@
1
+
2
+ import { JsonView } from "react-json-view-lite";
3
+ export { JsonView };
@@ -1,6 +1,3 @@
1
1
  /** Powered by @ttoss/config. https://ttoss.dev/docs/modules/packages/config/ */
2
- import "../chunk-V4MHYKRI.js";
3
-
4
- // src/components/JsonView/index.ts
5
2
  import { JsonView } from "react-json-view-lite";
6
3
  export { JsonView };
@@ -1,13 +1,16 @@
1
- import * as React from 'react';
2
1
 
2
+ import * as React from "react";
3
+
4
+ //#region src/components/List/List.d.ts
3
5
  interface ListProps extends React.HTMLProps<HTMLUListElement> {
4
- children: React.ReactNode;
6
+ children: React.ReactNode;
5
7
  }
6
8
  declare const List: React.ForwardRefExoticComponent<Omit<ListProps, "ref"> & React.RefAttributes<HTMLUListElement>>;
7
-
9
+ //#endregion
10
+ //#region src/components/List/ListItem.d.ts
8
11
  interface ListItemProps extends React.HTMLProps<HTMLLIElement> {
9
- children: React.ReactNode;
12
+ children: React.ReactNode;
10
13
  }
11
14
  declare const ListItem: React.ForwardRefExoticComponent<Omit<ListItemProps, "ref"> & React.RefAttributes<HTMLLIElement>>;
12
-
13
- export { List, ListItem, type ListItemProps, type ListProps };
15
+ //#endregion
16
+ export { List, ListItem, ListItemProps, ListProps };
@@ -0,0 +1,34 @@
1
+ /** Powered by @ttoss/config. https://ttoss.dev/docs/modules/packages/config/ */
2
+ import * as React from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+
5
+ //#region src/components/List/List.tsx
6
+ const List = React.forwardRef(({
7
+ children,
8
+ ...props
9
+ }, ref) => {
10
+ return /* @__PURE__ */jsx("ul", {
11
+ ...props,
12
+ ref,
13
+ children
14
+ });
15
+ });
16
+ List.displayName = "List";
17
+
18
+ //#endregion
19
+ //#region src/components/List/ListItem.tsx
20
+ const ListItem = React.forwardRef((props, ref) => {
21
+ const {
22
+ children,
23
+ ...rest
24
+ } = props;
25
+ return /* @__PURE__ */jsx("li", {
26
+ ...rest,
27
+ ref,
28
+ children
29
+ });
30
+ });
31
+ ListItem.displayName = "ListItem";
32
+
33
+ //#endregion
34
+ export { List, ListItem };