@djangocfg/ui-tools 2.1.412 → 2.1.413

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 (812) hide show
  1. package/README.md +2 -1
  2. package/dist/file-icon/index.cjs +3 -3
  3. package/dist/file-icon/index.cjs.map +1 -1
  4. package/dist/file-icon/index.d.cts +1 -1
  5. package/dist/file-icon/index.d.ts +1 -1
  6. package/dist/file-icon/index.mjs +3 -3
  7. package/dist/file-icon/index.mjs.map +1 -1
  8. package/dist/tree/index.cjs +44 -7
  9. package/dist/tree/index.cjs.map +1 -1
  10. package/dist/tree/index.d.cts +2 -2
  11. package/dist/tree/index.d.ts +2 -2
  12. package/dist/tree/index.mjs +44 -7
  13. package/dist/tree/index.mjs.map +1 -1
  14. package/dist/{types-eEu8SeiQ.d.cts → types-j2vhn4Kv.d.cts} +34 -1
  15. package/dist/{types-eEu8SeiQ.d.ts → types-j2vhn4Kv.d.ts} +34 -1
  16. package/package.json +168 -63
  17. package/src/lib/page-snapshot/react/provider.tsx +1 -1
  18. package/src/tools/{Chat → chat}/composer/fileToAttachment.ts +1 -1
  19. package/src/tools/{Chat → chat}/composer/useComposerAttach.tsx +1 -1
  20. package/src/tools/{Chat → chat}/index.ts +1 -1
  21. package/src/tools/{Chat → chat}/launcher/header/ChatHeaderLanguageButton.tsx +2 -2
  22. package/src/tools/{Chat → chat}/messages/MessageBubble.tsx +1 -1
  23. package/src/tools/{Chat → chat}/messages/blocks/builtin.tsx +1 -1
  24. package/src/tools/{Chat → chat}/messages/blocks/renderers/AudioBlock.tsx +1 -1
  25. package/src/tools/{Chat → chat}/messages/blocks/renderers/CodeBlock.tsx +2 -2
  26. package/src/tools/{Chat → chat}/messages/blocks/renderers/GalleryBlock.tsx +2 -2
  27. package/src/tools/{Chat → chat}/messages/blocks/renderers/ImageBlock.tsx +1 -1
  28. package/src/tools/{Chat → chat}/messages/blocks/renderers/JsonBlock.tsx +1 -1
  29. package/src/tools/{Chat → chat}/messages/blocks/renderers/LottieBlock.tsx +1 -1
  30. package/src/tools/{Chat → chat}/messages/blocks/renderers/MapBlock.tsx +2 -2
  31. package/src/tools/{Chat → chat}/messages/blocks/renderers/MermaidBlock.tsx +1 -1
  32. package/src/tools/{Chat → chat}/messages/blocks/renderers/VideoBlock.tsx +2 -2
  33. package/src/tools/data/DataGrid/context/DataGridContext.tsx +441 -0
  34. package/src/tools/data/DataGrid/context/index.ts +4 -0
  35. package/src/tools/data/DataGrid/index.ts +29 -0
  36. package/src/tools/data/DataGrid/lazy.tsx +23 -0
  37. package/src/tools/data/DataGrid/parts/DataGrid.tsx +125 -0
  38. package/src/tools/data/DataGrid/parts/DataGridCell.tsx +30 -0
  39. package/src/tools/data/DataGrid/parts/DataGridHeader.tsx +111 -0
  40. package/src/tools/data/DataGrid/parts/DataGridPagination.tsx +105 -0
  41. package/src/tools/data/DataGrid/parts/DataGridRow.tsx +84 -0
  42. package/src/tools/data/DataGrid/parts/index.ts +7 -0
  43. package/src/tools/data/DataGrid/types.ts +95 -0
  44. package/src/tools/data/DataTable/context/DataTableContext.tsx +433 -0
  45. package/src/tools/data/DataTable/context/index.ts +4 -0
  46. package/src/tools/data/DataTable/index.ts +28 -0
  47. package/src/tools/data/DataTable/lazy.tsx +23 -0
  48. package/src/tools/data/DataTable/parts/DataTable.tsx +132 -0
  49. package/src/tools/data/DataTable/parts/DataTableHeader.tsx +103 -0
  50. package/src/tools/data/DataTable/parts/DataTablePagination.tsx +105 -0
  51. package/src/tools/data/DataTable/parts/DataTableRow.tsx +96 -0
  52. package/src/tools/data/DataTable/parts/index.ts +6 -0
  53. package/src/tools/data/DataTable/types.ts +88 -0
  54. package/src/tools/{JsonTree → data/JsonTree}/index.tsx +2 -2
  55. package/src/tools/{JsonTree → data/JsonTree}/lazy.tsx +1 -1
  56. package/src/tools/data/Kanban/context/KanbanContext.tsx +163 -0
  57. package/src/tools/data/Kanban/context/index.ts +4 -0
  58. package/src/tools/data/Kanban/index.ts +26 -0
  59. package/src/tools/data/Kanban/lazy.tsx +23 -0
  60. package/src/tools/data/Kanban/parts/Kanban.tsx +77 -0
  61. package/src/tools/data/Kanban/parts/KanbanCard.tsx +76 -0
  62. package/src/tools/data/Kanban/parts/KanbanColumn.tsx +79 -0
  63. package/src/tools/data/Kanban/parts/KanbanDragOverlay.tsx +46 -0
  64. package/src/tools/data/Kanban/parts/index.ts +6 -0
  65. package/src/tools/data/Kanban/types.ts +45 -0
  66. package/src/tools/data/Listbox/context/ListboxProvider.tsx +616 -0
  67. package/src/tools/data/Listbox/context/index.ts +8 -0
  68. package/src/tools/data/Listbox/index.ts +23 -0
  69. package/src/tools/data/Listbox/lazy.tsx +31 -0
  70. package/src/tools/data/Listbox/parts/ListboxGroup.tsx +71 -0
  71. package/src/tools/data/Listbox/parts/ListboxItem.tsx +151 -0
  72. package/src/tools/data/Listbox/parts/index.ts +12 -0
  73. package/src/tools/data/Listbox/types.ts +98 -0
  74. package/src/tools/data/Masonry/README.md +79 -0
  75. package/src/tools/data/Masonry/context/MasonryProvider.tsx +1205 -0
  76. package/src/tools/data/Masonry/context/index.ts +8 -0
  77. package/src/tools/data/Masonry/index.ts +13 -0
  78. package/src/tools/data/Masonry/lazy.tsx +20 -0
  79. package/src/tools/data/Masonry/parts/index.ts +2 -0
  80. package/src/tools/data/Masonry/types.ts +44 -0
  81. package/src/tools/data/Timeline/context/TimelineProvider.tsx +474 -0
  82. package/src/tools/data/Timeline/context/index.ts +16 -0
  83. package/src/tools/data/Timeline/index.ts +24 -0
  84. package/src/tools/data/Timeline/lazy.tsx +27 -0
  85. package/src/tools/data/Timeline/parts/index.ts +2 -0
  86. package/src/tools/data/Timeline/types.ts +25 -0
  87. package/src/tools/{Tree → data/Tree}/README.md +66 -2
  88. package/src/tools/{Tree → data/Tree}/TreeRoot.tsx +66 -3
  89. package/src/tools/{Tree → data/Tree}/index.tsx +3 -0
  90. package/src/tools/{Tree → data/Tree}/lazy.tsx +1 -1
  91. package/src/tools/{Tree → data/Tree}/types.ts +36 -0
  92. package/src/tools/{Map → dev/Map}/lazy.tsx +1 -1
  93. package/src/tools/{MarkdownMessage → dev/MarkdownMessage}/CollapseToggle.tsx +1 -1
  94. package/src/tools/{MarkdownMessage → dev/MarkdownMessage}/MarkdownMessage.tsx +1 -1
  95. package/src/tools/{MarkdownMessage → dev/MarkdownMessage}/components.tsx +1 -1
  96. package/src/tools/{Mermaid → dev/Mermaid}/Mermaid.client.tsx +2 -2
  97. package/src/tools/{Mermaid → dev/Mermaid}/lazy.tsx +1 -1
  98. package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/lazy.tsx +1 -1
  99. package/src/tools/{PrettyCode → dev/PrettyCode}/PrettyCode.client.tsx +2 -2
  100. package/src/tools/{PrettyCode → dev/PrettyCode}/lazy.tsx +1 -1
  101. package/src/tools/{CodeEditor → forms/CodeEditor}/lazy.tsx +1 -1
  102. package/src/tools/forms/FileUpload/FileUpload.tsx +1326 -0
  103. package/src/tools/forms/FileUpload/index.ts +21 -0
  104. package/src/tools/forms/FileUpload/lazy.tsx +19 -0
  105. package/src/tools/forms/FileUpload/types.ts +83 -0
  106. package/src/tools/{JsonForm → forms/JsonForm}/lazy.tsx +1 -1
  107. package/src/tools/{MarkdownEditor → forms/MarkdownEditor}/lazy.tsx +1 -1
  108. package/src/tools/index.ts +305 -31
  109. package/src/tools/input/Combobox/context/ComboboxContext.tsx +30 -0
  110. package/src/tools/input/Combobox/context/index.ts +6 -0
  111. package/src/tools/input/Combobox/index.ts +45 -0
  112. package/src/tools/input/Combobox/lazy.tsx +72 -0
  113. package/src/tools/input/Combobox/parts/Combobox.tsx +392 -0
  114. package/src/tools/input/Combobox/parts/index.ts +10 -0
  115. package/src/tools/input/Combobox/types.ts +67 -0
  116. package/src/tools/{CronScheduler → input/CronScheduler}/index.tsx +1 -1
  117. package/src/tools/{CronScheduler → input/CronScheduler}/lazy.tsx +1 -1
  118. package/src/tools/input/Scroller/context/ScrollerContext.tsx +30 -0
  119. package/src/tools/input/Scroller/context/index.ts +6 -0
  120. package/src/tools/input/Scroller/index.ts +34 -0
  121. package/src/tools/input/Scroller/lazy.tsx +32 -0
  122. package/src/tools/input/Scroller/parts/Scroller.tsx +193 -0
  123. package/src/tools/input/Scroller/parts/index.ts +6 -0
  124. package/src/tools/input/Scroller/types.ts +37 -0
  125. package/src/tools/input/Sortable/context/SortableContext.tsx +30 -0
  126. package/src/tools/input/Sortable/context/index.ts +6 -0
  127. package/src/tools/input/Sortable/index.ts +40 -0
  128. package/src/tools/input/Sortable/lazy.tsx +42 -0
  129. package/src/tools/input/Sortable/parts/Sortable.tsx +144 -0
  130. package/src/tools/input/Sortable/parts/index.ts +7 -0
  131. package/src/tools/input/Sortable/types.ts +40 -0
  132. package/src/tools/{SpeechRecognition → input/SpeechRecognition}/core/audio/defaults.ts +2 -2
  133. package/src/tools/{SpeechRecognition → input/SpeechRecognition}/lazy.tsx +1 -1
  134. package/src/tools/{SpeechRecognition → input/SpeechRecognition}/widgets/VoiceComposerSlot.tsx +1 -1
  135. package/src/tools/{ImageViewer → media/ImageViewer}/components/ImageInfo.tsx +1 -1
  136. package/src/tools/{ImageViewer → media/ImageViewer}/hooks/useImageLoading.ts +1 -1
  137. package/src/tools/{ImageViewer → media/ImageViewer}/lazy.tsx +1 -1
  138. package/src/tools/{LottiePlayer → media/LottiePlayer}/lazy.tsx +1 -1
  139. package/src/tools/overlay/ResponsiveDialog/context/ResponsiveDialogContext.tsx +30 -0
  140. package/src/tools/overlay/ResponsiveDialog/context/index.ts +6 -0
  141. package/src/tools/overlay/ResponsiveDialog/index.ts +48 -0
  142. package/src/tools/overlay/ResponsiveDialog/lazy.tsx +90 -0
  143. package/src/tools/overlay/ResponsiveDialog/parts/ResponsiveDialog.tsx +87 -0
  144. package/src/tools/overlay/ResponsiveDialog/parts/index.ts +10 -0
  145. package/src/tools/overlay/ResponsiveDialog/types.ts +26 -0
  146. package/src/tools/overlay/ScrollSpy/context/ScrollSpyContext.tsx +30 -0
  147. package/src/tools/overlay/ScrollSpy/context/index.ts +6 -0
  148. package/src/tools/overlay/ScrollSpy/index.ts +40 -0
  149. package/src/tools/overlay/ScrollSpy/lazy.tsx +52 -0
  150. package/src/tools/overlay/ScrollSpy/parts/ScrollSpy.tsx +184 -0
  151. package/src/tools/overlay/ScrollSpy/parts/index.ts +8 -0
  152. package/src/tools/overlay/ScrollSpy/types.ts +41 -0
  153. package/src/tools/overlay/SelectionToolbar/context/SelectionToolbarContext.tsx +30 -0
  154. package/src/tools/overlay/SelectionToolbar/context/index.ts +6 -0
  155. package/src/tools/overlay/SelectionToolbar/index.ts +37 -0
  156. package/src/tools/overlay/SelectionToolbar/lazy.tsx +42 -0
  157. package/src/tools/overlay/SelectionToolbar/parts/SelectionToolbar.tsx +162 -0
  158. package/src/tools/overlay/SelectionToolbar/parts/index.ts +7 -0
  159. package/src/tools/overlay/SelectionToolbar/types.ts +31 -0
  160. package/src/tools/overlay/Tour/context/TourContext.tsx +30 -0
  161. package/src/tools/overlay/Tour/context/index.ts +6 -0
  162. package/src/tools/overlay/Tour/index.ts +40 -0
  163. package/src/tools/overlay/Tour/lazy.tsx +42 -0
  164. package/src/tools/overlay/Tour/parts/Tour.tsx +278 -0
  165. package/src/tools/overlay/Tour/parts/index.ts +8 -0
  166. package/src/tools/overlay/Tour/types.ts +42 -0
  167. package/src/tools/visual/ColorPicker/ColorPicker.tsx +257 -0
  168. package/src/tools/visual/ColorPicker/context/ColorPickerContext.tsx +28 -0
  169. package/src/tools/visual/ColorPicker/context/ColorPickerStore.tsx +166 -0
  170. package/src/tools/visual/ColorPicker/context/index.ts +2 -0
  171. package/src/tools/visual/ColorPicker/index.ts +15 -0
  172. package/src/tools/visual/ColorPicker/lazy.tsx +24 -0
  173. package/src/tools/visual/ColorPicker/lib/color-utils.ts +323 -0
  174. package/src/tools/visual/ColorPicker/parts/ColorPickerAlphaSlider.tsx +72 -0
  175. package/src/tools/visual/ColorPicker/parts/ColorPickerArea.tsx +155 -0
  176. package/src/tools/visual/ColorPicker/parts/ColorPickerEyeDropper.tsx +73 -0
  177. package/src/tools/visual/ColorPicker/parts/ColorPickerFormatSelect.tsx +64 -0
  178. package/src/tools/visual/ColorPicker/parts/ColorPickerHueSlider.tsx +64 -0
  179. package/src/tools/visual/ColorPicker/parts/ColorPickerInput.tsx +512 -0
  180. package/src/tools/visual/ColorPicker/parts/ColorPickerSwatch.tsx +63 -0
  181. package/src/tools/visual/ColorPicker/parts/index.ts +7 -0
  182. package/src/tools/visual/ColorPicker/types.ts +77 -0
  183. package/src/tools/{FileIcon → visual/FileIcon}/treeAdapter.tsx +1 -1
  184. package/src/tools/visual/Fps/Fps.tsx +94 -0
  185. package/src/tools/visual/Fps/index.ts +2 -0
  186. package/src/tools/visual/Fps/lazy.tsx +14 -0
  187. package/src/tools/visual/Fps/types.ts +42 -0
  188. package/src/tools/visual/Gauge/Gauge.tsx +401 -0
  189. package/src/tools/visual/Gauge/index.ts +10 -0
  190. package/src/tools/visual/Gauge/lazy.tsx +14 -0
  191. package/src/tools/visual/Gauge/types.ts +34 -0
  192. package/src/tools/visual/Marquee/Marquee.tsx +637 -0
  193. package/src/tools/visual/Marquee/index.ts +7 -0
  194. package/src/tools/visual/Marquee/lazy.tsx +14 -0
  195. package/src/tools/visual/Marquee/types.ts +40 -0
  196. package/src/tools/visual/QRCode/QRCode.tsx +468 -0
  197. package/src/tools/visual/QRCode/index.ts +10 -0
  198. package/src/tools/visual/QRCode/lazy.tsx +19 -0
  199. package/src/tools/visual/QRCode/types.ts +57 -0
  200. package/src/tools/visual/Rating/Rating.tsx +868 -0
  201. package/src/tools/visual/Rating/index.ts +2 -0
  202. package/src/tools/visual/Rating/lazy.tsx +20 -0
  203. package/src/tools/visual/Rating/types.ts +79 -0
  204. /package/src/tools/{Chat → chat}/README.md +0 -0
  205. /package/src/tools/{Chat → chat}/composer/AttachContext.tsx +0 -0
  206. /package/src/tools/{Chat → chat}/composer/Composer.tsx +0 -0
  207. /package/src/tools/{Chat → chat}/composer/ComposerActionBar.tsx +0 -0
  208. /package/src/tools/{Chat → chat}/composer/ComposerBanner.tsx +0 -0
  209. /package/src/tools/{Chat → chat}/composer/ComposerButton.tsx +0 -0
  210. /package/src/tools/{Chat → chat}/composer/ComposerFooter.tsx +0 -0
  211. /package/src/tools/{Chat → chat}/composer/ComposerMenuButton.tsx +0 -0
  212. /package/src/tools/{Chat → chat}/composer/ComposerModelPicker.tsx +0 -0
  213. /package/src/tools/{Chat → chat}/composer/ComposerRichTextarea.tsx +0 -0
  214. /package/src/tools/{Chat → chat}/composer/ComposerToolPill.tsx +0 -0
  215. /package/src/tools/{Chat → chat}/composer/index.ts +0 -0
  216. /package/src/tools/{Chat → chat}/composer/size-context.tsx +0 -0
  217. /package/src/tools/{Chat → chat}/composer/types.ts +0 -0
  218. /package/src/tools/{Chat → chat}/composer/useComposerActions.tsx +0 -0
  219. /package/src/tools/{Chat → chat}/constants.ts +0 -0
  220. /package/src/tools/{Chat → chat}/context/ChatProvider.tsx +0 -0
  221. /package/src/tools/{Chat → chat}/context/index.ts +0 -0
  222. /package/src/tools/{Chat → chat}/core/__tests__/metadata.test.ts +0 -0
  223. /package/src/tools/{Chat → chat}/core/audio/audioBus.ts +0 -0
  224. /package/src/tools/{Chat → chat}/core/audio/defaults.ts +0 -0
  225. /package/src/tools/{Chat → chat}/core/audio/index.ts +0 -0
  226. /package/src/tools/{Chat → chat}/core/audio/preferences.ts +0 -0
  227. /package/src/tools/{Chat → chat}/core/audio/sounds/error.ts +0 -0
  228. /package/src/tools/{Chat → chat}/core/audio/sounds/mention.ts +0 -0
  229. /package/src/tools/{Chat → chat}/core/audio/sounds/notification.ts +0 -0
  230. /package/src/tools/{Chat → chat}/core/audio/sounds/received.ts +0 -0
  231. /package/src/tools/{Chat → chat}/core/audio/sounds/sent.ts +0 -0
  232. /package/src/tools/{Chat → chat}/core/audio/sounds/start.ts +0 -0
  233. /package/src/tools/{Chat → chat}/core/audio/types.ts +0 -0
  234. /package/src/tools/{Chat → chat}/core/ids.ts +0 -0
  235. /package/src/tools/{Chat → chat}/core/index.ts +0 -0
  236. /package/src/tools/{Chat → chat}/core/logger.ts +0 -0
  237. /package/src/tools/{Chat → chat}/core/markdown.ts +0 -0
  238. /package/src/tools/{Chat → chat}/core/metadata.ts +0 -0
  239. /package/src/tools/{Chat → chat}/core/payload-dispatch.ts +0 -0
  240. /package/src/tools/{Chat → chat}/core/persona.ts +0 -0
  241. /package/src/tools/{Chat → chat}/core/reducer.ts +0 -0
  242. /package/src/tools/{Chat → chat}/core/transport/http.ts +0 -0
  243. /package/src/tools/{Chat → chat}/core/transport/index.ts +0 -0
  244. /package/src/tools/{Chat → chat}/core/transport/mappers/index.ts +0 -0
  245. /package/src/tools/{Chat → chat}/core/transport/mappers/pydantic-ai.ts +0 -0
  246. /package/src/tools/{Chat → chat}/core/transport/mock.ts +0 -0
  247. /package/src/tools/{Chat → chat}/core/transport/pydantic-ai-transport.ts +0 -0
  248. /package/src/tools/{Chat → chat}/core/transport/sse.ts +0 -0
  249. /package/src/tools/{Chat → chat}/core/transport/types.ts +0 -0
  250. /package/src/tools/{Chat → chat}/hooks/index.ts +0 -0
  251. /package/src/tools/{Chat → chat}/hooks/useAutoFocusOnStreamEnd.ts +0 -0
  252. /package/src/tools/{Chat → chat}/hooks/useChat.ts +0 -0
  253. /package/src/tools/{Chat → chat}/hooks/useChatAudio.ts +0 -0
  254. /package/src/tools/{Chat → chat}/hooks/useChatComposer.ts +0 -0
  255. /package/src/tools/{Chat → chat}/hooks/useChatDockPrefs.ts +0 -0
  256. /package/src/tools/{Chat → chat}/hooks/useChatHistory.ts +0 -0
  257. /package/src/tools/{Chat → chat}/hooks/useChatLayout.ts +0 -0
  258. /package/src/tools/{Chat → chat}/hooks/useChatLightbox.ts +0 -0
  259. /package/src/tools/{Chat → chat}/hooks/useChatReset.ts +0 -0
  260. /package/src/tools/{Chat → chat}/hooks/useChatUnread.ts +0 -0
  261. /package/src/tools/{Chat → chat}/hooks/useChatUnreadNotifier.ts +0 -0
  262. /package/src/tools/{Chat → chat}/hooks/useFocusOnEmptyClick.ts +0 -0
  263. /package/src/tools/{Chat → chat}/hooks/useStreamEndFocus.ts +0 -0
  264. /package/src/tools/{Chat → chat}/hooks/useVisitorFingerprint.ts +0 -0
  265. /package/src/tools/{Chat → chat}/launcher/ChatDock.tsx +0 -0
  266. /package/src/tools/{Chat → chat}/launcher/ChatFAB.tsx +0 -0
  267. /package/src/tools/{Chat → chat}/launcher/ChatGreeting.tsx +0 -0
  268. /package/src/tools/{Chat → chat}/launcher/ChatLauncher.tsx +0 -0
  269. /package/src/tools/{Chat → chat}/launcher/ChatUnreadPreview.tsx +0 -0
  270. /package/src/tools/{Chat → chat}/launcher/header/ChatHeader.tsx +0 -0
  271. /package/src/tools/{Chat → chat}/launcher/header/ChatHeaderActionButton.tsx +0 -0
  272. /package/src/tools/{Chat → chat}/launcher/header/ChatHeaderAudioToggle.tsx +0 -0
  273. /package/src/tools/{Chat → chat}/launcher/header/ChatHeaderModeToggle.tsx +0 -0
  274. /package/src/tools/{Chat → chat}/launcher/header/ChatHeaderResetButton.tsx +0 -0
  275. /package/src/tools/{Chat → chat}/launcher/header/HeaderSlots.tsx +0 -0
  276. /package/src/tools/{Chat → chat}/launcher/header/index.ts +0 -0
  277. /package/src/tools/{Chat → chat}/launcher/index.ts +0 -0
  278. /package/src/tools/{Chat → chat}/launcher/types.ts +0 -0
  279. /package/src/tools/{Chat → chat}/launcher/useChatPresence.ts +0 -0
  280. /package/src/tools/{Chat → chat}/lazy.tsx +0 -0
  281. /package/src/tools/{Chat → chat}/messages/Attachments.tsx +0 -0
  282. /package/src/tools/{Chat → chat}/messages/JumpToLatest.tsx +0 -0
  283. /package/src/tools/{Chat → chat}/messages/MessageActions.tsx +0 -0
  284. /package/src/tools/{Chat → chat}/messages/MessageList.tsx +0 -0
  285. /package/src/tools/{Chat → chat}/messages/Sources.tsx +0 -0
  286. /package/src/tools/{Chat → chat}/messages/StreamingIndicator.tsx +0 -0
  287. /package/src/tools/{Chat → chat}/messages/ToolCalls.tsx +0 -0
  288. /package/src/tools/{Chat → chat}/messages/blocks/MessageBlocks.tsx +0 -0
  289. /package/src/tools/{Chat → chat}/messages/blocks/index.ts +0 -0
  290. /package/src/tools/{Chat → chat}/messages/blocks/registry.tsx +0 -0
  291. /package/src/tools/{Chat → chat}/messages/blocks/renderers/types.ts +0 -0
  292. /package/src/tools/{Chat → chat}/messages/index.ts +0 -0
  293. /package/src/tools/{Chat → chat}/notifier/createBrowserNotifier.ts +0 -0
  294. /package/src/tools/{Chat → chat}/notifier/createCrossTabNotifier.ts +0 -0
  295. /package/src/tools/{Chat → chat}/notifier/faviconBadge.ts +0 -0
  296. /package/src/tools/{Chat → chat}/notifier/index.ts +0 -0
  297. /package/src/tools/{Chat → chat}/notifier/titleRotator.ts +0 -0
  298. /package/src/tools/{Chat → chat}/notifier/types.ts +0 -0
  299. /package/src/tools/{Chat → chat}/notifier/visibility.ts +0 -0
  300. /package/src/tools/{Chat → chat}/public.ts +0 -0
  301. /package/src/tools/{Chat → chat}/settings/README.md +0 -0
  302. /package/src/tools/{Chat → chat}/settings/__tests__/useChatSettings.test.tsx +0 -0
  303. /package/src/tools/{Chat → chat}/settings/__tests__/useLocalStorage.test.tsx +0 -0
  304. /package/src/tools/{Chat → chat}/settings/index.ts +0 -0
  305. /package/src/tools/{Chat → chat}/settings/types.ts +0 -0
  306. /package/src/tools/{Chat → chat}/settings/useChatSettings.ts +0 -0
  307. /package/src/tools/{Chat → chat}/shell/ChatRoot.tsx +0 -0
  308. /package/src/tools/{Chat → chat}/shell/EmptyState.tsx +0 -0
  309. /package/src/tools/{Chat → chat}/shell/ErrorBanner.tsx +0 -0
  310. /package/src/tools/{Chat → chat}/shell/index.ts +0 -0
  311. /package/src/tools/{Chat → chat}/styles/bubbleTokens.ts +0 -0
  312. /package/src/tools/{Chat → chat}/styles/index.ts +0 -0
  313. /package/src/tools/{Chat → chat}/styles/useChatStyles.ts +0 -0
  314. /package/src/tools/{Chat → chat}/types/attachment.ts +0 -0
  315. /package/src/tools/{Chat → chat}/types/block.ts +0 -0
  316. /package/src/tools/{Chat → chat}/types/config.ts +0 -0
  317. /package/src/tools/{Chat → chat}/types/events.ts +0 -0
  318. /package/src/tools/{Chat → chat}/types/index.ts +0 -0
  319. /package/src/tools/{Chat → chat}/types/labels.ts +0 -0
  320. /package/src/tools/{Chat → chat}/types/message.ts +0 -0
  321. /package/src/tools/{Chat → chat}/types/persona.ts +0 -0
  322. /package/src/tools/{Chat → chat}/types/session.ts +0 -0
  323. /package/src/tools/{Chat → chat}/types/tool-call.ts +0 -0
  324. /package/src/tools/{Chat → chat}/types/transport.ts +0 -0
  325. /package/src/tools/{Chat → chat}/utils/collectImageAttachments.ts +0 -0
  326. /package/src/tools/{Chat → chat}/utils/index.ts +0 -0
  327. /package/src/tools/{Chat → chat}/utils/sanitizeDraft.ts +0 -0
  328. /package/src/tools/{JsonTree → data/JsonTree}/README.md +0 -0
  329. /package/src/tools/{JsonTree → data/JsonTree}/components/JsonContent.tsx +0 -0
  330. /package/src/tools/{JsonTree → data/JsonTree}/hooks/useJsonExpand.ts +0 -0
  331. /package/src/tools/{JsonTree → data/JsonTree}/types.ts +0 -0
  332. /package/src/tools/{Tree → data/Tree}/components/TreeChevron.tsx +0 -0
  333. /package/src/tools/{Tree → data/Tree}/components/TreeContent.tsx +0 -0
  334. /package/src/tools/{Tree → data/Tree}/components/TreeEmpty.tsx +0 -0
  335. /package/src/tools/{Tree → data/Tree}/components/TreeError.tsx +0 -0
  336. /package/src/tools/{Tree → data/Tree}/components/TreeIcon.tsx +0 -0
  337. /package/src/tools/{Tree → data/Tree}/components/TreeIndentGuides.tsx +0 -0
  338. /package/src/tools/{Tree → data/Tree}/components/TreeLabel.tsx +0 -0
  339. /package/src/tools/{Tree → data/Tree}/components/TreeRow.tsx +0 -0
  340. /package/src/tools/{Tree → data/Tree}/components/TreeSearchInput.tsx +0 -0
  341. /package/src/tools/{Tree → data/Tree}/components/TreeSkeleton.tsx +0 -0
  342. /package/src/tools/{Tree → data/Tree}/components/index.ts +0 -0
  343. /package/src/tools/{Tree → data/Tree}/context/TreeContext.tsx +0 -0
  344. /package/src/tools/{Tree → data/Tree}/context/hooks.ts +0 -0
  345. /package/src/tools/{Tree → data/Tree}/context/index.ts +0 -0
  346. /package/src/tools/{Tree → data/Tree}/data/appearance.ts +0 -0
  347. /package/src/tools/{Tree → data/Tree}/data/childCache.ts +0 -0
  348. /package/src/tools/{Tree → data/Tree}/data/createDemoTree.ts +0 -0
  349. /package/src/tools/{Tree → data/Tree}/data/flatten.ts +0 -0
  350. /package/src/tools/{Tree → data/Tree}/data/index.ts +0 -0
  351. /package/src/tools/{Tree → data/Tree}/data/persist.ts +0 -0
  352. /package/src/tools/{Tree → data/Tree}/hooks/index.ts +0 -0
  353. /package/src/tools/{Tree → data/Tree}/hooks/useTreeKeyboard.ts +0 -0
  354. /package/src/tools/{Tree → data/Tree}/hooks/useTreeTypeAhead.ts +0 -0
  355. /package/src/tools/{Map → dev/Map}/README.md +0 -0
  356. /package/src/tools/{Map → dev/Map}/components/CustomOverlay.tsx +0 -0
  357. /package/src/tools/{Map → dev/Map}/components/DrawControl.tsx +0 -0
  358. /package/src/tools/{Map → dev/Map}/components/GeocoderControl.tsx +0 -0
  359. /package/src/tools/{Map → dev/Map}/components/LayerSwitcher.tsx +0 -0
  360. /package/src/tools/{Map → dev/Map}/components/MapCluster.tsx +0 -0
  361. /package/src/tools/{Map → dev/Map}/components/MapContainer.tsx +0 -0
  362. /package/src/tools/{Map → dev/Map}/components/MapControls.tsx +0 -0
  363. /package/src/tools/{Map → dev/Map}/components/MapLegend.tsx +0 -0
  364. /package/src/tools/{Map → dev/Map}/components/MapMarker.tsx +0 -0
  365. /package/src/tools/{Map → dev/Map}/components/MapPopup.tsx +0 -0
  366. /package/src/tools/{Map → dev/Map}/components/MapSource.tsx +0 -0
  367. /package/src/tools/{Map → dev/Map}/components/index.ts +0 -0
  368. /package/src/tools/{Map → dev/Map}/context/MapContext.tsx +0 -0
  369. /package/src/tools/{Map → dev/Map}/context/index.ts +0 -0
  370. /package/src/tools/{Map → dev/Map}/hooks/index.ts +0 -0
  371. /package/src/tools/{Map → dev/Map}/hooks/useMap.ts +0 -0
  372. /package/src/tools/{Map → dev/Map}/hooks/useMapControl.ts +0 -0
  373. /package/src/tools/{Map → dev/Map}/hooks/useMapEvents.ts +0 -0
  374. /package/src/tools/{Map → dev/Map}/hooks/useMapLayers.ts +0 -0
  375. /package/src/tools/{Map → dev/Map}/hooks/useMapViewport.ts +0 -0
  376. /package/src/tools/{Map → dev/Map}/hooks/useMarkers.ts +0 -0
  377. /package/src/tools/{Map → dev/Map}/hooks/useSpiderfy.ts +0 -0
  378. /package/src/tools/{Map → dev/Map}/index.ts +0 -0
  379. /package/src/tools/{Map → dev/Map}/layers/cluster.ts +0 -0
  380. /package/src/tools/{Map → dev/Map}/layers/index.ts +0 -0
  381. /package/src/tools/{Map → dev/Map}/layers/line.ts +0 -0
  382. /package/src/tools/{Map → dev/Map}/layers/point.ts +0 -0
  383. /package/src/tools/{Map → dev/Map}/layers/polygon.ts +0 -0
  384. /package/src/tools/{Map → dev/Map}/styles/index.ts +0 -0
  385. /package/src/tools/{Map → dev/Map}/types.ts +0 -0
  386. /package/src/tools/{Map → dev/Map}/utils/geo.ts +0 -0
  387. /package/src/tools/{Map → dev/Map}/utils/index.ts +0 -0
  388. /package/src/tools/{Map → dev/Map}/utils/spiderfy.ts +0 -0
  389. /package/src/tools/{Map → dev/Map}/utils/transform.ts +0 -0
  390. /package/src/tools/{MarkdownMessage → dev/MarkdownMessage}/ActionRow.tsx +0 -0
  391. /package/src/tools/{MarkdownMessage → dev/MarkdownMessage}/ChatMessageRow.tsx +0 -0
  392. /package/src/tools/{MarkdownMessage → dev/MarkdownMessage}/CodeBlock.tsx +0 -0
  393. /package/src/tools/{MarkdownMessage → dev/MarkdownMessage}/README.md +0 -0
  394. /package/src/tools/{MarkdownMessage → dev/MarkdownMessage}/index.ts +0 -0
  395. /package/src/tools/{MarkdownMessage → dev/MarkdownMessage}/linkRules.ts +0 -0
  396. /package/src/tools/{MarkdownMessage → dev/MarkdownMessage}/plainText.ts +0 -0
  397. /package/src/tools/{MarkdownMessage → dev/MarkdownMessage}/sanitize.ts +0 -0
  398. /package/src/tools/{MarkdownMessage → dev/MarkdownMessage}/types.ts +0 -0
  399. /package/src/tools/{Mermaid → dev/Mermaid}/builders/FlowDiagram/FlowDiagram.ts +0 -0
  400. /package/src/tools/{Mermaid → dev/Mermaid}/builders/FlowDiagram/functions/getEdges.ts +0 -0
  401. /package/src/tools/{Mermaid → dev/Mermaid}/builders/FlowDiagram/functions/getNodes.ts +0 -0
  402. /package/src/tools/{Mermaid → dev/Mermaid}/builders/FlowDiagram/functions/getStyles.ts +0 -0
  403. /package/src/tools/{Mermaid → dev/Mermaid}/builders/FlowDiagram/functions/index.ts +0 -0
  404. /package/src/tools/{Mermaid → dev/Mermaid}/builders/FlowDiagram/index.ts +0 -0
  405. /package/src/tools/{Mermaid → dev/Mermaid}/builders/FlowDiagram/types.ts +0 -0
  406. /package/src/tools/{Mermaid → dev/Mermaid}/builders/JourneyDiagram/JourneyDiagram.ts +0 -0
  407. /package/src/tools/{Mermaid → dev/Mermaid}/builders/JourneyDiagram/index.ts +0 -0
  408. /package/src/tools/{Mermaid → dev/Mermaid}/builders/JourneyDiagram/types.ts +0 -0
  409. /package/src/tools/{Mermaid → dev/Mermaid}/builders/SequenceDiagram/SequenceDiagram.ts +0 -0
  410. /package/src/tools/{Mermaid → dev/Mermaid}/builders/SequenceDiagram/functions/getActivations.ts +0 -0
  411. /package/src/tools/{Mermaid → dev/Mermaid}/builders/SequenceDiagram/functions/getBlocks.ts +0 -0
  412. /package/src/tools/{Mermaid → dev/Mermaid}/builders/SequenceDiagram/functions/getMessages.ts +0 -0
  413. /package/src/tools/{Mermaid → dev/Mermaid}/builders/SequenceDiagram/functions/getNotes.ts +0 -0
  414. /package/src/tools/{Mermaid → dev/Mermaid}/builders/SequenceDiagram/functions/index.ts +0 -0
  415. /package/src/tools/{Mermaid → dev/Mermaid}/builders/SequenceDiagram/index.ts +0 -0
  416. /package/src/tools/{Mermaid → dev/Mermaid}/builders/SequenceDiagram/types.ts +0 -0
  417. /package/src/tools/{Mermaid → dev/Mermaid}/builders/core/DiagramStore.ts +0 -0
  418. /package/src/tools/{Mermaid → dev/Mermaid}/builders/core/index.ts +0 -0
  419. /package/src/tools/{Mermaid → dev/Mermaid}/builders/core/sanitize.ts +0 -0
  420. /package/src/tools/{Mermaid → dev/Mermaid}/builders/core/theme.ts +0 -0
  421. /package/src/tools/{Mermaid → dev/Mermaid}/builders/core/types.ts +0 -0
  422. /package/src/tools/{Mermaid → dev/Mermaid}/builders/index.ts +0 -0
  423. /package/src/tools/{Mermaid → dev/Mermaid}/components/MermaidCodeViewer.tsx +0 -0
  424. /package/src/tools/{Mermaid → dev/Mermaid}/components/MermaidErrorPanel.tsx +0 -0
  425. /package/src/tools/{Mermaid → dev/Mermaid}/components/MermaidFullscreenModal.tsx +0 -0
  426. /package/src/tools/{Mermaid → dev/Mermaid}/hooks/index.ts +0 -0
  427. /package/src/tools/{Mermaid → dev/Mermaid}/hooks/useMermaidCleanup.ts +0 -0
  428. /package/src/tools/{Mermaid → dev/Mermaid}/hooks/useMermaidFullscreen.ts +0 -0
  429. /package/src/tools/{Mermaid → dev/Mermaid}/hooks/useMermaidRenderer.ts +0 -0
  430. /package/src/tools/{Mermaid → dev/Mermaid}/hooks/useMermaidValidation.ts +0 -0
  431. /package/src/tools/{Mermaid → dev/Mermaid}/index.tsx +0 -0
  432. /package/src/tools/{Mermaid → dev/Mermaid}/utils/mermaid-helpers.ts +0 -0
  433. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/README.md +0 -0
  434. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/ApiIntroSection.tsx +0 -0
  435. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/DocsView.tsx +0 -0
  436. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/CodeSamples/LanguageTabs.tsx +0 -0
  437. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/CodeSamples/index.tsx +0 -0
  438. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/CodeSamples/useCodeSnippet.ts +0 -0
  439. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/Header/MetaActions.tsx +0 -0
  440. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/Header/MethodBadge.tsx +0 -0
  441. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/Header/PathDisplay.tsx +0 -0
  442. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/Header/index.tsx +0 -0
  443. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/Parameters/ParamGroup.tsx +0 -0
  444. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/Parameters/ParamRow.tsx +0 -0
  445. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/Parameters/index.tsx +0 -0
  446. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/RequestBody/index.tsx +0 -0
  447. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/Responses/ResponseBody.tsx +0 -0
  448. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/Responses/ResponseRow.tsx +0 -0
  449. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/Responses/StatusTag.tsx +0 -0
  450. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/Responses/index.tsx +0 -0
  451. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/SchemaFields/FieldRow.tsx +0 -0
  452. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/SchemaFields/buildTree.ts +0 -0
  453. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/SchemaFields/index.tsx +0 -0
  454. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/SchemaFields/types.ts +0 -0
  455. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/Section/SectionHeader.tsx +0 -0
  456. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/Section/defaults.ts +0 -0
  457. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/Section/index.tsx +0 -0
  458. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/context.tsx +0 -0
  459. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/hooks/useSectionHash.ts +0 -0
  460. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/index.tsx +0 -0
  461. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/store/index.ts +0 -0
  462. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/store/selectors.ts +0 -0
  463. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/EndpointDoc/types.ts +0 -0
  464. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/SchemaCopyMenu.tsx +0 -0
  465. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/Sidebar/BrandHeader.tsx +0 -0
  466. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/Sidebar/CategoryBlock.tsx +0 -0
  467. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/Sidebar/EndpointRow.tsx +0 -0
  468. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/Sidebar/SchemaSection.tsx +0 -0
  469. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/Sidebar/SearchInput.tsx +0 -0
  470. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/Sidebar/SidebarBody.tsx +0 -0
  471. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/Sidebar/Toolbar.tsx +0 -0
  472. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/Sidebar/buildVM.ts +0 -0
  473. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/Sidebar/index.tsx +0 -0
  474. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/Sidebar/types.ts +0 -0
  475. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/Sidebar/useDebouncedValue.ts +0 -0
  476. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/SlideInPlayground.tsx +0 -0
  477. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/TryItSheet.tsx +0 -0
  478. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/anchor.ts +0 -0
  479. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/grouping.ts +0 -0
  480. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/index.tsx +0 -0
  481. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/DocsLayout/sidebarLabel.ts +0 -0
  482. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/index.ts +0 -0
  483. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/shared/BodyFormEditor.tsx +0 -0
  484. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/shared/EndpointDraftSync.tsx +0 -0
  485. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/shared/EndpointResetButton.tsx +0 -0
  486. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/shared/RequestPanel.tsx +0 -0
  487. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/shared/ResponsePanel/PrettyView.tsx +0 -0
  488. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/shared/ResponsePanel/PreviewView.tsx +0 -0
  489. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/shared/ResponsePanel/RawView.tsx +0 -0
  490. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/shared/ResponsePanel/StatusBar.tsx +0 -0
  491. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/shared/ResponsePanel/ViewTabs.tsx +0 -0
  492. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/shared/ResponsePanel/detectContent.ts +0 -0
  493. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/shared/ResponsePanel/index.tsx +0 -0
  494. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/shared/ResponsePanel/types.ts +0 -0
  495. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/shared/ResponsePanel/useResponseView.ts +0 -0
  496. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/shared/SendButton.tsx +0 -0
  497. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/components/shared/ui.tsx +0 -0
  498. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/constants.ts +0 -0
  499. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/context/PlaygroundContext.tsx +0 -0
  500. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/hooks/index.ts +0 -0
  501. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/hooks/useDocsUrlSync.ts +0 -0
  502. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/hooks/useEndpointDraft.ts +0 -0
  503. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/hooks/useMobile.ts +0 -0
  504. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/hooks/useOpenApiSchema.ts +0 -0
  505. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/index.tsx +0 -0
  506. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/types.ts +0 -0
  507. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/utils/apiKeyManager.ts +0 -0
  508. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/utils/codeSamples.ts +0 -0
  509. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/utils/formatters.ts +0 -0
  510. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/utils/index.ts +0 -0
  511. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/utils/operationToHar.ts +0 -0
  512. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/utils/sampler.ts +0 -0
  513. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/utils/schemaExport.ts +0 -0
  514. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/utils/scrollParent.ts +0 -0
  515. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/utils/url.ts +0 -0
  516. /package/src/tools/{OpenapiViewer → dev/OpenapiViewer}/utils/versionManager.ts +0 -0
  517. /package/src/tools/{PrettyCode → dev/PrettyCode}/README.md +0 -0
  518. /package/src/tools/{PrettyCode → dev/PrettyCode}/index.tsx +0 -0
  519. /package/src/tools/{PrettyCode → dev/PrettyCode}/registerPrismLanguages.ts +0 -0
  520. /package/src/tools/{CodeEditor → forms/CodeEditor}/README.md +0 -0
  521. /package/src/tools/{CodeEditor → forms/CodeEditor}/components/DiffEditor.tsx +0 -0
  522. /package/src/tools/{CodeEditor → forms/CodeEditor}/components/Editor.tsx +0 -0
  523. /package/src/tools/{CodeEditor → forms/CodeEditor}/components/index.ts +0 -0
  524. /package/src/tools/{CodeEditor → forms/CodeEditor}/context/EditorProvider.tsx +0 -0
  525. /package/src/tools/{CodeEditor → forms/CodeEditor}/context/index.ts +0 -0
  526. /package/src/tools/{CodeEditor → forms/CodeEditor}/hooks/index.ts +0 -0
  527. /package/src/tools/{CodeEditor → forms/CodeEditor}/hooks/useEditor.ts +0 -0
  528. /package/src/tools/{CodeEditor → forms/CodeEditor}/hooks/useEditorTheme.ts +0 -0
  529. /package/src/tools/{CodeEditor → forms/CodeEditor}/hooks/useLanguage.ts +0 -0
  530. /package/src/tools/{CodeEditor → forms/CodeEditor}/hooks/useMonaco.ts +0 -0
  531. /package/src/tools/{CodeEditor → forms/CodeEditor}/index.ts +0 -0
  532. /package/src/tools/{CodeEditor → forms/CodeEditor}/lib/index.ts +0 -0
  533. /package/src/tools/{CodeEditor → forms/CodeEditor}/lib/languages.ts +0 -0
  534. /package/src/tools/{CodeEditor → forms/CodeEditor}/lib/themes.ts +0 -0
  535. /package/src/tools/{CodeEditor → forms/CodeEditor}/types/index.ts +0 -0
  536. /package/src/tools/{CodeEditor → forms/CodeEditor}/workers/index.ts +0 -0
  537. /package/src/tools/{CodeEditor → forms/CodeEditor}/workers/setup.ts +0 -0
  538. /package/src/tools/{JsonForm → forms/JsonForm}/JsonSchemaForm.tsx +0 -0
  539. /package/src/tools/{JsonForm → forms/JsonForm}/README.md +0 -0
  540. /package/src/tools/{JsonForm → forms/JsonForm}/examples/BotConfigExample.tsx +0 -0
  541. /package/src/tools/{JsonForm → forms/JsonForm}/examples/RealBotConfigExample.tsx +0 -0
  542. /package/src/tools/{JsonForm → forms/JsonForm}/index.ts +0 -0
  543. /package/src/tools/{JsonForm → forms/JsonForm}/templates/ArrayFieldItemTemplate.tsx +0 -0
  544. /package/src/tools/{JsonForm → forms/JsonForm}/templates/ArrayFieldTemplate.tsx +0 -0
  545. /package/src/tools/{JsonForm → forms/JsonForm}/templates/BaseInputTemplate.tsx +0 -0
  546. /package/src/tools/{JsonForm → forms/JsonForm}/templates/ErrorListTemplate.tsx +0 -0
  547. /package/src/tools/{JsonForm → forms/JsonForm}/templates/FieldTemplate.tsx +0 -0
  548. /package/src/tools/{JsonForm → forms/JsonForm}/templates/ObjectFieldTemplate.tsx +0 -0
  549. /package/src/tools/{JsonForm → forms/JsonForm}/templates/index.ts +0 -0
  550. /package/src/tools/{JsonForm → forms/JsonForm}/types.ts +0 -0
  551. /package/src/tools/{JsonForm → forms/JsonForm}/utils.ts +0 -0
  552. /package/src/tools/{JsonForm → forms/JsonForm}/widgets/CheckboxWidget.tsx +0 -0
  553. /package/src/tools/{JsonForm → forms/JsonForm}/widgets/ColorWidget.tsx +0 -0
  554. /package/src/tools/{JsonForm → forms/JsonForm}/widgets/NumberWidget.tsx +0 -0
  555. /package/src/tools/{JsonForm → forms/JsonForm}/widgets/RadioWidget.tsx +0 -0
  556. /package/src/tools/{JsonForm → forms/JsonForm}/widgets/SelectWidget.tsx +0 -0
  557. /package/src/tools/{JsonForm → forms/JsonForm}/widgets/SliderWidget.tsx +0 -0
  558. /package/src/tools/{JsonForm → forms/JsonForm}/widgets/SwitchWidget.tsx +0 -0
  559. /package/src/tools/{JsonForm → forms/JsonForm}/widgets/TextWidget.tsx +0 -0
  560. /package/src/tools/{JsonForm → forms/JsonForm}/widgets/TextareaWidget.tsx +0 -0
  561. /package/src/tools/{JsonForm → forms/JsonForm}/widgets/_useWidgetEnv.ts +0 -0
  562. /package/src/tools/{JsonForm → forms/JsonForm}/widgets/index.ts +0 -0
  563. /package/src/tools/{MarkdownEditor → forms/MarkdownEditor}/MarkdownEditor.tsx +0 -0
  564. /package/src/tools/{MarkdownEditor → forms/MarkdownEditor}/MentionList.tsx +0 -0
  565. /package/src/tools/{MarkdownEditor → forms/MarkdownEditor}/README.md +0 -0
  566. /package/src/tools/{MarkdownEditor → forms/MarkdownEditor}/createMentionSuggestion.ts +0 -0
  567. /package/src/tools/{MarkdownEditor → forms/MarkdownEditor}/index.ts +0 -0
  568. /package/src/tools/{MarkdownEditor → forms/MarkdownEditor}/mentionPresets.test.ts +0 -0
  569. /package/src/tools/{MarkdownEditor → forms/MarkdownEditor}/mentionPresets.ts +0 -0
  570. /package/src/tools/{MarkdownEditor → forms/MarkdownEditor}/styles.css +0 -0
  571. /package/src/tools/{MarkdownEditor → forms/MarkdownEditor}/submitOnEnter.ts +0 -0
  572. /package/src/tools/{MarkdownEditor → forms/MarkdownEditor}/types.ts +0 -0
  573. /package/src/tools/{Uploader → forms/Uploader}/README.md +0 -0
  574. /package/src/tools/{Uploader → forms/Uploader}/components/UploadAddButton.tsx +0 -0
  575. /package/src/tools/{Uploader → forms/Uploader}/components/UploadDropzone.tsx +0 -0
  576. /package/src/tools/{Uploader → forms/Uploader}/components/UploadPageDropOverlay.tsx +0 -0
  577. /package/src/tools/{Uploader → forms/Uploader}/components/UploadPreviewItem.tsx +0 -0
  578. /package/src/tools/{Uploader → forms/Uploader}/components/UploadPreviewList.tsx +0 -0
  579. /package/src/tools/{Uploader → forms/Uploader}/components/Uploader.tsx +0 -0
  580. /package/src/tools/{Uploader → forms/Uploader}/components/index.ts +0 -0
  581. /package/src/tools/{Uploader → forms/Uploader}/context/UploadProvider.tsx +0 -0
  582. /package/src/tools/{Uploader → forms/Uploader}/context/index.ts +0 -0
  583. /package/src/tools/{Uploader → forms/Uploader}/hooks/index.ts +0 -0
  584. /package/src/tools/{Uploader → forms/Uploader}/hooks/useClipboardPaste.ts +0 -0
  585. /package/src/tools/{Uploader → forms/Uploader}/hooks/useUploadEvents.ts +0 -0
  586. /package/src/tools/{Uploader → forms/Uploader}/hooks/useUploadProvider.ts +0 -0
  587. /package/src/tools/{Uploader → forms/Uploader}/index.ts +0 -0
  588. /package/src/tools/{Uploader → forms/Uploader}/types/index.ts +0 -0
  589. /package/src/tools/{Uploader → forms/Uploader}/utils/assetTypes.ts +0 -0
  590. /package/src/tools/{Uploader → forms/Uploader}/utils/formatters.ts +0 -0
  591. /package/src/tools/{Uploader → forms/Uploader}/utils/index.ts +0 -0
  592. /package/src/tools/{Uploader → forms/Uploader}/utils/logger.ts +0 -0
  593. /package/src/tools/{Uploader → forms/Uploader}/utils/transformers.ts +0 -0
  594. /package/src/tools/{CronScheduler → input/CronScheduler}/CronScheduler.client.tsx +0 -0
  595. /package/src/tools/{CronScheduler → input/CronScheduler}/components/CronCheatsheet.tsx +0 -0
  596. /package/src/tools/{CronScheduler → input/CronScheduler}/components/CustomInput.tsx +0 -0
  597. /package/src/tools/{CronScheduler → input/CronScheduler}/components/DayChips.tsx +0 -0
  598. /package/src/tools/{CronScheduler → input/CronScheduler}/components/MonthDayGrid.tsx +0 -0
  599. /package/src/tools/{CronScheduler → input/CronScheduler}/components/SchedulePreview.tsx +0 -0
  600. /package/src/tools/{CronScheduler → input/CronScheduler}/components/ScheduleTypeSelector.tsx +0 -0
  601. /package/src/tools/{CronScheduler → input/CronScheduler}/components/TimeSelector.tsx +0 -0
  602. /package/src/tools/{CronScheduler → input/CronScheduler}/components/index.ts +0 -0
  603. /package/src/tools/{CronScheduler → input/CronScheduler}/context/CronSchedulerContext.tsx +0 -0
  604. /package/src/tools/{CronScheduler → input/CronScheduler}/context/hooks.ts +0 -0
  605. /package/src/tools/{CronScheduler → input/CronScheduler}/context/index.ts +0 -0
  606. /package/src/tools/{CronScheduler → input/CronScheduler}/types/index.ts +0 -0
  607. /package/src/tools/{CronScheduler → input/CronScheduler}/utils/cron-builder.ts +0 -0
  608. /package/src/tools/{CronScheduler → input/CronScheduler}/utils/cron-humanize.ts +0 -0
  609. /package/src/tools/{CronScheduler → input/CronScheduler}/utils/cron-parser.ts +0 -0
  610. /package/src/tools/{CronScheduler → input/CronScheduler}/utils/index.ts +0 -0
  611. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/README.md +0 -0
  612. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/__tests__/ids.test.ts +0 -0
  613. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/__tests__/language.test.ts +0 -0
  614. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/__tests__/reducer.test.ts +0 -0
  615. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/__tests__/transcript.test.ts +0 -0
  616. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/components/DevicePicker.tsx +0 -0
  617. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/components/DictationButton.tsx +0 -0
  618. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/components/EngineBadge.tsx +0 -0
  619. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/components/ErrorBanner.tsx +0 -0
  620. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/components/LanguagePicker.tsx +0 -0
  621. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/components/MicMeter.tsx +0 -0
  622. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/components/PushToTalkHint.tsx +0 -0
  623. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/components/RecordingPulse.tsx +0 -0
  624. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/components/TranscriptView.tsx +0 -0
  625. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/components/index.ts +0 -0
  626. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/context/SpeechRecognitionProvider.tsx +0 -0
  627. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/context/index.ts +0 -0
  628. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/core/engine/external.ts +0 -0
  629. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/core/engine/http.ts +0 -0
  630. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/core/engine/index.ts +0 -0
  631. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/core/engine/mediarecorder.ts +0 -0
  632. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/core/engine/websocket.ts +0 -0
  633. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/core/engine/webspeech.ts +0 -0
  634. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/core/ids.ts +0 -0
  635. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/core/index.ts +0 -0
  636. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/core/language.ts +0 -0
  637. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/core/languages-catalog.ts +0 -0
  638. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/core/logger.ts +0 -0
  639. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/core/reducer.ts +0 -0
  640. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/core/transcript.ts +0 -0
  641. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/hooks/index.ts +0 -0
  642. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/hooks/useDictation.ts +0 -0
  643. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/hooks/useEnginePrefs.ts +0 -0
  644. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/hooks/useMicDevices.ts +0 -0
  645. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/hooks/useMicLevel.ts +0 -0
  646. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/hooks/usePushToTalk.ts +0 -0
  647. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/hooks/useResolvedLanguage.ts +0 -0
  648. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/hooks/useSpeechLanguageInfo.ts +0 -0
  649. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/hooks/useSpeechRecognition.ts +0 -0
  650. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/hooks/useVoiceSupport.ts +0 -0
  651. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/index.ts +0 -0
  652. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/store/index.ts +0 -0
  653. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/store/prefsStore.ts +0 -0
  654. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/types.ts +0 -0
  655. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/widgets/DictationField.tsx +0 -0
  656. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/widgets/VoiceMessageRecorder.tsx +0 -0
  657. /package/src/tools/{SpeechRecognition → input/SpeechRecognition}/widgets/index.ts +0 -0
  658. /package/src/tools/{AudioPlayer → media/AudioPlayer}/Player.tsx +0 -0
  659. /package/src/tools/{AudioPlayer → media/AudioPlayer}/PlayerShell.tsx +0 -0
  660. /package/src/tools/{AudioPlayer → media/AudioPlayer}/README.md +0 -0
  661. /package/src/tools/{AudioPlayer → media/AudioPlayer}/audio/audioContext.ts +0 -0
  662. /package/src/tools/{AudioPlayer → media/AudioPlayer}/audio/decodePeaks.ts +0 -0
  663. /package/src/tools/{AudioPlayer → media/AudioPlayer}/audio/index.ts +0 -0
  664. /package/src/tools/{AudioPlayer → media/AudioPlayer}/audio/mediaElementSourceCache.ts +0 -0
  665. /package/src/tools/{AudioPlayer → media/AudioPlayer}/audio/peaksCache.ts +0 -0
  666. /package/src/tools/{AudioPlayer → media/AudioPlayer}/context/AudioRefContext.tsx +0 -0
  667. /package/src/tools/{AudioPlayer → media/AudioPlayer}/context/ControlsContext.tsx +0 -0
  668. /package/src/tools/{AudioPlayer → media/AudioPlayer}/context/LevelsContext.tsx +0 -0
  669. /package/src/tools/{AudioPlayer → media/AudioPlayer}/context/MetaContext.tsx +0 -0
  670. /package/src/tools/{AudioPlayer → media/AudioPlayer}/context/PlayerProvider.tsx +0 -0
  671. /package/src/tools/{AudioPlayer → media/AudioPlayer}/context/StateContext.tsx +0 -0
  672. /package/src/tools/{AudioPlayer → media/AudioPlayer}/context/index.ts +0 -0
  673. /package/src/tools/{AudioPlayer → media/AudioPlayer}/context/selectors.ts +0 -0
  674. /package/src/tools/{AudioPlayer → media/AudioPlayer}/hooks/index.ts +0 -0
  675. /package/src/tools/{AudioPlayer → media/AudioPlayer}/hooks/useActivePlayer.ts +0 -0
  676. /package/src/tools/{AudioPlayer → media/AudioPlayer}/hooks/useAnalyser.ts +0 -0
  677. /package/src/tools/{AudioPlayer → media/AudioPlayer}/hooks/useAudioElementEvents.ts +0 -0
  678. /package/src/tools/{AudioPlayer → media/AudioPlayer}/hooks/useKeyboardShortcuts.ts +0 -0
  679. /package/src/tools/{AudioPlayer → media/AudioPlayer}/hooks/useMediaSession.ts +0 -0
  680. /package/src/tools/{AudioPlayer → media/AudioPlayer}/hooks/usePeaks.ts +0 -0
  681. /package/src/tools/{AudioPlayer → media/AudioPlayer}/hooks/usePlayerPreferences.ts +0 -0
  682. /package/src/tools/{AudioPlayer → media/AudioPlayer}/hooks/usePlayheadLoop.ts +0 -0
  683. /package/src/tools/{AudioPlayer → media/AudioPlayer}/hooks/useResizeObserver.ts +0 -0
  684. /package/src/tools/{AudioPlayer → media/AudioPlayer}/hooks/useThemeWatcher.ts +0 -0
  685. /package/src/tools/{AudioPlayer → media/AudioPlayer}/index.ts +0 -0
  686. /package/src/tools/{AudioPlayer → media/AudioPlayer}/lazy.tsx +0 -0
  687. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Controls/ControlsRow.tsx +0 -0
  688. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Controls/IconButton.tsx +0 -0
  689. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Controls/LoopButton.tsx +0 -0
  690. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Controls/PlayButton.tsx +0 -0
  691. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Controls/SkipButton.tsx +0 -0
  692. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Controls/VolumeControl.tsx +0 -0
  693. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Controls/index.ts +0 -0
  694. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Cover/Cover.tsx +0 -0
  695. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Cover/CoverPlaceholder.tsx +0 -0
  696. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Cover/ReactivePulse.tsx +0 -0
  697. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Cover/index.ts +0 -0
  698. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/ErrorState/ErrorState.tsx +0 -0
  699. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/ErrorState/index.ts +0 -0
  700. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Layout/CompactLayout.tsx +0 -0
  701. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Layout/DefaultLayout.tsx +0 -0
  702. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Layout/index.ts +0 -0
  703. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Meta/Artist.tsx +0 -0
  704. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Meta/TimeDisplay.tsx +0 -0
  705. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Meta/Title.tsx +0 -0
  706. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Meta/index.ts +0 -0
  707. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Skeleton/CoverSkeleton.tsx +0 -0
  708. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Skeleton/MetaSkeleton.tsx +0 -0
  709. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Skeleton/index.ts +0 -0
  710. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Waveform/BarsWaveform.tsx +0 -0
  711. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Waveform/LiveWaveform.tsx +0 -0
  712. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Waveform/PeaksWaveform.tsx +0 -0
  713. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Waveform/ProgressBar.tsx +0 -0
  714. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Waveform/Waveform.tsx +0 -0
  715. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Waveform/WaveformSkeleton.tsx +0 -0
  716. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Waveform/index.ts +0 -0
  717. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Waveform/waveformInteraction.ts +0 -0
  718. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/Waveform/waveformRenderer.ts +0 -0
  719. /package/src/tools/{AudioPlayer → media/AudioPlayer}/parts/index.ts +0 -0
  720. /package/src/tools/{AudioPlayer → media/AudioPlayer}/store/activePlayerBus.ts +0 -0
  721. /package/src/tools/{AudioPlayer → media/AudioPlayer}/store/createLevelsStore.ts +0 -0
  722. /package/src/tools/{AudioPlayer → media/AudioPlayer}/store/index.ts +0 -0
  723. /package/src/tools/{AudioPlayer → media/AudioPlayer}/store/preferencesStore.ts +0 -0
  724. /package/src/tools/{AudioPlayer → media/AudioPlayer}/styles/webview-safe.css +0 -0
  725. /package/src/tools/{AudioPlayer → media/AudioPlayer}/types.ts +0 -0
  726. /package/src/tools/{AudioPlayer → media/AudioPlayer}/utils/bucketize.ts +0 -0
  727. /package/src/tools/{AudioPlayer → media/AudioPlayer}/utils/clamp.ts +0 -0
  728. /package/src/tools/{AudioPlayer → media/AudioPlayer}/utils/dpr.ts +0 -0
  729. /package/src/tools/{AudioPlayer → media/AudioPlayer}/utils/formatTime.ts +0 -0
  730. /package/src/tools/{AudioPlayer → media/AudioPlayer}/utils/index.ts +0 -0
  731. /package/src/tools/{AudioPlayer → media/AudioPlayer}/utils/readCssVar.ts +0 -0
  732. /package/src/tools/{AudioPlayer → media/AudioPlayer}/utils/resolveCanvasColor.ts +0 -0
  733. /package/src/tools/{Gallery → media/Gallery}/components/Gallery.tsx +0 -0
  734. /package/src/tools/{Gallery → media/Gallery}/components/compact/GalleryCompact.tsx +0 -0
  735. /package/src/tools/{Gallery → media/Gallery}/components/compact/index.ts +0 -0
  736. /package/src/tools/{Gallery → media/Gallery}/components/index.ts +0 -0
  737. /package/src/tools/{Gallery → media/Gallery}/components/lightbox/GalleryLightbox.tsx +0 -0
  738. /package/src/tools/{Gallery → media/Gallery}/components/lightbox/index.ts +0 -0
  739. /package/src/tools/{Gallery → media/Gallery}/components/media/GalleryImage.tsx +0 -0
  740. /package/src/tools/{Gallery → media/Gallery}/components/media/GalleryMedia.tsx +0 -0
  741. /package/src/tools/{Gallery → media/Gallery}/components/media/GalleryVideo.tsx +0 -0
  742. /package/src/tools/{Gallery → media/Gallery}/components/media/index.ts +0 -0
  743. /package/src/tools/{Gallery → media/Gallery}/components/preview/GalleryCarousel.tsx +0 -0
  744. /package/src/tools/{Gallery → media/Gallery}/components/preview/GalleryGrid.tsx +0 -0
  745. /package/src/tools/{Gallery → media/Gallery}/components/preview/index.ts +0 -0
  746. /package/src/tools/{Gallery → media/Gallery}/components/shared/ImageSpinner.tsx +0 -0
  747. /package/src/tools/{Gallery → media/Gallery}/components/shared/index.ts +0 -0
  748. /package/src/tools/{Gallery → media/Gallery}/components/thumbnails/GalleryThumbnails.tsx +0 -0
  749. /package/src/tools/{Gallery → media/Gallery}/components/thumbnails/GalleryThumbnailsVirtual.tsx +0 -0
  750. /package/src/tools/{Gallery → media/Gallery}/components/thumbnails/index.ts +0 -0
  751. /package/src/tools/{Gallery → media/Gallery}/hooks/index.ts +0 -0
  752. /package/src/tools/{Gallery → media/Gallery}/hooks/useGallery.ts +0 -0
  753. /package/src/tools/{Gallery → media/Gallery}/hooks/useImageDimensions.ts +0 -0
  754. /package/src/tools/{Gallery → media/Gallery}/hooks/usePinchZoom.ts +0 -0
  755. /package/src/tools/{Gallery → media/Gallery}/hooks/usePreloadImages.ts +0 -0
  756. /package/src/tools/{Gallery → media/Gallery}/hooks/useSwipe.ts +0 -0
  757. /package/src/tools/{Gallery → media/Gallery}/hooks/useVirtualList.ts +0 -0
  758. /package/src/tools/{Gallery → media/Gallery}/hooks/useZoom.ts +0 -0
  759. /package/src/tools/{Gallery → media/Gallery}/index.ts +0 -0
  760. /package/src/tools/{Gallery → media/Gallery}/types.ts +0 -0
  761. /package/src/tools/{Gallery → media/Gallery}/utils/imageAnalysis.ts +0 -0
  762. /package/src/tools/{Gallery → media/Gallery}/utils/index.ts +0 -0
  763. /package/src/tools/{Gallery → media/Gallery}/utils/normalizeUrl.ts +0 -0
  764. /package/src/tools/{ImageViewer → media/ImageViewer}/README.md +0 -0
  765. /package/src/tools/{ImageViewer → media/ImageViewer}/components/ImageToolbar.tsx +0 -0
  766. /package/src/tools/{ImageViewer → media/ImageViewer}/components/ImageViewer.tsx +0 -0
  767. /package/src/tools/{ImageViewer → media/ImageViewer}/components/index.ts +0 -0
  768. /package/src/tools/{ImageViewer → media/ImageViewer}/hooks/index.ts +0 -0
  769. /package/src/tools/{ImageViewer → media/ImageViewer}/hooks/useImageTransform.ts +0 -0
  770. /package/src/tools/{ImageViewer → media/ImageViewer}/index.ts +0 -0
  771. /package/src/tools/{ImageViewer → media/ImageViewer}/types.ts +0 -0
  772. /package/src/tools/{ImageViewer → media/ImageViewer}/utils/constants.ts +0 -0
  773. /package/src/tools/{ImageViewer → media/ImageViewer}/utils/debug.ts +0 -0
  774. /package/src/tools/{ImageViewer → media/ImageViewer}/utils/index.ts +0 -0
  775. /package/src/tools/{ImageViewer → media/ImageViewer}/utils/lqip.ts +0 -0
  776. /package/src/tools/{LottiePlayer → media/LottiePlayer}/LottiePlayer.client.tsx +0 -0
  777. /package/src/tools/{LottiePlayer → media/LottiePlayer}/index.tsx +0 -0
  778. /package/src/tools/{LottiePlayer → media/LottiePlayer}/types.ts +0 -0
  779. /package/src/tools/{LottiePlayer → media/LottiePlayer}/useLottie.ts +0 -0
  780. /package/src/tools/{LottiePlayer → media/LottiePlayer}/usePrefersReducedMotion.ts +0 -0
  781. /package/src/tools/{VideoPlayer → media/VideoPlayer}/README.md +0 -0
  782. /package/src/tools/{VideoPlayer → media/VideoPlayer}/VideoPlayer.tsx +0 -0
  783. /package/src/tools/{VideoPlayer → media/VideoPlayer}/canvas/canvas-dispatcher.tsx +0 -0
  784. /package/src/tools/{VideoPlayer → media/VideoPlayer}/canvas/hls-canvas.tsx +0 -0
  785. /package/src/tools/{VideoPlayer → media/VideoPlayer}/canvas/iframe-canvas.tsx +0 -0
  786. /package/src/tools/{VideoPlayer → media/VideoPlayer}/canvas/index.ts +0 -0
  787. /package/src/tools/{VideoPlayer → media/VideoPlayer}/canvas/jsx-augmentation.ts +0 -0
  788. /package/src/tools/{VideoPlayer → media/VideoPlayer}/canvas/native-canvas.tsx +0 -0
  789. /package/src/tools/{VideoPlayer → media/VideoPlayer}/canvas/vimeo-canvas.tsx +0 -0
  790. /package/src/tools/{VideoPlayer → media/VideoPlayer}/canvas/youtube-canvas.tsx +0 -0
  791. /package/src/tools/{VideoPlayer → media/VideoPlayer}/index.ts +0 -0
  792. /package/src/tools/{VideoPlayer → media/VideoPlayer}/lazy.tsx +0 -0
  793. /package/src/tools/{VideoPlayer → media/VideoPlayer}/parts/controls-bar.tsx +0 -0
  794. /package/src/tools/{VideoPlayer → media/VideoPlayer}/parts/fullscreen.tsx +0 -0
  795. /package/src/tools/{VideoPlayer → media/VideoPlayer}/parts/index.ts +0 -0
  796. /package/src/tools/{VideoPlayer → media/VideoPlayer}/parts/pip.tsx +0 -0
  797. /package/src/tools/{VideoPlayer → media/VideoPlayer}/parts/play-button.tsx +0 -0
  798. /package/src/tools/{VideoPlayer → media/VideoPlayer}/parts/playback-rate.tsx +0 -0
  799. /package/src/tools/{VideoPlayer → media/VideoPlayer}/parts/poster.tsx +0 -0
  800. /package/src/tools/{VideoPlayer → media/VideoPlayer}/parts/seek-bar.tsx +0 -0
  801. /package/src/tools/{VideoPlayer → media/VideoPlayer}/parts/volume.tsx +0 -0
  802. /package/src/tools/{VideoPlayer → media/VideoPlayer}/styles/video-player.css +0 -0
  803. /package/src/tools/{VideoPlayer → media/VideoPlayer}/types.ts +0 -0
  804. /package/src/tools/{VideoPlayer → media/VideoPlayer}/utils/parse-embed-url.ts +0 -0
  805. /package/src/tools/{VideoPlayer → media/VideoPlayer}/utils/vimeo-id.ts +0 -0
  806. /package/src/tools/{VideoPlayer → media/VideoPlayer}/utils/youtube-id.ts +0 -0
  807. /package/src/tools/{FileIcon → visual/FileIcon}/FileIcon.tsx +0 -0
  808. /package/src/tools/{FileIcon → visual/FileIcon}/get-file-icon.ts +0 -0
  809. /package/src/tools/{FileIcon → visual/FileIcon}/icons/icon-data.ts +0 -0
  810. /package/src/tools/{FileIcon → visual/FileIcon}/index.ts +0 -0
  811. /package/src/tools/{FileIcon → visual/FileIcon}/loader.ts +0 -0
  812. /package/src/tools/{FileIcon → visual/FileIcon}/specialFolders.ts +0 -0
