@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,1205 @@
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import { Slot } from "@radix-ui/react-slot";
5
+ import { useComposedRefs } from "@djangocfg/ui-core/lib";
6
+ import { cn } from "@djangocfg/ui-core/lib";
7
+ import type { MasonryProps, MasonryItemProps, Positioner, PositionerItem } from "../types";
8
+
9
+ // ============================================================================
10
+ // Interval Tree (red-black tree for efficient range queries)
11
+ // ============================================================================
12
+
13
+ const NODE_COLOR = { RED: 0, BLACK: 1, SENTINEL: 2 } as const;
14
+ type NodeColor = (typeof NODE_COLOR)[keyof typeof NODE_COLOR];
15
+
16
+ const NODE_OPERATION = { REMOVE: 0, PRESERVE: 1 } as const;
17
+ type NodeOperation = (typeof NODE_OPERATION)[keyof typeof NODE_OPERATION];
18
+
19
+ interface ListNode { index: number; high: number; next: ListNode | null; }
20
+ interface TreeNode {
21
+ max: number; low: number; high: number; color: NodeColor;
22
+ parent: TreeNode; right: TreeNode; left: TreeNode; list: ListNode;
23
+ }
24
+ interface Tree { root: TreeNode; size: number; }
25
+
26
+ function addInterval(treeNode: TreeNode, high: number, index: number): boolean {
27
+ let node: ListNode | null = treeNode.list;
28
+ let prevNode: ListNode | undefined;
29
+ while (node) {
30
+ if (node.index === index) return false;
31
+ if (high > node.high) break;
32
+ prevNode = node;
33
+ node = node.next;
34
+ }
35
+ if (!prevNode) treeNode.list = { index, high, next: node };
36
+ if (prevNode) prevNode.next = { index, high, next: prevNode.next };
37
+ return true;
38
+ }
39
+
40
+ function removeInterval(treeNode: TreeNode, index: number): NodeOperation | undefined {
41
+ let node: ListNode | null = treeNode.list;
42
+ if (node.index === index) {
43
+ if (node.next === null) return NODE_OPERATION.REMOVE;
44
+ treeNode.list = node.next;
45
+ return NODE_OPERATION.PRESERVE;
46
+ }
47
+ let prevNode: ListNode | undefined = node;
48
+ node = node.next;
49
+ while (node !== null) {
50
+ if (node.index === index) {
51
+ prevNode.next = node.next;
52
+ return NODE_OPERATION.PRESERVE;
53
+ }
54
+ prevNode = node;
55
+ node = node.next;
56
+ }
57
+ }
58
+
59
+ const SENTINEL_NODE: TreeNode = {
60
+ low: 0, max: 0, high: 0, color: NODE_COLOR.SENTINEL,
61
+ parent: undefined as unknown as TreeNode,
62
+ right: undefined as unknown as TreeNode,
63
+ left: undefined as unknown as TreeNode,
64
+ list: undefined as unknown as ListNode,
65
+ };
66
+ SENTINEL_NODE.parent = SENTINEL_NODE;
67
+ SENTINEL_NODE.left = SENTINEL_NODE;
68
+ SENTINEL_NODE.right = SENTINEL_NODE;
69
+
70
+ function updateMax(node: TreeNode) {
71
+ const max = node.high;
72
+ if (node.left === SENTINEL_NODE && node.right === SENTINEL_NODE) node.max = max;
73
+ else if (node.left === SENTINEL_NODE) node.max = Math.max(node.right.max, max);
74
+ else if (node.right === SENTINEL_NODE) node.max = Math.max(node.left.max, max);
75
+ else node.max = Math.max(Math.max(node.left.max, node.right.max), max);
76
+ }
77
+
78
+ function updateMaxUp(node: TreeNode) {
79
+ let x = node;
80
+ while (x.parent !== SENTINEL_NODE) {
81
+ updateMax(x.parent);
82
+ x = x.parent;
83
+ }
84
+ }
85
+
86
+ function rotateLeft(tree: Tree, x: TreeNode) {
87
+ if (x.right === SENTINEL_NODE) return;
88
+ const y = x.right;
89
+ x.right = y.left;
90
+ if (y.left !== SENTINEL_NODE) y.left.parent = x;
91
+ y.parent = x.parent;
92
+ if (x.parent === SENTINEL_NODE) tree.root = y;
93
+ else if (x === x.parent.left) x.parent.left = y;
94
+ else x.parent.right = y;
95
+ y.left = x;
96
+ x.parent = y;
97
+ updateMax(x);
98
+ updateMax(y);
99
+ }
100
+
101
+ function rotateRight(tree: Tree, x: TreeNode) {
102
+ if (x.left === SENTINEL_NODE) return;
103
+ const y = x.left;
104
+ x.left = y.right;
105
+ if (y.right !== SENTINEL_NODE) y.right.parent = x;
106
+ y.parent = x.parent;
107
+ if (x.parent === SENTINEL_NODE) tree.root = y;
108
+ else if (x === x.parent.right) x.parent.right = y;
109
+ else x.parent.left = y;
110
+ y.right = x;
111
+ x.parent = y;
112
+ updateMax(x);
113
+ updateMax(y);
114
+ }
115
+
116
+ function replaceNode(tree: Tree, x: TreeNode, y: TreeNode) {
117
+ if (x.parent === SENTINEL_NODE) tree.root = y;
118
+ else if (x === x.parent.left) x.parent.left = y;
119
+ else x.parent.right = y;
120
+ y.parent = x.parent;
121
+ }
122
+
123
+ function fixRemove(tree: Tree, node: TreeNode) {
124
+ let x = node;
125
+ let w: TreeNode;
126
+ while (x !== SENTINEL_NODE && x.color === NODE_COLOR.BLACK) {
127
+ if (x === x.parent.left) {
128
+ w = x.parent.right;
129
+ if (w.color === NODE_COLOR.RED) {
130
+ w.color = NODE_COLOR.BLACK;
131
+ x.parent.color = NODE_COLOR.RED;
132
+ rotateLeft(tree, x.parent);
133
+ w = x.parent.right;
134
+ }
135
+ if (w.left.color === NODE_COLOR.BLACK && w.right.color === NODE_COLOR.BLACK) {
136
+ w.color = NODE_COLOR.RED;
137
+ x = x.parent;
138
+ } else {
139
+ if (w.right.color === NODE_COLOR.BLACK) {
140
+ w.left.color = NODE_COLOR.BLACK;
141
+ w.color = NODE_COLOR.RED;
142
+ rotateRight(tree, w);
143
+ w = x.parent.right;
144
+ }
145
+ w.color = x.parent.color;
146
+ x.parent.color = NODE_COLOR.BLACK;
147
+ w.right.color = NODE_COLOR.BLACK;
148
+ rotateLeft(tree, x.parent);
149
+ x = tree.root;
150
+ }
151
+ } else {
152
+ w = x.parent.left;
153
+ if (w.color === NODE_COLOR.RED) {
154
+ w.color = NODE_COLOR.BLACK;
155
+ x.parent.color = NODE_COLOR.RED;
156
+ rotateRight(tree, x.parent);
157
+ w = x.parent.left;
158
+ }
159
+ if (w.right.color === NODE_COLOR.BLACK && w.left.color === NODE_COLOR.BLACK) {
160
+ w.color = NODE_COLOR.RED;
161
+ x = x.parent;
162
+ } else {
163
+ if (w.left.color === NODE_COLOR.BLACK) {
164
+ w.right.color = NODE_COLOR.BLACK;
165
+ w.color = NODE_COLOR.RED;
166
+ rotateLeft(tree, w);
167
+ w = x.parent.left;
168
+ }
169
+ w.color = x.parent.color;
170
+ x.parent.color = NODE_COLOR.BLACK;
171
+ w.left.color = NODE_COLOR.BLACK;
172
+ rotateRight(tree, x.parent);
173
+ x = tree.root;
174
+ }
175
+ }
176
+ }
177
+ x.color = NODE_COLOR.BLACK;
178
+ }
179
+
180
+ function minimumTree(node: TreeNode) {
181
+ let current = node;
182
+ while (current.left !== SENTINEL_NODE) current = current.left;
183
+ return current;
184
+ }
185
+
186
+ function fixInsert(tree: Tree, node: TreeNode) {
187
+ let current = node;
188
+ let y: TreeNode;
189
+ while (current.parent.color === NODE_COLOR.RED) {
190
+ if (current.parent === current.parent.parent.left) {
191
+ y = current.parent.parent.right;
192
+ if (y.color === NODE_COLOR.RED) {
193
+ current.parent.color = NODE_COLOR.BLACK;
194
+ y.color = NODE_COLOR.BLACK;
195
+ current.parent.parent.color = NODE_COLOR.RED;
196
+ current = current.parent.parent;
197
+ } else {
198
+ if (current === current.parent.right) {
199
+ current = current.parent;
200
+ rotateLeft(tree, current);
201
+ }
202
+ current.parent.color = NODE_COLOR.BLACK;
203
+ current.parent.parent.color = NODE_COLOR.RED;
204
+ rotateRight(tree, current.parent.parent);
205
+ }
206
+ } else {
207
+ y = current.parent.parent.left;
208
+ if (y.color === NODE_COLOR.RED) {
209
+ current.parent.color = NODE_COLOR.BLACK;
210
+ y.color = NODE_COLOR.BLACK;
211
+ current.parent.parent.color = NODE_COLOR.RED;
212
+ current = current.parent.parent;
213
+ } else {
214
+ if (current === current.parent.left) {
215
+ current = current.parent;
216
+ rotateRight(tree, current);
217
+ }
218
+ current.parent.color = NODE_COLOR.BLACK;
219
+ current.parent.parent.color = NODE_COLOR.RED;
220
+ rotateLeft(tree, current.parent.parent);
221
+ }
222
+ }
223
+ }
224
+ tree.root.color = NODE_COLOR.BLACK;
225
+ }
226
+
227
+ interface IntervalTree {
228
+ insert(low: number, high: number, index: number): void;
229
+ remove(index: number): void;
230
+ search(low: number, high: number, onCallback: (index: number, low: number) => void): void;
231
+ size: number;
232
+ }
233
+
234
+ function createIntervalTree(): IntervalTree {
235
+ const tree: Tree = { root: SENTINEL_NODE, size: 0 };
236
+ const indexMap: Record<number, TreeNode> = {};
237
+
238
+ return {
239
+ insert(low, high, index) {
240
+ let x: TreeNode = tree.root;
241
+ let y: TreeNode = SENTINEL_NODE;
242
+ while (x !== SENTINEL_NODE) {
243
+ y = x;
244
+ if (low === y.low) break;
245
+ if (low < x.low) x = x.left;
246
+ else x = x.right;
247
+ }
248
+ if (low === y.low && y !== SENTINEL_NODE) {
249
+ if (!addInterval(y, high, index)) return;
250
+ y.high = Math.max(y.high, high);
251
+ updateMax(y);
252
+ updateMaxUp(y);
253
+ indexMap[index] = y;
254
+ tree.size++;
255
+ return;
256
+ }
257
+ const z: TreeNode = {
258
+ low, high, max: high, color: NODE_COLOR.RED, parent: y,
259
+ left: SENTINEL_NODE, right: SENTINEL_NODE,
260
+ list: { index, high, next: null },
261
+ };
262
+ if (y === SENTINEL_NODE) {
263
+ tree.root = z;
264
+ } else {
265
+ if (z.low < y.low) y.left = z;
266
+ else y.right = z;
267
+ updateMaxUp(z);
268
+ }
269
+ fixInsert(tree, z);
270
+ indexMap[index] = z;
271
+ tree.size++;
272
+ },
273
+
274
+ remove(index) {
275
+ const z = indexMap[index];
276
+ if (z === void 0) return;
277
+ delete indexMap[index];
278
+ const intervalResult = removeInterval(z, index);
279
+ if (intervalResult === void 0) return;
280
+ if (intervalResult === NODE_OPERATION.PRESERVE) {
281
+ z.high = z.list.high;
282
+ updateMax(z);
283
+ updateMaxUp(z);
284
+ tree.size--;
285
+ return;
286
+ }
287
+ let y = z;
288
+ let originalYColor = y.color;
289
+ let x: TreeNode;
290
+ if (z.left === SENTINEL_NODE) {
291
+ x = z.right;
292
+ replaceNode(tree, z, z.right);
293
+ } else if (z.right === SENTINEL_NODE) {
294
+ x = z.left;
295
+ replaceNode(tree, z, z.left);
296
+ } else {
297
+ y = minimumTree(z.right);
298
+ originalYColor = y.color;
299
+ x = y.right;
300
+ if (y.parent === z) {
301
+ x.parent = y;
302
+ } else {
303
+ replaceNode(tree, y, y.right);
304
+ y.right = z.right;
305
+ y.right.parent = y;
306
+ }
307
+ replaceNode(tree, z, y);
308
+ y.left = z.left;
309
+ y.left.parent = y;
310
+ y.color = z.color;
311
+ }
312
+ updateMax(x);
313
+ updateMaxUp(x);
314
+ if (originalYColor === NODE_COLOR.BLACK) fixRemove(tree, x);
315
+ tree.size--;
316
+ },
317
+
318
+ search(low, high, onCallback) {
319
+ const stack = [tree.root];
320
+ while (stack.length !== 0) {
321
+ const node = stack.pop();
322
+ if (!node) continue;
323
+ if (node === SENTINEL_NODE || low > node.max) continue;
324
+ if (node.left !== SENTINEL_NODE) stack.push(node.left);
325
+ if (node.right !== SENTINEL_NODE) stack.push(node.right);
326
+ if (node.low <= high && node.high >= low) {
327
+ let curr: ListNode | null = node.list;
328
+ while (curr !== null) {
329
+ if (curr.high >= low) onCallback(curr.index, node.low);
330
+ curr = curr.next;
331
+ }
332
+ }
333
+ }
334
+ },
335
+
336
+ get size() {
337
+ return tree.size;
338
+ },
339
+ };
340
+ }
341
+
342
+ // ============================================================================
343
+ // Positioner
344
+ // ============================================================================
345
+
346
+ const COLUMN_WIDTH = 200;
347
+ const GAP = 0;
348
+ const ITEM_HEIGHT = 300;
349
+
350
+ interface UsePositionerOptions {
351
+ width: number;
352
+ columnWidth?: number;
353
+ columnGap?: number;
354
+ rowGap?: number;
355
+ columnCount?: number;
356
+ maxColumnCount?: number;
357
+ linear?: boolean;
358
+ }
359
+
360
+ function usePositioner(
361
+ { width, columnWidth = COLUMN_WIDTH, columnGap = GAP, rowGap, columnCount, maxColumnCount, linear = false }: UsePositionerOptions,
362
+ deps: React.DependencyList = [],
363
+ ): Positioner {
364
+ const initPositioner = React.useCallback((): Positioner => {
365
+ function binarySearch(a: number[], y: number): number {
366
+ let l = 0;
367
+ let h = a.length - 1;
368
+ while (l <= h) {
369
+ const m = (l + h) >>> 1;
370
+ const x = a[m];
371
+ if (x === y) return m;
372
+ if (x === undefined || x <= y) l = m + 1;
373
+ else h = m - 1;
374
+ }
375
+ return -1;
376
+ }
377
+
378
+ const computedColumnCount =
379
+ columnCount ||
380
+ Math.min(
381
+ Math.floor((width + columnGap) / (columnWidth + columnGap)),
382
+ maxColumnCount || Number.POSITIVE_INFINITY,
383
+ ) ||
384
+ 1;
385
+ const computedColumnWidth = Math.floor(
386
+ (width - columnGap * (computedColumnCount - 1)) / computedColumnCount,
387
+ );
388
+
389
+ const intervalTree = createIntervalTree();
390
+ const columnHeights: number[] = new Array(computedColumnCount).fill(0);
391
+ const items: (PositionerItem | undefined)[] = [];
392
+ const columnItems: number[][] = new Array(computedColumnCount).fill(0).map(() => []);
393
+
394
+ for (let i = 0; i < computedColumnCount; i++) {
395
+ columnHeights[i] = 0;
396
+ columnItems[i] = [];
397
+ }
398
+
399
+ return {
400
+ columnCount: computedColumnCount,
401
+ columnWidth: computedColumnWidth,
402
+ set: (index: number, height = 0) => {
403
+ let columnIndex = 0;
404
+ if (linear) {
405
+ const preferredColumn = index % computedColumnCount;
406
+ let shortestHeight = columnHeights[0] ?? 0;
407
+ let tallestHeight = shortestHeight;
408
+ let shortestIndex = 0;
409
+ for (let i = 0; i < columnHeights.length; i++) {
410
+ const currentHeight = columnHeights[i] ?? 0;
411
+ if (currentHeight < shortestHeight) {
412
+ shortestHeight = currentHeight;
413
+ shortestIndex = i;
414
+ }
415
+ if (currentHeight > tallestHeight) tallestHeight = currentHeight;
416
+ }
417
+ const preferredHeight = (columnHeights[preferredColumn] ?? 0) + height;
418
+ const maxAllowedHeight = shortestHeight + height * 2.5;
419
+ columnIndex = preferredHeight <= maxAllowedHeight ? preferredColumn : shortestIndex;
420
+ } else {
421
+ for (let i = 1; i < columnHeights.length; i++) {
422
+ const currentHeight = columnHeights[i];
423
+ const shortestHeight = columnHeights[columnIndex];
424
+ if (currentHeight !== undefined && shortestHeight !== undefined && currentHeight < shortestHeight) {
425
+ columnIndex = i;
426
+ }
427
+ }
428
+ }
429
+
430
+ const columnHeight = columnHeights[columnIndex];
431
+ if (columnHeight === undefined) return;
432
+
433
+ const top = columnHeight;
434
+ columnHeights[columnIndex] = top + height + (rowGap ?? columnGap);
435
+
436
+ const columnItemsList = columnItems[columnIndex];
437
+ if (!columnItemsList) return;
438
+ columnItemsList.push(index);
439
+
440
+ items[index] = {
441
+ left: columnIndex * (computedColumnWidth + columnGap),
442
+ top,
443
+ height,
444
+ columnIndex,
445
+ };
446
+ intervalTree.insert(top, top + height, index);
447
+ },
448
+ get: (index: number) => items[index],
449
+ update: (updates: number[]) => {
450
+ const columns: (number | undefined)[] = new Array(computedColumnCount);
451
+ let i = 0;
452
+ let j = 0;
453
+
454
+ for (; i < updates.length - 1; i++) {
455
+ const currentIndex = updates[i];
456
+ if (typeof currentIndex !== "number") continue;
457
+ const item = items[currentIndex];
458
+ if (!item) continue;
459
+ const nextHeight = updates[++i];
460
+ if (typeof nextHeight !== "number") continue;
461
+ item.height = nextHeight;
462
+ intervalTree.remove(currentIndex);
463
+ intervalTree.insert(item.top, item.top + item.height, currentIndex);
464
+ columns[item.columnIndex] =
465
+ columns[item.columnIndex] === void 0
466
+ ? currentIndex
467
+ : Math.min(currentIndex, columns[item.columnIndex] ?? currentIndex);
468
+ }
469
+
470
+ for (i = 0; i < columns.length; i++) {
471
+ const currentColumn = columns[i];
472
+ if (currentColumn === void 0) continue;
473
+ const itemsInColumn = columnItems[i];
474
+ if (!itemsInColumn) continue;
475
+ const startIndex = binarySearch(itemsInColumn, currentColumn);
476
+ if (startIndex === -1) continue;
477
+ const currentItemIndex = itemsInColumn[startIndex];
478
+ if (typeof currentItemIndex !== "number") continue;
479
+ const startItem = items[currentItemIndex];
480
+ if (!startItem) continue;
481
+ const currentHeight = columnHeights[i];
482
+ if (typeof currentHeight !== "number") continue;
483
+ columnHeights[i] = startItem.top + startItem.height + (rowGap ?? columnGap);
484
+
485
+ for (j = startIndex + 1; j < itemsInColumn.length; j++) {
486
+ const currentIndex = itemsInColumn[j];
487
+ if (typeof currentIndex !== "number") continue;
488
+ const item = items[currentIndex];
489
+ if (!item) continue;
490
+ const columnHeight = columnHeights[i];
491
+ if (typeof columnHeight !== "number") continue;
492
+ item.top = columnHeight;
493
+ columnHeights[i] = item.top + item.height + (rowGap ?? columnGap);
494
+ intervalTree.remove(currentIndex);
495
+ intervalTree.insert(item.top, item.top + item.height, currentIndex);
496
+ }
497
+ }
498
+ },
499
+ range: (low, high, onItemRender) =>
500
+ intervalTree.search(low, high, (index: number, top: number) => {
501
+ const item = items[index];
502
+ if (!item) return;
503
+ onItemRender(index, item.left, top);
504
+ }),
505
+ estimateHeight: (itemCount, defaultItemHeight): number => {
506
+ const tallestColumn = Math.max(0, Math.max.apply(null, columnHeights));
507
+ return itemCount === intervalTree.size
508
+ ? tallestColumn
509
+ : tallestColumn +
510
+ Math.ceil((itemCount - intervalTree.size) / computedColumnCount) * defaultItemHeight;
511
+ },
512
+ shortestColumn: () => {
513
+ if (columnHeights.length > 1) return Math.min.apply(null, columnHeights);
514
+ return columnHeights[0] ?? 0;
515
+ },
516
+ size(): number {
517
+ return intervalTree.size;
518
+ },
519
+ all(): PositionerItem[] {
520
+ return items.filter(Boolean) as PositionerItem[];
521
+ },
522
+ };
523
+ }, [width, columnWidth, columnGap, rowGap, columnCount, maxColumnCount, linear]);
524
+
525
+ const positionerRef = React.useRef<Positioner | null>(null);
526
+ if (positionerRef.current === null) positionerRef.current = initPositioner();
527
+
528
+ const prevDepsRef = React.useRef(deps);
529
+ const opts = [width, columnWidth, columnGap, rowGap, columnCount, maxColumnCount, linear];
530
+ const prevOptsRef = React.useRef(opts);
531
+ const optsChanged = !opts.every((item, i) => prevOptsRef.current[i] === item);
532
+
533
+ if (optsChanged || !deps.every((item, i) => prevDepsRef.current[i] === item)) {
534
+ const prevPositioner = positionerRef.current;
535
+ const positioner = initPositioner();
536
+ prevDepsRef.current = deps;
537
+ prevOptsRef.current = opts;
538
+
539
+ if (optsChanged) {
540
+ const cacheSize = prevPositioner.size();
541
+ for (let index = 0; index < cacheSize; index++) {
542
+ const pos = prevPositioner.get(index);
543
+ positioner.set(index, pos !== void 0 ? pos.height : 0);
544
+ }
545
+ }
546
+
547
+ positionerRef.current = positioner;
548
+ }
549
+
550
+ return positionerRef.current;
551
+ }
552
+
553
+ // ============================================================================
554
+ // Hooks
555
+ // ============================================================================
556
+
557
+ const DEBOUNCE_DELAY = 300;
558
+ const SCROLL_FPS = 12;
559
+
560
+ interface DebouncedWindowSizeOptions {
561
+ containerRef: React.RefObject<HTMLDivElement | null>;
562
+ defaultWidth?: number;
563
+ defaultHeight?: number;
564
+ delayMs?: number;
565
+ }
566
+
567
+ function useDebouncedWindowSize(options: DebouncedWindowSizeOptions) {
568
+ const { containerRef, defaultWidth = 0, defaultHeight = 0, delayMs = DEBOUNCE_DELAY } = options;
569
+
570
+ const getDocumentSize = React.useCallback(() => {
571
+ if (typeof document === "undefined") {
572
+ return { width: defaultWidth, height: defaultHeight };
573
+ }
574
+ return {
575
+ width: document.documentElement.clientWidth,
576
+ height: document.documentElement.clientHeight,
577
+ };
578
+ }, [defaultWidth, defaultHeight]);
579
+
580
+ const [size, setSize] = React.useState(getDocumentSize());
581
+ const timeoutRef = React.useRef<NodeJS.Timeout | null>(null);
582
+
583
+ const setDebouncedSize = React.useCallback(
584
+ (value: { width: number; height: number }) => {
585
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
586
+ timeoutRef.current = setTimeout(() => {
587
+ setSize(value);
588
+ }, delayMs);
589
+ },
590
+ [delayMs],
591
+ );
592
+
593
+ React.useEffect(() => {
594
+ function onResize() {
595
+ if (containerRef.current) {
596
+ setDebouncedSize({
597
+ width: containerRef.current.offsetWidth,
598
+ height: document.documentElement.clientHeight,
599
+ });
600
+ } else {
601
+ setDebouncedSize(getDocumentSize());
602
+ }
603
+ }
604
+ window?.addEventListener("resize", onResize, { passive: true });
605
+ window?.addEventListener("orientationchange", onResize);
606
+ window.visualViewport?.addEventListener("resize", onResize);
607
+ return () => {
608
+ window?.removeEventListener("resize", onResize);
609
+ window?.removeEventListener("orientationchange", onResize);
610
+ window.visualViewport?.removeEventListener("resize", onResize);
611
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
612
+ };
613
+ }, [setDebouncedSize, containerRef, getDocumentSize]);
614
+
615
+ return size;
616
+ }
617
+
618
+ function useLazyRef<T>(init: () => T): React.RefObject<T> {
619
+ const ref = React.useRef<T | null>(null);
620
+ if (ref.current === null) {
621
+ ref.current = init();
622
+ }
623
+ return ref as React.RefObject<T>;
624
+ }
625
+
626
+ type OnRafScheduleReturn<T extends unknown[]> = { (...args: T): void; cancel: () => void };
627
+
628
+ function onRafSchedule<T extends unknown[]>(callback: (...args: T) => void): OnRafScheduleReturn<T> {
629
+ let lastArgs: T = [] as unknown as T;
630
+ let frameId: number | null = null;
631
+ function onCallback(...args: T) {
632
+ lastArgs = args;
633
+ if (frameId === null) {
634
+ frameId = requestAnimationFrame(() => {
635
+ frameId = null;
636
+ callback(...lastArgs);
637
+ });
638
+ }
639
+ }
640
+ onCallback.cancel = () => {
641
+ if (frameId === null) return;
642
+ cancelAnimationFrame(frameId);
643
+ frameId = null;
644
+ };
645
+ return onCallback;
646
+ }
647
+
648
+ function useResizeObserver(positioner: Positioner) {
649
+ const [, setLayoutVersion] = React.useState(0);
650
+
651
+ const createResizeObserver = React.useMemo(() => {
652
+ if (typeof window === "undefined") {
653
+ return () => ({ disconnect: () => {}, observe: () => {}, unobserve: () => {} });
654
+ }
655
+
656
+ const cache = new WeakMap<object, ResizeObserver>();
657
+
658
+ return (positioner: Positioner, onUpdate: () => void) => {
659
+ const key = { positioner, onUpdate };
660
+ if (cache.has(key)) return cache.get(key)!;
661
+
662
+ const updates: number[] = [];
663
+ const itemMap = new WeakMap<Element, number>();
664
+
665
+ const update = onRafSchedule(() => {
666
+ if (updates.length > 0) {
667
+ positioner.update(updates);
668
+ onUpdate();
669
+ }
670
+ updates.length = 0;
671
+ });
672
+
673
+ function onItemResize(target: HTMLDivElement) {
674
+ const height = target.offsetHeight;
675
+ if (height > 0) {
676
+ const index = itemMap.get(target);
677
+ if (index !== void 0) {
678
+ const pos = positioner.get(index);
679
+ if (pos !== void 0 && height !== pos.height) {
680
+ updates.push(index, height);
681
+ }
682
+ }
683
+ }
684
+ update();
685
+ }
686
+
687
+ const scheduledItemMap = new Map<number, OnRafScheduleReturn<[HTMLDivElement]>>();
688
+ function onResizeObserver(entries: ResizeObserverEntry[]) {
689
+ for (const entry of entries) {
690
+ if (!entry) continue;
691
+ const index = itemMap.get(entry.target);
692
+ if (index === void 0) continue;
693
+ let handler = scheduledItemMap.get(index);
694
+ if (!handler) {
695
+ handler = onRafSchedule(onItemResize);
696
+ scheduledItemMap.set(index, handler);
697
+ }
698
+ handler(entry.target as HTMLDivElement);
699
+ }
700
+ }
701
+
702
+ const observer = new ResizeObserver(onResizeObserver);
703
+ const disconnect = observer.disconnect.bind(observer);
704
+ observer.disconnect = () => {
705
+ disconnect();
706
+ for (const [, scheduleItem] of scheduledItemMap) {
707
+ scheduleItem.cancel();
708
+ }
709
+ };
710
+
711
+ cache.set(key, observer);
712
+ return observer;
713
+ };
714
+ }, []);
715
+
716
+ const resizeObserver = createResizeObserver(positioner, () =>
717
+ setLayoutVersion((prev) => prev + 1),
718
+ );
719
+
720
+ React.useEffect(() => () => resizeObserver.disconnect(), [resizeObserver]);
721
+
722
+ return resizeObserver;
723
+ }
724
+
725
+ function useThrottle<State>(
726
+ initialState: State | (() => State),
727
+ options: { fps?: number; leading?: boolean } = {},
728
+ ): [State, React.Dispatch<React.SetStateAction<State>>] {
729
+ const { fps = 30, leading = false } = options;
730
+ const [state, setState] = React.useState(initialState);
731
+ const latestSetState = React.useRef(setState);
732
+ latestSetState.current = setState;
733
+
734
+ const ms = 1000 / fps;
735
+ const prevCountRef = React.useRef(0);
736
+ const trailingTimeout = React.useRef<ReturnType<typeof setTimeout> | null>(null);
737
+
738
+ const clearTrailing = React.useCallback(() => {
739
+ if (trailingTimeout.current) clearTimeout(trailingTimeout.current);
740
+ }, []);
741
+
742
+ React.useEffect(() => {
743
+ return () => {
744
+ prevCountRef.current = 0;
745
+ clearTrailing();
746
+ };
747
+ }, [clearTrailing]);
748
+
749
+ const throttledSetState = React.useCallback(
750
+ (action: React.SetStateAction<State>) => {
751
+ const perf = typeof performance !== "undefined" ? performance : Date;
752
+ const now = () => perf.now();
753
+ const rightNow = now();
754
+ const call = () => {
755
+ prevCountRef.current = rightNow;
756
+ clearTrailing();
757
+ latestSetState.current(action);
758
+ };
759
+ const current = prevCountRef.current;
760
+
761
+ if (leading && current === 0) return call();
762
+ if (rightNow - current > ms) {
763
+ if (current > 0) return call();
764
+ prevCountRef.current = rightNow;
765
+ }
766
+
767
+ clearTrailing();
768
+ trailingTimeout.current = setTimeout(() => {
769
+ call();
770
+ prevCountRef.current = 0;
771
+ }, ms);
772
+ },
773
+ [leading, ms, clearTrailing],
774
+ );
775
+
776
+ return [state, throttledSetState];
777
+ }
778
+
779
+ function useScroller({
780
+ offset = 0,
781
+ fps = SCROLL_FPS,
782
+ }: { offset?: number; fps?: number } = {}): { scrollTop: number; isScrolling: boolean } {
783
+ const [scrollY, setScrollY] = useThrottle(
784
+ typeof globalThis.window === "undefined"
785
+ ? 0
786
+ : (globalThis.window.scrollY ?? document.documentElement.scrollTop ?? 0),
787
+ { fps, leading: true },
788
+ );
789
+
790
+ const onScroll = React.useCallback(() => {
791
+ setScrollY(globalThis.window.scrollY ?? document.documentElement.scrollTop ?? 0);
792
+ }, [setScrollY]);
793
+
794
+ React.useEffect(() => {
795
+ if (typeof globalThis.window === "undefined") return;
796
+ globalThis.window.addEventListener("scroll", onScroll, { passive: true });
797
+ return () => globalThis.window.removeEventListener("scroll", onScroll);
798
+ }, [onScroll]);
799
+
800
+ const [isScrolling, setIsScrolling] = React.useState(false);
801
+ const hasMountedRef = React.useRef(0);
802
+
803
+ React.useEffect(() => {
804
+ if (hasMountedRef.current === 1) setIsScrolling(true);
805
+ let didUnsubscribe = false;
806
+
807
+ function requestTimeout(fn: () => void, delay: number) {
808
+ const start = performance.now();
809
+ const handle = {
810
+ id: requestAnimationFrame(function tick(timestamp) {
811
+ if (timestamp - start >= delay) fn();
812
+ else handle.id = requestAnimationFrame(tick);
813
+ }),
814
+ };
815
+ return handle;
816
+ }
817
+
818
+ const timeout = requestTimeout(() => {
819
+ if (didUnsubscribe) return;
820
+ setIsScrolling(false);
821
+ }, 40 + 1000 / fps);
822
+ hasMountedRef.current = 1;
823
+ return () => {
824
+ didUnsubscribe = true;
825
+ cancelAnimationFrame(timeout.id);
826
+ };
827
+ }, [fps, scrollY]);
828
+
829
+ return { scrollTop: Math.max(0, scrollY - offset), isScrolling };
830
+ }
831
+
832
+ // ============================================================================
833
+ // Masonry Components
834
+ // ============================================================================
835
+
836
+ const ROOT_NAME = "MasonryRoot";
837
+ const VIEWPORT_NAME = "MasonryViewport";
838
+ const ITEM_NAME = "MasonryItem";
839
+
840
+ const MASONRY_ERROR = {
841
+ [ROOT_NAME]: `\`${ROOT_NAME}\` components must be within \`${ROOT_NAME}\``,
842
+ [VIEWPORT_NAME]: `\`${VIEWPORT_NAME}\` components must be within \`${ROOT_NAME}\``,
843
+ [ITEM_NAME]: `\`${ITEM_NAME}\` must be within \`${VIEWPORT_NAME}\``,
844
+ } as const;
845
+
846
+ type RootElement = React.ComponentRef<typeof Masonry>;
847
+ type ItemElement = React.ComponentRef<typeof MasonryItem>;
848
+
849
+ interface MasonryContextValue {
850
+ positioner: Positioner;
851
+ resizeObserver?: ResizeObserver;
852
+ columnWidth: number;
853
+ onItemRegister: (index: number) => (node: ItemElement | null) => void;
854
+ scrollTop: number;
855
+ windowHeight: number;
856
+ itemHeight: number;
857
+ overscan: number;
858
+ isScrolling?: boolean;
859
+ fallback?: React.ReactNode;
860
+ }
861
+
862
+ const MasonryContext = React.createContext<MasonryContextValue | null>(null);
863
+
864
+ function useMasonryContext(name: keyof typeof MASONRY_ERROR) {
865
+ const context = React.useContext(MasonryContext);
866
+ if (!context) {
867
+ throw new Error(MASONRY_ERROR[name]);
868
+ }
869
+ return context;
870
+ }
871
+
872
+ const OVERSCAN = 2;
873
+
874
+ function Masonry(props: MasonryProps) {
875
+ const {
876
+ columnWidth = COLUMN_WIDTH,
877
+ columnCount,
878
+ maxColumnCount,
879
+ gap = GAP,
880
+ itemHeight = ITEM_HEIGHT,
881
+ defaultWidth,
882
+ defaultHeight,
883
+ overscan = OVERSCAN,
884
+ scrollFps = SCROLL_FPS,
885
+ fallback,
886
+ linear = false,
887
+ asChild,
888
+ children,
889
+ style,
890
+ ref,
891
+ ...rootProps
892
+ } = props;
893
+
894
+ const gapValue = typeof gap === "object" ? gap : { column: gap, row: gap };
895
+ const columnGap = gapValue.column;
896
+ const rowGap = gapValue.row;
897
+
898
+ const containerRef = React.useRef<RootElement | null>(null);
899
+ const composedRef = useComposedRefs(ref, containerRef);
900
+
901
+ const size = useDebouncedWindowSize({
902
+ containerRef,
903
+ defaultWidth,
904
+ defaultHeight,
905
+ delayMs: DEBOUNCE_DELAY,
906
+ });
907
+
908
+ const [containerPosition, setContainerPosition] = React.useState<{ offset: number; width: number }>({
909
+ offset: 0,
910
+ width: 0,
911
+ });
912
+
913
+ const useIsomorphicLayoutEffect = typeof window !== "undefined" ? React.useLayoutEffect : React.useEffect;
914
+
915
+ useIsomorphicLayoutEffect(() => {
916
+ if (!containerRef.current) return;
917
+ let offset = 0;
918
+ let container = containerRef.current;
919
+ do {
920
+ offset += container.offsetTop ?? 0;
921
+ container = container.offsetParent as RootElement;
922
+ } while (container);
923
+
924
+ if (
925
+ offset !== containerPosition.offset ||
926
+ containerRef.current.offsetWidth !== containerPosition.width
927
+ ) {
928
+ setContainerPosition({
929
+ offset,
930
+ width: containerRef.current.offsetWidth,
931
+ });
932
+ }
933
+ }, [containerPosition, size]);
934
+
935
+ const positioner = usePositioner({
936
+ width: containerPosition.width ?? size.width,
937
+ columnWidth,
938
+ columnGap,
939
+ rowGap,
940
+ columnCount,
941
+ maxColumnCount,
942
+ linear,
943
+ });
944
+ const resizeObserver = useResizeObserver(positioner);
945
+ const { scrollTop, isScrolling } = useScroller({
946
+ offset: containerPosition.offset,
947
+ fps: scrollFps,
948
+ });
949
+
950
+ const itemMap = React.useRef(new WeakMap<ItemElement, number>()).current;
951
+
952
+ const onItemRegister = React.useCallback(
953
+ (index: number) => (node: ItemElement | null) => {
954
+ if (!node) return;
955
+ itemMap.set(node, index);
956
+ if (resizeObserver) {
957
+ resizeObserver.observe(node);
958
+ }
959
+ if (positioner.get(index) === void 0) {
960
+ positioner.set(index, node.offsetHeight);
961
+ }
962
+ },
963
+ [itemMap, positioner, resizeObserver],
964
+ );
965
+
966
+ const contextValue = React.useMemo<MasonryContextValue>(
967
+ () => ({
968
+ positioner,
969
+ resizeObserver,
970
+ columnWidth: positioner.columnWidth,
971
+ onItemRegister,
972
+ scrollTop,
973
+ windowHeight: size.height,
974
+ itemHeight,
975
+ overscan,
976
+ fallback,
977
+ isScrolling,
978
+ }),
979
+ [positioner, resizeObserver, onItemRegister, scrollTop, size.height, itemHeight, overscan, fallback, isScrolling],
980
+ );
981
+
982
+ const RootPrimitive = asChild ? Slot : "div";
983
+
984
+ return (
985
+ <MasonryContext.Provider value={contextValue}>
986
+ <RootPrimitive
987
+ {...rootProps}
988
+ data-slot="masonry"
989
+ ref={composedRef}
990
+ style={{
991
+ position: "relative",
992
+ width: "100%",
993
+ height: "100%",
994
+ ...style,
995
+ }}
996
+ >
997
+ <MasonryViewport>{children}</MasonryViewport>
998
+ </RootPrimitive>
999
+ </MasonryContext.Provider>
1000
+ );
1001
+ }
1002
+
1003
+ interface MasonryItemPropsWithRef extends MasonryItemProps {
1004
+ ref: React.Ref<ItemElement | null>;
1005
+ }
1006
+
1007
+ function MasonryViewport(props: React.ComponentProps<"div">) {
1008
+ const { children, style, ref, ...viewportProps } = props;
1009
+ const context = useMasonryContext(VIEWPORT_NAME);
1010
+ const [layoutVersion, setLayoutVersion] = React.useState(0);
1011
+ const rafId = React.useRef<number | null>(null);
1012
+ const [mounted, setMounted] = React.useState(false);
1013
+
1014
+ const useIsomorphicLayoutEffect = typeof window !== "undefined" ? React.useLayoutEffect : React.useEffect;
1015
+
1016
+ useIsomorphicLayoutEffect(() => {
1017
+ setMounted(true);
1018
+ }, []);
1019
+
1020
+ let startIndex = 0;
1021
+ let stopIndex: number | undefined;
1022
+
1023
+ const validChildren = React.Children.toArray(children).filter(
1024
+ (child): child is React.ReactElement<MasonryItemPropsWithRef> =>
1025
+ React.isValidElement(child) && (child.type === MasonryItem || child.type === MasonryItem),
1026
+ );
1027
+ const itemCount = validChildren.length;
1028
+
1029
+ const shortestColumnSize = context.positioner.shortestColumn();
1030
+ const measuredCount = context.positioner.size();
1031
+ const overscanPixels = context.windowHeight * context.overscan;
1032
+ const rangeStart = Math.max(0, context.scrollTop - overscanPixels / 2);
1033
+ const rangeEnd = context.scrollTop + overscanPixels;
1034
+ const layoutOutdated = shortestColumnSize < rangeEnd && measuredCount < itemCount;
1035
+
1036
+ const positionedChildren: React.ReactElement[] = [];
1037
+
1038
+ const visibleItemStyle = React.useMemo(
1039
+ (): React.CSSProperties => ({
1040
+ position: "absolute",
1041
+ writingMode: "horizontal-tb",
1042
+ visibility: "visible",
1043
+ width: context.columnWidth,
1044
+ transform: context.isScrolling ? "translateZ(0)" : undefined,
1045
+ willChange: context.isScrolling ? "transform" : undefined,
1046
+ }),
1047
+ [context.columnWidth, context.isScrolling],
1048
+ );
1049
+
1050
+ const hiddenItemStyle = React.useMemo(
1051
+ (): React.CSSProperties => ({
1052
+ position: "absolute",
1053
+ writingMode: "horizontal-tb",
1054
+ visibility: "hidden",
1055
+ width: context.columnWidth,
1056
+ zIndex: -1000,
1057
+ }),
1058
+ [context.columnWidth],
1059
+ );
1060
+
1061
+ context.positioner.range(rangeStart, rangeEnd, (index, left, top) => {
1062
+ const child = validChildren[index];
1063
+ if (!child) return;
1064
+
1065
+ const itemStyle = {
1066
+ ...visibleItemStyle,
1067
+ top,
1068
+ left,
1069
+ ...child.props.style,
1070
+ };
1071
+
1072
+ positionedChildren.push(
1073
+ React.cloneElement(child, {
1074
+ key: child.key ?? index,
1075
+ ref: context.onItemRegister(index),
1076
+ style: itemStyle,
1077
+ }),
1078
+ );
1079
+
1080
+ if (stopIndex === undefined) {
1081
+ startIndex = index;
1082
+ stopIndex = index;
1083
+ } else {
1084
+ startIndex = Math.min(startIndex, index);
1085
+ stopIndex = Math.max(stopIndex, index);
1086
+ }
1087
+ });
1088
+
1089
+ if (layoutOutdated && mounted) {
1090
+ const batchSize = Math.min(
1091
+ itemCount - measuredCount,
1092
+ Math.ceil(
1093
+ ((context.scrollTop + overscanPixels - shortestColumnSize) / context.itemHeight) *
1094
+ context.positioner.columnCount,
1095
+ ),
1096
+ );
1097
+
1098
+ for (let index = measuredCount; index < measuredCount + batchSize; index++) {
1099
+ const child = validChildren[index];
1100
+ if (!child) continue;
1101
+
1102
+ const itemStyle = {
1103
+ ...hiddenItemStyle,
1104
+ ...child.props.style,
1105
+ };
1106
+
1107
+ positionedChildren.push(
1108
+ React.cloneElement(child, {
1109
+ key: child.key ?? index,
1110
+ ref: context.onItemRegister(index),
1111
+ style: itemStyle,
1112
+ }),
1113
+ );
1114
+ }
1115
+ }
1116
+
1117
+ React.useEffect(() => {
1118
+ if (layoutOutdated && mounted) {
1119
+ if (rafId.current) cancelAnimationFrame(rafId.current);
1120
+ rafId.current = requestAnimationFrame(() => {
1121
+ setLayoutVersion((v) => v + 1);
1122
+ });
1123
+ }
1124
+ return () => {
1125
+ if (rafId.current) cancelAnimationFrame(rafId.current);
1126
+ };
1127
+ }, [layoutOutdated, mounted]);
1128
+
1129
+ const estimatedHeight = React.useMemo(() => {
1130
+ const measuredHeight = context.positioner.estimateHeight(measuredCount, context.itemHeight);
1131
+ if (measuredCount === itemCount) return measuredHeight;
1132
+ const remainingItems = itemCount - measuredCount;
1133
+ const estimatedRemainingHeight = Math.ceil(
1134
+ (remainingItems / context.positioner.columnCount) * context.itemHeight,
1135
+ );
1136
+ return measuredHeight + estimatedRemainingHeight;
1137
+ }, [context.positioner, context.itemHeight, measuredCount, itemCount]);
1138
+
1139
+ const containerStyle = React.useMemo(
1140
+ () => ({
1141
+ position: "relative" as const,
1142
+ width: "100%",
1143
+ maxWidth: "100%",
1144
+ height: Math.ceil(estimatedHeight),
1145
+ maxHeight: Math.ceil(estimatedHeight),
1146
+ willChange: context.isScrolling ? "contents" : undefined,
1147
+ pointerEvents: context.isScrolling ? ("none" as const) : undefined,
1148
+ ...style,
1149
+ }),
1150
+ [context.isScrolling, estimatedHeight, style],
1151
+ );
1152
+
1153
+ // First-paint placeholder: positioned children are still empty until the
1154
+ // ResizeObserver has measured at least one item. Without this branch the
1155
+ // viewport renders `null` on the first frame and feels broken to first-
1156
+ // time users. Consumer-supplied `fallback` wins; otherwise we render a
1157
+ // minimal muted skeleton so something is on screen immediately.
1158
+ if (!mounted) {
1159
+ if (context.fallback) {
1160
+ return context.fallback as React.ReactElement;
1161
+ }
1162
+ return <MasonryFallback itemCount={itemCount} />;
1163
+ }
1164
+
1165
+ return (
1166
+ <div {...viewportProps} ref={ref} style={containerStyle} data-version={mounted ? layoutVersion : undefined}>
1167
+ {positionedChildren}
1168
+ </div>
1169
+ );
1170
+ }
1171
+
1172
+ function MasonryFallback({ itemCount }: { itemCount: number }) {
1173
+ const placeholders = Math.min(Math.max(itemCount, 1), 6);
1174
+ return (
1175
+ <div
1176
+ data-slot="masonry-fallback"
1177
+ aria-hidden="true"
1178
+ style={{
1179
+ display: "grid",
1180
+ gridTemplateColumns: "repeat(auto-fill, minmax(220px, 1fr))",
1181
+ gap: "var(--masonry-fallback-gap, 12px)",
1182
+ width: "100%",
1183
+ }}
1184
+ >
1185
+ {Array.from({ length: placeholders }).map((_, i) => (
1186
+ <div
1187
+ key={i}
1188
+ style={{
1189
+ height: 12 * (8 + (i % 4) * 3) /* 96 / 132 / 168 / 204 */,
1190
+ borderRadius: "var(--radius-sm)",
1191
+ background: "color-mix(in oklab, var(--muted, #e5e7eb) 70%, transparent)",
1192
+ }}
1193
+ />
1194
+ ))}
1195
+ </div>
1196
+ );
1197
+ }
1198
+
1199
+ function MasonryItem(props: MasonryItemProps) {
1200
+ const { asChild, ref, ...itemProps } = props;
1201
+ const ItemPrimitive = asChild ? Slot : "div";
1202
+ return <ItemPrimitive data-slot="masonry-item" {...itemProps} ref={ref} />;
1203
+ }
1204
+
1205
+ export { Masonry, MasonryItem, MasonryViewport, useMasonryContext };