@boxcustodia/library 2.0.0-alpha.12 → 2.0.0-alpha.14

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 (174) hide show
  1. package/dist/index.cjs.js +1 -138
  2. package/dist/index.d.ts +1087 -720
  3. package/dist/index.es.js +7011 -56097
  4. package/dist/theme.css +1 -1
  5. package/package.json +34 -26
  6. package/src/__doc__/Examples.tsx +1 -1
  7. package/src/__doc__/Intro.mdx +3 -3
  8. package/src/__doc__/Tabs.mdx +112 -0
  9. package/src/__doc__/V2.mdx +1246 -0
  10. package/src/components/accordion/accordion.stories.tsx +143 -0
  11. package/src/components/accordion/accordion.tsx +135 -0
  12. package/src/components/accordion/index.ts +1 -0
  13. package/src/components/alert/alert.stories.tsx +24 -4
  14. package/src/components/alert/alert.tsx +17 -9
  15. package/src/components/alert-dialog/alert-dialog.stories.tsx +24 -0
  16. package/src/components/alert-dialog/alert-dialog.test.tsx +1 -1
  17. package/src/components/alert-dialog/alert-dialog.tsx +58 -10
  18. package/src/components/auto-complete/auto-complete.stories.tsx +616 -200
  19. package/src/components/auto-complete/auto-complete.tsx +420 -68
  20. package/src/components/auto-complete/index.ts +0 -1
  21. package/src/components/avatar/avatar.stories.tsx +162 -21
  22. package/src/components/avatar/avatar.tsx +79 -20
  23. package/src/components/button/button.stories.tsx +219 -294
  24. package/src/components/button/button.test.tsx +10 -17
  25. package/src/components/button/button.tsx +78 -19
  26. package/src/components/button/components/base-button.tsx +30 -53
  27. package/src/components/button/index.ts +0 -1
  28. package/src/components/calendar/calendar.stories.tsx +1 -1
  29. package/src/components/calendar/calendar.tsx +4 -4
  30. package/src/components/card/card.stories.tsx +141 -69
  31. package/src/components/card/card.tsx +155 -54
  32. package/src/components/center/center.stories.tsx +22 -39
  33. package/src/components/checkbox/checkbox.stories.tsx +25 -5
  34. package/src/components/checkbox/checkbox.tsx +76 -15
  35. package/src/components/checkbox-group/checkbox-group.stories.tsx +116 -28
  36. package/src/components/checkbox-group/checkbox-group.tsx +84 -3
  37. package/src/components/combobox/combobox.stories.tsx +33 -23
  38. package/src/components/combobox/combobox.tsx +99 -77
  39. package/src/components/date-picker/date-input.stories.tsx +14 -6
  40. package/src/components/date-picker/date-input.tsx +2 -2
  41. package/src/components/date-picker/date-picker.model.ts +13 -4
  42. package/src/components/date-picker/date-picker.stories.tsx +38 -12
  43. package/src/components/date-picker/date-picker.tsx +28 -14
  44. package/src/components/dialog/dialog.stories.tsx +18 -0
  45. package/src/components/dialog/dialog.test.tsx +1 -1
  46. package/src/components/dialog/dialog.tsx +51 -20
  47. package/src/components/divider/divider.stories.tsx +126 -51
  48. package/src/components/divider/divider.tsx +16 -16
  49. package/src/components/dropzone/dropzone.stories.tsx +71 -90
  50. package/src/components/dropzone/dropzone.tsx +383 -105
  51. package/src/components/dropzone/index.ts +0 -1
  52. package/src/components/empty/empty.stories.tsx +165 -0
  53. package/src/components/empty/empty.tsx +156 -0
  54. package/src/components/empty/index.ts +1 -0
  55. package/src/components/field/field.stories.tsx +227 -4
  56. package/src/components/field/field.tsx +77 -42
  57. package/src/components/form/form.stories.tsx +320 -197
  58. package/src/components/form/form.tsx +3 -23
  59. package/src/components/index.ts +2 -6
  60. package/src/components/input/input.stories.tsx +5 -5
  61. package/src/components/input/input.tsx +4 -4
  62. package/src/components/kbd/kbd.stories.tsx +1 -0
  63. package/src/components/label/label.stories.tsx +16 -0
  64. package/src/components/label/label.tsx +13 -2
  65. package/src/components/loader/loader.stories.tsx +7 -5
  66. package/src/components/loader/loader.tsx +8 -3
  67. package/src/components/menu/menu-primitives.tsx +207 -196
  68. package/src/components/menu/menu.stories.tsx +276 -146
  69. package/src/components/menu/menu.tsx +146 -54
  70. package/src/components/number-input/number-input.stories.tsx +27 -4
  71. package/src/components/number-input/number-input.test.tsx +2 -2
  72. package/src/components/number-input/number-input.tsx +31 -33
  73. package/src/components/otp/index.ts +1 -0
  74. package/src/components/otp/otp.stories.tsx +209 -0
  75. package/src/components/otp/otp.tsx +100 -0
  76. package/src/components/pagination/index.ts +1 -0
  77. package/src/components/pagination/pagination.model.ts +2 -0
  78. package/src/components/pagination/pagination.stories.tsx +154 -59
  79. package/src/components/pagination/pagination.test.tsx +122 -57
  80. package/src/components/pagination/pagination.tsx +575 -77
  81. package/src/components/password/password.stories.tsx +18 -3
  82. package/src/components/password/password.tsx +29 -9
  83. package/src/components/popover/popover.stories.tsx +26 -5
  84. package/src/components/popover/popover.tsx +15 -23
  85. package/src/components/progress/progress.stories.tsx +1 -0
  86. package/src/components/radio-group/index.ts +1 -0
  87. package/src/components/radio-group/radio-group.stories.tsx +251 -0
  88. package/src/components/radio-group/radio-group.tsx +212 -0
  89. package/src/components/scroll-area/scroll-area.stories.tsx +1 -0
  90. package/src/components/select/select.stories.tsx +118 -19
  91. package/src/components/select/select.tsx +67 -62
  92. package/src/components/skeleton/skeleton.stories.tsx +1 -0
  93. package/src/components/stack/stack.stories.tsx +179 -89
  94. package/src/components/stack/stack.tsx +2 -2
  95. package/src/components/stepper/index.ts +1 -1
  96. package/src/components/stepper/stepper.stories.tsx +767 -83
  97. package/src/components/stepper/stepper.test.tsx +18 -18
  98. package/src/components/stepper/stepper.tsx +554 -0
  99. package/src/components/switch/switch.stories.tsx +15 -1
  100. package/src/components/switch/switch.tsx +17 -4
  101. package/src/components/table/index.ts +0 -2
  102. package/src/components/table/table.stories.tsx +131 -18
  103. package/src/components/table/table.test.tsx +1 -1
  104. package/src/components/table/table.tsx +183 -77
  105. package/src/components/tabs/tabs.stories.tsx +373 -155
  106. package/src/components/tabs/tabs.test.tsx +12 -12
  107. package/src/components/tabs/tabs.tsx +72 -149
  108. package/src/components/tag/index.ts +0 -1
  109. package/src/components/tag/tag.stories.tsx +155 -120
  110. package/src/components/tag/tag.tsx +47 -95
  111. package/src/components/textarea/textarea.stories.tsx +8 -22
  112. package/src/components/textarea/textarea.tsx +17 -79
  113. package/src/components/timeline/timeline.stories.tsx +323 -42
  114. package/src/components/timeline/timeline.tsx +359 -132
  115. package/src/components/toast/toast.stories.tsx +1 -0
  116. package/src/components/tooltip/tooltip.tsx +11 -9
  117. package/src/components/tree/index.ts +0 -1
  118. package/src/components/tree/tree.stories.tsx +365 -408
  119. package/src/components/tree/tree.test.tsx +163 -0
  120. package/src/components/tree/tree.tsx +212 -36
  121. package/src/hooks/useAsync/__doc__/useAsync.stories.tsx +5 -5
  122. package/src/hooks/useClipboard/__doc__/useClipboard.stories.tsx +1 -3
  123. package/src/hooks/useDebounceCallback/__doc__/useDebouncedCallback.stories.tsx +6 -6
  124. package/src/hooks/useDocumentTitle/__doc__/useDocumentTitle.stories.tsx +1 -1
  125. package/src/hooks/useEventListener/__test__/useEventListener.test.tsx +1 -1
  126. package/src/hooks/useLocalStorage/__doc__/useLocalStorage.stories.tsx +1 -1
  127. package/src/hooks/usePagination/usePagination.tsx +36 -24
  128. package/src/styles/theme.css +1 -1
  129. package/src/utils/form.tsx +67 -37
  130. package/src/utils/index.ts +1 -1
  131. package/src/__doc__/Migration.mdx +0 -475
  132. package/src/components/auto-complete/auto-complete-primitives.tsx +0 -155
  133. package/src/components/background-image/background-image.stories.tsx +0 -21
  134. package/src/components/background-image/background-image.test.tsx +0 -29
  135. package/src/components/background-image/background-image.tsx +0 -23
  136. package/src/components/background-image/index.ts +0 -1
  137. package/src/components/button/button.variants.ts +0 -44
  138. package/src/components/button/components/loader-overlay.tsx +0 -21
  139. package/src/components/button/components/loading-icon.tsx +0 -47
  140. package/src/components/dropzone/upload-primitives.tsx +0 -310
  141. package/src/components/dropzone/use-dropzone.ts +0 -122
  142. package/src/components/empty-state/empty-state.stories.tsx +0 -56
  143. package/src/components/empty-state/empty-state.tsx +0 -39
  144. package/src/components/empty-state/index.ts +0 -1
  145. package/src/components/heading/heading.stories.tsx +0 -74
  146. package/src/components/heading/heading.tsx +0 -28
  147. package/src/components/heading/heading.variants.ts +0 -27
  148. package/src/components/heading/index.ts +0 -1
  149. package/src/components/kbd/kbd.variants.ts +0 -26
  150. package/src/components/menu/util/render-menu-item.tsx +0 -54
  151. package/src/components/multi-select/hooks/use-multi-select.ts +0 -66
  152. package/src/components/multi-select/index.ts +0 -1
  153. package/src/components/multi-select/multi-select.stories.tsx +0 -294
  154. package/src/components/multi-select/multi-select.tsx +0 -300
  155. package/src/components/multi-select/multi-select.variants.ts +0 -22
  156. package/src/components/pagination/components/pagination-option.tsx +0 -27
  157. package/src/components/show/index.ts +0 -1
  158. package/src/components/show/show.stories.tsx +0 -197
  159. package/src/components/show/show.test.tsx +0 -41
  160. package/src/components/show/show.tsx +0 -16
  161. package/src/components/stepper/Stepper.tsx +0 -190
  162. package/src/components/stepper/context/stepper-context.tsx +0 -11
  163. package/src/components/table/table-primitives.tsx +0 -122
  164. package/src/components/table/table.model.ts +0 -20
  165. package/src/components/table-pagination/index.ts +0 -2
  166. package/src/components/table-pagination/table-pagination.model.ts +0 -2
  167. package/src/components/table-pagination/table-pagination.stories.tsx +0 -23
  168. package/src/components/table-pagination/table-pagination.test.tsx +0 -32
  169. package/src/components/table-pagination/table-pagination.tsx +0 -108
  170. package/src/components/tabs/context/tabs-context.tsx +0 -14
  171. package/src/components/tag/tag.variants.ts +0 -31
  172. package/src/components/timeline/timeline-status.ts +0 -5
  173. package/src/components/tree/hooks/use-controllable-tree-state.ts +0 -80
  174. package/src/components/tree/tree-primitives.tsx +0 -126