@@ -0,0 +1,1326 @@
1
+ 'use client';
2
+
3
+ import {
4
+ FileArchiveIcon,
5
+ FileAudioIcon,
6
+ FileCodeIcon,
7
+ FileCogIcon,
8
+ FileIcon,
9
+ FileTextIcon,
10
+ FileVideoIcon,
11
+ } from 'lucide-react';
12
+ import { Slot as SlotPrimitive } from '@radix-ui/react-slot';
13
+ import { useDirection as useDirectionPrimitive } from '@radix-ui/react-direction';
14
+ import * as React from 'react';
15
+ import { cn } from '@djangocfg/ui-core/lib';
16
+ import { useComposedRefs } from '@djangocfg/ui-core/lib';
17
+ import type {
18
+ FileUploadProps,
19
+ FileUploadContextValue,
20
+ FileUploadItemContextValue,
21
+ FileState,
22
+ StoreState,
23
+ StoreAction,
24
+ Store,
25
+ } from './types';
26
+
27
+ const ROOT_NAME = 'FileUpload';
28
+ const DROPZONE_NAME = 'FileUploadDropzone';
29
+ const TRIGGER_NAME = 'FileUploadTrigger';
30
+ const LIST_NAME = 'FileUploadList';
31
+ const ITEM_NAME = 'FileUploadItem';
32
+ const ITEM_PREVIEW_NAME = 'FileUploadItemPreview';
33
+ const ITEM_METADATA_NAME = 'FileUploadItemMetadata';
34
+ const ITEM_PROGRESS_NAME = 'FileUploadItemProgress';
35
+ const ITEM_DELETE_NAME = 'FileUploadItemDelete';
36
+ const CLEAR_NAME = 'FileUploadClear';
37
+
38
+ function formatBytes(bytes: number) {
39
+ if (bytes === 0) return '0 B';
40
+ const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
41
+ const i = Math.floor(Math.log(bytes) / Math.log(1024));
42
+ return `${(bytes / 1024 ** i).toFixed(i ? 1 : 0)} ${sizes[i]}`;
43
+ }
44
+
45
+ function getFileIcon(file: File) {
46
+ const type = file.type;
47
+ const extension = file.name.split('.').pop()?.toLowerCase() ?? '';
48
+
49
+ if (type.startsWith('video/')) {
50
+ return <FileVideoIcon />;
51
+ }
52
+
53
+ if (type.startsWith('audio/')) {
54
+ return <FileAudioIcon />;
55
+ }
56
+
57
+ if (
58
+ type.startsWith('text/') ||
59
+ ['txt', 'md', 'rtf', 'pdf'].includes(extension)
60
+ ) {
61
+ return <FileTextIcon />;
62
+ }
63
+
64
+ if (
65
+ [
66
+ 'html',
67
+ 'css',
68
+ 'js',
69
+ 'jsx',
70
+ 'ts',
71
+ 'tsx',
72
+ 'json',
73
+ 'xml',
74
+ 'php',
75
+ 'py',
76
+ 'rb',
77
+ 'java',
78
+ 'c',
79
+ 'cpp',
80
+ 'cs',
81
+ ].includes(extension)
82
+ ) {
83
+ return <FileCodeIcon />;
84
+ }
85
+
86
+ if (['zip', 'rar', '7z', 'tar', 'gz', 'bz2'].includes(extension)) {
87
+ return <FileArchiveIcon />;
88
+ }
89
+
90
+ if (
91
+ ['exe', 'msi', 'app', 'apk', 'deb', 'rpm'].includes(extension) ||
92
+ type.startsWith('application/')
93
+ ) {
94
+ return <FileCogIcon />;
95
+ }
96
+
97
+ return <FileIcon />;
98
+ }
99
+
100
+ function useLazyRef<T>(init: () => T): React.RefObject<T> {
101
+ const ref = React.useRef<T | null>(null);
102
+ if (ref.current === null) {
103
+ ref.current = init();
104
+ }
105
+ return ref as React.RefObject<T>;
106
+ }
107
+
108
+ const StoreContext = React.createContext<Store | null>(null);
109
+
110
+ function useStoreContext(consumerName: string) {
111
+ const context = React.useContext(StoreContext);
112
+ if (!context) {
113
+ throw new Error(`\`${consumerName}\` must be used within \`${ROOT_NAME}\``);
114
+ }
115
+ return context;
116
+ }
117
+
118
+ function useStore<T>(selector: (state: StoreState) => T): T {
119
+ const store = useStoreContext('useStore');
120
+
121
+ const lastValueRef = useLazyRef<{ value: T; state: StoreState } | null>(
122
+ () => null,
123
+ );
124
+
125
+ const getSnapshot = React.useCallback(() => {
126
+ const state = store.getState();
127
+ const prevValue = lastValueRef.current;
128
+
129
+ if (prevValue && prevValue.state === state) {
130
+ return prevValue.value;
131
+ }
132
+
133
+ const nextValue = selector(state);
134
+ lastValueRef.current = { value: nextValue, state };
135
+ return nextValue;
136
+ }, [store, selector, lastValueRef]);
137
+
138
+ return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);
139
+ }
140
+
141
+ const FileUploadContext = React.createContext<FileUploadContextValue | null>(
142
+ null,
143
+ );
144
+
145
+ function useFileUploadContext(consumerName: string) {
146
+ const context = React.useContext(FileUploadContext);
147
+ if (!context) {
148
+ throw new Error(`\`${consumerName}\` must be used within \`${ROOT_NAME}\``);
149
+ }
150
+ return context;
151
+ }
152
+
153
+ export function FileUpload(props: FileUploadProps) {
154
+ const {
155
+ value,
156
+ defaultValue,
157
+ onValueChange,
158
+ onAccept,
159
+ onFileAccept,
160
+ onFileReject,
161
+ onFileValidate,
162
+ onUpload,
163
+ accept,
164
+ maxFiles,
165
+ maxSize,
166
+ dir: dirProp,
167
+ label,
168
+ name,
169
+ asChild,
170
+ disabled = false,
171
+ invalid = false,
172
+ multiple = false,
173
+ required = false,
174
+ children,
175
+ className,
176
+ ...rootProps
177
+ } = props;
178
+
179
+ const inputId = React.useId();
180
+ const dropzoneId = React.useId();
181
+ const listId = React.useId();
182
+ const labelId = React.useId();
183
+
184
+ const dir = useDirectionPrimitive(dirProp);
185
+ const listeners = useLazyRef(() => new Set<() => void>()).current;
186
+ const files = useLazyRef<Map<File, FileState>>(() => new Map()).current;
187
+ const urlCache = useLazyRef(() => new WeakMap<File, string>()).current;
188
+ const inputRef = React.useRef<HTMLInputElement>(null);
189
+ const isControlled = value !== undefined;
190
+
191
+ const propsRef = React.useRef({
192
+ onValueChange,
193
+ onAccept,
194
+ onFileAccept,
195
+ onFileReject,
196
+ onFileValidate,
197
+ onUpload,
198
+ });
199
+ React.useEffect(() => {
200
+ propsRef.current = {
201
+ onValueChange,
202
+ onAccept,
203
+ onFileAccept,
204
+ onFileReject,
205
+ onFileValidate,
206
+ onUpload,
207
+ };
208
+ });
209
+
210
+ const store = React.useMemo<Store>(() => {
211
+ let state: StoreState = {
212
+ files,
213
+ dragOver: false,
214
+ invalid: invalid,
215
+ };
216
+
217
+ function reducer(state: StoreState, action: StoreAction): StoreState {
218
+ switch (action.type) {
219
+ case 'ADD_FILES': {
220
+ for (const file of action.files) {
221
+ files.set(file, {
222
+ file,
223
+ progress: 0,
224
+ status: 'idle',
225
+ });
226
+ }
227
+
228
+ if (propsRef.current.onValueChange) {
229
+ const fileList = Array.from(files.values()).map(
230
+ (fileState) => fileState.file,
231
+ );
232
+ propsRef.current.onValueChange(fileList);
233
+ }
234
+ return { ...state, files };
235
+ }
236
+
237
+ case 'SET_FILES': {
238
+ const newFileSet = new Set(action.files);
239
+ for (const existingFile of files.keys()) {
240
+ if (!newFileSet.has(existingFile)) {
241
+ files.delete(existingFile);
242
+ }
243
+ }
244
+
245
+ for (const file of action.files) {
246
+ const existingState = files.get(file);
247
+ if (!existingState) {
248
+ files.set(file, {
249
+ file,
250
+ progress: 0,
251
+ status: 'idle',
252
+ });
253
+ }
254
+ }
255
+ return { ...state, files };
256
+ }
257
+
258
+ case 'SET_PROGRESS': {
259
+ const fileState = files.get(action.file);
260
+ if (fileState) {
261
+ files.set(action.file, {
262
+ ...fileState,
263
+ progress: action.progress,
264
+ status: 'uploading',
265
+ });
266
+ }
267
+ return { ...state, files };
268
+ }
269
+
270
+ case 'SET_SUCCESS': {
271
+ const fileState = files.get(action.file);
272
+ if (fileState) {
273
+ files.set(action.file, {
274
+ ...fileState,
275
+ progress: 100,
276
+ status: 'success',
277
+ });
278
+ }
279
+ return { ...state, files };
280
+ }
281
+
282
+ case 'SET_ERROR': {
283
+ const fileState = files.get(action.file);
284
+ if (fileState) {
285
+ files.set(action.file, {
286
+ ...fileState,
287
+ error: action.error,
288
+ status: 'error',
289
+ });
290
+ }
291
+ return { ...state, files };
292
+ }
293
+
294
+ case 'REMOVE_FILE': {
295
+ const cachedUrl = urlCache.get(action.file);
296
+ if (cachedUrl) {
297
+ URL.revokeObjectURL(cachedUrl);
298
+ urlCache.delete(action.file);
299
+ }
300
+
301
+ files.delete(action.file);
302
+
303
+ if (propsRef.current.onValueChange) {
304
+ const fileList = Array.from(files.values()).map(
305
+ (fileState) => fileState.file,
306
+ );
307
+ propsRef.current.onValueChange(fileList);
308
+ }
309
+ return { ...state, files };
310
+ }
311
+
312
+ case 'SET_DRAG_OVER': {
313
+ return { ...state, dragOver: action.dragOver };
314
+ }
315
+
316
+ case 'SET_INVALID': {
317
+ return { ...state, invalid: action.invalid };
318
+ }
319
+
320
+ case 'CLEAR': {
321
+ for (const file of files.keys()) {
322
+ const cachedUrl = urlCache.get(file);
323
+ if (cachedUrl) {
324
+ URL.revokeObjectURL(cachedUrl);
325
+ }
326
+ }
327
+
328
+ files.clear();
329
+ if (propsRef.current.onValueChange) {
330
+ propsRef.current.onValueChange([]);
331
+ }
332
+ return { ...state, files, invalid: false };
333
+ }
334
+
335
+ default:
336
+ return state;
337
+ }
338
+ }
339
+
340
+ return {
341
+ getState: () => state,
342
+ dispatch: (action) => {
343
+ state = reducer(state, action);
344
+ for (const listener of listeners) {
345
+ listener();
346
+ }
347
+ },
348
+ subscribe: (listener) => {
349
+ listeners.add(listener);
350
+ return () => listeners.delete(listener);
351
+ },
352
+ };
353
+ }, [listeners, files, invalid, urlCache]);
354
+
355
+ const acceptTypes = React.useMemo(
356
+ () => accept?.split(',').map((t) => t.trim()) ?? null,
357
+ [accept],
358
+ );
359
+
360
+ const onProgress = useLazyRef(() => {
361
+ let frame = 0;
362
+ return (file: File, progress: number) => {
363
+ if (frame) return;
364
+ frame = requestAnimationFrame(() => {
365
+ frame = 0;
366
+ store.dispatch({
367
+ type: 'SET_PROGRESS',
368
+ file,
369
+ progress: Math.min(Math.max(0, progress), 100),
370
+ });
371
+ });
372
+ };
373
+ }).current;
374
+
375
+ React.useEffect(() => {
376
+ if (isControlled) {
377
+ store.dispatch({ type: 'SET_FILES', files: value });
378
+ } else if (
379
+ defaultValue &&
380
+ defaultValue.length > 0 &&
381
+ !store.getState().files.size
382
+ ) {
383
+ store.dispatch({ type: 'SET_FILES', files: defaultValue });
384
+ }
385
+ }, [value, defaultValue, isControlled, store]);
386
+
387
+ React.useEffect(() => {
388
+ return () => {
389
+ for (const file of files.keys()) {
390
+ const cachedUrl = urlCache.get(file);
391
+ if (cachedUrl) {
392
+ URL.revokeObjectURL(cachedUrl);
393
+ }
394
+ }
395
+ };
396
+ }, [files, urlCache]);
397
+
398
+ const onFilesUpload = React.useCallback(
399
+ async (files: File[]) => {
400
+ try {
401
+ for (const file of files) {
402
+ store.dispatch({ type: 'SET_PROGRESS', file, progress: 0 });
403
+ }
404
+
405
+ if (propsRef.current.onUpload) {
406
+ await propsRef.current.onUpload(files, {
407
+ onProgress,
408
+ onSuccess: (file) => {
409
+ store.dispatch({ type: 'SET_SUCCESS', file });
410
+ },
411
+ onError: (file, error) => {
412
+ store.dispatch({
413
+ type: 'SET_ERROR',
414
+ file,
415
+ error: error.message ?? 'Upload failed',
416
+ });
417
+ },
418
+ });
419
+ } else {
420
+ for (const file of files) {
421
+ store.dispatch({ type: 'SET_SUCCESS', file });
422
+ }
423
+ }
424
+ } catch (error) {
425
+ const errorMessage =
426
+ error instanceof Error ? error.message : 'Upload failed';
427
+ for (const file of files) {
428
+ store.dispatch({
429
+ type: 'SET_ERROR',
430
+ file,
431
+ error: errorMessage,
432
+ });
433
+ }
434
+ }
435
+ },
436
+ [store, onProgress],
437
+ );
438
+
439
+ const onFilesChange = React.useCallback(
440
+ (originalFiles: File[]) => {
441
+ if (disabled) return;
442
+
443
+ let filesToProcess = [...originalFiles];
444
+ let invalid = false;
445
+
446
+ if (maxFiles) {
447
+ const currentCount = store.getState().files.size;
448
+ const remainingSlotCount = Math.max(0, maxFiles - currentCount);
449
+
450
+ if (remainingSlotCount < filesToProcess.length) {
451
+ const rejectedFiles = filesToProcess.slice(remainingSlotCount);
452
+ invalid = true;
453
+
454
+ filesToProcess = filesToProcess.slice(0, remainingSlotCount);
455
+
456
+ for (const file of rejectedFiles) {
457
+ let rejectionMessage = `Maximum ${maxFiles} files allowed`;
458
+
459
+ if (propsRef.current.onFileValidate) {
460
+ const validationMessage = propsRef.current.onFileValidate(file);
461
+ if (validationMessage) {
462
+ rejectionMessage = validationMessage;
463
+ }
464
+ }
465
+
466
+ propsRef.current.onFileReject?.(file, rejectionMessage);
467
+ }
468
+ }
469
+ }
470
+
471
+ const acceptedFiles: File[] = [];
472
+ const rejectedFiles: { file: File; message: string }[] = [];
473
+
474
+ for (const file of filesToProcess) {
475
+ let rejected = false;
476
+ let rejectionMessage = '';
477
+
478
+ if (propsRef.current.onFileValidate) {
479
+ const validationMessage = propsRef.current.onFileValidate(file);
480
+ if (validationMessage) {
481
+ rejectionMessage = validationMessage;
482
+ propsRef.current.onFileReject?.(file, rejectionMessage);
483
+ rejected = true;
484
+ invalid = true;
485
+ continue;
486
+ }
487
+ }
488
+
489
+ if (acceptTypes) {
490
+ const fileType = file.type;
491
+ const fileExtension = `.${file.name.split('.').pop()}`;
492
+
493
+ if (
494
+ !acceptTypes.some(
495
+ (type) =>
496
+ type === fileType ||
497
+ type === fileExtension ||
498
+ (type.includes('/*') &&
499
+ fileType.startsWith(type.replace('/*', '/'))),
500
+ )
501
+ ) {
502
+ rejectionMessage = 'File type not accepted';
503
+ propsRef.current.onFileReject?.(file, rejectionMessage);
504
+ rejected = true;
505
+ invalid = true;
506
+ }
507
+ }
508
+
509
+ if (maxSize && file.size > maxSize) {
510
+ rejectionMessage = 'File too large';
511
+ propsRef.current.onFileReject?.(file, rejectionMessage);
512
+ rejected = true;
513
+ invalid = true;
514
+ }
515
+
516
+ if (!rejected) {
517
+ acceptedFiles.push(file);
518
+ } else {
519
+ rejectedFiles.push({ file, message: rejectionMessage });
520
+ }
521
+ }
522
+
523
+ if (invalid) {
524
+ store.dispatch({ type: 'SET_INVALID', invalid });
525
+ setTimeout(() => {
526
+ store.dispatch({ type: 'SET_INVALID', invalid: false });
527
+ }, 2000);
528
+ }
529
+
530
+ if (acceptedFiles.length > 0) {
531
+ store.dispatch({ type: 'ADD_FILES', files: acceptedFiles });
532
+
533
+ if (isControlled && propsRef.current.onValueChange) {
534
+ const currentFiles = Array.from(store.getState().files.values()).map(
535
+ (f) => f.file,
536
+ );
537
+ propsRef.current.onValueChange([...currentFiles]);
538
+ }
539
+
540
+ if (propsRef.current.onAccept) {
541
+ propsRef.current.onAccept(acceptedFiles);
542
+ }
543
+
544
+ for (const file of acceptedFiles) {
545
+ propsRef.current.onFileAccept?.(file);
546
+ }
547
+
548
+ if (propsRef.current.onUpload) {
549
+ requestAnimationFrame(() => {
550
+ onFilesUpload(acceptedFiles);
551
+ });
552
+ }
553
+ }
554
+ },
555
+ [
556
+ store,
557
+ isControlled,
558
+ onFilesUpload,
559
+ maxFiles,
560
+ acceptTypes,
561
+ maxSize,
562
+ disabled,
563
+ ],
564
+ );
565
+
566
+ const onInputChange = React.useCallback(
567
+ (event: React.ChangeEvent<HTMLInputElement>) => {
568
+ const files = Array.from(event.target.files ?? []);
569
+ onFilesChange(files);
570
+ event.target.value = '';
571
+ },
572
+ [onFilesChange],
573
+ );
574
+
575
+ const contextValue = React.useMemo<FileUploadContextValue>(
576
+ () => ({
577
+ dropzoneId,
578
+ inputId,
579
+ listId,
580
+ labelId,
581
+ dir,
582
+ disabled,
583
+ inputRef,
584
+ urlCache,
585
+ }),
586
+ [dropzoneId, inputId, listId, labelId, dir, disabled, urlCache],
587
+ );
588
+
589
+ const RootPrimitive = asChild ? SlotPrimitive : 'div';
590
+
591
+ return (
592
+ <StoreContext.Provider value={store}>
593
+ <FileUploadContext.Provider value={contextValue}>
594
+ <RootPrimitive
595
+ data-disabled={disabled ? '' : undefined}
596
+ data-slot="file-upload"
597
+ dir={dir}
598
+ {...rootProps}
599
+ className={cn('relative flex flex-col gap-2', className)}
600
+ >
601
+ {children}
602
+ <input
603
+ type="file"
604
+ id={inputId}
605
+ aria-labelledby={labelId}
606
+ aria-describedby={dropzoneId}
607
+ ref={inputRef}
608
+ tabIndex={-1}
609
+ accept={accept}
610
+ name={name}
611
+ className="sr-only"
612
+ disabled={disabled}
613
+ multiple={multiple}
614
+ required={required}
615
+ onChange={onInputChange}
616
+ />
617
+ <div id={labelId} className="sr-only">
618
+ {label ?? 'File upload'}
619
+ </div>
620
+ </RootPrimitive>
621
+ </FileUploadContext.Provider>
622
+ </StoreContext.Provider>
623
+ );
624
+ }
625
+
626
+ FileUpload.displayName = ROOT_NAME;
627
+
628
+ export function FileUploadDropzone(props: React.ComponentProps<'div'> & { asChild?: boolean }) {
629
+ const {
630
+ asChild,
631
+ className,
632
+ onClick: onClickProp,
633
+ onDragOver: onDragOverProp,
634
+ onDragEnter: onDragEnterProp,
635
+ onDragLeave: onDragLeaveProp,
636
+ onDrop: onDropProp,
637
+ onPaste: onPasteProp,
638
+ onKeyDown: onKeyDownProp,
639
+ ...dropzoneProps
640
+ } = props;
641
+
642
+ const context = useFileUploadContext(DROPZONE_NAME);
643
+ const store = useStoreContext(DROPZONE_NAME);
644
+ const dragOver = useStore((state) => state.dragOver);
645
+ const invalid = useStore((state) => state.invalid);
646
+
647
+ const propsRef = React.useRef({
648
+ onClick: onClickProp,
649
+ onDragOver: onDragOverProp,
650
+ onDragEnter: onDragEnterProp,
651
+ onDragLeave: onDragLeaveProp,
652
+ onDrop: onDropProp,
653
+ onPaste: onPasteProp,
654
+ onKeyDown: onKeyDownProp,
655
+ });
656
+ React.useEffect(() => {
657
+ propsRef.current = {
658
+ onClick: onClickProp,
659
+ onDragOver: onDragOverProp,
660
+ onDragEnter: onDragEnterProp,
661
+ onDragLeave: onDragLeaveProp,
662
+ onDrop: onDropProp,
663
+ onPaste: onPasteProp,
664
+ onKeyDown: onKeyDownProp,
665
+ };
666
+ });
667
+
668
+ const onClick = React.useCallback(
669
+ (event: React.MouseEvent<HTMLDivElement>) => {
670
+ propsRef.current.onClick?.(event);
671
+
672
+ if (event.defaultPrevented) return;
673
+
674
+ const target = event.target;
675
+
676
+ const isFromTrigger =
677
+ target instanceof HTMLElement &&
678
+ target.closest('[data-slot="file-upload-trigger"]');
679
+
680
+ if (!isFromTrigger) {
681
+ context.inputRef.current?.click();
682
+ }
683
+ },
684
+ [context.inputRef],
685
+ );
686
+
687
+ const onDragOver = React.useCallback(
688
+ (event: React.DragEvent<HTMLDivElement>) => {
689
+ propsRef.current.onDragOver?.(event);
690
+
691
+ if (event.defaultPrevented) return;
692
+
693
+ event.preventDefault();
694
+ store.dispatch({ type: 'SET_DRAG_OVER', dragOver: true });
695
+ },
696
+ [store],
697
+ );
698
+
699
+ const onDragEnter = React.useCallback(
700
+ (event: React.DragEvent<HTMLDivElement>) => {
701
+ propsRef.current.onDragEnter?.(event);
702
+
703
+ if (event.defaultPrevented) return;
704
+
705
+ event.preventDefault();
706
+ store.dispatch({ type: 'SET_DRAG_OVER', dragOver: true });
707
+ },
708
+ [store],
709
+ );
710
+
711
+ const onDragLeave = React.useCallback(
712
+ (event: React.DragEvent<HTMLDivElement>) => {
713
+ propsRef.current.onDragLeave?.(event);
714
+
715
+ if (event.defaultPrevented) return;
716
+
717
+ const relatedTarget = event.relatedTarget;
718
+ if (
719
+ relatedTarget &&
720
+ relatedTarget instanceof Node &&
721
+ event.currentTarget.contains(relatedTarget)
722
+ ) {
723
+ return;
724
+ }
725
+
726
+ event.preventDefault();
727
+ store.dispatch({ type: 'SET_DRAG_OVER', dragOver: false });
728
+ },
729
+ [store],
730
+ );
731
+
732
+ const onDrop = React.useCallback(
733
+ (event: React.DragEvent<HTMLDivElement>) => {
734
+ propsRef.current.onDrop?.(event);
735
+
736
+ if (event.defaultPrevented) return;
737
+
738
+ event.preventDefault();
739
+ store.dispatch({ type: 'SET_DRAG_OVER', dragOver: false });
740
+
741
+ const files = Array.from(event.dataTransfer.files);
742
+ const inputElement = context.inputRef.current;
743
+ if (!inputElement) return;
744
+
745
+ const dataTransfer = new DataTransfer();
746
+ for (const file of files) {
747
+ dataTransfer.items.add(file);
748
+ }
749
+
750
+ inputElement.files = dataTransfer.files;
751
+ inputElement.dispatchEvent(new Event('change', { bubbles: true }));
752
+ },
753
+ [store, context.inputRef],
754
+ );
755
+
756
+ const onPaste = React.useCallback(
757
+ (event: React.ClipboardEvent<HTMLDivElement>) => {
758
+ propsRef.current.onPaste?.(event);
759
+
760
+ if (event.defaultPrevented) return;
761
+
762
+ event.preventDefault();
763
+ store.dispatch({ type: 'SET_DRAG_OVER', dragOver: false });
764
+
765
+ const items = event.clipboardData?.items;
766
+ if (!items) return;
767
+
768
+ const files: File[] = [];
769
+ for (let i = 0; i < items.length; i++) {
770
+ const item = items[i];
771
+ if (item?.kind === 'file') {
772
+ const file = item.getAsFile();
773
+ if (file) {
774
+ files.push(file);
775
+ }
776
+ }
777
+ }
778
+
779
+ if (files.length === 0) return;
780
+
781
+ const inputElement = context.inputRef.current;
782
+ if (!inputElement) return;
783
+
784
+ const dataTransfer = new DataTransfer();
785
+ for (const file of files) {
786
+ dataTransfer.items.add(file);
787
+ }
788
+
789
+ inputElement.files = dataTransfer.files;
790
+ inputElement.dispatchEvent(new Event('change', { bubbles: true }));
791
+ },
792
+ [store, context.inputRef],
793
+ );
794
+
795
+ const onKeyDown = React.useCallback(
796
+ (event: React.KeyboardEvent<HTMLDivElement>) => {
797
+ propsRef.current.onKeyDown?.(event);
798
+
799
+ if (
800
+ !event.defaultPrevented &&
801
+ (event.key === 'Enter' || event.key === ' ')
802
+ ) {
803
+ event.preventDefault();
804
+ context.inputRef.current?.click();
805
+ }
806
+ },
807
+ [context.inputRef],
808
+ );
809
+
810
+ const DropzonePrimitive = asChild ? SlotPrimitive : 'div';
811
+
812
+ return (
813
+ <DropzonePrimitive
814
+ role="region"
815
+ id={context.dropzoneId}
816
+ aria-controls={`${context.inputId} ${context.listId}`}
817
+ aria-disabled={context.disabled}
818
+ aria-invalid={invalid}
819
+ data-disabled={context.disabled ? '' : undefined}
820
+ data-dragging={dragOver ? '' : undefined}
821
+ data-invalid={invalid ? '' : undefined}
822
+ data-slot="file-upload-dropzone"
823
+ dir={context.dir}
824
+ tabIndex={context.disabled ? undefined : 0}
825
+ {...dropzoneProps}
826
+ className={cn(
827
+ 'relative flex select-none flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed p-6 outline-none transition-colors hover:bg-accent/30 focus-visible:border-ring/50 data-disabled:pointer-events-none data-dragging:border-primary/30 data-invalid:border-destructive data-dragging:bg-accent/30 data-invalid:ring-destructive/20',
828
+ className,
829
+ )}
830
+ onClick={onClick}
831
+ onDragEnter={onDragEnter}
832
+ onDragLeave={onDragLeave}
833
+ onDragOver={onDragOver}
834
+ onDrop={onDrop}
835
+ onKeyDown={onKeyDown}
836
+ onPaste={onPaste}
837
+ />
838
+ );
839
+ }
840
+
841
+ FileUploadDropzone.displayName = DROPZONE_NAME;
842
+
843
+ export function FileUploadTrigger(props: React.ComponentProps<'button'> & { asChild?: boolean }) {
844
+ const { asChild, onClick: onClickProp, ...triggerProps } = props;
845
+
846
+ const context = useFileUploadContext(TRIGGER_NAME);
847
+
848
+ const propsRef = React.useRef({ onClick: onClickProp });
849
+ React.useEffect(() => {
850
+ propsRef.current = { onClick: onClickProp };
851
+ });
852
+
853
+ const onClick = React.useCallback(
854
+ (event: React.MouseEvent<HTMLButtonElement>) => {
855
+ propsRef.current.onClick?.(event);
856
+
857
+ if (event.defaultPrevented) return;
858
+
859
+ context.inputRef.current?.click();
860
+ },
861
+ [context.inputRef],
862
+ );
863
+
864
+ const TriggerPrimitive = asChild ? SlotPrimitive : 'button';
865
+
866
+ return (
867
+ <TriggerPrimitive
868
+ type="button"
869
+ aria-controls={context.inputId}
870
+ data-disabled={context.disabled ? '' : undefined}
871
+ data-slot="file-upload-trigger"
872
+ {...triggerProps}
873
+ disabled={context.disabled}
874
+ onClick={onClick}
875
+ />
876
+ );
877
+ }
878
+
879
+ FileUploadTrigger.displayName = TRIGGER_NAME;
880
+
881
+ export function FileUploadList(props: React.ComponentProps<'div'> & { orientation?: 'horizontal' | 'vertical'; asChild?: boolean; forceMount?: boolean }) {
882
+ const {
883
+ className,
884
+ orientation = 'vertical',
885
+ asChild,
886
+ forceMount,
887
+ ...listProps
888
+ } = props;
889
+
890
+ const context = useFileUploadContext(LIST_NAME);
891
+ const fileCount = useStore((state) => state.files.size);
892
+ const shouldRender = forceMount || fileCount > 0;
893
+
894
+ if (!shouldRender) return null;
895
+
896
+ const ListPrimitive = asChild ? SlotPrimitive : 'div';
897
+
898
+ return (
899
+ <ListPrimitive
900
+ role="list"
901
+ id={context.listId}
902
+ aria-orientation={orientation}
903
+ data-orientation={orientation}
904
+ data-slot="file-upload-list"
905
+ data-state={shouldRender ? 'active' : 'inactive'}
906
+ dir={context.dir}
907
+ {...listProps}
908
+ className={cn(
909
+ 'data-[state=inactive]:fade-out-0 data-[state=active]:fade-in-0 data-[state=inactive]:slide-out-to-top-2 data-[state=active]:slide-in-from-top-2 flex flex-col gap-2 data-[state=active]:animate-in data-[state=inactive]:animate-out',
910
+ orientation === 'horizontal' && 'flex-row overflow-x-auto p-1.5',
911
+ className,
912
+ )}
913
+ />
914
+ );
915
+ }
916
+
917
+ FileUploadList.displayName = LIST_NAME;
918
+
919
+ const FileUploadItemContext =
920
+ React.createContext<FileUploadItemContextValue | null>(null);
921
+
922
+ function useFileUploadItemContext(consumerName: string) {
923
+ const context = React.useContext(FileUploadItemContext);
924
+ if (!context) {
925
+ throw new Error(`\`${consumerName}\` must be used within \`${ITEM_NAME}\``);
926
+ }
927
+ return context;
928
+ }
929
+
930
+ export function FileUploadItem(props: React.ComponentProps<'div'> & { value: File; asChild?: boolean }) {
931
+ const { value, asChild, className, ...itemProps } = props;
932
+
933
+ const id = React.useId();
934
+ const statusId = `${id}-status`;
935
+ const nameId = `${id}-name`;
936
+ const sizeId = `${id}-size`;
937
+ const messageId = `${id}-message`;
938
+
939
+ const context = useFileUploadContext(ITEM_NAME);
940
+ const fileState = useStore((state) => state.files.get(value));
941
+ const fileCount = useStore((state) => state.files.size);
942
+ const fileIndex = useStore((state) => {
943
+ const files = Array.from(state.files.keys());
944
+ return files.indexOf(value) + 1;
945
+ });
946
+
947
+ const itemContext = React.useMemo(
948
+ () => ({
949
+ id,
950
+ fileState,
951
+ nameId,
952
+ sizeId,
953
+ statusId,
954
+ messageId,
955
+ }),
956
+ [id, fileState, statusId, nameId, sizeId, messageId],
957
+ );
958
+
959
+ if (!fileState) return null;
960
+
961
+ const statusText = fileState.error
962
+ ? `Error: ${fileState.error}`
963
+ : fileState.status === 'uploading'
964
+ ? `Uploading: ${fileState.progress}% complete`
965
+ : fileState.status === 'success'
966
+ ? 'Upload complete'
967
+ : 'Ready to upload';
968
+
969
+ const ItemPrimitive = asChild ? SlotPrimitive : 'div';
970
+
971
+ return (
972
+ <FileUploadItemContext.Provider value={itemContext}>
973
+ <ItemPrimitive
974
+ role="listitem"
975
+ id={id}
976
+ aria-setsize={fileCount}
977
+ aria-posinset={fileIndex}
978
+ aria-describedby={`${nameId} ${sizeId} ${statusId} ${
979
+ fileState.error ? messageId : ''
980
+ }`}
981
+ aria-labelledby={nameId}
982
+ data-slot="file-upload-item"
983
+ dir={context.dir}
984
+ {...itemProps}
985
+ className={cn(
986
+ 'relative flex items-center gap-2.5 rounded-md border p-3',
987
+ className,
988
+ )}
989
+ >
990
+ {props.children}
991
+ <span id={statusId} className="sr-only">
992
+ {statusText}
993
+ </span>
994
+ </ItemPrimitive>
995
+ </FileUploadItemContext.Provider>
996
+ );
997
+ }
998
+
999
+ FileUploadItem.displayName = ITEM_NAME;
1000
+
1001
+ export function FileUploadItemPreview(props: React.ComponentProps<'div'> & { render?: (file: File, fallback: () => React.ReactNode) => React.ReactNode; asChild?: boolean }) {
1002
+ const { render, asChild, children, className, ...previewProps } = props;
1003
+
1004
+ const itemContext = useFileUploadItemContext(ITEM_PREVIEW_NAME);
1005
+ const context = useFileUploadContext(ITEM_PREVIEW_NAME);
1006
+
1007
+ const getDefaultRender = React.useCallback(
1008
+ (file: File) => {
1009
+ if (itemContext.fileState?.file.type.startsWith('image/')) {
1010
+ let url = context.urlCache.get(file);
1011
+ if (!url) {
1012
+ url = URL.createObjectURL(file);
1013
+ context.urlCache.set(file, url);
1014
+ }
1015
+
1016
+ return (
1017
+ <img src={url} alt={file.name} className="size-full object-cover" />
1018
+ );
1019
+ }
1020
+
1021
+ return getFileIcon(file);
1022
+ },
1023
+ [itemContext.fileState?.file.type, context.urlCache],
1024
+ );
1025
+
1026
+ const onPreviewRender = React.useCallback(
1027
+ (file: File) => {
1028
+ if (render) {
1029
+ return render(file, () => getDefaultRender(file));
1030
+ }
1031
+
1032
+ return getDefaultRender(file);
1033
+ },
1034
+ [render, getDefaultRender],
1035
+ );
1036
+
1037
+ if (!itemContext.fileState) return null;
1038
+
1039
+ const ItemPreviewPrimitive = asChild ? SlotPrimitive : 'div';
1040
+
1041
+ return (
1042
+ <ItemPreviewPrimitive
1043
+ aria-labelledby={itemContext.nameId}
1044
+ data-slot="file-upload-preview"
1045
+ {...previewProps}
1046
+ className={cn(
1047
+ 'relative flex size-10 shrink-0 items-center justify-center overflow-hidden rounded border bg-accent/50 [&>svg]:size-10',
1048
+ className,
1049
+ )}
1050
+ >
1051
+ {onPreviewRender(itemContext.fileState.file)}
1052
+ {children}
1053
+ </ItemPreviewPrimitive>
1054
+ );
1055
+ }
1056
+
1057
+ FileUploadItemPreview.displayName = ITEM_PREVIEW_NAME;
1058
+
1059
+ export function FileUploadItemMetadata(props: React.ComponentProps<'div'> & { asChild?: boolean; size?: 'default' | 'sm' }) {
1060
+ const {
1061
+ asChild,
1062
+ size = 'default',
1063
+ children,
1064
+ className,
1065
+ ...metadataProps
1066
+ } = props;
1067
+
1068
+ const context = useFileUploadContext(ITEM_METADATA_NAME);
1069
+ const itemContext = useFileUploadItemContext(ITEM_METADATA_NAME);
1070
+
1071
+ if (!itemContext.fileState) return null;
1072
+
1073
+ const ItemMetadataPrimitive = asChild ? SlotPrimitive : 'div';
1074
+
1075
+ return (
1076
+ <ItemMetadataPrimitive
1077
+ data-slot="file-upload-metadata"
1078
+ dir={context.dir}
1079
+ {...metadataProps}
1080
+ className={cn('flex min-w-0 flex-1 flex-col', className)}
1081
+ >
1082
+ {children ?? (
1083
+ <>
1084
+ <span
1085
+ id={itemContext.nameId}
1086
+ className={cn(
1087
+ 'truncate font-medium text-sm',
1088
+ size === 'sm' && 'font-normal text-[13px] leading-snug',
1089
+ )}
1090
+ >
1091
+ {itemContext.fileState.file.name}
1092
+ </span>
1093
+ <span
1094
+ id={itemContext.sizeId}
1095
+ className={cn(
1096
+ 'truncate text-muted-foreground text-xs',
1097
+ size === 'sm' && 'text-[11px] leading-snug',
1098
+ )}
1099
+ >
1100
+ {formatBytes(itemContext.fileState.file.size)}
1101
+ </span>
1102
+ {itemContext.fileState.error && (
1103
+ <span
1104
+ id={itemContext.messageId}
1105
+ className="text-destructive text-xs"
1106
+ >
1107
+ {itemContext.fileState.error}
1108
+ </span>
1109
+ )}
1110
+ </>
1111
+ )}
1112
+ </ItemMetadataPrimitive>
1113
+ );
1114
+ }
1115
+
1116
+ FileUploadItemMetadata.displayName = ITEM_METADATA_NAME;
1117
+
1118
+ export function FileUploadItemProgress(props: React.ComponentProps<'div'> & { variant?: 'linear' | 'circular' | 'fill'; size?: number; asChild?: boolean; forceMount?: boolean }) {
1119
+ const {
1120
+ variant = 'linear',
1121
+ size = 40,
1122
+ asChild,
1123
+ forceMount,
1124
+ className,
1125
+ ...progressProps
1126
+ } = props;
1127
+
1128
+ const itemContext = useFileUploadItemContext(ITEM_PROGRESS_NAME);
1129
+
1130
+ if (!itemContext.fileState) return null;
1131
+
1132
+ const shouldRender = forceMount || itemContext.fileState.progress !== 100;
1133
+
1134
+ if (!shouldRender) return null;
1135
+
1136
+ const ItemProgressPrimitive = asChild ? SlotPrimitive : 'div';
1137
+
1138
+ switch (variant) {
1139
+ case 'circular': {
1140
+ const circumference = 2 * Math.PI * ((size - 4) / 2);
1141
+ const strokeDashoffset =
1142
+ circumference - (itemContext.fileState.progress / 100) * circumference;
1143
+
1144
+ return (
1145
+ <ItemProgressPrimitive
1146
+ role="progressbar"
1147
+ aria-valuemin={0}
1148
+ aria-valuemax={100}
1149
+ aria-valuenow={itemContext.fileState.progress}
1150
+ aria-valuetext={`${itemContext.fileState.progress}%`}
1151
+ aria-labelledby={itemContext.nameId}
1152
+ data-slot="file-upload-progress"
1153
+ {...progressProps}
1154
+ className={cn(
1155
+ 'absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2',
1156
+ className,
1157
+ )}
1158
+ >
1159
+ <svg
1160
+ className="-rotate-90 transform"
1161
+ width={size}
1162
+ height={size}
1163
+ viewBox={`0 0 ${size} ${size}`}
1164
+ fill="none"
1165
+ stroke="currentColor"
1166
+ >
1167
+ <circle
1168
+ className="text-primary/20"
1169
+ strokeWidth="2"
1170
+ cx={size / 2}
1171
+ cy={size / 2}
1172
+ r={(size - 4) / 2}
1173
+ />
1174
+ <circle
1175
+ className="text-primary transition-[stroke-dashoffset] duration-300 ease-linear"
1176
+ strokeWidth="2"
1177
+ strokeLinecap="round"
1178
+ strokeDasharray={circumference}
1179
+ strokeDashoffset={strokeDashoffset}
1180
+ cx={size / 2}
1181
+ cy={size / 2}
1182
+ r={(size - 4) / 2}
1183
+ />
1184
+ </svg>
1185
+ </ItemProgressPrimitive>
1186
+ );
1187
+ }
1188
+
1189
+ case 'fill': {
1190
+ const progressPercentage = itemContext.fileState.progress;
1191
+ const topInset = 100 - progressPercentage;
1192
+
1193
+ return (
1194
+ <ItemProgressPrimitive
1195
+ role="progressbar"
1196
+ aria-valuemin={0}
1197
+ aria-valuemax={100}
1198
+ aria-valuenow={progressPercentage}
1199
+ aria-valuetext={`${progressPercentage}%`}
1200
+ aria-labelledby={itemContext.nameId}
1201
+ data-slot="file-upload-progress"
1202
+ {...progressProps}
1203
+ className={cn(
1204
+ 'absolute inset-0 bg-primary/50 transition-[clip-path] duration-300 ease-linear',
1205
+ className,
1206
+ )}
1207
+ style={{
1208
+ clipPath: `inset(${topInset}% 0% 0% 0%)`,
1209
+ }}
1210
+ />
1211
+ );
1212
+ }
1213
+
1214
+ default:
1215
+ return (
1216
+ <ItemProgressPrimitive
1217
+ role="progressbar"
1218
+ aria-valuemin={0}
1219
+ aria-valuemax={100}
1220
+ aria-valuenow={itemContext.fileState.progress}
1221
+ aria-valuetext={`${itemContext.fileState.progress}%`}
1222
+ aria-labelledby={itemContext.nameId}
1223
+ data-slot="file-upload-progress"
1224
+ {...progressProps}
1225
+ className={cn(
1226
+ 'relative h-1.5 w-full overflow-hidden rounded-full bg-primary/20',
1227
+ className,
1228
+ )}
1229
+ >
1230
+ <div
1231
+ className="h-full w-full flex-1 bg-primary transition-transform duration-300 ease-linear"
1232
+ style={{
1233
+ transform: `translateX(-${100 - itemContext.fileState.progress}%)`,
1234
+ }}
1235
+ />
1236
+ </ItemProgressPrimitive>
1237
+ );
1238
+ }
1239
+ }
1240
+
1241
+ FileUploadItemProgress.displayName = ITEM_PROGRESS_NAME;
1242
+
1243
+ export function FileUploadItemDelete(props: React.ComponentProps<'button'> & { asChild?: boolean }) {
1244
+ const { asChild, onClick: onClickProp, ...deleteProps } = props;
1245
+
1246
+ const store = useStoreContext(ITEM_DELETE_NAME);
1247
+ const itemContext = useFileUploadItemContext(ITEM_DELETE_NAME);
1248
+
1249
+ const onClick = React.useCallback(
1250
+ (event: React.MouseEvent<HTMLButtonElement>) => {
1251
+ onClickProp?.(event);
1252
+
1253
+ if (!itemContext.fileState || event.defaultPrevented) return;
1254
+
1255
+ store.dispatch({
1256
+ type: 'REMOVE_FILE',
1257
+ file: itemContext.fileState.file,
1258
+ });
1259
+ },
1260
+ [store, itemContext.fileState, onClickProp],
1261
+ );
1262
+
1263
+ if (!itemContext.fileState) return null;
1264
+
1265
+ const ItemDeletePrimitive = asChild ? SlotPrimitive : 'button';
1266
+
1267
+ return (
1268
+ <ItemDeletePrimitive
1269
+ type="button"
1270
+ aria-controls={itemContext.id}
1271
+ aria-describedby={itemContext.nameId}
1272
+ data-slot="file-upload-item-delete"
1273
+ {...deleteProps}
1274
+ onClick={onClick}
1275
+ />
1276
+ );
1277
+ }
1278
+
1279
+ FileUploadItemDelete.displayName = ITEM_DELETE_NAME;
1280
+
1281
+ export function FileUploadClear(props: React.ComponentProps<'button'> & { forceMount?: boolean; asChild?: boolean }) {
1282
+ const {
1283
+ asChild,
1284
+ forceMount,
1285
+ disabled,
1286
+ onClick: onClickProp,
1287
+ ...clearProps
1288
+ } = props;
1289
+
1290
+ const context = useFileUploadContext(CLEAR_NAME);
1291
+ const store = useStoreContext(CLEAR_NAME);
1292
+ const fileCount = useStore((state) => state.files.size);
1293
+
1294
+ const isDisabled = disabled || context.disabled;
1295
+
1296
+ const onClick = React.useCallback(
1297
+ (event: React.MouseEvent<HTMLButtonElement>) => {
1298
+ onClickProp?.(event);
1299
+
1300
+ if (event.defaultPrevented) return;
1301
+
1302
+ store.dispatch({ type: 'CLEAR' });
1303
+ },
1304
+ [store, onClickProp],
1305
+ );
1306
+
1307
+ const shouldRender = forceMount || fileCount > 0;
1308
+
1309
+ if (!shouldRender) return null;
1310
+
1311
+ const ClearPrimitive = asChild ? SlotPrimitive : 'button';
1312
+
1313
+ return (
1314
+ <ClearPrimitive
1315
+ type="button"
1316
+ aria-controls={context.listId}
1317
+ data-slot="file-upload-clear"
1318
+ data-disabled={isDisabled ? '' : undefined}
1319
+ {...clearProps}
1320
+ disabled={isDisabled}
1321
+ onClick={onClick}
1322
+ />
1323
+ );
1324
+ }
1325
+
1326
+ FileUploadClear.displayName = CLEAR_NAME;