themelia-react-ui 2.0.0 → 2.0.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 (625) hide show
  1. package/CHANGELOG.md +351 -0
  2. package/README.md +26 -13
  3. package/dist/{accordion-CQXVcd7Q.js → accordion-B6a3vVgA.js} +84 -82
  4. package/dist/accordion-B6a3vVgA.js.map +1 -0
  5. package/dist/action-menu-TzCoSlwL.js +280 -0
  6. package/dist/action-menu-TzCoSlwL.js.map +1 -0
  7. package/dist/{affordance-geometry.generated-CCIXb2A1.js → affordance-geometry.generated-B5iu-Mkr.js} +3 -2
  8. package/dist/affordance-geometry.generated-B5iu-Mkr.js.map +1 -0
  9. package/dist/{ai-artifact-2PQ2fItc.js → ai-artifact-BMJdv-6q.js} +379 -376
  10. package/dist/ai-artifact-BMJdv-6q.js.map +1 -0
  11. package/dist/{app-shell-BE_j8-AT.js → app-shell-ZK5RWdo6.js} +4 -4
  12. package/dist/{app-shell-BE_j8-AT.js.map → app-shell-ZK5RWdo6.js.map} +1 -1
  13. package/dist/attachment-BtfhGm8i.js +245 -0
  14. package/dist/attachment-BtfhGm8i.js.map +1 -0
  15. package/dist/{auth-M3vGMgDR.js → auth-CYxKfo69.js} +237 -235
  16. package/dist/auth-CYxKfo69.js.map +1 -0
  17. package/dist/{avatar-djdaaQ_s.js → avatar-BBnEJIx8.js} +66 -65
  18. package/dist/avatar-BBnEJIx8.js.map +1 -0
  19. package/dist/badge-MrKVNzW9.js +93 -0
  20. package/dist/badge-MrKVNzW9.js.map +1 -0
  21. package/dist/base/accordion.js +1 -1
  22. package/dist/base/action-menu.js +1 -1
  23. package/dist/base/attachment.js +1 -1
  24. package/dist/base/avatar.js +1 -1
  25. package/dist/base/badge.js +1 -1
  26. package/dist/base/batch-action-bar.js +3 -0
  27. package/dist/base/buttons.js +2 -3
  28. package/dist/base/cards.js +2 -2
  29. package/dist/base/carousel.js +13 -13
  30. package/dist/base/carousel.js.map +1 -1
  31. package/dist/base/cascader.js +103 -115
  32. package/dist/base/cascader.js.map +1 -1
  33. package/dist/base/chart.js +1 -1
  34. package/dist/base/choice-inputs.js +3 -3
  35. package/dist/base/code-block.js +1 -1
  36. package/dist/base/combobox.js +1 -1
  37. package/dist/base/command.js +1 -1
  38. package/dist/base/copyable.js +1 -1
  39. package/dist/base/date-pickers.js +2 -2
  40. package/dist/base/display.js +7 -7
  41. package/dist/base/feedback.js +3 -3
  42. package/dist/base/forms-numeric.js +1 -1
  43. package/dist/base/forms.js +2 -2
  44. package/dist/base/inline-edit.js +17 -17
  45. package/dist/base/inline-edit.js.map +1 -1
  46. package/dist/base/item.js +1 -1
  47. package/dist/base/media-gallery.js +1 -1
  48. package/dist/base/metadata-list.js +3 -0
  49. package/dist/base/navigation.js +7 -7
  50. package/dist/base/popover-menu.js +1 -1
  51. package/dist/base/popover.js +1 -1
  52. package/dist/base/qr-code.js +1 -1
  53. package/dist/base/repeaters.js +171 -170
  54. package/dist/base/repeaters.js.map +1 -1
  55. package/dist/base/sheet.js +1 -1
  56. package/dist/base/sidebar.js +1 -1
  57. package/dist/base/signature-pad.js +147 -137
  58. package/dist/base/signature-pad.js.map +1 -1
  59. package/dist/base/skeleton.js +1 -1
  60. package/dist/base/spinner.js +1 -1
  61. package/dist/base/structure.js +1 -1
  62. package/dist/base/table.js +1 -1
  63. package/dist/base/text-inputs.js +2 -2
  64. package/dist/base/toaster.js +2 -2
  65. package/dist/base/tree.js +1 -1
  66. package/dist/base/upload-queue.js +1 -1
  67. package/dist/base/upload.js +3 -3
  68. package/dist/base/value-inputs.js +2 -2
  69. package/dist/batch-action-bar-BZGDG-Si.js +104 -0
  70. package/dist/batch-action-bar-BZGDG-Si.js.map +1 -0
  71. package/dist/blocks/admin.js +173 -171
  72. package/dist/blocks/admin.js.map +1 -1
  73. package/dist/blocks/ai.js +266 -263
  74. package/dist/blocks/ai.js.map +1 -1
  75. package/dist/blocks/analytics/usage-card.js +1 -1
  76. package/dist/blocks/analytics.js +440 -438
  77. package/dist/blocks/analytics.js.map +1 -1
  78. package/dist/blocks/collaboration.js +1 -1
  79. package/dist/blocks/commerce/receipt.js +1 -1
  80. package/dist/blocks/commerce.js +1945 -1266
  81. package/dist/blocks/commerce.js.map +1 -1
  82. package/dist/blocks/data-display.js +3 -2
  83. package/dist/blocks/onboarding.js +50 -49
  84. package/dist/blocks/onboarding.js.map +1 -1
  85. package/dist/blocks/planning.js +25 -25
  86. package/dist/blocks/planning.js.map +1 -1
  87. package/dist/blocks/timelines.js +1 -1
  88. package/dist/breadcrumbs-D5t7I023.js +129 -0
  89. package/dist/breadcrumbs-D5t7I023.js.map +1 -0
  90. package/dist/{button-R9CCoH7A.js → button-QYwiyhD2.js} +15 -14
  91. package/dist/button-QYwiyhD2.js.map +1 -0
  92. package/dist/{button-BS3KDg00.js → buttons-SbIcm1HJ.js} +200 -213
  93. package/dist/buttons-SbIcm1HJ.js.map +1 -0
  94. package/dist/{cards-QoJ4syG9.js → cards-CiiHpKYd.js} +8 -8
  95. package/dist/cards-CiiHpKYd.js.map +1 -0
  96. package/dist/{chart-DwYRKKc-.js → chart-QfrARkXl.js} +5 -5
  97. package/dist/{chart-DwYRKKc-.js.map → chart-QfrARkXl.js.map} +1 -1
  98. package/dist/checkbox-DhB6K0bK.js +36 -0
  99. package/dist/checkbox-DhB6K0bK.js.map +1 -0
  100. package/dist/choice-inputs-t6w3ATNz.js +766 -0
  101. package/dist/choice-inputs-t6w3ATNz.js.map +1 -0
  102. package/dist/code-block-Dgbu-CU3.js +185 -0
  103. package/dist/code-block-Dgbu-CU3.js.map +1 -0
  104. package/dist/{collapsible-oMUGM4tr.js → collapsible-D8AEGU1-.js} +4 -4
  105. package/dist/{collapsible-oMUGM4tr.js.map → collapsible-D8AEGU1-.js.map} +1 -1
  106. package/dist/{collection-content-Ys-OZOkY.js → collection-content-uK16Grv0.js} +3 -3
  107. package/dist/{collection-content-Ys-OZOkY.js.map → collection-content-uK16Grv0.js.map} +1 -1
  108. package/dist/{combobox-6dvVny2q.js → combobox-2Ic8N9bL.js} +74 -68
  109. package/dist/combobox-2Ic8N9bL.js.map +1 -0
  110. package/dist/{combobox-CB7039j7.js → combobox-DLl0bfiq.js} +307 -305
  111. package/dist/combobox-DLl0bfiq.js.map +1 -0
  112. package/dist/{command-kPMPjIxJ.js → command-kNR20o7x.js} +7 -7
  113. package/dist/{command-kPMPjIxJ.js.map → command-kNR20o7x.js.map} +1 -1
  114. package/dist/{comments-You0Bzbr.js → comments-BpDuCUUu.js} +341 -339
  115. package/dist/comments-BpDuCUUu.js.map +1 -0
  116. package/dist/components/base/action-menu/action-menu.d.ts +21 -4
  117. package/dist/components/base/action-menu/action-menu.recipes.d.ts +21 -0
  118. package/dist/components/base/action-menu/index.d.ts +1 -0
  119. package/dist/components/base/badge/badge.recipes.d.ts +4 -4
  120. package/dist/components/base/batch-action-bar/batch-action-bar.d.ts +50 -0
  121. package/dist/components/base/batch-action-bar/batch-action-bar.strings.d.ts +20 -0
  122. package/dist/components/base/batch-action-bar/index.d.ts +8 -0
  123. package/dist/components/base/buttons/button-group.recipes.d.ts +1 -1
  124. package/dist/components/base/buttons/button.recipes.d.ts +2 -2
  125. package/dist/components/base/choice-inputs/checkbox.d.ts +2 -2
  126. package/dist/components/base/choice-inputs/choice-types.d.ts +18 -6
  127. package/dist/components/base/display/alert-dialog.d.ts +6 -5
  128. package/dist/components/base/display/dialog.d.ts +4 -8
  129. package/dist/components/base/display/icon-badge/icon-badge.d.ts +1 -1
  130. package/dist/components/base/forms/form-sizing.d.ts +15 -12
  131. package/dist/components/base/metadata-list/index.d.ts +12 -0
  132. package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-list.d.ts +28 -25
  133. package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-value.d.ts +2 -2
  134. package/dist/components/base/navigation/index.d.ts +1 -1
  135. package/dist/components/base/navigation/page-header/index.d.ts +1 -0
  136. package/dist/components/base/navigation/page-header/page-header-commands.d.ts +73 -0
  137. package/dist/components/base/navigation/page-header/page-header.d.ts +26 -3
  138. package/dist/components/base/sheet/sheet.d.ts +4 -8
  139. package/dist/components/base/signature-pad/signature-pad.types.d.ts +5 -1
  140. package/dist/components/base/signature-pad/signature-pad.utils.d.ts +11 -3
  141. package/dist/components/base/text-inputs/field-clear-button.d.ts +6 -0
  142. package/dist/components/base/upload/upload.recipes.d.ts +25 -3
  143. package/dist/components/base/value-inputs/index.d.ts +5 -5
  144. package/dist/components/base/value-inputs/tags-input.d.ts +36 -12
  145. package/dist/components/blocks/commerce/address-card/address-card.d.ts +1 -1
  146. package/dist/components/blocks/commerce/address-card/types.d.ts +2 -1
  147. package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +3 -1
  148. package/dist/components/blocks/commerce/cart-summary/index.d.ts +2 -2
  149. package/dist/components/blocks/commerce/cart-summary/types.d.ts +6 -1
  150. package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +3 -1
  151. package/dist/components/blocks/commerce/discount-stack/index.d.ts +2 -2
  152. package/dist/components/blocks/commerce/discount-stack/types.d.ts +16 -4
  153. package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +5 -0
  154. package/dist/components/blocks/commerce/fulfillment-group/index.d.ts +2 -0
  155. package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +43 -0
  156. package/dist/components/blocks/commerce/index.d.ts +13 -5
  157. package/dist/components/blocks/commerce/invoice-header/invoice-header.d.ts +1 -1
  158. package/dist/components/blocks/commerce/invoice-header/types.d.ts +4 -2
  159. package/dist/components/blocks/commerce/invoice-mini/invoice-mini.d.ts +1 -1
  160. package/dist/components/blocks/commerce/invoice-mini/types.d.ts +2 -1
  161. package/dist/components/blocks/commerce/order-customer/index.d.ts +2 -0
  162. package/dist/components/blocks/commerce/order-customer/order-customer.d.ts +5 -0
  163. package/dist/components/blocks/commerce/order-customer/types.d.ts +48 -0
  164. package/dist/components/blocks/commerce/order-header/index.d.ts +2 -0
  165. package/dist/components/blocks/commerce/order-header/order-header.d.ts +5 -0
  166. package/dist/components/blocks/commerce/order-header/types.d.ts +37 -0
  167. package/dist/components/blocks/commerce/order-line-item/index.d.ts +2 -0
  168. package/dist/components/blocks/commerce/order-line-item/order-line-item.d.ts +5 -0
  169. package/dist/components/blocks/commerce/order-line-item/types.d.ts +46 -0
  170. package/dist/components/blocks/commerce/order-summary/index.d.ts +2 -0
  171. package/dist/components/blocks/commerce/order-summary/order-summary.d.ts +5 -0
  172. package/dist/components/blocks/commerce/order-summary/types.d.ts +42 -0
  173. package/dist/components/blocks/commerce/order-transactions/index.d.ts +2 -0
  174. package/dist/components/blocks/commerce/order-transactions/order-transactions.d.ts +5 -0
  175. package/dist/components/blocks/commerce/order-transactions/types.d.ts +46 -0
  176. package/dist/components/blocks/commerce/payment-method/index.d.ts +2 -2
  177. package/dist/components/blocks/commerce/payment-method/payment-method.d.ts +9 -1
  178. package/dist/components/blocks/commerce/payment-method/types.d.ts +12 -1
  179. package/dist/components/blocks/commerce/refund-status/index.d.ts +2 -2
  180. package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +3 -1
  181. package/dist/components/blocks/commerce/refund-status/types.d.ts +6 -3
  182. package/dist/components/blocks/commerce/shared/address-lines.d.ts +21 -0
  183. package/dist/components/blocks/commerce/shared/line-thumbnail.d.ts +9 -0
  184. package/dist/components/blocks/commerce/shared/order-status.d.ts +51 -0
  185. package/dist/components/blocks/commerce/shipment-tracking/shipment-tracking.d.ts +1 -1
  186. package/dist/components/blocks/commerce/shipment-tracking/types.d.ts +27 -6
  187. package/dist/components/blocks/commerce/summary-panel/amount-row.d.ts +2 -0
  188. package/dist/components/blocks/commerce/summary-panel/index.d.ts +3 -0
  189. package/dist/components/blocks/commerce/summary-panel/summary-panel.d.ts +2 -0
  190. package/dist/components/blocks/commerce/summary-panel/types.d.ts +26 -0
  191. package/dist/components/blocks/commerce/tax-breakdown/tax-breakdown.d.ts +1 -1
  192. package/dist/components/blocks/commerce/tax-breakdown/types.d.ts +2 -1
  193. package/dist/components/blocks/data-display/metadata/index.d.ts +30 -4
  194. package/dist/components/features/activities/partials/activity-row.d.ts +6 -2
  195. package/dist/components/features/activities/partials/tone-tokens.d.ts +0 -6
  196. package/dist/components/features/global-search/partials/global-search-group-heading.d.ts +15 -0
  197. package/dist/components/features/global-search/partials/tone-palettes.d.ts +0 -5
  198. package/dist/components/features/kanban/kanban.d.ts +1 -1
  199. package/dist/components/features/kanban/kanban.strings.d.ts +1 -1
  200. package/dist/components/features/kanban/kanban.types.d.ts +2 -2
  201. package/dist/components/features/media-library/hooks/use-media-library.d.ts +1 -1
  202. package/dist/components/features/media-library/index.d.ts +1 -1
  203. package/dist/components/features/media-library/media-library.d.ts +1 -1
  204. package/dist/components/features/media-library/media-library.strings.d.ts +4 -0
  205. package/dist/components/features/media-library/media-library.types.d.ts +74 -1
  206. package/dist/components/features/media-library/partials/media-library-partials.d.ts +3 -3
  207. package/dist/components/features/mentions/partials/mention-kind-toggles.d.ts +16 -0
  208. package/dist/components/features/overlays/alert-dialog.d.ts +1 -1
  209. package/dist/components/features/overlays/dialog.d.ts +1 -1
  210. package/dist/components/features/overlays/index.d.ts +1 -1
  211. package/dist/components/features/overlays/overlay-tone-icon.d.ts +3 -3
  212. package/dist/components/features/overlays/overlays.types.d.ts +20 -0
  213. package/dist/components/features/products/components/product-contract-overview.d.ts +5 -0
  214. package/dist/components/features/products/components/product-details-card.d.ts +5 -0
  215. package/dist/components/features/products/components/product-operations-card.d.ts +5 -0
  216. package/dist/components/features/products/components/product-option-action-menu.d.ts +5 -0
  217. package/dist/components/features/products/components/product-options-summary.d.ts +5 -0
  218. package/dist/components/features/products/components/product-policies-card.d.ts +5 -0
  219. package/dist/components/features/products/components/product-quote-preview-card.d.ts +5 -0
  220. package/dist/components/features/products/components/product-readiness-card.d.ts +5 -0
  221. package/dist/components/features/products/components/product-structure-card.d.ts +5 -0
  222. package/dist/components/features/products/components/product-variant-action-menu.d.ts +23 -1
  223. package/dist/components/features/products/products.types.d.ts +9 -2
  224. package/dist/components/features/resource/index.d.ts +1 -1
  225. package/dist/components/features/resource/resource.d.ts +1 -1
  226. package/dist/components/features/resource/resource.types.d.ts +34 -6
  227. package/dist/components/features/rich-text-editor/index.d.ts +2 -1
  228. package/dist/components/features/rich-text-editor/partials/image-nodes.d.ts +13 -0
  229. package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +66 -0
  230. package/dist/components/features/rich-text-editor/partials/inline-reference-node.d.ts +19 -0
  231. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +1 -1
  232. package/dist/components/features/rich-text-editor/rich-text-editor.strings.d.ts +14 -0
  233. package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +45 -0
  234. package/dist/components/features/rich-text-editor/use-rich-text-images.d.ts +18 -0
  235. package/dist/components/features/sync/index.d.ts +26 -3
  236. package/dist/components/features/table/data-table.d.ts +1 -1
  237. package/dist/components/features/table/table.types.d.ts +32 -7
  238. package/dist/components/layout/page/index.d.ts +1 -1
  239. package/dist/components/layout/page/page.types.d.ts +33 -36
  240. package/dist/components/layout/page/partials/page-actions.d.ts +1 -0
  241. package/dist/components/layout/page/partials/page-header.d.ts +1 -1
  242. package/dist/components/layout/settings/settings.d.ts +16 -2
  243. package/dist/components/layout/workspace/workspace.types.d.ts +21 -4
  244. package/dist/components/typography/rich-text/index.d.ts +1 -1
  245. package/dist/components/typography/rich-text/rich-text-tree.d.ts +19 -0
  246. package/dist/components/typography/rich-text/rich-text.d.ts +16 -0
  247. package/dist/components/typography/text-link.d.ts +4 -3
  248. package/dist/components/ui/checkbox.d.ts +4 -3
  249. package/dist/components/ui/overlay.recipes.d.ts +0 -9
  250. package/dist/components/ui/switch.d.ts +2 -2
  251. package/dist/{containers-D_L4mTVb.js → containers-DmWiJa2I.js} +36 -35
  252. package/dist/containers-DmWiJa2I.js.map +1 -0
  253. package/dist/{copyable-DDjTeW_j.js → copyable-B3Gwgdqc.js} +6 -6
  254. package/dist/{copyable-DDjTeW_j.js.map → copyable-B3Gwgdqc.js.map} +1 -1
  255. package/dist/data-display-DafIvCl5.js +960 -0
  256. package/dist/data-display-DafIvCl5.js.map +1 -0
  257. package/dist/{date-uf3z37Nm.js → date-BgK3bTdo.js} +5 -5
  258. package/dist/{date-uf3z37Nm.js.map → date-BgK3bTdo.js.map} +1 -1
  259. package/dist/date-picker-CF-DtUpF.js +1529 -0
  260. package/dist/date-picker-CF-DtUpF.js.map +1 -0
  261. package/dist/{date-pickers-CnFCb0n2.js → date-pickers-BmzxJl5l.js} +19 -19
  262. package/dist/{date-pickers-CnFCb0n2.js.map → date-pickers-BmzxJl5l.js.map} +1 -1
  263. package/dist/{display-DrdvPwF0.js → display-DsQTVzMz.js} +88 -87
  264. package/dist/display-DsQTVzMz.js.map +1 -0
  265. package/dist/{dropdown-menu-CURh59jb.js → dropdown-menu-E2qmdC7o.js} +7 -7
  266. package/dist/{dropdown-menu-CURh59jb.js.map → dropdown-menu-E2qmdC7o.js.map} +1 -1
  267. package/dist/features/activities.js +414 -501
  268. package/dist/features/activities.js.map +1 -1
  269. package/dist/features/ai-chat.js +170 -169
  270. package/dist/features/ai-chat.js.map +1 -1
  271. package/dist/features/async-preview.js +8 -8
  272. package/dist/features/async-preview.js.map +1 -1
  273. package/dist/features/combobox.js +1 -1
  274. package/dist/features/comments.js +1 -1
  275. package/dist/features/data-view.js +139 -138
  276. package/dist/features/data-view.js.map +1 -1
  277. package/dist/features/email-composer/engine.js +1 -1
  278. package/dist/features/email-composer.js +73 -71
  279. package/dist/features/email-composer.js.map +1 -1
  280. package/dist/features/event-calendar.js +278 -275
  281. package/dist/features/event-calendar.js.map +1 -1
  282. package/dist/features/filters.js +1 -1
  283. package/dist/features/global-search.js +307 -310
  284. package/dist/features/global-search.js.map +1 -1
  285. package/dist/features/kanban.js +95 -97
  286. package/dist/features/kanban.js.map +1 -1
  287. package/dist/features/map.js +56 -57
  288. package/dist/features/map.js.map +1 -1
  289. package/dist/features/media-library.js +918 -825
  290. package/dist/features/media-library.js.map +1 -1
  291. package/dist/features/mentions.js +1 -1
  292. package/dist/features/overlays.js +1 -1
  293. package/dist/features/products.js +1115 -1122
  294. package/dist/features/products.js.map +1 -1
  295. package/dist/features/questionnaire.js +202 -194
  296. package/dist/features/questionnaire.js.map +1 -1
  297. package/dist/features/resource-assignment.js +25 -25
  298. package/dist/features/resource-assignment.js.map +1 -1
  299. package/dist/features/resource.js +77 -69
  300. package/dist/features/resource.js.map +1 -1
  301. package/dist/features/rich-text-editor.js +30 -11
  302. package/dist/features/rich-text-editor.js.map +1 -1
  303. package/dist/features/schema-form.js +33 -33
  304. package/dist/features/schema-form.js.map +1 -1
  305. package/dist/features/suggestions.js +3 -3
  306. package/dist/features/sync.js +3 -3
  307. package/dist/features/table.js +1 -1
  308. package/dist/features/theme-tweaker.js +397 -396
  309. package/dist/features/theme-tweaker.js.map +1 -1
  310. package/dist/{feedback-C7nR0UtT.js → feedback-qNuMBtRH.js} +84 -83
  311. package/dist/feedback-qNuMBtRH.js.map +1 -0
  312. package/dist/{field-affordance-recipes-CkOCdE2y.js → field-affordance-recipes-qQeIf4lG.js} +8 -6
  313. package/dist/field-affordance-recipes-qQeIf4lG.js.map +1 -0
  314. package/dist/field-state-recipes-BVA2CWHo.js +12 -0
  315. package/dist/field-state-recipes-BVA2CWHo.js.map +1 -0
  316. package/dist/{filters-Da-gNPsE.js → filters-BkHH53uv.js} +565 -563
  317. package/dist/filters-BkHH53uv.js.map +1 -0
  318. package/dist/focus-recipes-B653VaLq.js +12 -0
  319. package/dist/focus-recipes-B653VaLq.js.map +1 -0
  320. package/dist/{form-field-VZRULhUK.js → form-field-DUt4UxSV.js} +4 -4
  321. package/dist/{form-field-VZRULhUK.js.map → form-field-DUt4UxSV.js.map} +1 -1
  322. package/dist/{form-sizing-uWP4lzVh.js → form-sizing-By94KzXE.js} +19 -15
  323. package/dist/form-sizing-By94KzXE.js.map +1 -0
  324. package/dist/{forms-DDeEnXSY.js → forms-Bzha-Y3B.js} +22 -22
  325. package/dist/{forms-DDeEnXSY.js.map → forms-Bzha-Y3B.js.map} +1 -1
  326. package/dist/{forms-numeric-D3CO60IF.js → forms-numeric-C0bvjRPZ.js} +265 -264
  327. package/dist/forms-numeric-C0bvjRPZ.js.map +1 -0
  328. package/dist/{header-2ycNqGOR.js → header-BOefOKd1.js} +47 -51
  329. package/dist/header-BOefOKd1.js.map +1 -0
  330. package/dist/{hooks-DQ5SPwZw.js → hooks-9k_TtmKh.js} +2 -2
  331. package/dist/{hooks-DQ5SPwZw.js.map → hooks-9k_TtmKh.js.map} +1 -1
  332. package/dist/{http-CdEIHyQf.js → http-D_6rOnzU.js} +2 -2
  333. package/dist/{http-CdEIHyQf.js.map → http-D_6rOnzU.js.map} +1 -1
  334. package/dist/icon-badge-CAuKupo9.js +55 -0
  335. package/dist/icon-badge-CAuKupo9.js.map +1 -0
  336. package/dist/index.js +7 -7
  337. package/dist/input-DWhBBBww.js +262 -0
  338. package/dist/input-DWhBBBww.js.map +1 -0
  339. package/dist/{input-BoLm9Hks.js → input-Ddi_LSYv.js} +3 -3
  340. package/dist/{input-BoLm9Hks.js.map → input-Ddi_LSYv.js.map} +1 -1
  341. package/dist/interaction-recipes-CHr0dJUs.js +24 -0
  342. package/dist/interaction-recipes-CHr0dJUs.js.map +1 -0
  343. package/dist/{item-xzh8Df65.js → item-DEmDiTlD.js} +98 -97
  344. package/dist/item-DEmDiTlD.js.map +1 -0
  345. package/dist/layer-recipes-CCpklYME.js +13 -0
  346. package/dist/layer-recipes-CCpklYME.js.map +1 -0
  347. package/dist/layout/app-shell.js +1 -1
  348. package/dist/layout/auth.js +1 -1
  349. package/dist/layout/containers.js +1 -1
  350. package/dist/layout/header.js +1 -1
  351. package/dist/layout/hooks.js +1 -1
  352. package/dist/layout/navigation.js +1 -1
  353. package/dist/layout/page.js +1 -1
  354. package/dist/layout/settings.js +1 -1
  355. package/dist/layout/sidebar.js +2 -2
  356. package/dist/layout/workspace.js +1 -1
  357. package/dist/layout.js +10 -10
  358. package/dist/lib/affordance-geometry.generated.d.ts +1 -0
  359. package/dist/lib/field-affordance-recipes.d.ts +6 -1
  360. package/dist/lib/field-state-recipes.d.ts +9 -8
  361. package/dist/lib/focus-recipes.d.ts +24 -0
  362. package/dist/lib/interaction-recipes.d.ts +35 -0
  363. package/dist/lib/layer-recipes.d.ts +19 -0
  364. package/dist/lib/motion-recipes.d.ts +1 -0
  365. package/dist/lib/overlay-anatomy-recipes.d.ts +1 -0
  366. package/dist/lib/safe-image-src.d.ts +10 -0
  367. package/dist/lib/sanitize-html.d.ts +15 -3
  368. package/dist/lib/surface-recipes.d.ts +47 -7
  369. package/dist/lib/token-merge.generated.d.ts +9 -6
  370. package/dist/lib/tone-recipes.d.ts +79 -0
  371. package/dist/lib/ui-provider/hooks.d.ts +2 -1
  372. package/dist/lib/ui-provider/index.d.ts +2 -2
  373. package/dist/lib/ui-provider/types.d.ts +9 -0
  374. package/dist/lib/utils.js +1 -1
  375. package/dist/media-gallery-DcTtAaeC.js +203 -0
  376. package/dist/media-gallery-DcTtAaeC.js.map +1 -0
  377. package/dist/mentions-D-uyCh01.js +568 -0
  378. package/dist/mentions-D-uyCh01.js.map +1 -0
  379. package/dist/{message-YfFmbXNP.js → message-CdHgIWKf.js} +5 -5
  380. package/dist/{message-YfFmbXNP.js.map → message-CdHgIWKf.js.map} +1 -1
  381. package/dist/metadata-list-X5rYAKSB.js +394 -0
  382. package/dist/metadata-list-X5rYAKSB.js.map +1 -0
  383. package/dist/{motion-recipes-B6jKXEcN.js → motion-recipes-ChBg4HBq.js} +3 -2
  384. package/dist/{motion-recipes-B6jKXEcN.js.map → motion-recipes-ChBg4HBq.js.map} +1 -1
  385. package/dist/navigation-D3KwXmaq.js +145 -0
  386. package/dist/navigation-D3KwXmaq.js.map +1 -0
  387. package/dist/navigation-HJf5zxlH.js +268 -0
  388. package/dist/navigation-HJf5zxlH.js.map +1 -0
  389. package/dist/{navigation-row-recipes-DlU-4QYO.js → navigation-row-recipes-BVowojQw.js} +2 -2
  390. package/dist/{navigation-row-recipes-DlU-4QYO.js.map → navigation-row-recipes-BVowojQw.js.map} +1 -1
  391. package/dist/{number-CKRBYmZK.js → number-DMhe-Vsk.js} +5 -5
  392. package/dist/{number-CKRBYmZK.js.map → number-DMhe-Vsk.js.map} +1 -1
  393. package/dist/overflow-tab-bar-sQHXLlwQ.js +280 -0
  394. package/dist/overflow-tab-bar-sQHXLlwQ.js.map +1 -0
  395. package/dist/overlay.recipes-8GHqmlb4.js +6 -0
  396. package/dist/overlay.recipes-8GHqmlb4.js.map +1 -0
  397. package/dist/overlays-I0axtYA6.js +999 -0
  398. package/dist/overlays-I0axtYA6.js.map +1 -0
  399. package/dist/page-B5dTH9gE.js +224 -0
  400. package/dist/page-B5dTH9gE.js.map +1 -0
  401. package/dist/page-header-commands-DjzFEq3E.js +126 -0
  402. package/dist/page-header-commands-DjzFEq3E.js.map +1 -0
  403. package/dist/{pagination-Cm0jqa3I.js → pagination-3bPA_a6K.js} +15 -15
  404. package/dist/{pagination-Cm0jqa3I.js.map → pagination-3bPA_a6K.js.map} +1 -1
  405. package/dist/{popover-Dcv_9jxr.js → popover-Di55PyAI.js} +8 -8
  406. package/dist/popover-Di55PyAI.js.map +1 -0
  407. package/dist/{popover-menu-DnRFKnHP.js → popover-menu-B71Tn2Qz.js} +6 -6
  408. package/dist/{popover-menu-DnRFKnHP.js.map → popover-menu-B71Tn2Qz.js.map} +1 -1
  409. package/dist/{popover.recipes-wmbvL8Ah.js → popover.recipes-Bdyhj2db.js} +2 -2
  410. package/dist/{popover.recipes-wmbvL8Ah.js.map → popover.recipes-Bdyhj2db.js.map} +1 -1
  411. package/dist/{primitives-BHrwQXFC.js → primitives-B-CkiEMU.js} +5 -5
  412. package/dist/{primitives-BHrwQXFC.js.map → primitives-B-CkiEMU.js.map} +1 -1
  413. package/dist/primitives.js +4 -4
  414. package/dist/{progress-Br9WTFya.js → progress-rnS8-uAW.js} +9 -9
  415. package/dist/{progress-Br9WTFya.js.map → progress-rnS8-uAW.js.map} +1 -1
  416. package/dist/{receipt-CV89q1fs.js → receipt-D0oswZ0p.js} +6 -6
  417. package/dist/{receipt-CV89q1fs.js.map → receipt-D0oswZ0p.js.map} +1 -1
  418. package/dist/rich-text-DvGulsNJ.js +78 -0
  419. package/dist/rich-text-DvGulsNJ.js.map +1 -0
  420. package/dist/rich-text-editor-sMU_Scqm.js +1204 -0
  421. package/dist/rich-text-editor-sMU_Scqm.js.map +1 -0
  422. package/dist/rich-text-editor.recipes-CadiF_Uu.js +88 -0
  423. package/dist/rich-text-editor.recipes-CadiF_Uu.js.map +1 -0
  424. package/dist/rich-text-editor.strings-CB59ekH2.js +38 -0
  425. package/dist/rich-text-editor.strings-CB59ekH2.js.map +1 -0
  426. package/dist/safe-image-src-C6kQSMBZ.js +17 -0
  427. package/dist/safe-image-src-C6kQSMBZ.js.map +1 -0
  428. package/dist/sanitize-html-DsQmI48u.js +92 -0
  429. package/dist/sanitize-html-DsQmI48u.js.map +1 -0
  430. package/dist/scroll-area-Bt_vXY2b.js +48 -0
  431. package/dist/scroll-area-Bt_vXY2b.js.map +1 -0
  432. package/dist/{separator-Do5GWDYi.js → separator-C8DlRGwF.js} +3 -3
  433. package/dist/{separator-Do5GWDYi.js.map → separator-C8DlRGwF.js.map} +1 -1
  434. package/dist/{separator-BMEvwnSX.js → separator-CYHnjsAb.js} +2 -2
  435. package/dist/{separator-BMEvwnSX.js.map → separator-CYHnjsAb.js.map} +1 -1
  436. package/dist/services/actions/action-adapters.d.ts +18 -0
  437. package/dist/services/actions/index.d.ts +1 -1
  438. package/dist/services/actions.js +16 -4
  439. package/dist/services/actions.js.map +1 -1
  440. package/dist/settings-CQW3b-Cu.js +170 -0
  441. package/dist/settings-CQW3b-Cu.js.map +1 -0
  442. package/dist/sheet-4SEvVYzA.js +210 -0
  443. package/dist/sheet-4SEvVYzA.js.map +1 -0
  444. package/dist/{sidebar-Crc9M9JV.js → sidebar-C7WWR29L.js} +180 -179
  445. package/dist/sidebar-C7WWR29L.js.map +1 -0
  446. package/dist/{sidebar-Cb8WzOvE.js → sidebar-d7Dg80ln.js} +16 -16
  447. package/dist/sidebar-d7Dg80ln.js.map +1 -0
  448. package/dist/{skeleton-DVMXr15h.js → skeleton-Cz890JZF.js} +9 -9
  449. package/dist/{skeleton-DVMXr15h.js.map → skeleton-Cz890JZF.js.map} +1 -1
  450. package/dist/smart-card-lFKxn5Hu.js +595 -0
  451. package/dist/smart-card-lFKxn5Hu.js.map +1 -0
  452. package/dist/{spinner-CmTAbEp0.js → spinner-fa3h1Aif.js} +7 -7
  453. package/dist/{spinner-CmTAbEp0.js.map → spinner-fa3h1Aif.js.map} +1 -1
  454. package/dist/{structure-hzCW-XsV.js → structure-DC2dygdA.js} +2 -2
  455. package/dist/{structure-hzCW-XsV.js.map → structure-DC2dygdA.js.map} +1 -1
  456. package/dist/style.css +1 -1
  457. package/dist/surface-recipes-BKRVW8Os.js +43 -0
  458. package/dist/surface-recipes-BKRVW8Os.js.map +1 -0
  459. package/dist/{table-D6zKeYQX.js → table-CIKyLUsy.js} +59 -58
  460. package/dist/table-CIKyLUsy.js.map +1 -0
  461. package/dist/table-CrcLN9Io.js +1458 -0
  462. package/dist/table-CrcLN9Io.js.map +1 -0
  463. package/dist/{tabs-Dk8E_knt.js → tabs-DwBJfjxX.js} +58 -57
  464. package/dist/tabs-DwBJfjxX.js.map +1 -0
  465. package/dist/{text-inputs-BFpku0Qd.js → text-inputs-aaK9wcDT.js} +74 -79
  466. package/dist/text-inputs-aaK9wcDT.js.map +1 -0
  467. package/dist/theme.css +3 -3
  468. package/dist/{timelines-CxuAFIc2.js → timelines-C_SBwHNP.js} +153 -150
  469. package/dist/timelines-C_SBwHNP.js.map +1 -0
  470. package/dist/tone-recipes-CPoExcTE.js +70 -0
  471. package/dist/tone-recipes-CPoExcTE.js.map +1 -0
  472. package/dist/tooltip-CsfgrfS7.js +111 -0
  473. package/dist/tooltip-CsfgrfS7.js.map +1 -0
  474. package/dist/{tree-BotPlyiD.js → tree-BiKhg8AY.js} +68 -66
  475. package/dist/tree-BiKhg8AY.js.map +1 -0
  476. package/dist/typography/rich-text.js +1 -1
  477. package/dist/typography-DTRkE9zL.js +117 -0
  478. package/dist/typography-DTRkE9zL.js.map +1 -0
  479. package/dist/typography.js +1 -1
  480. package/dist/{ui-provider-D2_TeLqw.js → ui-provider-1D_NSYzO.js} +11 -3
  481. package/dist/ui-provider-1D_NSYzO.js.map +1 -0
  482. package/dist/ui-provider.js +3 -3
  483. package/dist/{upload-B0WHW7ak.js → upload-BO8-CLN6.js} +209 -209
  484. package/dist/upload-BO8-CLN6.js.map +1 -0
  485. package/dist/{upload-queue-BHZ_wBfd.js → upload-queue-EOC8g1gf.js} +109 -111
  486. package/dist/upload-queue-EOC8g1gf.js.map +1 -0
  487. package/dist/upload.recipes-BbxTqrCT.js +61 -0
  488. package/dist/upload.recipes-BbxTqrCT.js.map +1 -0
  489. package/dist/{usage-card-U0YBLTNT.js → usage-card-obRaBskq.js} +46 -46
  490. package/dist/{usage-card-U0YBLTNT.js.map → usage-card-obRaBskq.js.map} +1 -1
  491. package/dist/{utils-Cospvlj1.js → utils-l5LpDw2z.js} +56 -24
  492. package/dist/utils-l5LpDw2z.js.map +1 -0
  493. package/dist/value-inputs-TAYMX111.js +947 -0
  494. package/dist/value-inputs-TAYMX111.js.map +1 -0
  495. package/dist/{value-typography-Deb3yQZg.js → value-typography-b8wpz1eX.js} +2 -2
  496. package/dist/{value-typography-Deb3yQZg.js.map → value-typography-b8wpz1eX.js.map} +1 -1
  497. package/dist/workspace-DH0v0KcB.js +407 -0
  498. package/dist/workspace-DH0v0KcB.js.map +1 -0
  499. package/docs/consumer-skill/SKILL.md +19 -20
  500. package/docs/consumer-skill/examples/app-layout.tsx +1 -1
  501. package/docs/consumer-skill/examples/composition.tsx +3 -3
  502. package/docs/consumer-skill/examples/detail.tsx +59 -12
  503. package/docs/consumer-skill/examples/edit.tsx +1 -1
  504. package/docs/consumer-skill/examples/receipt.tsx +2 -2
  505. package/docs/consumer-skill/examples/scoped-directory.tsx +1 -1
  506. package/docs/consumer-skill/examples/website.tsx +1 -1
  507. package/docs/consumer-skill/references/agents-md.md +33 -0
  508. package/docs/consumer-skill/references/analytics.md +1 -1
  509. package/docs/consumer-skill/references/composition.md +51 -8
  510. package/docs/consumer-skill/references/design-contract.md +12 -3
  511. package/docs/consumer-skill/references/installation.md +11 -1
  512. package/docs/consumer-skill/references/public-api.json +847 -447
  513. package/docs/consumer-skill/references/review.md +25 -5
  514. package/docs/consumer-skill/references/theming.md +8 -4
  515. package/docs/consumer-skill/references/tokens.json +1 -1
  516. package/docs/consumer-skill/references/workflows.md +29 -10
  517. package/docs/consumer-skill/scripts/composition-policy.mjs +41 -11
  518. package/docs/consumer-skill/scripts/surface-policy.mjs +139 -5
  519. package/package.json +10 -2
  520. package/dist/accordion-CQXVcd7Q.js.map +0 -1
  521. package/dist/action-menu-BTpyPWJ2.js +0 -264
  522. package/dist/action-menu-BTpyPWJ2.js.map +0 -1
  523. package/dist/affordance-geometry.generated-CCIXb2A1.js.map +0 -1
  524. package/dist/ai-artifact-2PQ2fItc.js.map +0 -1
  525. package/dist/attachment-q69dlt5Y.js +0 -244
  526. package/dist/attachment-q69dlt5Y.js.map +0 -1
  527. package/dist/auth-M3vGMgDR.js.map +0 -1
  528. package/dist/avatar-djdaaQ_s.js.map +0 -1
  529. package/dist/badge-0tATj-tW.js +0 -92
  530. package/dist/badge-0tATj-tW.js.map +0 -1
  531. package/dist/breadcrumbs-BG_FfMK4.js +0 -128
  532. package/dist/breadcrumbs-BG_FfMK4.js.map +0 -1
  533. package/dist/button-BS3KDg00.js.map +0 -1
  534. package/dist/button-R9CCoH7A.js.map +0 -1
  535. package/dist/buttons-DS0ZIwJ_.js +0 -99
  536. package/dist/buttons-DS0ZIwJ_.js.map +0 -1
  537. package/dist/cards-QoJ4syG9.js.map +0 -1
  538. package/dist/checkbox-B7ygNTYp.js +0 -35
  539. package/dist/checkbox-B7ygNTYp.js.map +0 -1
  540. package/dist/choice-inputs-DrJ17tpL.js +0 -752
  541. package/dist/choice-inputs-DrJ17tpL.js.map +0 -1
  542. package/dist/code-block-CD0B7M93.js +0 -183
  543. package/dist/code-block-CD0B7M93.js.map +0 -1
  544. package/dist/combobox-6dvVny2q.js.map +0 -1
  545. package/dist/combobox-CB7039j7.js.map +0 -1
  546. package/dist/comments-You0Bzbr.js.map +0 -1
  547. package/dist/components/layout/page/partials/page-header-commands.d.ts +0 -13
  548. package/dist/containers-D_L4mTVb.js.map +0 -1
  549. package/dist/data-display-3xWQUnMA.js +0 -1335
  550. package/dist/data-display-3xWQUnMA.js.map +0 -1
  551. package/dist/date-picker-DrDFj8Lo.js +0 -1527
  552. package/dist/date-picker-DrDFj8Lo.js.map +0 -1
  553. package/dist/display-DrdvPwF0.js.map +0 -1
  554. package/dist/feedback-C7nR0UtT.js.map +0 -1
  555. package/dist/field-affordance-recipes-CkOCdE2y.js.map +0 -1
  556. package/dist/field-state-recipes-C-MFBX_8.js +0 -11
  557. package/dist/field-state-recipes-C-MFBX_8.js.map +0 -1
  558. package/dist/filters-Da-gNPsE.js.map +0 -1
  559. package/dist/form-sizing-uWP4lzVh.js.map +0 -1
  560. package/dist/forms-numeric-D3CO60IF.js.map +0 -1
  561. package/dist/header-2ycNqGOR.js.map +0 -1
  562. package/dist/icon-badge-DKlaKXoo.js +0 -53
  563. package/dist/icon-badge-DKlaKXoo.js.map +0 -1
  564. package/dist/input-DhQdBnV3.js +0 -255
  565. package/dist/input-DhQdBnV3.js.map +0 -1
  566. package/dist/item-xzh8Df65.js.map +0 -1
  567. package/dist/media-gallery-DQUQ0m3O.js +0 -201
  568. package/dist/media-gallery-DQUQ0m3O.js.map +0 -1
  569. package/dist/mentions-DwnO1hh4.js +0 -564
  570. package/dist/mentions-DwnO1hh4.js.map +0 -1
  571. package/dist/navigation-Cbp5V8gG.js +0 -264
  572. package/dist/navigation-Cbp5V8gG.js.map +0 -1
  573. package/dist/navigation-Cs1npsPm.js +0 -300
  574. package/dist/navigation-Cs1npsPm.js.map +0 -1
  575. package/dist/overlay.recipes-CNO2S9V6.js +0 -34
  576. package/dist/overlay.recipes-CNO2S9V6.js.map +0 -1
  577. package/dist/overlays-DhZO7N-I.js +0 -994
  578. package/dist/overlays-DhZO7N-I.js.map +0 -1
  579. package/dist/page-C6R_8jFt.js +0 -325
  580. package/dist/page-C6R_8jFt.js.map +0 -1
  581. package/dist/page-header-hUTzcRZX.js +0 -112
  582. package/dist/page-header-hUTzcRZX.js.map +0 -1
  583. package/dist/popover-Dcv_9jxr.js.map +0 -1
  584. package/dist/rich-text-editor-CF8QYt5p.js +0 -574
  585. package/dist/rich-text-editor-CF8QYt5p.js.map +0 -1
  586. package/dist/rich-text-editor.recipes-CnrbmTS1.js +0 -81
  587. package/dist/rich-text-editor.recipes-CnrbmTS1.js.map +0 -1
  588. package/dist/rich-text-editor.strings-BpnIQgMl.js +0 -25
  589. package/dist/rich-text-editor.strings-BpnIQgMl.js.map +0 -1
  590. package/dist/rich-text-j-FGAeZW.js +0 -32
  591. package/dist/rich-text-j-FGAeZW.js.map +0 -1
  592. package/dist/sanitize-html-BG9FGe-j.js +0 -64
  593. package/dist/sanitize-html-BG9FGe-j.js.map +0 -1
  594. package/dist/scroll-area-DRdr16Pt.js +0 -47
  595. package/dist/scroll-area-DRdr16Pt.js.map +0 -1
  596. package/dist/settings-DHk0L2MF.js +0 -161
  597. package/dist/settings-DHk0L2MF.js.map +0 -1
  598. package/dist/sheet-DRFNY1_D.js +0 -207
  599. package/dist/sheet-DRFNY1_D.js.map +0 -1
  600. package/dist/sidebar-Cb8WzOvE.js.map +0 -1
  601. package/dist/sidebar-Crc9M9JV.js.map +0 -1
  602. package/dist/smart-card-Bek-TwUp.js +0 -599
  603. package/dist/smart-card-Bek-TwUp.js.map +0 -1
  604. package/dist/surface-recipes-DOdoBXGm.js +0 -28
  605. package/dist/surface-recipes-DOdoBXGm.js.map +0 -1
  606. package/dist/table-D6zKeYQX.js.map +0 -1
  607. package/dist/table-Dn4XSrSB.js +0 -1444
  608. package/dist/table-Dn4XSrSB.js.map +0 -1
  609. package/dist/tabs-Dk8E_knt.js.map +0 -1
  610. package/dist/text-inputs-BFpku0Qd.js.map +0 -1
  611. package/dist/timelines-CxuAFIc2.js.map +0 -1
  612. package/dist/tree-BotPlyiD.js.map +0 -1
  613. package/dist/typography-CAr3dQhX.js +0 -116
  614. package/dist/typography-CAr3dQhX.js.map +0 -1
  615. package/dist/ui-provider-D2_TeLqw.js.map +0 -1
  616. package/dist/upload-B0WHW7ak.js.map +0 -1
  617. package/dist/upload-queue-BHZ_wBfd.js.map +0 -1
  618. package/dist/use-file-drop-target-BX7GnhoQ.js +0 -39
  619. package/dist/use-file-drop-target-BX7GnhoQ.js.map +0 -1
  620. package/dist/utils-Cospvlj1.js.map +0 -1
  621. package/dist/value-inputs-CjfzGMsN.js +0 -854
  622. package/dist/value-inputs-CjfzGMsN.js.map +0 -1
  623. package/dist/workspace-YoFjXi6i.js +0 -394
  624. package/dist/workspace-YoFjXi6i.js.map +0 -1
  625. /package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-list.strings.d.ts +0 -0