@@ -1,36 +1,61 @@
1
- import { Meta, StoryObj } from "@storybook/react-vite";
1
+ import type { Meta, StoryObj } from "@storybook/react-vite";
2
2
  import { Camera, File, FileArchive, ImageIcon, Trash } from "lucide-react";
3
- import React from "react";
4
3
  import { Button } from "../../components/button";
5
- import { Dropzone } from ".";
6
- import { FileType, FileTypeGroups, FileTypeValue } from "./file-types";
7
4
  import {
8
- UploadAcceptedFiles,
9
- UploadContent,
10
- UploadRejectedFiles,
11
- UploadRoot,
12
- UploadTrigger,
13
- } from "./upload-primitives";
14
- import { FileError } from "./use-dropzone";
5
+ Dropzone,
6
+ DropzoneAcceptedFiles,
7
+ DropzoneContent,
8
+ DropzoneRejectedFiles,
9
+ DropzoneRoot,
10
+ DropzoneTrigger,
11
+ type FileError,
12
+ } from ".";
13
+ import { FileType, FileTypeGroups, type FileTypeValue } from "./file-types";
15
14
 
15
+ /**
16
+ * Drag-and-drop file uploader built on react-dropzone. Supports controlled and uncontrolled
17
+ * file state, MIME type filtering, size limits, and custom file item rendering via render props.
18
+ *
19
+ * Compose with primitives (`DropzoneRoot`, `DropzoneTrigger`, `DropzoneContent`,
20
+ * `DropzoneAcceptedFiles`, `DropzoneRejectedFiles`) for full layout control.
21
+ */
16
22
  const meta: Meta<typeof Dropzone> = {
17
- title: "data entry/Dropzone",
23
+ title: "Components/Dropzone",
18
24
  component: Dropzone,
19
25
  subcomponents: {
20
- UploadRoot: UploadRoot as React.ComponentType<unknown>,
21
- UploadTrigger: UploadTrigger as React.ComponentType<unknown>,
22
- UploadContent: UploadContent as React.ComponentType<unknown>,
23
- UploadAcceptedFiles: UploadAcceptedFiles as React.ComponentType<unknown>,
24
- UploadRejectedFiles: UploadRejectedFiles as React.ComponentType<unknown>,
26
+ DropzoneRoot: DropzoneRoot as React.ComponentType<unknown>,
27
+ DropzoneTrigger: DropzoneTrigger as React.ComponentType<unknown>,
28
+ DropzoneContent: DropzoneContent as React.ComponentType<unknown>,
29
+ DropzoneAcceptedFiles:
30
+ DropzoneAcceptedFiles as React.ComponentType<unknown>,
31
+ DropzoneRejectedFiles:
32
+ DropzoneRejectedFiles as React.ComponentType<unknown>,
33
+ },
34
+ args: {
35
+ allowedExtensions: [...FileTypeGroups.IMAGES, FileType.PDF],
36
+ },
37
+ argTypes: {
38
+ classNames: { control: false },
25
39
  },
40
+ tags: ["beta"],
26
41
  };
