@ttoss/components 2.14.19 → 2.14.21

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 (78) 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/FileUploader/index.d.ts +0 -55
  50. package/dist/InstallPwa/index.d.ts +0 -10
  51. package/dist/JsonEditor/index.d.ts +0 -2
  52. package/dist/JsonView/index.d.ts +0 -1
  53. package/dist/LockedOverlay/index.d.ts +0 -151
  54. package/dist/Markdown/index.d.ts +0 -11
  55. package/dist/Menu/index.d.ts +0 -11
  56. package/dist/MetricCard/index.d.ts +0 -148
  57. package/dist/Modal/index.d.ts +0 -10
  58. package/dist/NavList/index.d.ts +0 -55
  59. package/dist/NotificationCard/index.d.ts +0 -21
  60. package/dist/NotificationsMenu/index.d.ts +0 -36
  61. package/dist/Search/index.d.ts +0 -11
  62. package/dist/SpotlightCard/index.d.ts +0 -27
  63. package/dist/Table/index.d.ts +0 -16
  64. package/dist/esm/Accordion/index.js +0 -119
  65. package/dist/esm/DatePicker/index.js +0 -331
  66. package/dist/esm/EnhancedTitle/index.js +0 -190
  67. package/dist/esm/FileUploader/index.js +0 -401
  68. package/dist/esm/InstallPwa/index.js +0 -61
  69. package/dist/esm/List/index.js +0 -30
  70. package/dist/esm/LockedOverlay/index.js +0 -316
  71. package/dist/esm/Markdown/index.js +0 -23
  72. package/dist/esm/MetricCard/index.js +0 -327
  73. package/dist/esm/NotificationCard/index.js +0 -156
  74. package/dist/esm/NotificationsMenu/index.js +0 -359
  75. package/dist/esm/SpotlightCard/index.js +0 -212
  76. package/dist/esm/Table/index.js +0 -63
  77. package/dist/esm/Toast/index.js +0 -38
  78. 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 };