@@ -1,26 +1,26 @@
1
1
  "use client";
2
- import { _ as e, s as t } from "./ui-provider-D2_TeLqw.js";
2
+ import { s as e, v as t } from "./ui-provider-1D_NSYzO.js";
3
3
  import { useStrings as n } from "./lib/strings.js";
4
- import { t as r } from "./utils-Cospvlj1.js";
5
- import { s as i } from "./typography-CAr3dQhX.js";
6
- import { t as a } from "./button-BS3KDg00.js";
7
- import { t as o } from "./structure-hzCW-XsV.js";
8
- import { g as s, i as c } from "./primitives-BHrwQXFC.js";
9
- import { t as l } from "./badge-0tATj-tW.js";
10
- import { t as u } from "./use-file-drop-target-BX7GnhoQ.js";
11
- import { a as d, c as f, i as p, n as m, o as h, r as g, s as _, t as v } from "./attachment-q69dlt5Y.js";
12
- import { forwardRef as y, useCallback as b, useId as x } from "react";
13
- import { Fragment as S, jsx as C, jsxs as w } from "react/jsx-runtime";
14
- import { AlertCircle as T, Check as E, Clock as D, Download as O, Eye as k, RefreshCw as A, UploadCloud as j, X as M } from "lucide-react";
4
+ import { t as r } from "./utils-l5LpDw2z.js";
5
+ import { n as i } from "./buttons-SbIcm1HJ.js";
6
+ import { s as a } from "./typography-DTRkE9zL.js";
7
+ import { t as o } from "./structure-DC2dygdA.js";
8
+ import { g as s, i as c } from "./primitives-B-CkiEMU.js";
9
+ import { t as l } from "./badge-MrKVNzW9.js";
10
+ import { n as u, t as d } from "./upload.recipes-BbxTqrCT.js";
11
+ import { a as f, c as p, i as m, n as h, o as g, r as _, s as v, t as y } from "./attachment-BtfhGm8i.js";
12
+ import { forwardRef as b, useCallback as x, useId as S } from "react";
13
+ import { Fragment as C, jsx as w, jsxs as T } from "react/jsx-runtime";
14
+ import { AlertCircle as E, Check as D, Clock as O, Download as k, Eye as A, RefreshCw as j, UploadCloud as M, X as N } from "lucide-react";
15
15
  //#region src/components/base/upload/file-picker-input.tsx
