@cerberus-design/react 0.25.0-rc.7 → 0.25.1-rc.1

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 (165) hide show
  1. package/dist/components/combobox/combobox.cjs +1 -2
  2. package/dist/components/combobox/combobox.d.cts +1 -3
  3. package/dist/components/combobox/combobox.d.ts +1 -3
  4. package/dist/components/combobox/combobox.js +1 -2
  5. package/dist/components/cta-dialog/provider.cjs +3 -1
  6. package/dist/components/cta-dialog/provider.d.cts +2 -1
  7. package/dist/components/cta-dialog/provider.d.ts +2 -1
  8. package/dist/components/cta-dialog/provider.js +3 -1
  9. package/dist/components/date-picker/calendar.cjs +3 -1
  10. package/dist/components/date-picker/calendar.d.cts +4 -8
  11. package/dist/components/date-picker/calendar.d.ts +4 -8
  12. package/dist/components/date-picker/calendar.js +3 -1
  13. package/dist/components/date-picker/content.cjs +1 -3
  14. package/dist/components/date-picker/content.d.cts +1 -2
  15. package/dist/components/date-picker/content.d.ts +1 -2
  16. package/dist/components/date-picker/content.js +1 -3
  17. package/dist/components/date-picker/date-picker.cjs +47 -2
  18. package/dist/components/date-picker/date-picker.d.cts +1 -6
  19. package/dist/components/date-picker/date-picker.d.ts +1 -6
  20. package/dist/components/date-picker/date-picker.js +47 -2
  21. package/dist/components/date-picker/index.cjs +3 -3
  22. package/dist/components/date-picker/index.js +3 -3
  23. package/dist/components/date-picker/input.cjs +1 -1
  24. package/dist/components/date-picker/input.js +1 -1
  25. package/dist/components/date-picker/primitives.cjs +4 -1
  26. package/dist/components/date-picker/primitives.d.cts +1 -4
  27. package/dist/components/date-picker/primitives.d.ts +1 -4
  28. package/dist/components/date-picker/primitives.js +4 -1
  29. package/dist/components/date-picker/range-input.cjs +2 -2
  30. package/dist/components/date-picker/range-input.js +2 -2
  31. package/dist/components/field/status-indicator.cjs +1 -2
  32. package/dist/components/field/status-indicator.d.cts +1 -1
  33. package/dist/components/field/status-indicator.d.ts +1 -1
  34. package/dist/components/field/status-indicator.js +1 -2
  35. package/dist/components/file-upload/file-status.cjs +26 -43
  36. package/dist/components/file-upload/file-status.js +27 -44
  37. package/dist/components/file-upload/file-uploader.cjs +21 -47
  38. package/dist/components/file-upload/file-uploader.d.cts +7 -10
  39. package/dist/components/file-upload/file-uploader.d.ts +7 -10
  40. package/dist/components/file-upload/file-uploader.js +22 -48
  41. package/dist/components/file-upload/helpers.cjs +17 -0
  42. package/dist/components/file-upload/helpers.d.cts +16 -0
  43. package/dist/components/file-upload/helpers.d.ts +16 -0
  44. package/dist/components/file-upload/helpers.js +13 -0
  45. package/dist/components/file-upload/img-preview.cjs +30 -0
  46. package/dist/components/file-upload/img-preview.d.cts +2 -0
  47. package/dist/components/file-upload/img-preview.d.ts +2 -0
  48. package/dist/components/file-upload/img-preview.js +26 -0
  49. package/dist/components/file-upload/index.cjs +24 -0
  50. package/dist/components/file-upload/index.d.cts +4 -0
  51. package/dist/components/file-upload/index.d.ts +4 -0
  52. package/dist/components/file-upload/index.js +4 -0
  53. package/dist/components/file-upload/parts.cjs +28 -0
  54. package/dist/components/file-upload/parts.d.cts +86 -0
  55. package/dist/components/file-upload/parts.d.ts +86 -0
  56. package/dist/components/file-upload/parts.js +24 -0
  57. package/dist/components/file-upload/primitives.cjs +81 -0
  58. package/dist/components/file-upload/primitives.d.cts +45 -0
  59. package/dist/components/file-upload/primitives.d.ts +45 -0
  60. package/dist/components/file-upload/primitives.js +61 -0
  61. package/dist/components/file-upload/utils.cjs +18 -0
  62. package/dist/components/file-upload/utils.d.cts +7 -0
  63. package/dist/components/file-upload/utils.d.ts +7 -0
  64. package/dist/components/file-upload/utils.js +14 -0
  65. package/dist/components/select/select.cjs +6 -3
  66. package/dist/components/select/select.d.cts +1 -3
  67. package/dist/components/select/select.d.ts +1 -3
  68. package/dist/components/select/select.js +6 -3
  69. package/dist/context/confirm-modal.cjs +3 -1
  70. package/dist/context/confirm-modal.d.cts +2 -1
  71. package/dist/context/confirm-modal.d.ts +2 -1
  72. package/dist/context/confirm-modal.js +3 -1
  73. package/dist/context/prompt-modal.cjs +4 -2
  74. package/dist/context/prompt-modal.d.cts +2 -1
  75. package/dist/context/prompt-modal.d.ts +2 -1
  76. package/dist/context/prompt-modal.js +5 -3
  77. package/dist/index.cjs +163 -131
  78. package/dist/index.client.d.cts +1 -1
  79. package/dist/index.client.d.ts +1 -1
  80. package/dist/index.js +8 -4
  81. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-clear-trigger.cjs +19 -0
  82. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-clear-trigger.js +15 -0
  83. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-context.cjs +10 -0
  84. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-context.js +6 -0
  85. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-dropzone.cjs +22 -0
  86. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-dropzone.js +18 -0
  87. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-hidden-input.cjs +21 -0
  88. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-hidden-input.js +17 -0
  89. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-item-delete-trigger.cjs +23 -0
  90. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-item-delete-trigger.js +19 -0
  91. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-item-group.cjs +23 -0
  92. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-item-group.js +19 -0
  93. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-item-name.cjs +22 -0
  94. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-item-name.js +18 -0
  95. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-item-preview-image.cjs +28 -0
  96. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-item-preview-image.js +24 -0
  97. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-item-preview.cjs +22 -0
  98. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-item-preview.js +18 -0
  99. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-item-size-text.cjs +22 -0
  100. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-item-size-text.js +18 -0
  101. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-item.cjs +26 -0
  102. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-item.js +22 -0
  103. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-label.cjs +19 -0
  104. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-label.js +15 -0
  105. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-root.cjs +47 -0
  106. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-root.js +43 -0
  107. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-trigger.cjs +19 -0
  108. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/file-upload-trigger.js +15 -0
  109. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/use-file-upload-context.cjs +15 -0
  110. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/use-file-upload-context.js +10 -0
  111. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/use-file-upload-item-group-props-context.cjs +15 -0
  112. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/use-file-upload-item-group-props-context.js +10 -0
  113. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/use-file-upload-item-props-context.cjs +15 -0
  114. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/use-file-upload-item-props-context.js +10 -0
  115. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/use-file-upload.cjs +36 -0
  116. package/dist/node_modules/.pnpm/@ark-ui_react@5.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@ark-ui/react/dist/components/file-upload/use-file-upload.js +32 -0
  117. package/dist/node_modules/.pnpm/@internationalized_date@3.10.0/node_modules/@internationalized/date/src/CalendarDate.js +3 -3
  118. package/dist/node_modules/.pnpm/@internationalized_date@3.10.0/node_modules/@internationalized/date/src/conversion.js +1 -1
  119. package/dist/node_modules/.pnpm/@internationalized_date@3.10.0/node_modules/@internationalized/date/src/queries.js +1 -1
  120. package/dist/node_modules/.pnpm/@internationalized_date@3.10.1/node_modules/@internationalized/date/src/CalendarDate.cjs +218 -0
  121. package/dist/node_modules/.pnpm/@internationalized_date@3.10.1/node_modules/@internationalized/date/src/CalendarDate.js +212 -0
  122. package/dist/node_modules/.pnpm/@internationalized_date@3.10.1/node_modules/@internationalized/date/src/DateFormatter.cjs +135 -0
  123. package/dist/node_modules/.pnpm/@internationalized_date@3.10.1/node_modules/@internationalized/date/src/DateFormatter.js +131 -0
  124. package/dist/node_modules/.pnpm/@internationalized_date@3.10.1/node_modules/@internationalized/date/src/calendars/GregorianCalendar.cjs +101 -0
  125. package/dist/node_modules/.pnpm/@internationalized_date@3.10.1/node_modules/@internationalized/date/src/calendars/GregorianCalendar.js +93 -0
  126. package/dist/node_modules/.pnpm/@internationalized_date@3.10.1/node_modules/@internationalized/date/src/conversion.cjs +200 -0
  127. package/dist/node_modules/.pnpm/@internationalized_date@3.10.1/node_modules/@internationalized/date/src/conversion.js +186 -0
  128. package/dist/node_modules/.pnpm/@internationalized_date@3.10.1/node_modules/@internationalized/date/src/manipulation.cjs +352 -0
  129. package/dist/node_modules/.pnpm/@internationalized_date@3.10.1/node_modules/@internationalized/date/src/manipulation.js +336 -0
  130. package/dist/node_modules/.pnpm/@internationalized_date@3.10.1/node_modules/@internationalized/date/src/queries.cjs +39 -0
  131. package/dist/node_modules/.pnpm/@internationalized_date@3.10.1/node_modules/@internationalized/date/src/queries.js +30 -0
  132. package/dist/node_modules/.pnpm/@internationalized_date@3.10.1/node_modules/@internationalized/date/src/string.cjs +44 -0
  133. package/dist/node_modules/.pnpm/@internationalized_date@3.10.1/node_modules/@internationalized/date/src/string.js +37 -0
  134. package/dist/node_modules/.pnpm/@internationalized_date@3.10.1/node_modules/@internationalized/date/src/utils.cjs +10 -0
  135. package/dist/node_modules/.pnpm/@internationalized_date@3.10.1/node_modules/@internationalized/date/src/utils.js +6 -0
  136. package/dist/node_modules/.pnpm/@zag-js_file-upload@1.31.1/node_modules/@zag-js/file-upload/dist/index.cjs +649 -0
  137. package/dist/node_modules/.pnpm/@zag-js_file-upload@1.31.1/node_modules/@zag-js/file-upload/dist/index.js +643 -0
  138. package/dist/node_modules/.pnpm/@zag-js_file-utils@1.31.1/node_modules/@zag-js/file-utils/dist/index.cjs +147 -0
  139. package/dist/node_modules/.pnpm/@zag-js_file-utils@1.31.1/node_modules/@zag-js/file-utils/dist/index.js +138 -0
  140. package/dist/node_modules/.pnpm/@zag-js_i18n-utils@1.31.1/node_modules/@zag-js/i18n-utils/dist/index.cjs +53 -0
  141. package/dist/node_modules/.pnpm/@zag-js_i18n-utils@1.31.1/node_modules/@zag-js/i18n-utils/dist/index.js +48 -0
  142. package/dist/node_modules/.pnpm/@zag-js_utils@1.31.1/node_modules/@zag-js/utils/dist/index.cjs +9 -0
  143. package/dist/node_modules/.pnpm/@zag-js_utils@1.31.1/node_modules/@zag-js/utils/dist/index.js +9 -1
  144. package/package.json +7 -7
  145. package/src/components/combobox/combobox.tsx +7 -13
  146. package/src/components/cta-dialog/provider.tsx +8 -3
  147. package/src/components/date-picker/calendar.tsx +10 -9
  148. package/src/components/date-picker/content.tsx +4 -11
  149. package/src/components/date-picker/date-picker.tsx +55 -18
  150. package/src/components/date-picker/input.tsx +1 -1
  151. package/src/components/date-picker/primitives.tsx +4 -1
  152. package/src/components/date-picker/range-input.tsx +2 -2
  153. package/src/components/field/status-indicator.tsx +2 -5
  154. package/src/components/file-upload/file-status.tsx +14 -21
  155. package/src/components/file-upload/file-uploader.tsx +37 -49
  156. package/src/components/file-upload/helpers.ts +28 -0
  157. package/src/components/file-upload/img-preview.tsx +41 -0
  158. package/src/components/file-upload/index.ts +4 -0
  159. package/src/components/file-upload/parts.tsx +126 -0
  160. package/src/components/file-upload/primitives.ts +156 -0
  161. package/src/components/file-upload/utils.ts +20 -0
  162. package/src/components/select/select.tsx +11 -12
  163. package/src/context/confirm-modal.tsx +7 -2
  164. package/src/context/prompt-modal.tsx +9 -4
  165. package/src/index.client.ts +2 -0