27
42
 
28
43
  export default meta;
29
44
  type Story = StoryObj<typeof Dropzone>;
30
45
 
31
- export const Default: Story = {
46
+ export const Default: Story = {};
47
+
48
+ /**
49
+ * `className` styles the outer wrapper. `classNames` exposes the `trigger`,
50
+ * `icon`, `label`, and `content` slots for fine-grained tweaks.
51
+ */
52
+ export const WithClassNames: Story = {
32
53
  args: {
33
- allowedExtensions: [...FileTypeGroups.IMAGES, FileType.PDF],
54
+ classNames: {
55
+ trigger: "border-primary bg-primary/5",
56
+ icon: "text-primary",
57
+ label: "text-primary",
58
+ },
34
59
  },
35
60
  };
36
61
 
@@ -59,60 +84,20 @@ export const MultipleFiles: Story = {
59
84
  };
60
85
 
61
86
  /**
62
- * El callback `onError` te permite manejar errores cuando se rechazan archivos durante la validación.
63
- *
64
- * ### Interfaz FileError
65
- * ```typescript
66
- * type FileError = {
67
- * file: File; // El archivo que causó el error
68
- * errorMessage: string; // Mensaje de error genérico
69
- * errorCode: FileErrorCode; // Código para identificar el tipo de error
70
- * };
71
- * ```
72
- *
73
- * ### Códigos de Error Disponibles
74
- * - `'INVALID_EXTENSION'`: El archivo no tiene una extensión permitida
75
- * - `'FILE_TOO_LARGE'`: El archivo excede el tamaño máximo permitido
76
- * - `'MAX_FILES_EXCEEDED'`: Se ha alcanzado el límite máximo de archivos
77
- *
78
- * ### Ejemplo de Uso
79
- * ```typescript
80
- * onError: (fileErrors) => {
81
- * fileErrors.forEach(({ file, errorCode }) => {
82
- * switch (errorCode) {
83
- * case 'INVALID_EXTENSION':
84
- * toast.error(`${file.name} no es un tipo válido`);
85
- * break;
86
- * case 'FILE_TOO_LARGE':
87
- * toast.error(`${file.name} es muy grande`);
88
- * break;
89
- * case 'MAX_FILES_EXCEEDED':
90
- * toast.error('Demasiados archivos');
91
- * break;
92
- * }
93
- * });
94
- * };
95
- * ```
96
- *
97
- * ### Notas Importantes
98
- * - El `onError` se ejecuta automáticamente cada vez que `validateFiles` encuentra errores
99
- * - Puedes acceder al archivo original para mostrar información personalizada
100
- * - Los mensajes de error son genéricos, puedes crear los tuyos propios basándote en el `errorCode`
87
+ * `onError` fires with a `FileError[]` whenever files are rejected. Each entry
88
+ * includes `errorCode` (`INVALID_EXTENSION`, `FILE_TOO_LARGE`, `MAX_FILES_EXCEEDED`)
89
+ * for granular error handling.
101
90
  */
102
91
  export const WithErrorHandling: Story = {
103
92
  args: {
104
93
  multiple: true,
105
94
  maxFiles: 2,
106
- maxFileSize: 2 * 1024 * 1024, // 2MB
95
+ maxFileSize: 2 * 1024 * 1024,
107
96
  allowedExtensions: [...FileTypeGroups.IMAGES, FileType.PDF],
108
97
  onError: (fileErrors: FileError[]) => {
109
- console.log("Errores de archivos:", fileErrors);
110
98
  alert(
111
99
  fileErrors
112
- .map(
113
- ({ file, errorMessage, errorCode }) =>
114
- `${file.name}: ${errorMessage} (${errorCode})`,
115
- )
100
+ .map(({ file, errorCode }) => `${file.name}: ${errorCode}`)
116
101
  .join("\n"),
117
102
  );
118
103
  },
@@ -174,37 +159,33 @@ export const CustomFilePreview: Story = {
174
159
  };
175
160
 
176
161
  /**
177
- * El componente Dropzone está compuesto por los componentes primitivos UploadRoot, UploadTrigger, UploadContent, UploadAcceptedFiles y UploadRejectedFiles.
162
+ * Use primitives directly for full layout control. `DropzoneTrigger` with `render`
163
+ * turns any element into the drag target and click handler.
178
164
  *
179
- * Este ejemplo muestra como armar el componente Dropzone usando los componentes primitivos.
180
- *
181
- * ##### Estructura
182
165
  * ```tsx
183
- * <UploadRoot>
184
- * <UploadTrigger>
185
- * ...
186
- * </UploadTrigger>
187
- * <UploadContent>
188
- * <UploadAcceptedFiles />
189
- * <UploadRejectedFiles />
190
- * </UploadContent>
191
- * </UploadRoot>
166
+ * <DropzoneRoot>
167
+ * <DropzoneTrigger render={<Button>Upload</Button>} />
168
+ * <DropzoneContent>
169
+ * <DropzoneAcceptedFiles />
170
+ * <DropzoneRejectedFiles />
171
+ * </DropzoneContent>
172
+ * </DropzoneRoot>
192
173
  * ```
193
174
  */
194
- export const Primitives: Story = {
195
- render: () => {
196
- return (
197
- <UploadRoot>
198
- <UploadTrigger asChild>
175
+ export const Primitive: Story = {
176
+ render: () => (
177
+ <DropzoneRoot>
178
+ <DropzoneTrigger
179
+ render={
199
180
  <Button>
200
181
  <Camera /> Upload
201
182
  </Button>
202
- </UploadTrigger>
203
- <UploadContent>
204
- <UploadAcceptedFiles />
205
- <UploadRejectedFiles />
206
- </UploadContent>
207
- </UploadRoot>
208
- );
209
- },
183
+ }
184
+ />
185
+ <DropzoneContent>
186
+ <DropzoneAcceptedFiles />
187
+ <DropzoneRejectedFiles />
188
+ </DropzoneContent>
189
+ </DropzoneRoot>
190
+ ),
210
191
  };