16
- var N = y(function({ className: e, onFiles: t, onClick: n, ...i }, a) {
16
+ var P = b(function({ className: e, onFiles: t, onClick: n, ...i }, a) {
17
17
  let o = (e) => {
18
18
  e.stopPropagation(), n?.(e), e.defaultPrevented || (e.currentTarget.value = "");
19
19
  }, s = (e) => {
20
20
  let n = e.currentTarget.files;
21
21
  n?.length && t(Array.from(n)) === !1 && (e.currentTarget.value = "");
22
22
  };
23
- return /* @__PURE__ */ C("input", {
23
+ return /* @__PURE__ */ w("input", {
24
24
  ...i,
25
25
  ref: a,
26
26
  type: "file",
@@ -30,14 +30,10 @@ var N = y(function({ className: e, onFiles: t, onClick: n, ...i }, a) {
30
30
  onChange: s
31
31
  });
32
32
  });
33
- N.displayName = "FilePickerInput";
33
+ P.displayName = "FilePickerInput";
34
34
  //#endregion
35
- //#region src/components/base/upload/upload.recipes.ts
36
- var P = {
37
- idle: "border-input",
38
- invalid: "border-destructive",
39
- dragging: "border-primary bg-primary/10"
40
- }, F = {
35
+ //#region src/components/base/upload/dropzone.tsx
36
+ var F = {
41
37
  instruction: "Drag files here or click to browse",
42
38
  helper: "",
43
39
  dragOver: "Release to select"
@@ -61,61 +57,63 @@ var P = {
61
57
  function L(e, t) {
62
58
  typeof t == "function" ? t(e) : t && (t.current = e);
63
59
  }
64
- function R({ onDrop: a, accept: o, multiple: s = !1, disabled: c = !1, invalid: l = !1, size: d, icon: f, className: p, inputProps: m, children: h, strings: g }, _) {
65
- let { defaultScale: v } = t(), y = n(F, g), b = x(), S = m?.id ?? `dropzone-${b}`, { isDragging: T, dropTargetProps: E } = u({
60
+ function R({ onDrop: i, accept: o, multiple: s = !1, disabled: c = !1, invalid: l = !1, size: f, icon: p, className: m, inputProps: h, children: g, strings: _ }, v) {
61
+ let { defaultScale: y } = e(), b = n(F, _), x = S(), C = h?.id ?? `dropzone-${x}`, { isDragging: E, dropTargetProps: D } = u({
66
62
  disabled: c,
67
- onFiles: a
68
- }), D = I[e(d, v)];
69
- return /* @__PURE__ */ w("div", {
70
- ...E,
63
+ onFiles: i
64
+ }), O = I[t(f, y)];
65
+ return /* @__PURE__ */ T("div", {
66
+ ...D,
71
67
  "data-disabled": c || void 0,
72
68
  "data-invalid": l || void 0,
73
- "data-dragging": T || void 0,
74
- className: r("dropzone--component relative flex flex-col items-center justify-center gap-space-md rounded-radius border border-dashed text-center transition-colors duration-150", "has-[[data-slot=file-picker-input]:focus-visible]:ring-2 has-[[data-slot=file-picker-input]:focus-visible]:ring-ring has-[[data-slot=file-picker-input]:focus-visible]:ring-offset-2", D.minHeight, D.padding, l ? P.invalid : P.idle, l ? !c && "hover:bg-destructive/5" : !c && "hover:border-primary hover:bg-primary/5", c && "cursor-not-allowed opacity-50", !c && T && (l ? "border-destructive bg-destructive/5" : P.dragging), p),
69
+ "data-dragging": E || void 0,
70
+ className: r("dropzone--component relative flex flex-col items-center justify-center gap-space-md rounded-radius border border-dashed text-center transition-colors duration-150", "has-[[data-slot=file-picker-input]:focus-visible]:ring-3", O.minHeight, O.padding, l ? r(d.invalid, d.focus.filePicker.invalid) : r(d.idle, d.focus.filePicker.valid), l ? !c && d.invalidHover : !c && d.hover, c && "cursor-not-allowed opacity-50", !c && E && (l ? d.invalidDragging : d.dragging), m),
75
71
  children: [
76
- /* @__PURE__ */ C(N, {
77
- ...m,
78
- ref: (e) => L(e, _),
79
- id: S,
72
+ /* @__PURE__ */ w(P, {
73
+ ...h,
74
+ ref: (e) => L(e, v),
75
+ id: C,
80
76
  accept: o,
81
77
  multiple: s,
82
78
  disabled: c,
83
79
  "aria-invalid": l || void 0,
84
- className: r("dropzone--input", m?.className),
85
- onFiles: a
80
+ className: r("dropzone--input", h?.className),
81
+ onFiles: i
86
82
  }),
87
- /* @__PURE__ */ w("label", {
88
- htmlFor: c ? void 0 : S,
83
+ /* @__PURE__ */ T("label", {
84
+ htmlFor: c ? void 0 : C,
89
85
  "aria-disabled": c || void 0,
90
86
  className: r("dropzone--trigger flex w-full flex-1 cursor-pointer flex-col items-center justify-center gap-space-md", c && "cursor-not-allowed"),
91
- children: [/* @__PURE__ */ C("span", {
87
+ children: [/* @__PURE__ */ w("span", {
92
88
  className: "dropzone--icon inline-flex items-center justify-center text-muted-foreground",
93
89
  "aria-hidden": "true",
94
- children: f ?? /* @__PURE__ */ C(j, { className: D.iconSize })
95
- }), /* @__PURE__ */ w("span", {
96
- className: "dropzone--copy grid gap-normal text-center [&_p]:text-center",
97
- children: [/* @__PURE__ */ C(i, {
90
+ children: p ?? /* @__PURE__ */ w(M, { className: O.iconSize })
91
+ }), /* @__PURE__ */ T("span", {
92
+ className: "dropzone--copy grid gap-normal",
93
+ children: [/* @__PURE__ */ w(a, {
98
94
  tag: "span",
99
95
  weight: "medium",
96
+ align: "center",
100
97
  className: "dropzone--instruction",
101
- children: T ? y.dragOver : y.instruction
102
- }), !!y.helper && /* @__PURE__ */ C(i, {
98
+ children: E ? b.dragOver : b.instruction
99
+ }), !!b.helper && /* @__PURE__ */ w(a, {
103
100
  tag: "span",
104
101
  size: "xs",
105
102
  type: "secondary",
103
+ align: "center",
106
104
  className: "dropzone--helper",
107
- children: y.helper
105
+ children: b.helper
108
106
  })]
109
107
  })]
110
108
  }),
111
- !!h && /* @__PURE__ */ C("div", {
109
+ !!g && /* @__PURE__ */ w("div", {
112
110
  className: "dropzone--action",
113
- children: h
111
+ children: g
114
112
  })
115
113
  ]
116
114
  });
117
115
  }
118
- var z = y(R);
116
+ var z = b(R);
119
117
  z.displayName = "Dropzone";
120
118
  //#endregion
121
119
  //#region src/components/base/upload-queue/upload-progress-list.tsx
@@ -132,87 +130,87 @@ var B = {
132
130
  download: "Download"
133
131
  }, V = {
134
132
  queued: {
135
- icon: D,
133
+ icon: O,
136
134
  fg: "text-muted-foreground"
137
135
  },
138
136
  uploading: {
139
- icon: j,
137
+ icon: M,
140
138
  fg: "text-primary-accent"
141
139
  },
142
140
  done: {
143
- icon: E,
141
+ icon: D,
144
142
  fg: "text-muted-foreground"
145
143
  },
146
144
  error: {
147
- icon: T,
145
+ icon: E,
148
146
  fg: "text-destructive"
149
147
  },
150
148
  cancelled: {
151
- icon: M,
149
+ icon: N,
152
150
  fg: "text-muted-foreground"
153
151
  }
154
152
  };
155
- function H({ items: e, onPreview: t, onDownload: l, onCancel: u, onRetry: y, onRemove: b, className: x, strings: S }) {
156
- let T = n(B, S), E = {
157
- queued: T.queued,
158
- uploading: T.uploading,
159
- done: T.done,
160
- error: T.error,
161
- cancelled: T.cancelled
153
+ function H({ items: e, onPreview: t, onDownload: l, onCancel: u, onRetry: d, onRemove: b, className: x, strings: S }) {
154
+ let C = n(B, S), E = {
155
+ queued: C.queued,
156
+ uploading: C.uploading,
157
+ done: C.done,
158
+ error: C.error,
159
+ cancelled: C.cancelled
162
160
  };
163
- return e.length === 0 ? null : /* @__PURE__ */ C(o, {
164
- render: /* @__PURE__ */ C("ul", {}),
161
+ return e.length === 0 ? null : /* @__PURE__ */ w(o, {
162
+ render: /* @__PURE__ */ w("ul", {}),
165
163
  gap: "sm",
166
164
  className: r("upload-progress-list--component m-0 p-0 list-none", x),
167
165
  children: e.map((e) => {
168
166
  let n = V[e.status], o = n.icon, x = e.progress === void 0 ? null : Number.isFinite(e.progress) ? Math.max(0, Math.min(100, e.progress ?? 0)) : 0, S = e.status === "uploading" || e.status === "queued";
169
- return /* @__PURE__ */ w(v, {
170
- render: /* @__PURE__ */ C("li", {}),
167
+ return /* @__PURE__ */ T(y, {
168
+ render: /* @__PURE__ */ w("li", {}),
171
169
  variant: "outline",
172
170
  className: "upload-progress-list--item flex-nowrap bg-card text-card-foreground",
173
171
  children: [
174
- /* @__PURE__ */ C(h, {
172
+ /* @__PURE__ */ w(g, {
175
173
  variant: e.preview ? "image" : "icon",
176
174
  className: r("upload-progress-list--media self-center group-has-data-[slot=item-description]/item:self-center", n.fg),
177
- children: e.preview ? /* @__PURE__ */ C("img", {
175
+ children: e.preview ? /* @__PURE__ */ w("img", {
178
176
  src: e.preview,
179
177
  alt: ""
180
- }) : e.status === "done" ? /* @__PURE__ */ C(d, {
178
+ }) : e.status === "done" ? /* @__PURE__ */ w(f, {
181
179
  name: e.name,
182
180
  kind: e.kind
183
- }) : /* @__PURE__ */ C(o, {
181
+ }) : /* @__PURE__ */ w(o, {
184
182
  "aria-hidden": "true",
185
183
  className: r("size-icon", e.status === "uploading" && "animate-pulse motion-reduce:animate-none")
186
184
  })
187
185
  }),
188
- /* @__PURE__ */ w(g, {
186
+ /* @__PURE__ */ T(_, {
189
187
  className: "min-w-0 gap-space-xs",
190
188
  children: [
191
- /* @__PURE__ */ C(f, {
189
+ /* @__PURE__ */ w(p, {
192
190
  className: "min-w-0 max-w-full",
193
191
  title: e.name,
194
- children: /* @__PURE__ */ C(i, {
192
+ children: /* @__PURE__ */ w(a, {
195
193
  tag: "span",
196
194
  weight: "medium",
197
195
  className: "truncate",
198
196
  children: e.name
199
197
  })
200
198
  }),
201
- (e.size !== void 0 || e.bytes !== void 0) && /* @__PURE__ */ C(p, {
199
+ (e.size !== void 0 || e.bytes !== void 0) && /* @__PURE__ */ w(m, {
202
200
  clamp: 1,
203
- children: /* @__PURE__ */ C(s, {
201
+ children: /* @__PURE__ */ w(s, {
204
202
  size: "xs",
205
203
  className: "tabular-nums",
206
- children: e.size ?? /* @__PURE__ */ C(c, {
204
+ children: e.size ?? /* @__PURE__ */ w(c, {
207
205
  value: e.bytes,
208
206
  size: "xs",
209
207
  type: "secondary"
210
208
  })
211
209
  })
212
210
  }),
213
- /* @__PURE__ */ C(p, {
211
+ /* @__PURE__ */ w(m, {
214
212
  clamp: "none",
215
- children: /* @__PURE__ */ C(i, {
213
+ children: /* @__PURE__ */ w(a, {
216
214
  tag: "span",
217
215
  size: "xs",
218
216
  type: e.status === "error" ? "error" : "secondary",
@@ -220,7 +218,7 @@ function H({ items: e, onPreview: t, onDownload: l, onCancel: u, onRetry: y, onR
220
218
  children: `${E[e.status]}${e.status === "error" && e.error ? ` — ${e.error}` : ""}`
221
219
  })
222
220
  }),
223
- S && /* @__PURE__ */ C(_, {
221
+ S && /* @__PURE__ */ w(v, {
224
222
  value: e.status === "queued" && x === null ? 0 : x,
225
223
  "aria-label": e.name,
226
224
  size: "sm",
@@ -229,64 +227,64 @@ function H({ items: e, onPreview: t, onDownload: l, onCancel: u, onRetry: y, onR
229
227
  })
230
228
  ]
231
229
  }),
232
- /* @__PURE__ */ w(m, {
230
+ /* @__PURE__ */ T(h, {
233
231
  className: "shrink-0",
234
232
  children: [
235
- !!t && /* @__PURE__ */ C(a, {
233
+ !!t && /* @__PURE__ */ w(i, {
236
234
  type: "button",
237
235
  tone: "secondary",
238
236
  buttonStyle: "ghost",
239
237
  size: "sm",
240
238
  iconOnly: !0,
241
- "aria-label": `${T.preview ?? "Preview"} ${e.name}`,
239
+ "aria-label": `${C.preview ?? "Preview"} ${e.name}`,
242
240
  onClick: () => t(e.id),
243
- children: /* @__PURE__ */ C(k, {
241
+ children: /* @__PURE__ */ w(A, {
244
242
  "aria-hidden": "true",
245
243
  className: "size-icon-md"
246
244
  })
247
245
  }),
248
- !!l && e.status === "done" && /* @__PURE__ */ C(a, {
246
+ !!l && e.status === "done" && /* @__PURE__ */ w(i, {
249
247
  type: "button",
250
248
  tone: "secondary",
251
249
  buttonStyle: "ghost",
252
250
  size: "sm",
253
251
  iconOnly: !0,
254
- "aria-label": `${T.download ?? "Download"} ${e.name}`,
252
+ "aria-label": `${C.download ?? "Download"} ${e.name}`,
255
253
  onClick: () => l(e.id),
256
- children: /* @__PURE__ */ C(O, {
254
+ children: /* @__PURE__ */ w(k, {
257
255
  "aria-hidden": "true",
258
256
  className: "size-icon-md"
259
257
  })
260
258
  }),
261
- (e.status === "uploading" || e.status === "queued") && !!u && /* @__PURE__ */ C(a, {
259
+ (e.status === "uploading" || e.status === "queued") && !!u && /* @__PURE__ */ w(i, {
262
260
  type: "button",
263
261
  tone: "secondary",
264
262
  buttonStyle: "ghost",
265
263
  size: "sm",
266
264
  iconOnly: !0,
267
- "aria-label": `${T.cancel} ${e.name}`,
265
+ "aria-label": `${C.cancel} ${e.name}`,
268
266
  onClick: () => u(e.id),
269
- children: /* @__PURE__ */ C(M, { className: "size-icon-md" })
267
+ children: /* @__PURE__ */ w(N, { className: "size-icon-md" })
270
268
  }),
271
- e.status === "error" && !!y && /* @__PURE__ */ C(a, {
269
+ e.status === "error" && !!d && /* @__PURE__ */ w(i, {
272
270
  type: "button",
273
271
  tone: "secondary",
274
272
  buttonStyle: "ghost",
275
273
  size: "sm",
276
274
  iconOnly: !0,
277
- "aria-label": `${T.retry} ${e.name}`,
278
- onClick: () => y(e.id),
279
- children: /* @__PURE__ */ C(A, { className: "size-icon-md" })
275
+ "aria-label": `${C.retry} ${e.name}`,
276
+ onClick: () => d(e.id),
277
+ children: /* @__PURE__ */ w(j, { className: "size-icon-md" })
280
278
  }),
281
- (e.status === "done" || e.status === "error" || e.status === "cancelled" || e.status === "queued" && !u) && !!b && /* @__PURE__ */ C(a, {
279
+ (e.status === "done" || e.status === "error" || e.status === "cancelled" || e.status === "queued" && !u) && !!b && /* @__PURE__ */ w(i, {
282
280
  type: "button",
283
281
  tone: "secondary",
284
282
  buttonStyle: "ghost",
285
283
  size: "sm",
286
284
  iconOnly: !0,
287
- "aria-label": `${T.remove} ${e.name}`,
285
+ "aria-label": `${C.remove} ${e.name}`,
288
286
  onClick: () => b(e.id),
289
- children: /* @__PURE__ */ C(M, { className: "size-icon-md" })
287
+ children: /* @__PURE__ */ w(N, { className: "size-icon-md" })
290
288
  })
291
289
  ]
292
290
  })
@@ -316,15 +314,15 @@ function W(e) {
316
314
  queued: i
317
315
  };
318
316
  }
319
- var G = y(function({ items: e, onAddFiles: t, onPreview: s, onDownload: c, onCancel: u, onRetry: d, onRemove: f, onClearAll: p, dropzone: m, className: h, strings: g, listStrings: _ }, v) {
320
- let y = n(U, g), { completed: x, failed: T, uploading: E, queued: D } = W(e), O = b((e) => {
317
+ var G = b(function({ items: e, onAddFiles: t, onPreview: s, onDownload: c, onCancel: u, onRetry: d, onRemove: f, onClearAll: p, dropzone: m, className: h, strings: g, listStrings: _ }, v) {
318
+ let y = n(U, g), { completed: b, failed: S, uploading: E, queued: D } = W(e), O = x((e) => {
321
319
  e.length > 0 && t(e);
322
320
  }, [t]), k = e.length > 0;
323
- return /* @__PURE__ */ w(o, {
321
+ return /* @__PURE__ */ T(o, {
324
322
  ref: v,
325
323
  gap: "md",
326
324
  className: r("upload-tray--component", h),
327
- children: [/* @__PURE__ */ C(z, {
325
+ children: [/* @__PURE__ */ w(z, {
328
326
  onDrop: O,
329
327
  accept: m?.accept,
330
328
  multiple: m?.multiple,
@@ -332,40 +330,40 @@ var G = y(function({ items: e, onAddFiles: t, onPreview: s, onDownload: c, onCan
332
330
  disabled: m?.disabled,
333
331
  invalid: m?.invalid,
334
332
  strings: m?.strings
335
- }), !!k && /* @__PURE__ */ w(S, { children: [/* @__PURE__ */ w(o, {
333
+ }), !!k && /* @__PURE__ */ T(C, { children: [/* @__PURE__ */ T(o, {
336
334
  direction: "horizontal",
337
335
  wrap: !0,
338
336
  align: "center",
339
337
  justify: "between",
340
338
  gap: "md",
341
- children: [/* @__PURE__ */ w(o, {
339
+ children: [/* @__PURE__ */ T(o, {
342
340
  direction: "horizontal",
343
341
  wrap: !0,
344
342
  align: "center",
345
343
  gap: "md",
346
344
  children: [
347
- /* @__PURE__ */ C(i, {
345
+ /* @__PURE__ */ w(a, {
348
346
  tag: "span",
349
347
  weight: "semibold",
350
348
  children: y.heading
351
349
  }),
352
- x > 0 && /* @__PURE__ */ w(l, {
350
+ b > 0 && /* @__PURE__ */ T(l, {
353
351
  tone: "success",
354
352
  children: [
355
353
  y.completedLabel,
356
354
  ": ",
357
- x
355
+ b
358
356
  ]
359
357
  }),
360
- T > 0 && /* @__PURE__ */ w(l, {
358
+ S > 0 && /* @__PURE__ */ T(l, {
361
359
  tone: "destructive",
362
360
  children: [
363
361
  y.failedLabel,
364
362
  ": ",
365
- T
363
+ S
366
364
  ]
367
365
  }),
368
- E > 0 && /* @__PURE__ */ w(l, {
366
+ E > 0 && /* @__PURE__ */ T(l, {
369
367
  tone: "info",
370
368
  children: [
371
369
  y.uploadingLabel,
@@ -373,7 +371,7 @@ var G = y(function({ items: e, onAddFiles: t, onPreview: s, onDownload: c, onCan
373
371
  E
374
372
  ]
375
373
  }),
376
- D > 0 && /* @__PURE__ */ w(l, {
374
+ D > 0 && /* @__PURE__ */ T(l, {
377
375
  tone: "secondary",
378
376
  children: [
379
377
  y.queuedLabel,
@@ -382,14 +380,14 @@ var G = y(function({ items: e, onAddFiles: t, onPreview: s, onDownload: c, onCan
382
380
  ]
383
381
  })
384
382
  ]
385
- }), !!p && /* @__PURE__ */ C(a, {
383
+ }), !!p && /* @__PURE__ */ w(i, {
386
384
  type: "button",
387
385
  tone: "secondary",
388
386
  buttonStyle: "ghost",
389
387
  onClick: p,
390
388
  children: y.clearAll
391
389
  })]
392
- }), /* @__PURE__ */ C(H, {
390
+ }), /* @__PURE__ */ w(H, {
393
391
  items: e,
394
392
  onPreview: s,
395
393
  onDownload: c,
@@ -402,6 +400,6 @@ var G = y(function({ items: e, onAddFiles: t, onPreview: s, onDownload: c, onCan
402
400
  });
403
401
  G.displayName = "UploadTray";
404
402
  //#endregion
405
- export { z as a, N as c, B as i, U as n, F as o, H as r, P as s, G as t };
403
+ export { z as a, B as i, U as n, F as o, H as r, P as s, G as t };
406
404
 
407
- //# sourceMappingURL=upload-queue-BHZ_wBfd.js.map
405
+ //# sourceMappingURL=upload-queue-EOC8g1gf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-queue-EOC8g1gf.js","names":["_Fragment","useDensityConfig","resolveComponentScale","cn","Button","Text","Stack","SecondaryValue","FileSize","Badge","useFileDropTarget","uploadDropTargetRecipes","AttachmentFileIcon","AttachmentTitle","AttachmentDescription","AttachmentActions","AttachmentMedia","AttachmentContent","AttachmentProgress","Attachment","Fragment$1","FilePickerInput","forwardRef","props","handleClick","event","onClick","handleChange","files","onFiles","className","defaultDropzoneStrings","SIZE_CHROME","assignInputRef","forwardedRef","node","DropzoneImpl","sizeProp","stringsProp","strings","useStrings","generatedId","useId","inputId","inputProps","onDrop","chrome","defaultScale","dropTargetProps","disabled","invalid","isDragging","icon","UploadCloud","children","Dropzone","defaultUploadProgressListStrings","STATUS_TONE","Clock","Check","AlertCircle","X","UploadProgressList","statusLabel","items","tone","item","Icon","pct","showProgress","onPreview","Eye","onDownload","Download","onCancel","onRetry","RefreshCw","onRemove","defaultUploadTrayStrings","countStatus","completed","failed","uploading","queued","UploadTray","handleDrop","useCallback","onAddFiles","hasItems","dropzone","onClearAll","listStrings"],"sources":["../src/components/base/upload/file-picker-input.tsx","../src/components/base/upload/dropzone.tsx","../src/components/base/upload-queue/upload-progress-list.tsx","../src/components/base/upload-queue/upload-tray.tsx"],"sourcesContent":["import {\n\tforwardRef,\n\ttype ChangeEvent,\n\ttype InputHTMLAttributes,\n\ttype MouseEvent,\n} from 'react';\n\nimport { cn } from '../../../lib/utils';\n\ntype DataAttributes = {\n\t[key: `data-${string}`]: string | number | boolean | undefined;\n};\n\nexport type FilePickerNativeInputProps = Omit<\n\tInputHTMLAttributes<HTMLInputElement>,\n\t'type' | 'value' | 'defaultValue' | 'onChange' | 'children'\n> & DataAttributes;\n\nexport type FilePickerInputProps = FilePickerNativeInputProps & {\n\t/** Return `false` when the native FileList must be cleared (for example, after rejection). */\n\tonFiles: (files: File[]) => boolean | void;\n};\n\n/** Shared native-input plumbing for FileUpload and Dropzone. Not a public export. */\nexport const FilePickerInput = forwardRef<HTMLInputElement, FilePickerInputProps>(\n\tfunction FilePickerInput(\n\t\t{ className, onFiles, onClick, ...props },\n\t\tref,\n\t) {\n\t\tconst handleClick = (event: MouseEvent<HTMLInputElement>) => {\n\t\t\tevent.stopPropagation();\n\t\t\tonClick?.(event);\n\t\t\tif (!event.defaultPrevented) {\n\t\t\t\t// Clearing before the picker opens makes choosing the same file again\n\t\t\t\t// observable without retaining an opaque native FileList as state.\n\t\t\t\tevent.currentTarget.value = '';\n\t\t\t}\n\t\t};\n\n\t\tconst handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst files = event.currentTarget.files;\n\t\t\tif (files?.length && onFiles(Array.from(files)) === false) {\n\t\t\t\tevent.currentTarget.value = '';\n\t\t\t}\n\t\t};\n\n\t\treturn (\n\t\t\t<input\n\t\t\t\t{...props}\n\t\t\t\tref={ref}\n\t\t\t\ttype=\"file\"\n\t\t\t\tdata-slot=\"file-picker-input\"\n\t\t\t\tclassName={cn('file-picker-input--component sr-only', className)}\n\t\t\t\tonClick={handleClick}\n\t\t\t\tonChange={handleChange}\n\t\t\t/>\n\t\t);\n\t},\n);\n\nFilePickerInput.displayName = 'FilePickerInput';\n","/**\n * Dropzone — accessible drag-and-drop chrome with a native file-input fallback.\n * It owns no validation or file state; consumers receive local `File` values.\n */\nimport { forwardRef, useId, type ForwardedRef, type ReactNode } from 'react';\nimport { UploadCloud } from 'lucide-react';\n\nimport { Text } from '../../typography';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { useDensityConfig, type ComponentScale } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { cn } from '../../../lib/utils';\n\nimport {\n\tFilePickerInput,\n\ttype FilePickerNativeInputProps,\n} from './file-picker-input';\nimport { useFileDropTarget } from './use-file-drop-target';\nimport { uploadDropTargetRecipes } from './upload.recipes';\n\nexport type DropzoneSize = ComponentScale;\n\nexport interface DropzoneStrings {\n\tinstruction: string;\n\thelper: string;\n\tdragOver: string;\n}\n\nexport const defaultDropzoneStrings: DropzoneStrings = {\n\tinstruction: 'Drag files here or click to browse',\n\thelper: '',\n\tdragOver: 'Release to select',\n};\n\nexport type DropzoneInputProps = Omit<\n\tFilePickerNativeInputProps,\n\t'accept' | 'disabled' | 'multiple'\n>;\n\nexport interface DropzoneProps {\n\tonDrop: (files: File[]) => void;\n\t/** Accepted MIME types or extensions. */\n\taccept?: string;\n\t/** Allows more than one file to be dropped. */\n\tmultiple?: boolean;\n\t/** Disables the control and blocks drops. */\n\tdisabled?: boolean;\n\t/** Applies the invalid styling. */\n\tinvalid?: boolean;\n\t/** Height preset for the drop target. */\n\tsize?: DropzoneSize;\n\t/** Glyph shown inside the drop target. */\n\ticon?: ReactNode;\n\tclassName?: string;\n\t/** Native form, ARIA, data, and event attributes forwarded to the file input. */\n\tinputProps?: DropzoneInputProps;\n\t/** Optional action rendered outside the input label, so nested controls remain valid. */\n\tchildren?: ReactNode;\n\t/** Overrides the prompt and constraint copy. */\n\tstrings?: StringsProp<DropzoneStrings>;\n}\n\nconst SIZE_CHROME: Record<\n\tDropzoneSize,\n\t{ padding: string; minHeight: string; iconSize: string }\n> = {\n\tsm: {\n\t\tpadding: 'p-surface-xs',\n\t\tminHeight: 'min-h-24',\n\t\ticonSize: 'size-icon',\n\t},\n\tmd: {\n\t\tpadding: 'p-surface',\n\t\tminHeight: 'min-h-32',\n\t\ticonSize: 'size-icon-lg',\n\t},\n\tlg: {\n\t\tpadding: 'p-surface-lg',\n\t\tminHeight: 'min-h-40',\n\t\ticonSize: 'size-icon-lg',\n\t},\n};\n\nfunction assignInputRef(\n\tnode: HTMLInputElement | null,\n\tforwardedRef: ForwardedRef<HTMLInputElement>,\n) {\n\tif (typeof forwardedRef === 'function') forwardedRef(node);\n\telse if (forwardedRef) forwardedRef.current = node;\n}\n\nfunction DropzoneImpl(\n\t{\n\t\tonDrop,\n\t\taccept,\n\t\tmultiple = false,\n\t\tdisabled = false,\n\t\tinvalid = false,\n\t\tsize: sizeProp,\n\t\ticon,\n\t\tclassName,\n\t\tinputProps,\n\t\tchildren,\n\t\tstrings: stringsProp,\n\t}: DropzoneProps,\n\tforwardedRef: ForwardedRef<HTMLInputElement>,\n) {\n\tconst { defaultScale } = useDensityConfig();\n\tconst strings = useStrings(defaultDropzoneStrings, stringsProp);\n\tconst generatedId = useId();\n\tconst inputId = inputProps?.id ?? `dropzone-${generatedId}`;\n\tconst { isDragging, dropTargetProps } = useFileDropTarget({\n\t\tdisabled,\n\t\tonFiles: onDrop,\n\t});\n\tconst resolvedSize = resolveComponentScale(sizeProp, defaultScale);\n\tconst chrome = SIZE_CHROME[resolvedSize];\n\n\treturn (\n\t\t<div\n\t\t\t{...dropTargetProps}\n\t\t\tdata-disabled={disabled || undefined}\n\t\t\tdata-invalid={invalid || undefined}\n\t\t\tdata-dragging={isDragging || undefined}\n\t\t\tclassName={cn(\n\t\t\t\t'dropzone--component relative flex flex-col items-center justify-center gap-space-md rounded-radius border border-dashed text-center transition-colors duration-150',\n\t\t\t\t'has-[[data-slot=file-picker-input]:focus-visible]:ring-3',\n\t\t\t\tchrome.minHeight,\n\t\t\t\tchrome.padding,\n\t\t\t\tinvalid ? cn(uploadDropTargetRecipes.invalid, uploadDropTargetRecipes.focus.filePicker.invalid) : cn(uploadDropTargetRecipes.idle, uploadDropTargetRecipes.focus.filePicker.valid),\n\t\t\t\tinvalid\n\t\t\t\t\t? !disabled && uploadDropTargetRecipes.invalidHover\n\t\t\t\t\t: !disabled && uploadDropTargetRecipes.hover,\n\t\t\t\tdisabled && 'cursor-not-allowed opacity-50',\n\t\t\t\t!disabled && isDragging && (\n\t\t\t\t\tinvalid\n\t\t\t\t\t\t? uploadDropTargetRecipes.invalidDragging\n\t\t\t\t\t\t: uploadDropTargetRecipes.dragging\n\t\t\t\t),\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<FilePickerInput\n\t\t\t\t{...inputProps}\n\t\t\t\tref={(node) => assignInputRef(node, forwardedRef)}\n\t\t\t\tid={inputId}\n\t\t\t\taccept={accept}\n\t\t\t\tmultiple={multiple}\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-invalid={invalid || undefined}\n\t\t\t\tclassName={cn('dropzone--input', inputProps?.className)}\n\t\t\t\tonFiles={onDrop}\n\t\t\t/>\n\n\t\t\t<label\n\t\t\t\thtmlFor={disabled ? undefined : inputId}\n\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'dropzone--trigger flex w-full flex-1 cursor-pointer flex-col items-center justify-center gap-space-md',\n\t\t\t\t\tdisabled && 'cursor-not-allowed',\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{/* The glyph names the affordance; it needs no tinted tile around it. */}\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"dropzone--icon inline-flex items-center justify-center text-muted-foreground\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t{icon ?? <UploadCloud className={chrome.iconSize} />}\n\t\t\t\t</span>\n\n\t\t\t\t{/* Text sets its own start alignment, and the copy column is as wide as\n\t\t\t\t its longest line, so each line centres itself. */}\n\t\t\t\t<span className=\"dropzone--copy grid gap-normal\">\n\t\t\t\t\t<Text\n\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t\talign=\"center\"\n\t\t\t\t\t\tclassName=\"dropzone--instruction\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{isDragging ? strings.dragOver : strings.instruction}\n\t\t\t\t\t</Text>\n\t\t\t\t\t{!!strings.helper && (\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\talign=\"center\"\n\t\t\t\t\t\t\tclassName=\"dropzone--helper\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{strings.helper}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t</span>\n\t\t\t</label>\n\n\t\t\t{!!children && <div className=\"dropzone--action\">{children}</div>}\n\t\t</div>\n\t);\n}\n\nconst Dropzone = forwardRef<HTMLInputElement, DropzoneProps>(DropzoneImpl);\nDropzone.displayName = 'Dropzone';\n\nexport { Dropzone };\n","/**\n * UploadProgressList — render-only list of in-flight uploads. Each row shows\n * a status icon (queued / uploading / done / error / cancelled), filename,\n * size, a progress bar driven by `progress` (0–100), and an action button\n * that maps to the row's status (cancel while uploading, retry on error,\n * remove when done). Pair with FileUpload / MediaGallery / Dropzone — those\n * components emit raw `File` instances; this one displays the upload UI\n * once the consumer has wired them to its API.\n *\n * Strings overridable for i18n.\n */\nimport { AlertCircle, Check, Clock, RefreshCw, UploadCloud, X, Eye, Download } from 'lucide-react';\nimport { Button } from '../buttons';\nimport { Stack } from '../structure';\nimport { SecondaryValue } from '../../primitives';\nimport { Attachment, AttachmentMedia, AttachmentContent, AttachmentTitle, AttachmentDescription, AttachmentActions, AttachmentProgress, AttachmentFileIcon, type AttachmentKind } from '../attachment';\nimport { FileSize } from '../../primitives';\nimport { Text } from '../../typography';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nexport type UploadStatus = 'queued' | 'uploading' | 'done' | 'error' | 'cancelled';\n\nexport interface UploadItem {\n\t/** Stable identity for this entry. */\n\tid: string;\n\t/** Displayed file name. */\n\tname: string;\n\t/** Pre-formatted size string (e.g. \"2.4 MB\"). */\n\tsize?: string;\n\t/** Numeric file size used when the formatted size is absent. */\n\tbytes?: number;\n\tkind?: AttachmentKind;\n\t/** Upload progress 0–100. Omit for an indeterminate transfer. Ignored when status is `done`/`error`/`cancelled`. */\n\tprogress?: number;\n\tstatus: UploadStatus;\n\t/** Error message rendered under the row when status is `error`. */\n\terror?: string;\n\t/**\n\t * Optional thumbnail URL, shown in place of the status icon.\n\t * The status remains visible beside the file name.\n\t */\n\tpreview?: string;\n}\n\nexport interface UploadProgressListStrings {\n\tqueued: string;\n\tuploading: string;\n\tdone: string;\n\terror: string;\n\tcancelled: string;\n\tcancel: string;\n\tretry: string;\n\tremove: string;\n\tpreview?: string;\n\tdownload?: string;\n}\n\nexport const defaultUploadProgressListStrings: UploadProgressListStrings = {\n\tqueued: 'Queued',\n\tuploading: 'Uploading',\n\tdone: 'Uploaded',\n\terror: 'Failed',\n\tcancelled: 'Cancelled',\n\tcancel: 'Cancel',\n\tretry: 'Retry',\n\tremove: 'Remove',\n\tpreview: 'Preview',\n\tdownload: 'Download',\n};\n\nexport interface UploadProgressListProps {\n\t/** Entries to render, in order. */\n\titems: UploadItem[];\n\t/** File preview action; consumers own the effect. */\n\tonPreview?: (id: string) => void;\n\t/** Download action for completed files. Receives the stable item identity. */\n\tonDownload?: (id: string) => void;\n\tonCancel?: (id: string) => void;\n\tonRetry?: (id: string) => void;\n\tonRemove?: (id: string) => void;\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<UploadProgressListStrings>;\n}\n\n// Colour is reserved for the state that needs attention. A finished upload shows\n// its neutral file-type icon, like a selected FileUpload row.\nconst STATUS_TONE: Record<UploadStatus, { icon: typeof Check; fg: string }> = {\n\tqueued: { icon: Clock, fg: 'text-muted-foreground' },\n\tuploading: { icon: UploadCloud, fg: 'text-primary-accent' },\n\tdone: { icon: Check, fg: 'text-muted-foreground' },\n\terror: { icon: AlertCircle, fg: 'text-destructive' },\n\tcancelled: { icon: X, fg: 'text-muted-foreground' },\n};\n\nexport function UploadProgressList({\n\titems,\n\tonPreview,\n\tonDownload,\n\tonCancel,\n\tonRetry,\n\tonRemove,\n\tclassName,\n\tstrings: stringsProp,\n}: UploadProgressListProps) {\n\tconst strings = useStrings(defaultUploadProgressListStrings, stringsProp);\n\tconst statusLabel: Record<UploadStatus, string> = {\n\t\tqueued: strings.queued,\n\t\tuploading: strings.uploading,\n\t\tdone: strings.done,\n\t\terror: strings.error,\n\t\tcancelled: strings.cancelled,\n\t};\n\n\tif (items.length === 0) return null;\n\n\treturn (\n\t\t<Stack render={<ul />} gap=\"sm\" className={cn('upload-progress-list--component m-0 p-0 list-none', className)}>\n\t\t\t{items.map((item) => {\n\t\t\t\tconst tone = STATUS_TONE[item.status];\n\t\t\t\tconst Icon = tone.icon;\n\t\t\t\tconst pct = item.progress === undefined ? null : Number.isFinite(item.progress) ? Math.max(0, Math.min(100, item.progress ?? 0)) : 0;\n\t\t\t\tconst showProgress = item.status === 'uploading' || item.status === 'queued';\n\t\t\t\treturn (\n\t\t\t\t\t<Attachment key={item.id} render={<li />} variant=\"outline\" className=\"upload-progress-list--item flex-nowrap bg-card text-card-foreground\">\n\t\t\t\t\t\t<AttachmentMedia variant={item.preview ? 'image' : 'icon'} className={cn('upload-progress-list--media self-center group-has-data-[slot=item-description]/item:self-center', tone.fg)}>\n\t\t\t\t\t\t\t{item.preview ? <img src={item.preview} alt=\"\" /> : item.status === 'done' ? <AttachmentFileIcon name={item.name} kind={item.kind} /> : <Icon aria-hidden=\"true\" className={cn('size-icon', item.status === 'uploading' && 'animate-pulse motion-reduce:animate-none')} />}\n\t\t\t\t\t\t</AttachmentMedia>\n\t\t\t\t\t\t{/* Same anatomy as Attachment: name, size line, status line, one gap. */}\n\t\t\t\t\t\t<AttachmentContent className=\"min-w-0 gap-space-xs\">\n\t\t\t\t\t\t\t<AttachmentTitle className=\"min-w-0 max-w-full\" title={item.name}><Text tag=\"span\" weight=\"medium\" className=\"truncate\">{item.name}</Text></AttachmentTitle>\n\t\t\t\t\t\t\t{(item.size !== undefined || item.bytes !== undefined) && (\n\t\t\t\t\t\t\t\t<AttachmentDescription clamp={1}>\n\t\t\t\t\t\t\t\t\t<SecondaryValue size=\"xs\" className=\"tabular-nums\">{item.size ?? <FileSize value={item.bytes} size=\"xs\" type=\"secondary\" />}</SecondaryValue>\n\t\t\t\t\t\t\t\t</AttachmentDescription>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<AttachmentDescription clamp=\"none\"><Text tag=\"span\" size=\"xs\" type={item.status === 'error' ? 'error' : 'secondary'} role={item.status === 'error' ? 'alert' : undefined}>{`${statusLabel[item.status]}${item.status === 'error' && item.error ? ` — ${item.error}` : ''}`}</Text></AttachmentDescription>\n\t\t\t\t\t\t\t{showProgress && <AttachmentProgress value={item.status === 'queued' && pct === null ? 0 : pct} aria-label={item.name} size=\"sm\" tone={item.status === 'queued' ? 'neutral' : 'primary'} className=\"upload-progress-list--progress\" />}\n\t\t\t\t\t\t</AttachmentContent>\n\t\t\t\t\t\t<AttachmentActions className=\"shrink-0\">\n {!!onPreview && <Button type=\"button\" tone=\"secondary\" buttonStyle=\"ghost\" size=\"sm\" iconOnly aria-label={`${strings.preview ?? 'Preview'} ${item.name}`} onClick={() => onPreview(item.id)}><Eye aria-hidden=\"true\" className=\"size-icon-md\" /></Button>}\n {!!onDownload && item.status === 'done' && <Button type=\"button\" tone=\"secondary\" buttonStyle=\"ghost\" size=\"sm\" iconOnly aria-label={`${strings.download ?? 'Download'} ${item.name}`} onClick={() => onDownload(item.id)}><Download aria-hidden=\"true\" className=\"size-icon-md\" /></Button>}\n\n\t\t\t\t\t\t\t\t{(item.status === 'uploading' || item.status === 'queued') && !!onCancel && (\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\taria-label={`${strings.cancel} ${item.name}`}\n\t\t\t\t\t\t\t\t\t\tonClick={() => onCancel(item.id)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<X className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{item.status === 'error' && !!onRetry && (\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\taria-label={`${strings.retry} ${item.name}`}\n\t\t\t\t\t\t\t\t\t\tonClick={() => onRetry(item.id)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<RefreshCw className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{(item.status === 'done' || item.status === 'error' || item.status === 'cancelled' || (item.status === 'queued' && !onCancel)) && !!onRemove && (\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\taria-label={`${strings.remove} ${item.name}`}\n\t\t\t\t\t\t\t\t\t\tonClick={() => onRemove(item.id)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<X className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</AttachmentActions>\n\t\t\t\t\t</Attachment>\n\t\t\t\t);\n\t\t\t})}\n\t\t</Stack>\n\t);\n}\n\nUploadProgressList.displayName = 'UploadProgressList';\n","/**\n * UploadTray — the canonical \"drag-and-drop area + per-file progress\n * rows + summary toolbar\" surface. Composes:\n *\n * - `Dropzone` — drag/drop chrome + click-to-browse\n * - `UploadProgressList` — per-file row with status icon + progress\n * bar + cancel/retry/remove actions\n * - `Badge` — status counters in the toolbar\n * - `Button` — \"Clear all\" action\n *\n * Framework-agnostic. Every action is callback-driven — the library\n * doesn't perform the upload; it surfaces the UX. The consumer wires\n * the actual transfer (XHR, fetch, S3 multipart, …) and feeds back\n * `progress` / `status` updates by mutating the `items` array.\n *\n * Pair with `useFiles` (the existing client-side validation hook) at\n * the call site if you want pre-flight size/type rejection.\n */\nimport { forwardRef, useCallback } from 'react';\n\nimport { Badge } from '../badge';\nimport { Button } from '../buttons';\nimport { Stack } from '../structure';\nimport { Text } from '../../typography';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { Dropzone, type DropzoneProps } from '../upload/dropzone';\nimport { UploadProgressList, type UploadItem, type UploadProgressListStrings } from './upload-progress-list';\n\nexport interface UploadTrayStrings {\n\theading: string;\n\tcompletedLabel: string;\n\tfailedLabel: string;\n\tuploadingLabel: string;\n\tqueuedLabel: string;\n\tclearAll: string;\n}\n\nexport const defaultUploadTrayStrings: UploadTrayStrings = {\n\theading: 'Upload progress',\n\tcompletedLabel: 'Completed',\n\tfailedLabel: 'Failed',\n\tuploadingLabel: 'Uploading',\n\tqueuedLabel: 'Queued',\n\tclearAll: 'Clear all',\n};\n\nexport interface UploadTrayProps {\n\t/** Files currently in the tray (queued / uploading / done / error / cancelled). */\n\titems: UploadItem[];\n\t/**\n\t * Fires when the user drops or browses files. The library does NOT\n\t * write to the items array — the consumer turns these into queued\n\t * `UploadItem`s, kicks off the actual transfer, and updates progress.\n\t */\n\tonAddFiles: (files: File[]) => void;\n\t/** Preview callback forwarded with the item identity. */\n\tonPreview?: (id: string) => void;\n\t/** Download callback for completed files, forwarded with the item identity. */\n\tonDownload?: (id: string) => void;\n\t/** Per-row cancel handler (passed through to UploadProgressList). */\n\tonCancel?: (id: string) => void;\n\t/** Per-row retry handler. */\n\tonRetry?: (id: string) => void;\n\t/** Per-row remove handler. */\n\tonRemove?: (id: string) => void;\n\t/**\n\t * Clears the entire tray. When omitted, the \"Clear all\" button is\n\t * hidden — useful for surfaces where in-flight uploads can't be\n\t * cancelled in bulk.\n\t */\n\tonClearAll?: () => void;\n\t/** Forwarded to the inner `<Dropzone>`. Only the meaningful subset. */\n\tdropzone?: Pick<DropzoneProps, 'accept' | 'multiple' | 'size' | 'disabled' | 'invalid' | 'strings'>;\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<UploadTrayStrings>;\n\t/** Strings forwarded to the inner `<UploadProgressList>`. */\n\tlistStrings?: StringsProp<UploadProgressListStrings>;\n}\n\nfunction countStatus(items: UploadItem[]) {\n\tlet completed = 0;\n\tlet failed = 0;\n\tlet uploading = 0;\n\tlet queued = 0;\n\tfor (const item of items) {\n\t\tif (item.status === 'done') completed += 1;\n\t\telse if (item.status === 'error') failed += 1;\n\t\telse if (item.status === 'uploading') uploading += 1;\n\t\telse if (item.status === 'queued') queued += 1;\n\t}\n\treturn { completed, failed, uploading, queued };\n}\n\nexport const UploadTray = forwardRef<HTMLDivElement, UploadTrayProps>(function UploadTray(\n\t{\n\t\titems,\n\t\tonAddFiles,\n\t\tonPreview,\n\t\tonDownload,\n\t\tonCancel,\n\t\tonRetry,\n\t\tonRemove,\n\t\tonClearAll,\n\t\tdropzone,\n\t\tclassName,\n\t\tstrings: stringsProp,\n\t\tlistStrings,\n\t},\n\tref,\n) {\n\tconst strings = useStrings(defaultUploadTrayStrings, stringsProp);\n\tconst { completed, failed, uploading, queued } = countStatus(items);\n\n\tconst handleDrop = useCallback(\n\t\t(files: File[]) => {\n\t\t\tif (files.length > 0) onAddFiles(files);\n\t\t},\n\t\t[onAddFiles],\n\t);\n\n\tconst hasItems = items.length > 0;\n\n\treturn (\n\t\t<Stack ref={ref} gap=\"md\" className={cn('upload-tray--component', className)}>\n\t\t\t<Dropzone\n\t\t\t\tonDrop={handleDrop}\n\t\t\t\taccept={dropzone?.accept}\n\t\t\t\tmultiple={dropzone?.multiple}\n\t\t\t\tsize={dropzone?.size}\n\t\t\t\tdisabled={dropzone?.disabled}\n\t\t\t\tinvalid={dropzone?.invalid}\n\t\t\t\tstrings={dropzone?.strings}\n\t\t\t/>\n\n\t\t\t{!!hasItems && (\n\t\t\t\t<>\n\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" justify=\"between\" gap=\"md\">\n\t\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"md\">\n\t\t\t\t\t\t\t<Text tag=\"span\" weight=\"semibold\">\n\t\t\t\t\t\t\t\t{strings.heading}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t{completed > 0 && (\n\t\t\t\t\t\t\t\t<Badge tone=\"success\">\n\t\t\t\t\t\t\t\t\t{strings.completedLabel}: {completed}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{failed > 0 && (\n\t\t\t\t\t\t\t\t<Badge tone=\"destructive\">\n\t\t\t\t\t\t\t\t\t{strings.failedLabel}: {failed}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{uploading > 0 && (\n\t\t\t\t\t\t\t\t<Badge tone=\"info\">\n\t\t\t\t\t\t\t\t\t{strings.uploadingLabel}: {uploading}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{queued > 0 && (\n\t\t\t\t\t\t\t\t<Badge tone=\"secondary\">\n\t\t\t\t\t\t\t\t\t{strings.queuedLabel}: {queued}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t{!!onClearAll && (\n\t\t\t\t\t\t\t<Button type=\"button\" tone=\"secondary\" buttonStyle=\"ghost\" onClick={onClearAll}>\n\t\t\t\t\t\t\t\t{strings.clearAll}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\n\t\t\t\t\t<UploadProgressList\n\t\t\t\t\t\titems={items}\n\t\t\t\t\t\tonPreview={onPreview}\n\t\t\t\t\t\tonDownload={onDownload}\n\t\t\t\t\t\tonCancel={onCancel}\n\t\t\t\t\t\tonRetry={onRetry}\n\t\t\t\t\t\tonRemove={onRemove}\n\t\t\t\t\t\tstrings={listStrings}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</Stack>\n\t);\n});\n\nUploadTray.displayName = 'UploadTray';\n"],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ "use client";
2
+ import { useCallback as e, useEffect as t, useRef as n, useState as r } from "react";
3
+ //#region src/components/base/upload/use-file-drop-target.ts
4
+ function i({ disabled: i = !1, onFiles: a }) {
5
+ let o = n(0), [s, c] = r(!1);
6
+ t(() => {
7
+ i && (o.current = 0, c(!1));
8
+ }, [i]);
9
+ let l = e((e) => {
10
+ e.preventDefault(), e.stopPropagation();
11
+ }, []);
12
+ return {
13
+ isDragging: s,
14
+ dropTargetProps: {
15
+ onDragEnter: e((e) => {
16
+ l(e), !i && (o.current += 1, c(!0));
17
+ }, [i, l]),
18
+ onDragOver: e((e) => {
19
+ l(e), !i && (e.dataTransfer && (e.dataTransfer.dropEffect = "copy"), c(!0));
20
+ }, [i, l]),
21
+ onDragLeave: e((e) => {
22
+ l(e), o.current = Math.max(0, o.current - 1), o.current === 0 && c(!1);
23
+ }, [l]),
24
+ onDrop: e((e) => {
25
+ if (l(e), o.current = 0, c(!1), i) return;
26
+ let t = e.dataTransfer?.files;
27
+ t?.length && a(Array.from(t));
28
+ }, [
29
+ i,
30
+ a,
31
+ l
32
+ ])
33
+ }
34
+ };
35
+ }
36
+ //#endregion
37
+ //#region src/components/base/upload/upload.recipes.ts
38
+ var a = {
39
+ idle: "border-input",
40
+ invalid: "border-destructive",
41
+ invalidHover: "hover:bg-destructive/5",
42
+ invalidDragging: "border-destructive bg-destructive/5",
43
+ dragging: "border-primary bg-primary/10",
44
+ hover: "hover:border-primary hover:bg-primary/5",
45
+ draggingRing: "ring-3 ring-primary/30",
46
+ invalidDraggingRing: "ring-3 ring-destructive/30",
47
+ focus: {
48
+ input: {
49
+ valid: "has-[input:focus-visible]:border-ring has-[input:focus-visible]:ring-ring/50",
50
+ invalid: "has-[input:focus-visible]:ring-destructive/30 dark:has-[input:focus-visible]:ring-destructive/50"
51
+ },
52
+ filePicker: {
53
+ valid: "has-[[data-slot=file-picker-input]:focus-visible]:border-ring has-[[data-slot=file-picker-input]:focus-visible]:ring-ring/50",
54
+ invalid: "has-[[data-slot=file-picker-input]:focus-visible]:ring-destructive/30 dark:has-[[data-slot=file-picker-input]:focus-visible]:ring-destructive/50"
55
+ }
56
+ }
57
+ };
58
+ //#endregion
59
+ export { i as n, a as t };
60
+
61
+ //# sourceMappingURL=upload.recipes-BbxTqrCT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.recipes-BbxTqrCT.js","names":["useFileDropTarget","dragDepth","useRef","isDragging","setIsDragging","useState","disabled","preventDefaults","useCallback","event","files","onFiles","uploadDropTargetRecipes"],"sources":["../src/components/base/upload/use-file-drop-target.ts","../src/components/base/upload/upload.recipes.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState, type DragEventHandler } from 'react';\n\ninterface UseFileDropTargetOptions {\n\tdisabled?: boolean;\n\tonFiles: (files: File[]) => void;\n}\n\nexport interface FileDropTargetProps {\n\tonDragEnter: DragEventHandler<HTMLDivElement>;\n\tonDragOver: DragEventHandler<HTMLDivElement>;\n\tonDragLeave: DragEventHandler<HTMLDivElement>;\n\tonDrop: DragEventHandler<HTMLDivElement>;\n}\n\n/** Shared descendant-safe drag state for Dropzone and selected FileUpload rows. */\nexport function useFileDropTarget({\n\tdisabled = false,\n\tonFiles,\n}: UseFileDropTargetOptions) {\n\tconst dragDepth = useRef(0);\n\tconst [isDragging, setIsDragging] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (!disabled) return;\n\t\tdragDepth.current = 0;\n\t\tsetIsDragging(false);\n\t}, [disabled]);\n\n\tconst preventDefaults: DragEventHandler<HTMLDivElement> = useCallback((event) => {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t}, []);\n\n\tconst onDragEnter: DragEventHandler<HTMLDivElement> = useCallback((event) => {\n\t\tpreventDefaults(event);\n\t\tif (disabled) return;\n\t\tdragDepth.current += 1;\n\t\tsetIsDragging(true);\n\t}, [disabled, preventDefaults]);\n\n\tconst onDragOver: DragEventHandler<HTMLDivElement> = useCallback((event) => {\n\t\tpreventDefaults(event);\n\t\tif (disabled) return;\n\t\tif (event.dataTransfer) event.dataTransfer.dropEffect = 'copy';\n\t\tsetIsDragging(true);\n\t}, [disabled, preventDefaults]);\n\n\tconst onDragLeave: DragEventHandler<HTMLDivElement> = useCallback((event) => {\n\t\tpreventDefaults(event);\n\t\tdragDepth.current = Math.max(0, dragDepth.current - 1);\n\t\tif (dragDepth.current === 0) setIsDragging(false);\n\t}, [preventDefaults]);\n\n\tconst onDrop: DragEventHandler<HTMLDivElement> = useCallback((event) => {\n\t\tpreventDefaults(event);\n\t\tdragDepth.current = 0;\n\t\tsetIsDragging(false);\n\t\tif (disabled) return;\n\t\tconst files = event.dataTransfer?.files;\n\t\tif (files?.length) onFiles(Array.from(files));\n\t}, [disabled, onFiles, preventDefaults]);\n\n\treturn {\n\t\tisDragging,\n\t\tdropTargetProps: { onDragEnter, onDragOver, onDragLeave, onDrop } satisfies FileDropTargetProps,\n\t};\n}\n\n","/**\n * Private drop-target states shared by Dropzone, AvatarUpload and ImageUpload.\n * An empty target draws the dashed `--input` control boundary, so all three\n * upload targets read as the same kind of control as every field. Hover, drag\n * and invalid states replace only the boundary colour and fill.\n *\n * Keyboard focus on the hidden file input draws the shared focus frame on the\n * target (each owner adds the `ring-3` width). The valid and invalid colours are\n * alternatives, never stacked, so an invalid target keeps its destructive border\n * and tints the halo instead of tying with the ring colour.\n */\nexport const uploadDropTargetRecipes = {\n\tidle: 'border-input',\n\tinvalid: 'border-destructive',\n\tinvalidHover: 'hover:bg-destructive/5',\n\tinvalidDragging: 'border-destructive bg-destructive/5',\n\tdragging: 'border-primary bg-primary/10',\n\t/** Pointer over an enabled target previews the drop: the boundary takes the primary colour. */\n\thover: 'hover:border-primary hover:bg-primary/5',\n\t/** A file dragged over an already selected file row: the row keeps its edge and gains the tone halo. */\n\tdraggingRing: 'ring-3 ring-primary/30',\n\tinvalidDraggingRing: 'ring-3 ring-destructive/30',\n\tfocus: {\n\t\tinput: {\n\t\t\tvalid: 'has-[input:focus-visible]:border-ring has-[input:focus-visible]:ring-ring/50',\n\t\t\tinvalid: 'has-[input:focus-visible]:ring-destructive/30 dark:has-[input:focus-visible]:ring-destructive/50',\n\t\t},\n\t\tfilePicker: {\n\t\t\tvalid: 'has-[[data-slot=file-picker-input]:focus-visible]:border-ring has-[[data-slot=file-picker-input]:focus-visible]:ring-ring/50',\n\t\t\tinvalid: 'has-[[data-slot=file-picker-input]:focus-visible]:ring-destructive/30 dark:has-[[data-slot=file-picker-input]:focus-visible]:ring-destructive/50',\n\t\t},\n\t},\n} as const;\n"],"mappings":";;;AAeA,SAAgBA,EAAkB,EACjC,cAAW,IACX,cAC4B;CAC5B,IAAMC,IAAYC,EAAO,CAAC,GACpB,CAACC,GAAYC,KAAiBC,EAAS,EAAK;CAElD,QAAgB;EACf,AAAKC,MACL,EAAU,UAAU,GACpBF,EAAc,EAAK;CACpB,GAAG,CAACE,CAAQ,CAAC;CAEb,IAAMC,IAAoDC,GAAa,MAAU;EAEhF,AADAC,EAAM,eAAe,GACrBA,EAAM,gBAAgB;CACvB,GAAG,CAAC,CAAC;CA+BL,OAAO;EACN;EACA,iBAAiB;GAAE,aA/BkCD,GAAa,MAAU;IAE5E,AADAD,EAAgBE,CAAK,GACjB,OACJ,EAAU,WAAW,GACrBL,EAAc,EAAI;GACnB,GAAG,CAACE,GAAUC,CAAe,CA0BT;GAAa,YAxBoBC,GAAa,MAAU;IAE3E,AADAD,EAAgBE,CAAK,GACjB,OACAA,EAAM,iBAAc,EAAM,aAAa,aAAa,SACxDL,EAAc,EAAI;GACnB,GAAG,CAACE,GAAUC,CAAe,CAmBI;GAAY,aAjBSC,GAAa,MAAU;IAG5E,AAFAD,EAAgBE,CAAK,GACrB,EAAU,UAAU,KAAK,IAAI,GAAGR,EAAU,UAAU,CAAC,GACjDA,EAAU,YAAY,KAAGG,EAAc,EAAK;GACjD,GAAG,CAACG,CAAe,CAa0B;GAAa,QAXTC,GAAa,MAAU;IAIvE,IAHAD,EAAgBE,CAAK,GACrB,EAAU,UAAU,GACpBL,EAAc,EAAK,GACfE,GAAU;IACd,IAAMI,IAAQD,EAAM,cAAc;IAClC,AAAIC,GAAO,UAAQC,EAAQ,MAAM,KAAKD,CAAK,CAAC;GAC7C,GAAG;IAACJ;IAAUK;IAASJ;GAAe,CAIoB;EAAO;CACjE;AACD;;;ACvDA,IAAaK,IAA0B;CACtC,MAAM;CACN,SAAS;CACT,cAAc;CACd,iBAAiB;CACjB,UAAU;CAEV,OAAO;CAEP,cAAc;CACd,qBAAqB;CACrB,OAAO;EACN,OAAO;GACN,OAAO;GACP,SAAS;EACV;EACA,YAAY;GACX,OAAO;GACP,SAAS;EACV;CACD;AACD"}