@@ -0,0 +1,643 @@
1
+ import { createAnatomy } from '../../../../../@zag-js_anatomy@1.31.1/node_modules/@zag-js/anatomy/dist/index.js';
2
+ import { raf, addDomEvent, contains, getEventTarget, dataAttr, visuallyHiddenStyle, getWindow } from '../../../../../@zag-js_dom-query@1.31.1/node_modules/@zag-js/dom-query/dist/index.js';
3
+ import { getAcceptAttrString, isFileEqual, getFileEntries, isValidFileType, isValidFileSize } from '../../../../../@zag-js_file-utils@1.31.1/node_modules/@zag-js/file-utils/dist/index.js';
4
+ import { formatBytes } from '../../../../../@zag-js_i18n-utils@1.31.1/node_modules/@zag-js/i18n-utils/dist/index.js';
5
+ import { createProps } from '../../../../../@zag-js_types@1.31.1/node_modules/@zag-js/types/dist/index.js';
6
+ import { warn, callAll, flatArray } from '../../../../../@zag-js_utils@1.31.1/node_modules/@zag-js/utils/dist/index.js';
7
+ import { createMachine } from '../../../../../@zag-js_core@1.31.1/node_modules/@zag-js/core/dist/index.js';
8
+
9
+ // src/file-upload.anatomy.ts
10
+ var anatomy = createAnatomy("file-upload").parts(
11
+ "root",
12
+ "dropzone",
13
+ "item",
14
+ "itemDeleteTrigger",
15
+ "itemGroup",
16
+ "itemName",
17
+ "itemPreview",
18
+ "itemPreviewImage",
19
+ "itemSizeText",
20
+ "label",
21
+ "trigger",
22
+ "clearTrigger"
23
+ );
24
+ var parts = anatomy.build();
25
+
26
+ // src/file-upload.dom.ts
27
+ var getRootId = (ctx) => ctx.ids?.root ?? `file:${ctx.id}`;
28
+ var getDropzoneId = (ctx) => ctx.ids?.dropzone ?? `file:${ctx.id}:dropzone`;
29
+ var getHiddenInputId = (ctx) => ctx.ids?.hiddenInput ?? `file:${ctx.id}:input`;
30
+ var getTriggerId = (ctx) => ctx.ids?.trigger ?? `file:${ctx.id}:trigger`;
31
+ var getLabelId = (ctx) => ctx.ids?.label ?? `file:${ctx.id}:label`;
32
+ var getItemId = (ctx, id) => ctx.ids?.item?.(id) ?? `file:${ctx.id}:item:${id}`;
33
+ var getItemNameId = (ctx, id) => ctx.ids?.itemName?.(id) ?? `file:${ctx.id}:item-name:${id}`;
34
+ var getItemSizeTextId = (ctx, id) => ctx.ids?.itemSizeText?.(id) ?? `file:${ctx.id}:item-size:${id}`;
35
+ var getItemPreviewId = (ctx, id) => ctx.ids?.itemPreview?.(id) ?? `file:${ctx.id}:item-preview:${id}`;
36
+ var getRootEl = (ctx) => ctx.getById(getRootId(ctx));
37
+ var getHiddenInputEl = (ctx) => ctx.getById(getHiddenInputId(ctx));
38
+ var getDropzoneEl = (ctx) => ctx.getById(getDropzoneId(ctx));
39
+ function isEventWithFiles(event) {
40
+ const target = getEventTarget(event);
41
+ if (!event.dataTransfer) return !!target && "files" in target;
42
+ return event.dataTransfer.types.some((type) => {
43
+ return type === "Files" || type === "application/x-moz-file";
44
+ });
45
+ }
46
+ function isFilesWithinRange(ctx, incomingCount, currentAcceptedFiles) {
47
+ const { prop, computed } = ctx;
48
+ if (!computed("multiple") && incomingCount > 1) return false;
49
+ if (!computed("multiple") && incomingCount + currentAcceptedFiles.length === 2) return true;
50
+ if (incomingCount + currentAcceptedFiles.length > prop("maxFiles")) return false;
51
+ return true;
52
+ }
53
+ function getEventFiles(ctx, files, currentAcceptedFiles = [], currentRejectedFiles = []) {
54
+ const { prop, computed } = ctx;
55
+ const acceptedFiles = [];
56
+ const rejectedFiles = [];
57
+ const validateParams = {
58
+ acceptedFiles: currentAcceptedFiles,
59
+ rejectedFiles: currentRejectedFiles
60
+ };
61
+ files.forEach((file) => {
62
+ const [accepted, acceptError] = isValidFileType(file, computed("acceptAttr"));
63
+ const [sizeMatch, sizeError] = isValidFileSize(file, prop("minFileSize"), prop("maxFileSize"));
64
+ const validateErrors = prop("validate")?.(file, validateParams);
65
+ const valid = validateErrors ? validateErrors.length === 0 : true;
66
+ if (accepted && sizeMatch && valid) {
67
+ acceptedFiles.push(file);
68
+ } else {
69
+ const errors = [acceptError, sizeError];
70
+ if (!valid) errors.push(...validateErrors ?? []);
71
+ rejectedFiles.push({ file, errors: errors.filter(Boolean) });
72
+ }
73
+ });
74
+ if (!isFilesWithinRange(ctx, acceptedFiles.length, currentAcceptedFiles)) {
75
+ acceptedFiles.forEach((file) => {
76
+ rejectedFiles.push({ file, errors: ["TOO_MANY_FILES"] });
77
+ });
78
+ acceptedFiles.splice(0);
79
+ }
80
+ return {
81
+ acceptedFiles,
82
+ rejectedFiles
83
+ };
84
+ }
85
+ function setInputFiles(inputEl, files) {
86
+ const win = getWindow(inputEl);
87
+ try {
88
+ if ("DataTransfer" in win) {
89
+ const dataTransfer = new win.DataTransfer();
90
+ files.forEach((file) => {
91
+ dataTransfer.items.add(file);
92
+ });
93
+ inputEl.files = dataTransfer.files;
94
+ }
95
+ } catch {
96
+ }
97
+ }
98
+
99
+ // src/file-upload.connect.ts
100
+ var DEFAULT_ITEM_TYPE = "accepted";
101
+ var INTERACTIVE_SELECTOR = "button, a[href], input:not([type='file']), select, textarea, [tabindex], [contenteditable]";
102
+ function isInteractiveTarget(element, container) {
103
+ if (!element || element.getAttribute("type") === "file") return false;
104
+ const interactive = element.closest(INTERACTIVE_SELECTOR);
105
+ return interactive != container && contains(container, interactive);
106
+ }
107
+ function connect(service, normalize) {
108
+ const { state, send, prop, computed, scope, context } = service;
109
+ const disabled = !!prop("disabled");
110
+ const required = !!prop("required");
111
+ const allowDrop = prop("allowDrop");
112
+ const translations = prop("translations");
113
+ const dragging = state.matches("dragging");
114
+ const focused = state.matches("focused") && !disabled;
115
+ return {
116
+ dragging,
117
+ focused,
118
+ disabled: !!disabled,
119
+ transforming: context.get("transforming"),
120
+ openFilePicker() {
121
+ if (disabled) return;
122
+ send({ type: "OPEN" });
123
+ },
124
+ deleteFile(file, type = DEFAULT_ITEM_TYPE) {
125
+ send({ type: "FILE.DELETE", file, itemType: type });
126
+ },
127
+ acceptedFiles: context.get("acceptedFiles"),
128
+ rejectedFiles: context.get("rejectedFiles"),
129
+ setFiles(files) {
130
+ send({ type: "FILES.SET", files, count: files.length });
131
+ },
132
+ clearRejectedFiles() {
133
+ send({ type: "REJECTED_FILES.CLEAR" });
134
+ },
135
+ clearFiles() {
136
+ send({ type: "FILES.CLEAR" });
137
+ },
138
+ getFileSize(file) {
139
+ return formatBytes(file.size, prop("locale"));
140
+ },
141
+ createFileUrl(file, cb) {
142
+ const win = scope.getWin();
143
+ const url = win.URL.createObjectURL(file);
144
+ cb(url);
145
+ return () => win.URL.revokeObjectURL(url);
146
+ },
147
+ setClipboardFiles(dt) {
148
+ if (disabled) return false;
149
+ const items = Array.from(dt?.items ?? []);
150
+ const files = items.reduce((acc, item) => {
151
+ if (item.kind !== "file") return acc;
152
+ const file = item.getAsFile();
153
+ if (!file) return acc;
154
+ return [...acc, file];
155
+ }, []);
156
+ if (!files.length) return false;
157
+ send({ type: "FILES.SET", files });
158
+ return true;
159
+ },
160
+ getRootProps() {
161
+ return normalize.element({
162
+ ...parts.root.attrs,
163
+ dir: prop("dir"),
164
+ id: getRootId(scope),
165
+ "data-disabled": dataAttr(disabled),
166
+ "data-dragging": dataAttr(dragging)
167
+ });
168
+ },
169
+ getDropzoneProps(props2 = {}) {
170
+ return normalize.element({
171
+ ...parts.dropzone.attrs,
172
+ dir: prop("dir"),
173
+ id: getDropzoneId(scope),
174
+ tabIndex: disabled || props2.disableClick ? void 0 : 0,
175
+ role: props2.disableClick ? "application" : "button",
176
+ "aria-label": translations.dropzone,
177
+ "aria-disabled": disabled,
178
+ "data-invalid": dataAttr(prop("invalid")),
179
+ "data-disabled": dataAttr(disabled),
180
+ "data-dragging": dataAttr(dragging),
181
+ onKeyDown(event) {
182
+ if (disabled) return;
183
+ if (event.defaultPrevented) return;
184
+ const target = getEventTarget(event);
185
+ if (!contains(event.currentTarget, target)) return;
186
+ if (isInteractiveTarget(target, event.currentTarget)) return;
187
+ if (props2.disableClick) return;
188
+ if (event.key !== "Enter" && event.key !== " ") return;
189
+ send({ type: "DROPZONE.CLICK", src: "keydown" });
190
+ },
191
+ onClick(event) {
192
+ if (disabled) return;
193
+ if (event.defaultPrevented) return;
194
+ if (props2.disableClick) return;
195
+ const target = getEventTarget(event);
196
+ if (!contains(event.currentTarget, target)) return;
197
+ if (isInteractiveTarget(target, event.currentTarget)) return;
198
+ if (event.currentTarget.localName === "label") {
199
+ event.preventDefault();
200
+ }
201
+ send({ type: "DROPZONE.CLICK" });
202
+ },
203
+ onDragOver(event) {
204
+ if (disabled) return;
205
+ if (!allowDrop) return;
206
+ event.preventDefault();
207
+ event.stopPropagation();
208
+ try {
209
+ event.dataTransfer.dropEffect = "copy";
210
+ } catch {
211
+ }
212
+ const hasFiles = isEventWithFiles(event);
213
+ if (!hasFiles) return;
214
+ const count = event.dataTransfer.items.length;
215
+ send({ type: "DROPZONE.DRAG_OVER", count });
216
+ },
217
+ onDragLeave(event) {
218
+ if (disabled) return;
219
+ if (!allowDrop) return;
220
+ if (contains(event.currentTarget, event.relatedTarget)) return;
221
+ send({ type: "DROPZONE.DRAG_LEAVE" });
222
+ },
223
+ onDrop(event) {
224
+ if (disabled) return;
225
+ if (allowDrop) {
226
+ event.preventDefault();
227
+ event.stopPropagation();
228
+ }
229
+ const hasFiles = isEventWithFiles(event);
230
+ if (disabled || !hasFiles) return;
231
+ getFileEntries(event.dataTransfer.items, prop("directory")).then((files) => {
232
+ send({ type: "DROPZONE.DROP", files: flatArray(files) });
233
+ });
234
+ },
235
+ onFocus() {
236
+ if (disabled) return;
237
+ send({ type: "DROPZONE.FOCUS" });
238
+ },
239
+ onBlur() {
240
+ if (disabled) return;
241
+ send({ type: "DROPZONE.BLUR" });
242
+ }
243
+ });
244
+ },
245
+ getTriggerProps() {
246
+ return normalize.button({
247
+ ...parts.trigger.attrs,
248
+ dir: prop("dir"),
249
+ id: getTriggerId(scope),
250
+ disabled,
251
+ "data-disabled": dataAttr(disabled),
252
+ "data-invalid": dataAttr(prop("invalid")),
253
+ type: "button",
254
+ onClick(event) {
255
+ if (disabled) return;
256
+ if (contains(getDropzoneEl(scope), event.currentTarget)) {
257
+ event.stopPropagation();
258
+ }
259
+ send({ type: "OPEN" });
260
+ }
261
+ });
262
+ },
263
+ getHiddenInputProps() {
264
+ return normalize.input({
265
+ id: getHiddenInputId(scope),
266
+ tabIndex: -1,
267
+ disabled,
268
+ type: "file",
269
+ required: prop("required"),
270
+ capture: prop("capture"),
271
+ name: prop("name"),
272
+ accept: computed("acceptAttr"),
273
+ webkitdirectory: prop("directory") ? "" : void 0,
274
+ multiple: computed("multiple") || prop("maxFiles") > 1,
275
+ onClick(event) {
276
+ event.stopPropagation();
277
+ event.currentTarget.value = "";
278
+ },
279
+ onInput(event) {
280
+ if (disabled) return;
281
+ const { files } = event.currentTarget;
282
+ send({ type: "FILE.SELECT", files: files ? Array.from(files) : [] });
283
+ },
284
+ style: visuallyHiddenStyle
285
+ });
286
+ },
287
+ getItemGroupProps(props2 = {}) {
288
+ const { type = DEFAULT_ITEM_TYPE } = props2;
289
+ return normalize.element({
290
+ ...parts.itemGroup.attrs,
291
+ dir: prop("dir"),
292
+ "data-disabled": dataAttr(disabled),
293
+ "data-type": type
294
+ });
295
+ },
296
+ getItemProps(props2) {
297
+ const { file, type = DEFAULT_ITEM_TYPE } = props2;
298
+ return normalize.element({
299
+ ...parts.item.attrs,
300
+ dir: prop("dir"),
301
+ id: getItemId(scope, file.name),
302
+ "data-disabled": dataAttr(disabled),
303
+ "data-type": type
304
+ });
305
+ },
306
+ getItemNameProps(props2) {
307
+ const { file, type = DEFAULT_ITEM_TYPE } = props2;
308
+ return normalize.element({
309
+ ...parts.itemName.attrs,
310
+ dir: prop("dir"),
311
+ id: getItemNameId(scope, file.name),
312
+ "data-disabled": dataAttr(disabled),
313
+ "data-type": type
314
+ });
315
+ },
316
+ getItemSizeTextProps(props2) {
317
+ const { file, type = DEFAULT_ITEM_TYPE } = props2;
318
+ return normalize.element({
319
+ ...parts.itemSizeText.attrs,
320
+ dir: prop("dir"),
321
+ id: getItemSizeTextId(scope, file.name),
322
+ "data-disabled": dataAttr(disabled),
323
+ "data-type": type
324
+ });
325
+ },
326
+ getItemPreviewProps(props2) {
327
+ const { file, type = DEFAULT_ITEM_TYPE } = props2;
328
+ return normalize.element({
329
+ ...parts.itemPreview.attrs,
330
+ dir: prop("dir"),
331
+ id: getItemPreviewId(scope, file.name),
332
+ "data-disabled": dataAttr(disabled),
333
+ "data-type": type
334
+ });
335
+ },
336
+ getItemPreviewImageProps(props2) {
337
+ const { file, url, type = DEFAULT_ITEM_TYPE } = props2;
338
+ const isImage = file.type.startsWith("image/");
339
+ if (!isImage) {
340
+ throw new Error("Preview Image is only supported for image files");
341
+ }
342
+ return normalize.img({
343
+ ...parts.itemPreviewImage.attrs,
344
+ alt: translations.itemPreview?.(file),
345
+ src: url,
346
+ "data-disabled": dataAttr(disabled),
347
+ "data-type": type
348
+ });
349
+ },
350
+ getItemDeleteTriggerProps(props2) {
351
+ const { file, type = DEFAULT_ITEM_TYPE } = props2;
352
+ return normalize.button({
353
+ ...parts.itemDeleteTrigger.attrs,
354
+ dir: prop("dir"),
355
+ type: "button",
356
+ disabled,
357
+ "data-disabled": dataAttr(disabled),
358
+ "data-type": type,
359
+ "aria-label": translations.deleteFile?.(file),
360
+ onClick() {
361
+ if (disabled) return;
362
+ send({ type: "FILE.DELETE", file, itemType: type });
363
+ }
364
+ });
365
+ },
366
+ getLabelProps() {
367
+ return normalize.label({
368
+ ...parts.label.attrs,
369
+ dir: prop("dir"),
370
+ id: getLabelId(scope),
371
+ htmlFor: getHiddenInputId(scope),
372
+ "data-disabled": dataAttr(disabled),
373
+ "data-required": dataAttr(required)
374
+ });
375
+ },
376
+ getClearTriggerProps() {
377
+ return normalize.button({
378
+ ...parts.clearTrigger.attrs,
379
+ dir: prop("dir"),
380
+ type: "button",
381
+ disabled,
382
+ hidden: context.get("acceptedFiles").length === 0,
383
+ "data-disabled": dataAttr(disabled),
384
+ onClick(event) {
385
+ if (event.defaultPrevented) return;
386
+ if (disabled) return;
387
+ send({ type: "FILES.CLEAR" });
388
+ }
389
+ });
390
+ }
391
+ };
392
+ }
393
+ var machine = createMachine({
394
+ props({ props: props2 }) {
395
+ return {
396
+ minFileSize: 0,
397
+ maxFileSize: Number.POSITIVE_INFINITY,
398
+ maxFiles: 1,
399
+ allowDrop: true,
400
+ preventDocumentDrop: true,
401
+ defaultAcceptedFiles: [],
402
+ ...props2,
403
+ translations: {
404
+ dropzone: "dropzone",
405
+ itemPreview: (file) => `preview of ${file.name}`,
406
+ deleteFile: (file) => `delete file ${file.name}`,
407
+ ...props2.translations
408
+ }
409
+ };
410
+ },
411
+ initialState() {
412
+ return "idle";
413
+ },
414
+ context({ prop, bindable, getContext }) {
415
+ return {
416
+ acceptedFiles: bindable(() => ({
417
+ defaultValue: prop("defaultAcceptedFiles"),
418
+ value: prop("acceptedFiles"),
419
+ isEqual: (a, b) => a.length === b?.length && a.every((file, i) => isFileEqual(file, b[i])),
420
+ hash(value) {
421
+ return value.map((file) => `${file.name}-${file.size}`).join(",");
422
+ },
423
+ onChange(value) {
424
+ const ctx = getContext();
425
+ prop("onFileAccept")?.({ files: value });
426
+ prop("onFileChange")?.({ acceptedFiles: value, rejectedFiles: ctx.get("rejectedFiles") });
427
+ }
428
+ })),
429
+ rejectedFiles: bindable(() => ({
430
+ defaultValue: [],
431
+ isEqual: (a, b) => a.length === b?.length && a.every((file, i) => isFileEqual(file.file, b[i].file)),
432
+ onChange(value) {
433
+ const ctx = getContext();
434
+ prop("onFileReject")?.({ files: value });
435
+ prop("onFileChange")?.({ acceptedFiles: ctx.get("acceptedFiles"), rejectedFiles: value });
436
+ }
437
+ })),
438
+ transforming: bindable(() => ({
439
+ defaultValue: false
440
+ }))
441
+ };
442
+ },
443
+ computed: {
444
+ acceptAttr: ({ prop }) => getAcceptAttrString(prop("accept")),
445
+ multiple: ({ prop }) => prop("maxFiles") > 1
446
+ },
447
+ watch({ track, context, action }) {
448
+ track([() => context.hash("acceptedFiles")], () => {
449
+ action(["syncInputElement"]);
450
+ });
451
+ },
452
+ on: {
453
+ "FILES.SET": {
454
+ actions: ["setFiles"]
455
+ },
456
+ "FILE.SELECT": {
457
+ actions: ["setEventFiles"]
458
+ },
459
+ "FILE.DELETE": {
460
+ actions: ["removeFile"]
461
+ },
462
+ "FILES.CLEAR": {
463
+ actions: ["clearFiles"]
464
+ },
465
+ "REJECTED_FILES.CLEAR": {
466
+ actions: ["clearRejectedFiles"]
467
+ }
468
+ },
469
+ effects: ["preventDocumentDrop"],
470
+ states: {
471
+ idle: {
472
+ on: {
473
+ OPEN: {
474
+ actions: ["openFilePicker"]
475
+ },
476
+ "DROPZONE.CLICK": {
477
+ actions: ["openFilePicker"]
478
+ },
479
+ "DROPZONE.FOCUS": {
480
+ target: "focused"
481
+ },
482
+ "DROPZONE.DRAG_OVER": {
483
+ target: "dragging"
484
+ }
485
+ }
486
+ },
487
+ focused: {
488
+ on: {
489
+ "DROPZONE.BLUR": {
490
+ target: "idle"
491
+ },
492
+ OPEN: {
493
+ actions: ["openFilePicker"]
494
+ },
495
+ "DROPZONE.CLICK": {
496
+ actions: ["openFilePicker"]
497
+ },
498
+ "DROPZONE.DRAG_OVER": {
499
+ target: "dragging"
500
+ }
501
+ }
502
+ },
503
+ dragging: {
504
+ on: {
505
+ "DROPZONE.DROP": {
506
+ target: "idle",
507
+ actions: ["setEventFiles"]
508
+ },
509
+ "DROPZONE.DRAG_LEAVE": {
510
+ target: "idle"
511
+ }
512
+ }
513
+ }
514
+ },
515
+ implementations: {
516
+ effects: {
517
+ preventDocumentDrop({ prop, scope }) {
518
+ if (!prop("preventDocumentDrop")) return;
519
+ if (!prop("allowDrop")) return;
520
+ if (prop("disabled")) return;
521
+ const doc = scope.getDoc();
522
+ const onDragOver = (event) => {
523
+ event?.preventDefault();
524
+ };
525
+ const onDrop = (event) => {
526
+ if (contains(getRootEl(scope), getEventTarget(event))) return;
527
+ event.preventDefault();
528
+ };
529
+ return callAll(addDomEvent(doc, "dragover", onDragOver, false), addDomEvent(doc, "drop", onDrop, false));
530
+ }
531
+ },
532
+ actions: {
533
+ syncInputElement({ scope, context }) {
534
+ queueMicrotask(() => {
535
+ const inputEl = getHiddenInputEl(scope);
536
+ if (!inputEl) return;
537
+ setInputFiles(inputEl, context.get("acceptedFiles"));
538
+ const win = scope.getWin();
539
+ inputEl.dispatchEvent(new win.Event("change", { bubbles: true }));
540
+ });
541
+ },
542
+ openFilePicker({ scope }) {
543
+ raf(() => {
544
+ getHiddenInputEl(scope)?.click();
545
+ });
546
+ },
547
+ setFiles(params) {
548
+ const { computed, context, event } = params;
549
+ const { acceptedFiles, rejectedFiles } = getEventFiles(params, event.files);
550
+ context.set(
551
+ "acceptedFiles",
552
+ computed("multiple") ? acceptedFiles : acceptedFiles.length > 0 ? [acceptedFiles[0]] : []
553
+ );
554
+ context.set("rejectedFiles", rejectedFiles);
555
+ },
556
+ setEventFiles(params) {
557
+ const { computed, context, event, prop } = params;
558
+ const currentAcceptedFiles = context.get("acceptedFiles");
559
+ const currentRejectedFiles = context.get("rejectedFiles");
560
+ const { acceptedFiles, rejectedFiles } = getEventFiles(
561
+ params,
562
+ event.files,
563
+ currentAcceptedFiles,
564
+ currentRejectedFiles
565
+ );
566
+ const set = (files) => {
567
+ if (computed("multiple")) {
568
+ context.set("acceptedFiles", (prev) => [...prev, ...files]);
569
+ context.set("rejectedFiles", rejectedFiles);
570
+ return;
571
+ }
572
+ if (files.length) {
573
+ context.set("acceptedFiles", [files[0]]);
574
+ context.set("rejectedFiles", rejectedFiles);
575
+ return;
576
+ }
577
+ if (rejectedFiles.length) {
578
+ context.set("acceptedFiles", context.get("acceptedFiles"));
579
+ context.set("rejectedFiles", rejectedFiles);
580
+ }
581
+ };
582
+ const transform = prop("transformFiles");
583
+ if (transform) {
584
+ context.set("transforming", true);
585
+ transform(acceptedFiles).then(set).catch((err) => {
586
+ warn(`[zag-js/file-upload] error transforming files
587
+ ${err}`);
588
+ }).finally(() => {
589
+ context.set("transforming", false);
590
+ });
591
+ } else {
592
+ set(acceptedFiles);
593
+ }
594
+ },
595
+ removeFile({ context, event }) {
596
+ if (event.itemType === "rejected") {
597
+ const rejectedFiles = context.get("rejectedFiles").filter((item) => !isFileEqual(item.file, event.file));
598
+ context.set("rejectedFiles", rejectedFiles);
599
+ } else {
600
+ const files = context.get("acceptedFiles").filter((file) => !isFileEqual(file, event.file));
601
+ context.set("acceptedFiles", files);
602
+ }
603
+ },
604
+ clearRejectedFiles({ context }) {
605
+ context.set("rejectedFiles", []);
606
+ },
607
+ clearFiles({ context }) {
608
+ context.set("acceptedFiles", []);
609
+ context.set("rejectedFiles", []);
610
+ }
611
+ }
612
+ }
613
+ });
614
+ createProps()([
615
+ "accept",
616
+ "acceptedFiles",
617
+ "allowDrop",
618
+ "capture",
619
+ "defaultAcceptedFiles",
620
+ "dir",
621
+ "directory",
622
+ "disabled",
623
+ "getRootNode",
624
+ "id",
625
+ "ids",
626
+ "invalid",
627
+ "locale",
628
+ "maxFiles",
629
+ "maxFileSize",
630
+ "minFileSize",
631
+ "name",
632
+ "onFileAccept",
633
+ "onFileChange",
634
+ "onFileReject",
635
+ "preventDocumentDrop",
636
+ "required",
637
+ "transformFiles",
638
+ "translations",
639
+ "validate"
640
+ ]);
641
+ createProps()(["file", "type"]);
642
+
643
+ export { anatomy, connect, machine };