entangle-ui 0.9.0 → 0.11.0

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 (1053) hide show
  1. package/CHANGELOG.md +766 -0
  2. package/README.md +8 -6
  3. package/dist/esm/assets/src/components/controls/FileTree/FileTree.css.ts.vanilla-YmktPvnr.css +48 -0
  4. package/dist/esm/assets/src/components/controls/Select/{Select.css.ts.vanilla-oZnFUorL.css → Select.css.ts.vanilla-Cpu2BvWL.css} +3 -0
  5. package/dist/esm/assets/src/components/controls/TreeView/{TreeNode.css.ts.vanilla-B_f8pUb8.css → TreeNode.css.ts.vanilla-DXPJRWZZ.css} +31 -24
  6. package/dist/esm/assets/src/components/editor/AssetBrowser/AssetBrowser.css.ts.vanilla-B2S4cEiY.css +262 -0
  7. package/dist/esm/assets/src/components/editor/Minimap/Minimap.css.ts.vanilla--rNdWQwy.css +133 -0
  8. package/dist/esm/assets/src/components/editor/NodeGraph/NodeGraph.css.ts.vanilla-ClF4YZvl.css +401 -0
  9. package/dist/esm/assets/src/components/editor/PropertyInspector/{PropertyPanel.css.ts.vanilla-RYv_XgOu.css → PropertyPanel.css.ts.vanilla-Dpr_k5I3.css} +4 -1
  10. package/dist/esm/assets/src/components/editor/PropertyInspector/{PropertyRow.css.ts.vanilla-C3YZnnHb.css → PropertyRow.css.ts.vanilla-pq1Uhd2a.css} +15 -8
  11. package/dist/esm/assets/src/components/editor/PropertyInspector/{PropertySection.css.ts.vanilla-DK12opZc.css → PropertySection.css.ts.vanilla-6MWWAqyd.css} +50 -32
  12. package/dist/esm/assets/src/components/editor/Timeline/Timeline.css.ts.vanilla-DDX6Zalo.css +203 -0
  13. package/dist/esm/assets/src/components/feedback/LogView/LogView.css.ts.vanilla-nB5ENOpw.css +312 -0
  14. package/dist/esm/assets/src/components/navigation/Menu/Menu.css.ts.vanilla-B5iVe5S2.css +88 -0
  15. package/dist/esm/assets/src/components/navigation/PathBar/PathBar.css.ts.vanilla-BIEzQQOf.css +10 -0
  16. package/dist/esm/assets/src/components/primitives/viewport/Viewport.css.ts.vanilla-CkFBJ7Vo.css +65 -0
  17. package/dist/esm/assets/src/components/shell/FloatingPanel/{FloatingPanel.css.ts.vanilla-1rIAXEFp.css → FloatingPanel.css.ts.vanilla-CRaeYJ2b.css} +20 -13
  18. package/dist/esm/assets/src/theme/{darkTheme.css.ts.vanilla-ab1WD4dr.css → darkTheme.css.ts.vanilla-BHZ3ecRn.css} +3 -3
  19. package/dist/esm/assets/src/theme/{lightTheme.css.ts.vanilla-OaRI_wIc.css → lightTheme.css.ts.vanilla-Ct6f9Iym.css} +3 -3
  20. package/dist/esm/components/Icons/AddIcon.js.map +1 -1
  21. package/dist/esm/components/Icons/AiChatIcon.js.map +1 -1
  22. package/dist/esm/components/Icons/AiSparklesIcon.js.map +1 -1
  23. package/dist/esm/components/Icons/ArchiveIcon.js.map +1 -1
  24. package/dist/esm/components/Icons/ArrowDownIcon.js.map +1 -1
  25. package/dist/esm/components/Icons/ArrowLeftIcon.js.map +1 -1
  26. package/dist/esm/components/Icons/ArrowRightIcon.js.map +1 -1
  27. package/dist/esm/components/Icons/ArrowUpIcon.js.map +1 -1
  28. package/dist/esm/components/Icons/BookmarkIcon.js.map +1 -1
  29. package/dist/esm/components/Icons/BugIcon.js.map +1 -1
  30. package/dist/esm/components/Icons/BuildingIcon.js.map +1 -1
  31. package/dist/esm/components/Icons/CalendarIcon.js.map +1 -1
  32. package/dist/esm/components/Icons/CameraIcon.js +31 -0
  33. package/dist/esm/components/Icons/CameraIcon.js.map +1 -0
  34. package/dist/esm/components/Icons/CheckIcon.js.map +1 -1
  35. package/dist/esm/components/Icons/ChevronDownIcon.js.map +1 -1
  36. package/dist/esm/components/Icons/ChevronLeftIcon.js.map +1 -1
  37. package/dist/esm/components/Icons/ChevronRightIcon.js.map +1 -1
  38. package/dist/esm/components/Icons/ChevronUpIcon.js.map +1 -1
  39. package/dist/esm/components/Icons/CircleIcon.js.map +1 -1
  40. package/dist/esm/components/Icons/ClockIcon.js.map +1 -1
  41. package/dist/esm/components/Icons/CloseIcon.js.map +1 -1
  42. package/dist/esm/components/Icons/CloudUploadIcon.js.map +1 -1
  43. package/dist/esm/components/Icons/CodeIcon.js.map +1 -1
  44. package/dist/esm/components/Icons/CopyIcon.js.map +1 -1
  45. package/dist/esm/components/Icons/CubeIcon.js +31 -0
  46. package/dist/esm/components/Icons/CubeIcon.js.map +1 -0
  47. package/dist/esm/components/Icons/CutIcon.js.map +1 -1
  48. package/dist/esm/components/Icons/DotsHorizontalIcon.js.map +1 -1
  49. package/dist/esm/components/Icons/DotsVerticalIcon.js.map +1 -1
  50. package/dist/esm/components/Icons/DownloadIcon.js.map +1 -1
  51. package/dist/esm/components/Icons/EditIcon.js.map +1 -1
  52. package/dist/esm/components/Icons/ErrorIcon.js.map +1 -1
  53. package/dist/esm/components/Icons/ExternalLinkIcon.js.map +1 -1
  54. package/dist/esm/components/Icons/EyeDropperIcon.js.map +1 -1
  55. package/dist/esm/components/Icons/EyeIcon.js.map +1 -1
  56. package/dist/esm/components/Icons/FileTextIcon.js.map +1 -1
  57. package/dist/esm/components/Icons/FilterIcon.js.map +1 -1
  58. package/dist/esm/components/Icons/FirstIcon.js.map +1 -1
  59. package/dist/esm/components/Icons/FolderCogIcon.js.map +1 -1
  60. package/dist/esm/components/Icons/FolderIcon.js.map +1 -1
  61. package/dist/esm/components/Icons/FolderOpenIcon.js +2 -2
  62. package/dist/esm/components/Icons/FolderOpenIcon.js.map +1 -1
  63. package/dist/esm/components/Icons/FullscreenIcon.js.map +1 -1
  64. package/dist/esm/components/Icons/GitBranchIcon.js.map +1 -1
  65. package/dist/esm/components/Icons/GridIcon.js.map +1 -1
  66. package/dist/esm/components/Icons/HeartIcon.js.map +1 -1
  67. package/dist/esm/components/Icons/HelpIcon.js.map +1 -1
  68. package/dist/esm/components/Icons/HomeIcon.js.map +1 -1
  69. package/dist/esm/components/Icons/ImageIcon.js +31 -0
  70. package/dist/esm/components/Icons/ImageIcon.js.map +1 -0
  71. package/dist/esm/components/Icons/InfoIcon.js.map +1 -1
  72. package/dist/esm/components/Icons/LastIcon.js.map +1 -1
  73. package/dist/esm/components/Icons/LinkIcon.js.map +1 -1
  74. package/dist/esm/components/Icons/ListIcon.js.map +1 -1
  75. package/dist/esm/components/Icons/LockIcon.js.map +1 -1
  76. package/dist/esm/components/Icons/MaximizeIcon.js.map +1 -1
  77. package/dist/esm/components/Icons/MenuIcon.js.map +1 -1
  78. package/dist/esm/components/Icons/MinimizeIcon.js.map +1 -1
  79. package/dist/esm/components/Icons/MinusIcon.js.map +1 -1
  80. package/dist/esm/components/Icons/OrbitIcon.js +31 -0
  81. package/dist/esm/components/Icons/OrbitIcon.js.map +1 -0
  82. package/dist/esm/components/Icons/PasteIcon.js.map +1 -1
  83. package/dist/esm/components/Icons/PauseIcon.js +2 -2
  84. package/dist/esm/components/Icons/PauseIcon.js.map +1 -1
  85. package/dist/esm/components/Icons/PinIcon.js.map +1 -1
  86. package/dist/esm/components/Icons/PlayIcon.js.map +1 -1
  87. package/dist/esm/components/Icons/RedoIcon.js.map +1 -1
  88. package/dist/esm/components/Icons/RefreshIcon.js.map +1 -1
  89. package/dist/esm/components/Icons/RobotIcon.js.map +1 -1
  90. package/dist/esm/components/Icons/RotateIcon.js +32 -0
  91. package/dist/esm/components/Icons/RotateIcon.js.map +1 -0
  92. package/dist/esm/components/Icons/SaveIcon.js.map +1 -1
  93. package/dist/esm/components/Icons/SearchIcon.js.map +1 -1
  94. package/dist/esm/components/Icons/SendIcon.js.map +1 -1
  95. package/dist/esm/components/Icons/SettingsIcon.js.map +1 -1
  96. package/dist/esm/components/Icons/SortIcon.js.map +1 -1
  97. package/dist/esm/components/Icons/SpinIcon.js +32 -0
  98. package/dist/esm/components/Icons/SpinIcon.js.map +1 -0
  99. package/dist/esm/components/Icons/StarIcon.js.map +1 -1
  100. package/dist/esm/components/Icons/StopIcon.js.map +1 -1
  101. package/dist/esm/components/Icons/SuccessIcon.js.map +1 -1
  102. package/dist/esm/components/Icons/TagIcon.js.map +1 -1
  103. package/dist/esm/components/Icons/TangentAlignedIcon.js.map +1 -1
  104. package/dist/esm/components/Icons/TangentAutoIcon.js.map +1 -1
  105. package/dist/esm/components/Icons/TangentFreeIcon.js.map +1 -1
  106. package/dist/esm/components/Icons/TangentLinearIcon.js.map +1 -1
  107. package/dist/esm/components/Icons/TangentMirroredIcon.js.map +1 -1
  108. package/dist/esm/components/Icons/TangentStepIcon.js.map +1 -1
  109. package/dist/esm/components/Icons/TerminalIcon.js.map +1 -1
  110. package/dist/esm/components/Icons/TrashIcon.js.map +1 -1
  111. package/dist/esm/components/Icons/UndoIcon.js.map +1 -1
  112. package/dist/esm/components/Icons/UnlinkIcon.js.map +1 -1
  113. package/dist/esm/components/Icons/UnlockIcon.js.map +1 -1
  114. package/dist/esm/components/Icons/UploadIcon.js.map +1 -1
  115. package/dist/esm/components/Icons/UserIcon.js.map +1 -1
  116. package/dist/esm/components/Icons/UsersIcon.js.map +1 -1
  117. package/dist/esm/components/Icons/WarningIcon.js.map +1 -1
  118. package/dist/esm/components/Icons/ZoomFitIcon.js +32 -0
  119. package/dist/esm/components/Icons/ZoomFitIcon.js.map +1 -0
  120. package/dist/esm/components/Icons/ZoomInIcon.js.map +1 -1
  121. package/dist/esm/components/Icons/ZoomOutIcon.js.map +1 -1
  122. package/dist/esm/components/controls/CartesianPicker/CartesianPicker.js +3 -3
  123. package/dist/esm/components/controls/CartesianPicker/CartesianPicker.js.map +1 -1
  124. package/dist/esm/components/controls/CartesianPicker/useCartesianInteraction.js +7 -5
  125. package/dist/esm/components/controls/CartesianPicker/useCartesianInteraction.js.map +1 -1
  126. package/dist/esm/components/controls/CartesianPicker/useCartesianRenderer.js.map +1 -1
  127. package/dist/esm/components/controls/ColorPicker/AlphaSlider.js.map +1 -1
  128. package/dist/esm/components/controls/ColorPicker/ColorArea.js +2 -2
  129. package/dist/esm/components/controls/ColorPicker/ColorArea.js.map +1 -1
  130. package/dist/esm/components/controls/ColorPicker/ColorInputs.js +16 -2
  131. package/dist/esm/components/controls/ColorPicker/ColorInputs.js.map +1 -1
  132. package/dist/esm/components/controls/ColorPicker/ColorPalette.js +3 -1
  133. package/dist/esm/components/controls/ColorPicker/ColorPalette.js.map +1 -1
  134. package/dist/esm/components/controls/ColorPicker/ColorPicker.js +6 -6
  135. package/dist/esm/components/controls/ColorPicker/ColorPicker.js.map +1 -1
  136. package/dist/esm/components/controls/ColorPicker/ColorPresets.js +3 -1
  137. package/dist/esm/components/controls/ColorPicker/ColorPresets.js.map +1 -1
  138. package/dist/esm/components/controls/ColorPicker/ColorSwatch.js.map +1 -1
  139. package/dist/esm/components/controls/ColorPicker/EyeDropper.js.map +1 -1
  140. package/dist/esm/components/controls/ColorPicker/HueSlider.js.map +1 -1
  141. package/dist/esm/components/controls/ColorPicker/colorUtils.js.map +1 -1
  142. package/dist/esm/components/controls/ColorPicker/palettes/material.js.map +1 -1
  143. package/dist/esm/components/controls/ColorPicker/palettes/professional.js.map +1 -1
  144. package/dist/esm/components/controls/ColorPicker/palettes/tailwind.js.map +1 -1
  145. package/dist/esm/components/controls/ColorPicker/useColor.js.map +1 -1
  146. package/dist/esm/components/controls/Combobox/Combobox.js +46 -23
  147. package/dist/esm/components/controls/Combobox/Combobox.js.map +1 -1
  148. package/dist/esm/components/controls/CurveEditor/CurveCanvas.js +11 -4
  149. package/dist/esm/components/controls/CurveEditor/CurveCanvas.js.map +1 -1
  150. package/dist/esm/components/controls/CurveEditor/CurveEditor.js +4 -4
  151. package/dist/esm/components/controls/CurveEditor/CurveEditor.js.map +1 -1
  152. package/dist/esm/components/controls/CurveEditor/CurveToolbar.js +7 -5
  153. package/dist/esm/components/controls/CurveEditor/CurveToolbar.js.map +1 -1
  154. package/dist/esm/components/controls/CurveEditor/curvePresets.js.map +1 -1
  155. package/dist/esm/components/controls/CurveEditor/curveUtils.js +13 -15
  156. package/dist/esm/components/controls/CurveEditor/curveUtils.js.map +1 -1
  157. package/dist/esm/components/controls/CurveEditor/useCurveInteraction.js +72 -50
  158. package/dist/esm/components/controls/CurveEditor/useCurveInteraction.js.map +1 -1
  159. package/dist/esm/components/controls/CurveEditor/useCurveRenderer.js +11 -3
  160. package/dist/esm/components/controls/CurveEditor/useCurveRenderer.js.map +1 -1
  161. package/dist/esm/components/controls/FileTree/FileTree.css.js +9 -0
  162. package/dist/esm/components/controls/FileTree/FileTree.css.js.map +1 -0
  163. package/dist/esm/components/controls/FileTree/FileTree.js +252 -0
  164. package/dist/esm/components/controls/FileTree/FileTree.js.map +1 -0
  165. package/dist/esm/components/controls/FileTree/fileTreeIcons.js +129 -0
  166. package/dist/esm/components/controls/FileTree/fileTreeIcons.js.map +1 -0
  167. package/dist/esm/components/controls/FileTree/fileTreeLabels.js +8 -0
  168. package/dist/esm/components/controls/FileTree/fileTreeLabels.js.map +1 -0
  169. package/dist/esm/components/controls/FileTree/useFileTreeDrop.js +115 -0
  170. package/dist/esm/components/controls/FileTree/useFileTreeDrop.js.map +1 -0
  171. package/dist/esm/components/controls/FileUploader/FileUploader.js +3 -6
  172. package/dist/esm/components/controls/FileUploader/FileUploader.js.map +1 -1
  173. package/dist/esm/components/controls/MultiSelect/MultiSelect.js +46 -15
  174. package/dist/esm/components/controls/MultiSelect/MultiSelect.js.map +1 -1
  175. package/dist/esm/components/controls/NumberInput/NumberInput.js +11 -4
  176. package/dist/esm/components/controls/NumberInput/NumberInput.js.map +1 -1
  177. package/dist/esm/components/controls/NumberInput/useNumberInput.js +6 -2
  178. package/dist/esm/components/controls/NumberInput/useNumberInput.js.map +1 -1
  179. package/dist/esm/components/controls/Select/Select.css.js +1 -1
  180. package/dist/esm/components/controls/Select/Select.js +44 -16
  181. package/dist/esm/components/controls/Select/Select.js.map +1 -1
  182. package/dist/esm/components/controls/Slider/Slider.js +6 -8
  183. package/dist/esm/components/controls/Slider/Slider.js.map +1 -1
  184. package/dist/esm/components/controls/TagInput/TagInput.js +4 -2
  185. package/dist/esm/components/controls/TagInput/TagInput.js.map +1 -1
  186. package/dist/esm/components/controls/TreeView/TreeNode.css.js +9 -8
  187. package/dist/esm/components/controls/TreeView/TreeNode.css.js.map +1 -1
  188. package/dist/esm/components/controls/TreeView/TreeNode.js +42 -7
  189. package/dist/esm/components/controls/TreeView/TreeNode.js.map +1 -1
  190. package/dist/esm/components/controls/TreeView/TreeView.js +18 -6
  191. package/dist/esm/components/controls/TreeView/TreeView.js.map +1 -1
  192. package/dist/esm/components/controls/TreeView/useTreeState.js +2 -6
  193. package/dist/esm/components/controls/TreeView/useTreeState.js.map +1 -1
  194. package/dist/esm/components/controls/VectorInput/VectorInput.js +13 -4
  195. package/dist/esm/components/controls/VectorInput/VectorInput.js.map +1 -1
  196. package/dist/esm/components/data/DataTable/DataTable.js +25 -8
  197. package/dist/esm/components/data/DataTable/DataTable.js.map +1 -1
  198. package/dist/esm/components/editor/AssetBrowser/AssetBrowser.css.js +46 -0
  199. package/dist/esm/components/editor/AssetBrowser/AssetBrowser.css.js.map +1 -0
  200. package/dist/esm/components/editor/AssetBrowser/AssetBrowser.js +254 -0
  201. package/dist/esm/components/editor/AssetBrowser/AssetBrowser.js.map +1 -0
  202. package/dist/esm/components/editor/AssetBrowser/AssetBrowserAnnouncementLive.js +17 -0
  203. package/dist/esm/components/editor/AssetBrowser/AssetBrowserAnnouncementLive.js.map +1 -0
  204. package/dist/esm/components/editor/AssetBrowser/AssetBrowserBreadcrumbs.js +25 -0
  205. package/dist/esm/components/editor/AssetBrowser/AssetBrowserBreadcrumbs.js.map +1 -0
  206. package/dist/esm/components/editor/AssetBrowser/AssetBrowserContent.js +140 -0
  207. package/dist/esm/components/editor/AssetBrowser/AssetBrowserContent.js.map +1 -0
  208. package/dist/esm/components/editor/AssetBrowser/AssetBrowserContext.js +81 -0
  209. package/dist/esm/components/editor/AssetBrowser/AssetBrowserContext.js.map +1 -0
  210. package/dist/esm/components/editor/AssetBrowser/AssetBrowserContextMenu.js +123 -0
  211. package/dist/esm/components/editor/AssetBrowser/AssetBrowserContextMenu.js.map +1 -0
  212. package/dist/esm/components/editor/AssetBrowser/AssetBrowserDefaultMenus.js +136 -0
  213. package/dist/esm/components/editor/AssetBrowser/AssetBrowserDefaultMenus.js.map +1 -0
  214. package/dist/esm/components/editor/AssetBrowser/AssetBrowserGrid.js +137 -0
  215. package/dist/esm/components/editor/AssetBrowser/AssetBrowserGrid.js.map +1 -0
  216. package/dist/esm/components/editor/AssetBrowser/AssetBrowserGridItem.js +226 -0
  217. package/dist/esm/components/editor/AssetBrowser/AssetBrowserGridItem.js.map +1 -0
  218. package/dist/esm/components/editor/AssetBrowser/AssetBrowserList.js +189 -0
  219. package/dist/esm/components/editor/AssetBrowser/AssetBrowserList.js.map +1 -0
  220. package/dist/esm/components/editor/AssetBrowser/AssetBrowserRenameField.js +63 -0
  221. package/dist/esm/components/editor/AssetBrowser/AssetBrowserRenameField.js.map +1 -0
  222. package/dist/esm/components/editor/AssetBrowser/AssetBrowserSidebar.js +19 -0
  223. package/dist/esm/components/editor/AssetBrowser/AssetBrowserSidebar.js.map +1 -0
  224. package/dist/esm/components/editor/AssetBrowser/AssetBrowserStatusBar.js +24 -0
  225. package/dist/esm/components/editor/AssetBrowser/AssetBrowserStatusBar.js.map +1 -0
  226. package/dist/esm/components/editor/AssetBrowser/AssetBrowserStore.js +176 -0
  227. package/dist/esm/components/editor/AssetBrowser/AssetBrowserStore.js.map +1 -0
  228. package/dist/esm/components/editor/AssetBrowser/AssetBrowserSurface.js +120 -0
  229. package/dist/esm/components/editor/AssetBrowser/AssetBrowserSurface.js.map +1 -0
  230. package/dist/esm/components/editor/AssetBrowser/AssetBrowserToolbar.js +134 -0
  231. package/dist/esm/components/editor/AssetBrowser/AssetBrowserToolbar.js.map +1 -0
  232. package/dist/esm/components/editor/AssetBrowser/assetBrowserFilter.js +90 -0
  233. package/dist/esm/components/editor/AssetBrowser/assetBrowserFilter.js.map +1 -0
  234. package/dist/esm/components/editor/AssetBrowser/assetBrowserFormat.js +32 -0
  235. package/dist/esm/components/editor/AssetBrowser/assetBrowserFormat.js.map +1 -0
  236. package/dist/esm/components/editor/AssetBrowser/assetBrowserGeometry.js +70 -0
  237. package/dist/esm/components/editor/AssetBrowser/assetBrowserGeometry.js.map +1 -0
  238. package/dist/esm/components/editor/AssetBrowser/assetBrowserKeyboard.js +62 -0
  239. package/dist/esm/components/editor/AssetBrowser/assetBrowserKeyboard.js.map +1 -0
  240. package/dist/esm/components/editor/AssetBrowser/assetBrowserLabels.js +52 -0
  241. package/dist/esm/components/editor/AssetBrowser/assetBrowserLabels.js.map +1 -0
  242. package/dist/esm/components/editor/AssetBrowser/slots.js +18 -0
  243. package/dist/esm/components/editor/AssetBrowser/slots.js.map +1 -0
  244. package/dist/esm/components/editor/AssetBrowser/useAssetBrowserAnnouncement.js +19 -0
  245. package/dist/esm/components/editor/AssetBrowser/useAssetBrowserAnnouncement.js.map +1 -0
  246. package/dist/esm/components/editor/AssetBrowser/useAssetBrowserHandle.js +70 -0
  247. package/dist/esm/components/editor/AssetBrowser/useAssetBrowserHandle.js.map +1 -0
  248. package/dist/esm/components/editor/AssetBrowser/useAssetBrowserViewState.js +108 -0
  249. package/dist/esm/components/editor/AssetBrowser/useAssetBrowserViewState.js.map +1 -0
  250. package/dist/esm/components/editor/AssetBrowser/useAssetDnd.js +192 -0
  251. package/dist/esm/components/editor/AssetBrowser/useAssetDnd.js.map +1 -0
  252. package/dist/esm/components/editor/AssetBrowser/useAssetGridKeyboardNav.js +91 -0
  253. package/dist/esm/components/editor/AssetBrowser/useAssetGridKeyboardNav.js.map +1 -0
  254. package/dist/esm/components/editor/AssetBrowser/useAssetGridVirtualizer.js +91 -0
  255. package/dist/esm/components/editor/AssetBrowser/useAssetGridVirtualizer.js.map +1 -0
  256. package/dist/esm/components/editor/AssetBrowser/useAssetMarqueeGesture.js +128 -0
  257. package/dist/esm/components/editor/AssetBrowser/useAssetMarqueeGesture.js.map +1 -0
  258. package/dist/esm/components/editor/AssetBrowser/useAssetMutationKeyboard.js +72 -0
  259. package/dist/esm/components/editor/AssetBrowser/useAssetMutationKeyboard.js.map +1 -0
  260. package/dist/esm/components/editor/AssetBrowser/useAssetMutations.js +141 -0
  261. package/dist/esm/components/editor/AssetBrowser/useAssetMutations.js.map +1 -0
  262. package/dist/esm/components/editor/AssetBrowser/useAssetNavigation.js +113 -0
  263. package/dist/esm/components/editor/AssetBrowser/useAssetNavigation.js.map +1 -0
  264. package/dist/esm/components/editor/AssetBrowser/useAssetSelectionController.js +174 -0
  265. package/dist/esm/components/editor/AssetBrowser/useAssetSelectionController.js.map +1 -0
  266. package/dist/esm/components/editor/ChatPanel/ChatActionBar.js.map +1 -1
  267. package/dist/esm/components/editor/ChatPanel/ChatAttachment.js +8 -2
  268. package/dist/esm/components/editor/ChatPanel/ChatAttachment.js.map +1 -1
  269. package/dist/esm/components/editor/ChatPanel/ChatBubble.js.map +1 -1
  270. package/dist/esm/components/editor/ChatPanel/ChatCodeBlock.js +20 -4
  271. package/dist/esm/components/editor/ChatPanel/ChatCodeBlock.js.map +1 -1
  272. package/dist/esm/components/editor/ChatPanel/ChatContextChip.js +1 -1
  273. package/dist/esm/components/editor/ChatPanel/ChatContextChip.js.map +1 -1
  274. package/dist/esm/components/editor/ChatPanel/ChatEmptyState.js +3 -1
  275. package/dist/esm/components/editor/ChatPanel/ChatEmptyState.js.map +1 -1
  276. package/dist/esm/components/editor/ChatPanel/ChatIcons.js.map +1 -1
  277. package/dist/esm/components/editor/ChatPanel/ChatInput.js +10 -3
  278. package/dist/esm/components/editor/ChatPanel/ChatInput.js.map +1 -1
  279. package/dist/esm/components/editor/ChatPanel/ChatInputToolbar.js.map +1 -1
  280. package/dist/esm/components/editor/ChatPanel/ChatMarkdownRenderer.js +1 -1
  281. package/dist/esm/components/editor/ChatPanel/ChatMarkdownRenderer.js.map +1 -1
  282. package/dist/esm/components/editor/ChatPanel/ChatMessage.js +10 -3
  283. package/dist/esm/components/editor/ChatPanel/ChatMessage.js.map +1 -1
  284. package/dist/esm/components/editor/ChatPanel/ChatMessageList.js +5 -3
  285. package/dist/esm/components/editor/ChatPanel/ChatMessageList.js.map +1 -1
  286. package/dist/esm/components/editor/ChatPanel/ChatPanel.js.map +1 -1
  287. package/dist/esm/components/editor/ChatPanel/ChatToolCall.js +1 -1
  288. package/dist/esm/components/editor/ChatPanel/ChatToolCall.js.map +1 -1
  289. package/dist/esm/components/editor/ChatPanel/ChatTypingIndicator.js.map +1 -1
  290. package/dist/esm/components/editor/ChatPanel/useChatInput.js.map +1 -1
  291. package/dist/esm/components/editor/ChatPanel/useChatMessages.js +7 -4
  292. package/dist/esm/components/editor/ChatPanel/useChatMessages.js.map +1 -1
  293. package/dist/esm/components/editor/ChatPanel/useChatScroll.js +6 -1
  294. package/dist/esm/components/editor/ChatPanel/useChatScroll.js.map +1 -1
  295. package/dist/esm/components/editor/Minimap/Minimap.css.js +18 -0
  296. package/dist/esm/components/editor/Minimap/Minimap.css.js.map +1 -0
  297. package/dist/esm/components/editor/Minimap/Minimap.js +257 -0
  298. package/dist/esm/components/editor/Minimap/Minimap.js.map +1 -0
  299. package/dist/esm/components/editor/Minimap/Minimap.types.js +11 -0
  300. package/dist/esm/components/editor/Minimap/Minimap.types.js.map +1 -0
  301. package/dist/esm/components/editor/Minimap/MinimapContext.js +48 -0
  302. package/dist/esm/components/editor/Minimap/MinimapContext.js.map +1 -0
  303. package/dist/esm/components/editor/Minimap/MinimapCorner.js +16 -0
  304. package/dist/esm/components/editor/Minimap/MinimapCorner.js.map +1 -0
  305. package/dist/esm/components/editor/Minimap/MinimapFooter.js +16 -0
  306. package/dist/esm/components/editor/Minimap/MinimapFooter.js.map +1 -0
  307. package/dist/esm/components/editor/Minimap/MinimapStore.js +166 -0
  308. package/dist/esm/components/editor/Minimap/MinimapStore.js.map +1 -0
  309. package/dist/esm/components/editor/Minimap/MinimapTitle.js +16 -0
  310. package/dist/esm/components/editor/Minimap/MinimapTitle.js.map +1 -0
  311. package/dist/esm/components/editor/Minimap/ViewportMinimap.js +69 -0
  312. package/dist/esm/components/editor/Minimap/ViewportMinimap.js.map +1 -0
  313. package/dist/esm/components/editor/Minimap/computeBoundsFromItems.js +65 -0
  314. package/dist/esm/components/editor/Minimap/computeBoundsFromItems.js.map +1 -0
  315. package/dist/esm/components/editor/Minimap/index.js +15 -0
  316. package/dist/esm/components/editor/Minimap/index.js.map +1 -0
  317. package/dist/esm/components/editor/Minimap/minimapCoords.js +105 -0
  318. package/dist/esm/components/editor/Minimap/minimapCoords.js.map +1 -0
  319. package/dist/esm/components/editor/Minimap/minimapDrawing.js +93 -0
  320. package/dist/esm/components/editor/Minimap/minimapDrawing.js.map +1 -0
  321. package/dist/esm/components/editor/Minimap/minimapHitTest.js +59 -0
  322. package/dist/esm/components/editor/Minimap/minimapHitTest.js.map +1 -0
  323. package/dist/esm/components/editor/Minimap/useMinimapGestures.js +299 -0
  324. package/dist/esm/components/editor/Minimap/useMinimapGestures.js.map +1 -0
  325. package/dist/esm/components/editor/NodeGraph/NodeGraph.css.js +36 -0
  326. package/dist/esm/components/editor/NodeGraph/NodeGraph.css.js.map +1 -0
  327. package/dist/esm/components/editor/NodeGraph/NodeGraph.js +627 -0
  328. package/dist/esm/components/editor/NodeGraph/NodeGraph.js.map +1 -0
  329. package/dist/esm/components/editor/NodeGraph/NodeGraph.types.js +10 -0
  330. package/dist/esm/components/editor/NodeGraph/NodeGraph.types.js.map +1 -0
  331. package/dist/esm/components/editor/NodeGraph/NodeGraphContext.js +54 -0
  332. package/dist/esm/components/editor/NodeGraph/NodeGraphContext.js.map +1 -0
  333. package/dist/esm/components/editor/NodeGraph/NodeGraphEdgeLabels.js +137 -0
  334. package/dist/esm/components/editor/NodeGraph/NodeGraphEdgeLabels.js.map +1 -0
  335. package/dist/esm/components/editor/NodeGraph/NodeGraphGroup.js +211 -0
  336. package/dist/esm/components/editor/NodeGraph/NodeGraphGroup.js.map +1 -0
  337. package/dist/esm/components/editor/NodeGraph/NodeGraphMinimap.js +122 -0
  338. package/dist/esm/components/editor/NodeGraph/NodeGraphMinimap.js.map +1 -0
  339. package/dist/esm/components/editor/NodeGraph/NodeGraphNode.js +170 -0
  340. package/dist/esm/components/editor/NodeGraph/NodeGraphNode.js.map +1 -0
  341. package/dist/esm/components/editor/NodeGraph/NodeGraphNodeContext.js +21 -0
  342. package/dist/esm/components/editor/NodeGraph/NodeGraphNodeContext.js.map +1 -0
  343. package/dist/esm/components/editor/NodeGraph/NodeGraphNodeParts.js +56 -0
  344. package/dist/esm/components/editor/NodeGraph/NodeGraphNodeParts.js.map +1 -0
  345. package/dist/esm/components/editor/NodeGraph/NodeGraphNodeSection.js +59 -0
  346. package/dist/esm/components/editor/NodeGraph/NodeGraphNodeSection.js.map +1 -0
  347. package/dist/esm/components/editor/NodeGraph/NodeGraphNodeSectionContext.js +17 -0
  348. package/dist/esm/components/editor/NodeGraph/NodeGraphNodeSectionContext.js.map +1 -0
  349. package/dist/esm/components/editor/NodeGraph/NodeGraphPin.js +35 -0
  350. package/dist/esm/components/editor/NodeGraph/NodeGraphPin.js.map +1 -0
  351. package/dist/esm/components/editor/NodeGraph/NodeGraphPort.js +191 -0
  352. package/dist/esm/components/editor/NodeGraph/NodeGraphPort.js.map +1 -0
  353. package/dist/esm/components/editor/NodeGraph/NodeGraphPortVisual.js +46 -0
  354. package/dist/esm/components/editor/NodeGraph/NodeGraphPortVisual.js.map +1 -0
  355. package/dist/esm/components/editor/NodeGraph/NodeGraphSlots.js +50 -0
  356. package/dist/esm/components/editor/NodeGraph/NodeGraphSlots.js.map +1 -0
  357. package/dist/esm/components/editor/NodeGraph/NodeGraphSpawnPalette.js +70 -0
  358. package/dist/esm/components/editor/NodeGraph/NodeGraphSpawnPalette.js.map +1 -0
  359. package/dist/esm/components/editor/NodeGraph/NodeGraphStore.js +543 -0
  360. package/dist/esm/components/editor/NodeGraph/NodeGraphStore.js.map +1 -0
  361. package/dist/esm/components/editor/NodeGraph/NodeGraphToolbar.js +100 -0
  362. package/dist/esm/components/editor/NodeGraph/NodeGraphToolbar.js.map +1 -0
  363. package/dist/esm/components/editor/NodeGraph/createTypeMatchValidator.js +37 -0
  364. package/dist/esm/components/editor/NodeGraph/createTypeMatchValidator.js.map +1 -0
  365. package/dist/esm/components/editor/NodeGraph/nodeGraphActions.js +53 -0
  366. package/dist/esm/components/editor/NodeGraph/nodeGraphActions.js.map +1 -0
  367. package/dist/esm/components/editor/NodeGraph/nodeGraphDrawing.js +461 -0
  368. package/dist/esm/components/editor/NodeGraph/nodeGraphDrawing.js.map +1 -0
  369. package/dist/esm/components/editor/NodeGraph/nodeGraphIds.js +31 -0
  370. package/dist/esm/components/editor/NodeGraph/nodeGraphIds.js.map +1 -0
  371. package/dist/esm/components/editor/NodeGraph/nodeGraphMath.js +350 -0
  372. package/dist/esm/components/editor/NodeGraph/nodeGraphMath.js.map +1 -0
  373. package/dist/esm/components/editor/NodeGraph/sortSlots.js +69 -0
  374. package/dist/esm/components/editor/NodeGraph/sortSlots.js.map +1 -0
  375. package/dist/esm/components/editor/NodeGraph/useDragGesture.js +63 -0
  376. package/dist/esm/components/editor/NodeGraph/useDragGesture.js.map +1 -0
  377. package/dist/esm/components/editor/NodeGraph/useNodeGraph.js +207 -0
  378. package/dist/esm/components/editor/NodeGraph/useNodeGraph.js.map +1 -0
  379. package/dist/esm/components/editor/NodeGraph/useNodeGraphConnection.js +334 -0
  380. package/dist/esm/components/editor/NodeGraph/useNodeGraphConnection.js.map +1 -0
  381. package/dist/esm/components/editor/NodeGraph/useNodeGraphEdgeInteraction.js +137 -0
  382. package/dist/esm/components/editor/NodeGraph/useNodeGraphEdgeInteraction.js.map +1 -0
  383. package/dist/esm/components/editor/NodeGraph/useNodeGraphGroupDrag.js +392 -0
  384. package/dist/esm/components/editor/NodeGraph/useNodeGraphGroupDrag.js.map +1 -0
  385. package/dist/esm/components/editor/NodeGraph/useNodeGraphKeyboard.js +164 -0
  386. package/dist/esm/components/editor/NodeGraph/useNodeGraphKeyboard.js.map +1 -0
  387. package/dist/esm/components/editor/NodeGraph/useNodeGraphNodeDrag.js +234 -0
  388. package/dist/esm/components/editor/NodeGraph/useNodeGraphNodeDrag.js.map +1 -0
  389. package/dist/esm/components/editor/NodeGraph/useStoreSlice.js +49 -0
  390. package/dist/esm/components/editor/NodeGraph/useStoreSlice.js.map +1 -0
  391. package/dist/esm/components/editor/PropertyInspector/PropertyGroup.js +1 -1
  392. package/dist/esm/components/editor/PropertyInspector/PropertyGroup.js.map +1 -1
  393. package/dist/esm/components/editor/PropertyInspector/PropertyPanel.css.js +4 -3
  394. package/dist/esm/components/editor/PropertyInspector/PropertyPanel.css.js.map +1 -1
  395. package/dist/esm/components/editor/PropertyInspector/PropertyPanel.js +12 -7
  396. package/dist/esm/components/editor/PropertyInspector/PropertyPanel.js.map +1 -1
  397. package/dist/esm/components/editor/PropertyInspector/PropertyRow.css.js +7 -6
  398. package/dist/esm/components/editor/PropertyInspector/PropertyRow.css.js.map +1 -1
  399. package/dist/esm/components/editor/PropertyInspector/PropertyRow.js +21 -5
  400. package/dist/esm/components/editor/PropertyInspector/PropertyRow.js.map +1 -1
  401. package/dist/esm/components/editor/PropertyInspector/PropertySection.css.js +11 -10
  402. package/dist/esm/components/editor/PropertyInspector/PropertySection.css.js.map +1 -1
  403. package/dist/esm/components/editor/PropertyInspector/PropertySection.js +32 -11
  404. package/dist/esm/components/editor/PropertyInspector/PropertySection.js.map +1 -1
  405. package/dist/esm/components/editor/PropertyInspector/usePropertyUndo.js.map +1 -1
  406. package/dist/esm/components/editor/Timeline/Timeline.css.js +23 -0
  407. package/dist/esm/components/editor/Timeline/Timeline.css.js.map +1 -0
  408. package/dist/esm/components/editor/Timeline/Timeline.js +450 -0
  409. package/dist/esm/components/editor/Timeline/Timeline.js.map +1 -0
  410. package/dist/esm/components/editor/Timeline/Timeline.types.js +10 -0
  411. package/dist/esm/components/editor/Timeline/Timeline.types.js.map +1 -0
  412. package/dist/esm/components/editor/Timeline/TimelineContext.js +69 -0
  413. package/dist/esm/components/editor/Timeline/TimelineContext.js.map +1 -0
  414. package/dist/esm/components/editor/Timeline/TimelineFooter.js +16 -0
  415. package/dist/esm/components/editor/Timeline/TimelineFooter.js.map +1 -0
  416. package/dist/esm/components/editor/Timeline/TimelineMinimap.js +280 -0
  417. package/dist/esm/components/editor/Timeline/TimelineMinimap.js.map +1 -0
  418. package/dist/esm/components/editor/Timeline/TimelineStore.js +289 -0
  419. package/dist/esm/components/editor/Timeline/TimelineStore.js.map +1 -0
  420. package/dist/esm/components/editor/Timeline/TimelineToolbar.js +15 -0
  421. package/dist/esm/components/editor/Timeline/TimelineToolbar.js.map +1 -0
  422. package/dist/esm/components/editor/Timeline/TimelineTrackHeaders.js +142 -0
  423. package/dist/esm/components/editor/Timeline/TimelineTrackHeaders.js.map +1 -0
  424. package/dist/esm/components/editor/Timeline/TimelineTrackScale.js +18 -0
  425. package/dist/esm/components/editor/Timeline/TimelineTrackScale.js.map +1 -0
  426. package/dist/esm/components/editor/Timeline/index.js +18 -0
  427. package/dist/esm/components/editor/Timeline/index.js.map +1 -0
  428. package/dist/esm/components/editor/Timeline/timelineCoords.js +118 -0
  429. package/dist/esm/components/editor/Timeline/timelineCoords.js.map +1 -0
  430. package/dist/esm/components/editor/Timeline/timelineDrawing.js +390 -0
  431. package/dist/esm/components/editor/Timeline/timelineDrawing.js.map +1 -0
  432. package/dist/esm/components/editor/Timeline/timelineEdits.js +323 -0
  433. package/dist/esm/components/editor/Timeline/timelineEdits.js.map +1 -0
  434. package/dist/esm/components/editor/Timeline/timelineHitTest.js +153 -0
  435. package/dist/esm/components/editor/Timeline/timelineHitTest.js.map +1 -0
  436. package/dist/esm/components/editor/Timeline/timelineLayout.js +39 -0
  437. package/dist/esm/components/editor/Timeline/timelineLayout.js.map +1 -0
  438. package/dist/esm/components/editor/Timeline/timelineSelection.js +0 -0
  439. package/dist/esm/components/editor/Timeline/timelineSelection.js.map +1 -0
  440. package/dist/esm/components/editor/Timeline/useTimelineDraw.js +156 -0
  441. package/dist/esm/components/editor/Timeline/useTimelineDraw.js.map +1 -0
  442. package/dist/esm/components/editor/Timeline/useTimelineGestures.js +587 -0
  443. package/dist/esm/components/editor/Timeline/useTimelineGestures.js.map +1 -0
  444. package/dist/esm/components/editor/Timeline/useTimelinePlayback.js +85 -0
  445. package/dist/esm/components/editor/Timeline/useTimelinePlayback.js.map +1 -0
  446. package/dist/esm/components/editor/TransformControl/TransformControl.js +4 -4
  447. package/dist/esm/components/editor/TransformControl/TransformControl.js.map +1 -1
  448. package/dist/esm/components/editor/ViewportGizmo/ViewportGizmo.js +8 -4
  449. package/dist/esm/components/editor/ViewportGizmo/ViewportGizmo.js.map +1 -1
  450. package/dist/esm/components/editor/ViewportGizmo/gizmoMath.js +6 -2
  451. package/dist/esm/components/editor/ViewportGizmo/gizmoMath.js.map +1 -1
  452. package/dist/esm/components/editor/ViewportGizmo/useGizmoInteraction.js +8 -6
  453. package/dist/esm/components/editor/ViewportGizmo/useGizmoInteraction.js.map +1 -1
  454. package/dist/esm/components/editor/ViewportGizmo/useGizmoRenderer.js +1 -2
  455. package/dist/esm/components/editor/ViewportGizmo/useGizmoRenderer.js.map +1 -1
  456. package/dist/esm/components/feedback/Alert/Alert.js +8 -8
  457. package/dist/esm/components/feedback/Alert/Alert.js.map +1 -1
  458. package/dist/esm/components/feedback/Alert/AlertActions.js.map +1 -1
  459. package/dist/esm/components/feedback/Alert/AlertDescription.js.map +1 -1
  460. package/dist/esm/components/feedback/Alert/AlertTitle.js.map +1 -1
  461. package/dist/esm/components/feedback/CommandPalette/CommandPalette.js +32 -22
  462. package/dist/esm/components/feedback/CommandPalette/CommandPalette.js.map +1 -1
  463. package/dist/esm/components/feedback/CommandPalette/fuzzySearch.js.map +1 -1
  464. package/dist/esm/components/feedback/CommandPalette/useRecentItems.js +3 -1
  465. package/dist/esm/components/feedback/CommandPalette/useRecentItems.js.map +1 -1
  466. package/dist/esm/components/feedback/Dialog/Dialog.js +6 -3
  467. package/dist/esm/components/feedback/Dialog/Dialog.js.map +1 -1
  468. package/dist/esm/components/feedback/Dialog/DialogBody.js.map +1 -1
  469. package/dist/esm/components/feedback/Dialog/DialogClose.js.map +1 -1
  470. package/dist/esm/components/feedback/Dialog/DialogFooter.js.map +1 -1
  471. package/dist/esm/components/feedback/Dialog/DialogHeader.js +1 -1
  472. package/dist/esm/components/feedback/Dialog/DialogHeader.js.map +1 -1
  473. package/dist/esm/components/feedback/Dialog/useDialogAnimation.js +10 -2
  474. package/dist/esm/components/feedback/Dialog/useDialogAnimation.js.map +1 -1
  475. package/dist/esm/components/feedback/Drawer/Drawer.js +4 -1
  476. package/dist/esm/components/feedback/Drawer/Drawer.js.map +1 -1
  477. package/dist/esm/components/feedback/Drawer/useDrawerAnimation.js +4 -0
  478. package/dist/esm/components/feedback/Drawer/useDrawerAnimation.js.map +1 -1
  479. package/dist/esm/components/feedback/EmptyState/EmptyState.js +1 -1
  480. package/dist/esm/components/feedback/EmptyState/EmptyState.js.map +1 -1
  481. package/dist/esm/components/feedback/LogView/LogView.css.js +35 -0
  482. package/dist/esm/components/feedback/LogView/LogView.css.js.map +1 -0
  483. package/dist/esm/components/feedback/LogView/LogView.js +297 -0
  484. package/dist/esm/components/feedback/LogView/LogView.js.map +1 -0
  485. package/dist/esm/components/feedback/LogView/LogViewBody.js +205 -0
  486. package/dist/esm/components/feedback/LogView/LogViewBody.js.map +1 -0
  487. package/dist/esm/components/feedback/LogView/LogViewContext.js +31 -0
  488. package/dist/esm/components/feedback/LogView/LogViewContext.js.map +1 -0
  489. package/dist/esm/components/feedback/LogView/LogViewParts.js +73 -0
  490. package/dist/esm/components/feedback/LogView/LogViewParts.js.map +1 -0
  491. package/dist/esm/components/feedback/LogView/LogViewStore.js +240 -0
  492. package/dist/esm/components/feedback/LogView/LogViewStore.js.map +1 -0
  493. package/dist/esm/components/feedback/LogView/logViewLabels.js +25 -0
  494. package/dist/esm/components/feedback/LogView/logViewLabels.js.map +1 -0
  495. package/dist/esm/components/feedback/LogView/logViewLevels.js +74 -0
  496. package/dist/esm/components/feedback/LogView/logViewLevels.js.map +1 -0
  497. package/dist/esm/components/feedback/LogView/logViewUtils.js +128 -0
  498. package/dist/esm/components/feedback/LogView/logViewUtils.js.map +1 -0
  499. package/dist/esm/components/feedback/LogView/useFollowTail.js +95 -0
  500. package/dist/esm/components/feedback/LogView/useFollowTail.js.map +1 -0
  501. package/dist/esm/components/feedback/LogView/useLogSelection.js +113 -0
  502. package/dist/esm/components/feedback/LogView/useLogSelection.js.map +1 -0
  503. package/dist/esm/components/feedback/ProgressBar/CircularProgress.js +1 -1
  504. package/dist/esm/components/feedback/ProgressBar/CircularProgress.js.map +1 -1
  505. package/dist/esm/components/feedback/ProgressBar/ProgressBar.js +1 -1
  506. package/dist/esm/components/feedback/ProgressBar/ProgressBar.js.map +1 -1
  507. package/dist/esm/components/feedback/Skeleton/Skeleton.js +1 -1
  508. package/dist/esm/components/feedback/Skeleton/Skeleton.js.map +1 -1
  509. package/dist/esm/components/feedback/Skeleton/SkeletonGroup.js +1 -1
  510. package/dist/esm/components/feedback/Skeleton/SkeletonGroup.js.map +1 -1
  511. package/dist/esm/components/feedback/Skeleton/SkeletonLayout.js +1 -1
  512. package/dist/esm/components/feedback/Skeleton/SkeletonLayout.js.map +1 -1
  513. package/dist/esm/components/feedback/Spinner/Spinner.js +1 -1
  514. package/dist/esm/components/feedback/Spinner/Spinner.js.map +1 -1
  515. package/dist/esm/components/feedback/Stat/Stat.js.map +1 -1
  516. package/dist/esm/components/feedback/Toast/ToastContainer.js +1 -1
  517. package/dist/esm/components/feedback/Toast/ToastContainer.js.map +1 -1
  518. package/dist/esm/components/feedback/Toast/ToastItem.js +7 -3
  519. package/dist/esm/components/feedback/Toast/ToastItem.js.map +1 -1
  520. package/dist/esm/components/feedback/Toast/ToastProvider.js.map +1 -1
  521. package/dist/esm/components/feedback/Toast/useToast.js.map +1 -1
  522. package/dist/esm/components/form/FormHelperText.js.map +1 -1
  523. package/dist/esm/components/form/FormLabel.js.map +1 -1
  524. package/dist/esm/components/form/InputWrapper.js.map +1 -1
  525. package/dist/esm/components/layout/Accordion/Accordion.js +1 -1
  526. package/dist/esm/components/layout/Accordion/Accordion.js.map +1 -1
  527. package/dist/esm/components/layout/Accordion/AccordionContent.js +1 -1
  528. package/dist/esm/components/layout/Accordion/AccordionContent.js.map +1 -1
  529. package/dist/esm/components/layout/Accordion/AccordionItem.js +1 -1
  530. package/dist/esm/components/layout/Accordion/AccordionItem.js.map +1 -1
  531. package/dist/esm/components/layout/Accordion/AccordionTrigger.js +7 -2
  532. package/dist/esm/components/layout/Accordion/AccordionTrigger.js.map +1 -1
  533. package/dist/esm/components/layout/Card/Card.js +2 -2
  534. package/dist/esm/components/layout/Card/Card.js.map +1 -1
  535. package/dist/esm/components/layout/Divider/Divider.js.map +1 -1
  536. package/dist/esm/components/layout/Flex/Flex.js +1 -1
  537. package/dist/esm/components/layout/Flex/Flex.js.map +1 -1
  538. package/dist/esm/components/layout/Grid/Grid.js +1 -1
  539. package/dist/esm/components/layout/Grid/Grid.js.map +1 -1
  540. package/dist/esm/components/layout/ListItem/ListItem.js +1 -1
  541. package/dist/esm/components/layout/ListItem/ListItem.js.map +1 -1
  542. package/dist/esm/components/layout/PageHeader/PageHeader.js.map +1 -1
  543. package/dist/esm/components/layout/PanelSurface/PanelSurface.js +3 -3
  544. package/dist/esm/components/layout/PanelSurface/PanelSurface.js.map +1 -1
  545. package/dist/esm/components/layout/ScrollArea/ScrollArea.js +91 -23
  546. package/dist/esm/components/layout/ScrollArea/ScrollArea.js.map +1 -1
  547. package/dist/esm/components/layout/Spacer/Spacer.js.map +1 -1
  548. package/dist/esm/components/layout/SplitPane/SplitPane.js +29 -16
  549. package/dist/esm/components/layout/SplitPane/SplitPane.js.map +1 -1
  550. package/dist/esm/components/layout/SplitPane/SplitPanePanel.js.map +1 -1
  551. package/dist/esm/components/layout/Stack/Stack.js +1 -1
  552. package/dist/esm/components/layout/Stack/Stack.js.map +1 -1
  553. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbEllipsis.js +4 -0
  554. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbEllipsis.js.map +1 -1
  555. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbItem.js +6 -2
  556. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbItem.js.map +1 -1
  557. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbSeparator.js.map +1 -1
  558. package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.js +13 -2
  559. package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.js.map +1 -1
  560. package/dist/esm/components/navigation/ContextMenu/ContextMenu.js +45 -39
  561. package/dist/esm/components/navigation/ContextMenu/ContextMenu.js.map +1 -1
  562. package/dist/esm/components/navigation/Menu/Menu.css.js +9 -12
  563. package/dist/esm/components/navigation/Menu/Menu.css.js.map +1 -1
  564. package/dist/esm/components/navigation/Menu/Menu.js +97 -63
  565. package/dist/esm/components/navigation/Menu/Menu.js.map +1 -1
  566. package/dist/esm/components/navigation/Menu/MenuGapContext.js +19 -0
  567. package/dist/esm/components/navigation/Menu/MenuGapContext.js.map +1 -0
  568. package/dist/esm/components/navigation/Pagination/Pagination.js.map +1 -1
  569. package/dist/esm/components/navigation/Pagination/usePagination.js.map +1 -1
  570. package/dist/esm/components/navigation/PathBar/PathBar.css.js +6 -0
  571. package/dist/esm/components/navigation/PathBar/PathBar.css.js.map +1 -0
  572. package/dist/esm/components/navigation/PathBar/PathBar.js +184 -0
  573. package/dist/esm/components/navigation/PathBar/PathBar.js.map +1 -0
  574. package/dist/esm/components/navigation/PathBar/PathBarSiblingMenu.js +151 -0
  575. package/dist/esm/components/navigation/PathBar/PathBarSiblingMenu.js.map +1 -0
  576. package/dist/esm/components/navigation/PathBar/pathUtils.js +118 -0
  577. package/dist/esm/components/navigation/PathBar/pathUtils.js.map +1 -0
  578. package/dist/esm/components/navigation/SegmentedControl/SegmentedControl.js +16 -6
  579. package/dist/esm/components/navigation/SegmentedControl/SegmentedControl.js.map +1 -1
  580. package/dist/esm/components/navigation/SegmentedControl/SegmentedControlItem.js +1 -1
  581. package/dist/esm/components/navigation/SegmentedControl/SegmentedControlItem.js.map +1 -1
  582. package/dist/esm/components/navigation/Tabs/Tab.js +10 -3
  583. package/dist/esm/components/navigation/Tabs/Tab.js.map +1 -1
  584. package/dist/esm/components/navigation/Tabs/TabList.js +5 -2
  585. package/dist/esm/components/navigation/Tabs/TabList.js.map +1 -1
  586. package/dist/esm/components/navigation/Tabs/TabPanel.js +1 -1
  587. package/dist/esm/components/navigation/Tabs/TabPanel.js.map +1 -1
  588. package/dist/esm/components/navigation/Tabs/Tabs.js.map +1 -1
  589. package/dist/esm/components/primitives/Avatar/Avatar.js +11 -4
  590. package/dist/esm/components/primitives/Avatar/Avatar.js.map +1 -1
  591. package/dist/esm/components/primitives/Avatar/AvatarGroup.js +2 -2
  592. package/dist/esm/components/primitives/Avatar/AvatarGroup.js.map +1 -1
  593. package/dist/esm/components/primitives/Badge/Badge.js +10 -3
  594. package/dist/esm/components/primitives/Badge/Badge.js.map +1 -1
  595. package/dist/esm/components/primitives/Button/Button.js.map +1 -1
  596. package/dist/esm/components/primitives/Checkbox/Checkbox.js +6 -4
  597. package/dist/esm/components/primitives/Checkbox/Checkbox.js.map +1 -1
  598. package/dist/esm/components/primitives/Checkbox/CheckboxGroup.js +2 -2
  599. package/dist/esm/components/primitives/Checkbox/CheckboxGroup.js.map +1 -1
  600. package/dist/esm/components/primitives/Code/Code.js.map +1 -1
  601. package/dist/esm/components/primitives/Collapsible/Collapsible.js +2 -2
  602. package/dist/esm/components/primitives/Collapsible/Collapsible.js.map +1 -1
  603. package/dist/esm/components/primitives/HoverCard/HoverCard.js +5 -3
  604. package/dist/esm/components/primitives/HoverCard/HoverCard.js.map +1 -1
  605. package/dist/esm/components/primitives/Icon/Icon.js +1 -1
  606. package/dist/esm/components/primitives/Icon/Icon.js.map +1 -1
  607. package/dist/esm/components/primitives/IconButton/IconButton.js.map +1 -1
  608. package/dist/esm/components/primitives/Input/Input.js +1 -1
  609. package/dist/esm/components/primitives/Input/Input.js.map +1 -1
  610. package/dist/esm/components/primitives/Kbd/Kbd.js +1 -1
  611. package/dist/esm/components/primitives/Kbd/Kbd.js.map +1 -1
  612. package/dist/esm/components/primitives/Link/Link.js.map +1 -1
  613. package/dist/esm/components/primitives/Paper/Paper.js.map +1 -1
  614. package/dist/esm/components/primitives/Popover/Popover.js +1 -1
  615. package/dist/esm/components/primitives/Popover/Popover.js.map +1 -1
  616. package/dist/esm/components/primitives/Popover/PopoverClose.js +1 -1
  617. package/dist/esm/components/primitives/Popover/PopoverClose.js.map +1 -1
  618. package/dist/esm/components/primitives/Popover/PopoverContent.js +6 -4
  619. package/dist/esm/components/primitives/Popover/PopoverContent.js.map +1 -1
  620. package/dist/esm/components/primitives/Popover/PopoverTrigger.js.map +1 -1
  621. package/dist/esm/components/primitives/Radio/Radio.js +3 -3
  622. package/dist/esm/components/primitives/Radio/Radio.js.map +1 -1
  623. package/dist/esm/components/primitives/Radio/RadioGroup.js +2 -2
  624. package/dist/esm/components/primitives/Radio/RadioGroup.js.map +1 -1
  625. package/dist/esm/components/primitives/Switch/Switch.js +1 -1
  626. package/dist/esm/components/primitives/Switch/Switch.js.map +1 -1
  627. package/dist/esm/components/primitives/Text/Text.js.map +1 -1
  628. package/dist/esm/components/primitives/TextArea/TextArea.js +3 -4
  629. package/dist/esm/components/primitives/TextArea/TextArea.js.map +1 -1
  630. package/dist/esm/components/primitives/Tooltip/Arrow.js +1 -1
  631. package/dist/esm/components/primitives/Tooltip/Arrow.js.map +1 -1
  632. package/dist/esm/components/primitives/Tooltip/Tooltip.js +9 -7
  633. package/dist/esm/components/primitives/Tooltip/Tooltip.js.map +1 -1
  634. package/dist/esm/components/primitives/Tooltip/utils.js +1 -1
  635. package/dist/esm/components/primitives/Tooltip/utils.js.map +1 -1
  636. package/dist/esm/components/primitives/VisuallyHidden/VisuallyHidden.js.map +1 -1
  637. package/dist/esm/components/primitives/canvas/CanvasContainer.js +1 -1
  638. package/dist/esm/components/primitives/canvas/CanvasContainer.js.map +1 -1
  639. package/dist/esm/components/primitives/canvas/canvasCoords.js.map +1 -1
  640. package/dist/esm/components/primitives/canvas/canvasDrawing.js +1 -1
  641. package/dist/esm/components/primitives/canvas/canvasDrawing.js.map +1 -1
  642. package/dist/esm/components/primitives/canvas/canvasTheme.js.map +1 -1
  643. package/dist/esm/components/primitives/canvas/useCanvasRenderer.js +8 -2
  644. package/dist/esm/components/primitives/canvas/useCanvasRenderer.js.map +1 -1
  645. package/dist/esm/components/primitives/viewport/Viewport.css.js +12 -0
  646. package/dist/esm/components/primitives/viewport/Viewport.css.js.map +1 -0
  647. package/dist/esm/components/primitives/viewport/Viewport.js +189 -0
  648. package/dist/esm/components/primitives/viewport/Viewport.js.map +1 -0
  649. package/dist/esm/components/primitives/viewport/ViewportContext.js +47 -0
  650. package/dist/esm/components/primitives/viewport/ViewportContext.js.map +1 -0
  651. package/dist/esm/components/primitives/viewport/ViewportLayer.js +113 -0
  652. package/dist/esm/components/primitives/viewport/ViewportLayer.js.map +1 -0
  653. package/dist/esm/components/primitives/viewport/ViewportOverlay.js +47 -0
  654. package/dist/esm/components/primitives/viewport/ViewportOverlay.js.map +1 -0
  655. package/dist/esm/components/primitives/viewport/ViewportStore.js +210 -0
  656. package/dist/esm/components/primitives/viewport/ViewportStore.js.map +1 -0
  657. package/dist/esm/components/primitives/viewport/ViewportWorld.js +38 -0
  658. package/dist/esm/components/primitives/viewport/ViewportWorld.js.map +1 -0
  659. package/dist/esm/components/primitives/viewport/useViewportGestures.js +333 -0
  660. package/dist/esm/components/primitives/viewport/useViewportGestures.js.map +1 -0
  661. package/dist/esm/components/primitives/viewport/viewportCoords.js +37 -0
  662. package/dist/esm/components/primitives/viewport/viewportCoords.js.map +1 -0
  663. package/dist/esm/components/primitives/viewport/viewportMath.js +77 -0
  664. package/dist/esm/components/primitives/viewport/viewportMath.js.map +1 -0
  665. package/dist/esm/components/shell/AppShell/AppShell.js +1 -1
  666. package/dist/esm/components/shell/AppShell/AppShell.js.map +1 -1
  667. package/dist/esm/components/shell/FloatingPanel/FloatingPanel.css.js +11 -10
  668. package/dist/esm/components/shell/FloatingPanel/FloatingPanel.css.js.map +1 -1
  669. package/dist/esm/components/shell/FloatingPanel/FloatingPanel.js +60 -24
  670. package/dist/esm/components/shell/FloatingPanel/FloatingPanel.js.map +1 -1
  671. package/dist/esm/components/shell/MenuBar/MenuBar.js +23 -16
  672. package/dist/esm/components/shell/MenuBar/MenuBar.js.map +1 -1
  673. package/dist/esm/components/shell/StatusBar/StatusBar.js.map +1 -1
  674. package/dist/esm/components/shell/Toolbar/Toolbar.js +4 -3
  675. package/dist/esm/components/shell/Toolbar/Toolbar.js.map +1 -1
  676. package/dist/esm/context/KeyboardContext.js.map +1 -1
  677. package/dist/esm/hooks/useBreakpoint/useBreakpoint.js +1 -1
  678. package/dist/esm/hooks/useBreakpoint/useBreakpoint.js.map +1 -1
  679. package/dist/esm/hooks/useClickOutside/useClickOutside.js +9 -9
  680. package/dist/esm/hooks/useClickOutside/useClickOutside.js.map +1 -1
  681. package/dist/esm/hooks/useClipboard/useClipboard.js +4 -0
  682. package/dist/esm/hooks/useClipboard/useClipboard.js.map +1 -1
  683. package/dist/esm/hooks/useControlledState/useControlledState.js.map +1 -1
  684. package/dist/esm/hooks/useDebounced/useDebouncedCallback.js +11 -6
  685. package/dist/esm/hooks/useDebounced/useDebouncedCallback.js.map +1 -1
  686. package/dist/esm/hooks/useDebounced/useDebouncedValue.js +16 -4
  687. package/dist/esm/hooks/useDebounced/useDebouncedValue.js.map +1 -1
  688. package/dist/esm/hooks/useDisclosure/useDisclosure.js.map +1 -1
  689. package/dist/esm/hooks/useEventCallback/useEventCallback.js +49 -0
  690. package/dist/esm/hooks/useEventCallback/useEventCallback.js.map +1 -0
  691. package/dist/esm/hooks/useFocusTrap/useFocusTrap.js.map +1 -1
  692. package/dist/esm/hooks/useHotkey/useHotkey.js +7 -12
  693. package/dist/esm/hooks/useHotkey/useHotkey.js.map +1 -1
  694. package/dist/esm/hooks/useIntersectionObserver/useIntersectionObserver.js +2 -0
  695. package/dist/esm/hooks/useIntersectionObserver/useIntersectionObserver.js.map +1 -1
  696. package/dist/esm/hooks/useIsMounted/useIsMounted.js +43 -0
  697. package/dist/esm/hooks/useIsMounted/useIsMounted.js.map +1 -0
  698. package/dist/esm/hooks/useKeyboard/useKeyboard.js.map +1 -1
  699. package/dist/esm/hooks/useKeyboard/utils.js.map +1 -1
  700. package/dist/esm/hooks/useLatest/useLatest.js +31 -0
  701. package/dist/esm/hooks/useLatest/useLatest.js.map +1 -0
  702. package/dist/esm/hooks/useListboxNav/useListboxNav.js +29 -13
  703. package/dist/esm/hooks/useListboxNav/useListboxNav.js.map +1 -1
  704. package/dist/esm/hooks/useMediaQuery/useMediaQuery.js +7 -1
  705. package/dist/esm/hooks/useMediaQuery/useMediaQuery.js.map +1 -1
  706. package/dist/esm/hooks/useMergedRef/useMergedRef.js +6 -1
  707. package/dist/esm/hooks/useMergedRef/useMergedRef.js.map +1 -1
  708. package/dist/esm/hooks/useNavigationHistory/useNavigationHistory.js +146 -0
  709. package/dist/esm/hooks/useNavigationHistory/useNavigationHistory.js.map +1 -0
  710. package/dist/esm/hooks/useResizeObserver/useResizeObserver.js +6 -8
  711. package/dist/esm/hooks/useResizeObserver/useResizeObserver.js.map +1 -1
  712. package/dist/esm/hooks/useTheme/useTheme.js +6 -3
  713. package/dist/esm/hooks/useTheme/useTheme.js.map +1 -1
  714. package/dist/esm/hooks/useThrottledCallback/useThrottledCallback.js +9 -4
  715. package/dist/esm/hooks/useThrottledCallback/useThrottledCallback.js.map +1 -1
  716. package/dist/esm/index.js +63 -4
  717. package/dist/esm/index.js.map +1 -1
  718. package/dist/esm/node_modules/tslib/tslib.es6.js +37 -0
  719. package/dist/esm/node_modules/tslib/tslib.es6.js.map +1 -0
  720. package/dist/esm/styles.js +3 -0
  721. package/dist/esm/styles.js.map +1 -0
  722. package/dist/esm/theme/ThemeProvider.js +6 -4
  723. package/dist/esm/theme/ThemeProvider.js.map +1 -1
  724. package/dist/esm/theme/VanillaThemeProvider.js.map +1 -1
  725. package/dist/esm/theme/breakpoints.js.map +1 -1
  726. package/dist/esm/theme/contract.css.js +1 -1
  727. package/dist/esm/theme/createCustomTheme.js +2 -2
  728. package/dist/esm/theme/createCustomTheme.js.map +1 -1
  729. package/dist/esm/theme/createLightTheme.js.map +1 -1
  730. package/dist/esm/theme/darkTheme.css.js +2 -2
  731. package/dist/esm/theme/darkThemeValues.js +1 -1
  732. package/dist/esm/theme/darkThemeValues.js.map +1 -1
  733. package/dist/esm/theme/lightTheme.css.js +1 -1
  734. package/dist/esm/theme/lightThemeValues.js +1 -1
  735. package/dist/esm/theme/lightThemeValues.js.map +1 -1
  736. package/dist/esm/theme/themeContractData.js +4 -4
  737. package/dist/esm/theme/themeContractData.js.map +1 -1
  738. package/dist/esm/utils/cx.js.map +1 -1
  739. package/dist/esm/utils/devWarn.js +1 -1
  740. package/dist/esm/utils/devWarn.js.map +1 -1
  741. package/dist/esm/utils/mathExpression.js +1 -1
  742. package/dist/esm/utils/mathExpression.js.map +1 -1
  743. package/dist/esm/utils/mathUtils.js.map +1 -1
  744. package/dist/esm/utils/objects.js.map +1 -1
  745. package/dist/esm/utils/platform.js.map +1 -1
  746. package/dist/tokens/tokens.dark.css +1 -1
  747. package/dist/tokens/tokens.json +1 -1
  748. package/dist/tokens/tokens.light.css +1 -1
  749. package/dist/types/components/Icons/AddIcon.d.ts +1 -1
  750. package/dist/types/components/Icons/AiChatIcon.d.ts +1 -1
  751. package/dist/types/components/Icons/AiSparklesIcon.d.ts +1 -1
  752. package/dist/types/components/Icons/ArchiveIcon.d.ts +1 -1
  753. package/dist/types/components/Icons/ArrowDownIcon.d.ts +1 -1
  754. package/dist/types/components/Icons/ArrowLeftIcon.d.ts +1 -1
  755. package/dist/types/components/Icons/ArrowRightIcon.d.ts +1 -1
  756. package/dist/types/components/Icons/ArrowUpIcon.d.ts +1 -1
  757. package/dist/types/components/Icons/BookmarkIcon.d.ts +1 -1
  758. package/dist/types/components/Icons/BugIcon.d.ts +1 -1
  759. package/dist/types/components/Icons/BuildingIcon.d.ts +1 -1
  760. package/dist/types/components/Icons/CalendarIcon.d.ts +1 -1
  761. package/dist/types/components/Icons/CameraIcon.d.ts +34 -0
  762. package/dist/types/components/Icons/CheckIcon.d.ts +1 -1
  763. package/dist/types/components/Icons/ChevronDownIcon.d.ts +1 -1
  764. package/dist/types/components/Icons/ChevronLeftIcon.d.ts +1 -1
  765. package/dist/types/components/Icons/ChevronRightIcon.d.ts +1 -1
  766. package/dist/types/components/Icons/ChevronUpIcon.d.ts +1 -1
  767. package/dist/types/components/Icons/CircleIcon.d.ts +1 -1
  768. package/dist/types/components/Icons/ClockIcon.d.ts +1 -1
  769. package/dist/types/components/Icons/CloseIcon.d.ts +1 -1
  770. package/dist/types/components/Icons/CloudUploadIcon.d.ts +1 -1
  771. package/dist/types/components/Icons/CodeIcon.d.ts +1 -1
  772. package/dist/types/components/Icons/CopyIcon.d.ts +1 -1
  773. package/dist/types/components/Icons/CubeIcon.d.ts +34 -0
  774. package/dist/types/components/Icons/CutIcon.d.ts +1 -1
  775. package/dist/types/components/Icons/DotsHorizontalIcon.d.ts +1 -1
  776. package/dist/types/components/Icons/DotsVerticalIcon.d.ts +1 -1
  777. package/dist/types/components/Icons/DownloadIcon.d.ts +1 -1
  778. package/dist/types/components/Icons/EditIcon.d.ts +1 -1
  779. package/dist/types/components/Icons/ErrorIcon.d.ts +1 -1
  780. package/dist/types/components/Icons/ExternalLinkIcon.d.ts +1 -1
  781. package/dist/types/components/Icons/EyeDropperIcon.d.ts +1 -1
  782. package/dist/types/components/Icons/EyeIcon.d.ts +1 -1
  783. package/dist/types/components/Icons/FileTextIcon.d.ts +1 -1
  784. package/dist/types/components/Icons/FilterIcon.d.ts +1 -1
  785. package/dist/types/components/Icons/FirstIcon.d.ts +1 -1
  786. package/dist/types/components/Icons/FolderCogIcon.d.ts +1 -1
  787. package/dist/types/components/Icons/FolderIcon.d.ts +1 -1
  788. package/dist/types/components/Icons/FolderOpenIcon.d.ts +1 -1
  789. package/dist/types/components/Icons/FullscreenIcon.d.ts +1 -1
  790. package/dist/types/components/Icons/GitBranchIcon.d.ts +1 -1
  791. package/dist/types/components/Icons/GridIcon.d.ts +1 -1
  792. package/dist/types/components/Icons/HeartIcon.d.ts +1 -1
  793. package/dist/types/components/Icons/HelpIcon.d.ts +1 -1
  794. package/dist/types/components/Icons/HomeIcon.d.ts +1 -1
  795. package/dist/types/components/Icons/ImageIcon.d.ts +34 -0
  796. package/dist/types/components/Icons/InfoIcon.d.ts +1 -1
  797. package/dist/types/components/Icons/LastIcon.d.ts +1 -1
  798. package/dist/types/components/Icons/LinkIcon.d.ts +1 -1
  799. package/dist/types/components/Icons/ListIcon.d.ts +1 -1
  800. package/dist/types/components/Icons/LockIcon.d.ts +1 -1
  801. package/dist/types/components/Icons/MaximizeIcon.d.ts +1 -1
  802. package/dist/types/components/Icons/MenuIcon.d.ts +1 -1
  803. package/dist/types/components/Icons/MinimizeIcon.d.ts +1 -1
  804. package/dist/types/components/Icons/MinusIcon.d.ts +1 -1
  805. package/dist/types/components/Icons/OrbitIcon.d.ts +34 -0
  806. package/dist/types/components/Icons/PasteIcon.d.ts +1 -1
  807. package/dist/types/components/Icons/PauseIcon.d.ts +1 -1
  808. package/dist/types/components/Icons/PinIcon.d.ts +1 -1
  809. package/dist/types/components/Icons/PlayIcon.d.ts +1 -1
  810. package/dist/types/components/Icons/RedoIcon.d.ts +1 -1
  811. package/dist/types/components/Icons/RefreshIcon.d.ts +1 -1
  812. package/dist/types/components/Icons/RobotIcon.d.ts +1 -1
  813. package/dist/types/components/Icons/RotateIcon.d.ts +35 -0
  814. package/dist/types/components/Icons/SaveIcon.d.ts +1 -1
  815. package/dist/types/components/Icons/SearchIcon.d.ts +1 -1
  816. package/dist/types/components/Icons/SendIcon.d.ts +1 -1
  817. package/dist/types/components/Icons/SettingsIcon.d.ts +1 -1
  818. package/dist/types/components/Icons/SortIcon.d.ts +1 -1
  819. package/dist/types/components/Icons/SpinIcon.d.ts +35 -0
  820. package/dist/types/components/Icons/StarIcon.d.ts +1 -1
  821. package/dist/types/components/Icons/StopIcon.d.ts +1 -1
  822. package/dist/types/components/Icons/SuccessIcon.d.ts +1 -1
  823. package/dist/types/components/Icons/TagIcon.d.ts +1 -1
  824. package/dist/types/components/Icons/TangentAlignedIcon.d.ts +1 -1
  825. package/dist/types/components/Icons/TangentAutoIcon.d.ts +1 -1
  826. package/dist/types/components/Icons/TangentFreeIcon.d.ts +1 -1
  827. package/dist/types/components/Icons/TangentLinearIcon.d.ts +1 -1
  828. package/dist/types/components/Icons/TangentMirroredIcon.d.ts +1 -1
  829. package/dist/types/components/Icons/TangentStepIcon.d.ts +1 -1
  830. package/dist/types/components/Icons/TerminalIcon.d.ts +1 -1
  831. package/dist/types/components/Icons/TrashIcon.d.ts +1 -1
  832. package/dist/types/components/Icons/UndoIcon.d.ts +1 -1
  833. package/dist/types/components/Icons/UnlinkIcon.d.ts +1 -1
  834. package/dist/types/components/Icons/UnlockIcon.d.ts +1 -1
  835. package/dist/types/components/Icons/UploadIcon.d.ts +1 -1
  836. package/dist/types/components/Icons/UserIcon.d.ts +1 -1
  837. package/dist/types/components/Icons/UsersIcon.d.ts +1 -1
  838. package/dist/types/components/Icons/WarningIcon.d.ts +1 -1
  839. package/dist/types/components/Icons/ZoomFitIcon.d.ts +35 -0
  840. package/dist/types/components/Icons/ZoomInIcon.d.ts +1 -1
  841. package/dist/types/components/Icons/ZoomOutIcon.d.ts +1 -1
  842. package/dist/types/components/controls/CartesianPicker/CartesianPicker.types.d.ts +3 -3
  843. package/dist/types/components/controls/ColorPicker/ColorPicker.types.d.ts +2 -2
  844. package/dist/types/components/controls/ColorPicker/EyeDropper.d.ts +1 -1
  845. package/dist/types/components/controls/Combobox/Combobox.types.d.ts +1 -1
  846. package/dist/types/components/controls/CurveEditor/CurveEditor.types.d.ts +8 -58
  847. package/dist/types/components/controls/CurveEditor/curveUtils.d.ts +2 -1
  848. package/dist/types/components/controls/FileTree/FileTree.d.ts +34 -0
  849. package/dist/types/components/controls/FileTree/FileTree.types.d.ts +133 -0
  850. package/dist/types/components/controls/FileTree/fileTreeIcons.d.ts +29 -0
  851. package/dist/types/components/controls/FileTree/fileTreeLabels.d.ts +19 -0
  852. package/dist/types/components/controls/FileUploader/FileUploader.types.d.ts +2 -2
  853. package/dist/types/components/controls/MultiSelect/MultiSelect.types.d.ts +1 -1
  854. package/dist/types/components/controls/NumberInput/NumberInput.d.ts +2 -2
  855. package/dist/types/components/controls/Select/Select.d.ts +1 -1
  856. package/dist/types/components/controls/Select/Select.types.d.ts +45 -11
  857. package/dist/types/components/controls/Slider/Slider.d.ts +1 -1
  858. package/dist/types/components/controls/TagInput/TagInput.types.d.ts +2 -2
  859. package/dist/types/components/controls/TreeView/TreeView.d.ts +1 -1
  860. package/dist/types/components/controls/TreeView/TreeView.types.d.ts +24 -2
  861. package/dist/types/components/controls/VectorInput/VectorInput.types.d.ts +1 -1
  862. package/dist/types/components/data/DataTable/DataTable.types.d.ts +2 -2
  863. package/dist/types/components/editor/AssetBrowser/AssetBrowser.d.ts +13 -0
  864. package/dist/types/components/editor/AssetBrowser/AssetBrowser.types.d.ts +241 -0
  865. package/dist/types/components/editor/AssetBrowser/assetBrowserLabels.d.ts +70 -0
  866. package/dist/types/components/editor/ChatPanel/ChatMarkdownRenderer.types.d.ts +1 -1
  867. package/dist/types/components/editor/ChatPanel/ChatPanel.types.d.ts +2 -2
  868. package/dist/types/components/editor/Minimap/Minimap.d.ts +26 -0
  869. package/dist/types/components/editor/Minimap/Minimap.types.d.ts +249 -0
  870. package/dist/types/components/editor/Minimap/MinimapContext.d.ts +27 -0
  871. package/dist/types/components/editor/Minimap/MinimapCorner.d.ts +8 -0
  872. package/dist/types/components/editor/Minimap/MinimapFooter.d.ts +8 -0
  873. package/dist/types/components/editor/Minimap/MinimapStore.d.ts +17 -0
  874. package/dist/types/components/editor/Minimap/MinimapTitle.d.ts +8 -0
  875. package/dist/types/components/editor/Minimap/ViewportMinimap.d.ts +52 -0
  876. package/dist/types/components/editor/Minimap/computeBoundsFromItems.d.ts +13 -0
  877. package/dist/types/components/editor/Minimap/index.d.ts +13 -0
  878. package/dist/types/components/editor/NodeGraph/NodeGraph.d.ts +63 -0
  879. package/dist/types/components/editor/NodeGraph/NodeGraph.types.d.ts +568 -0
  880. package/dist/types/components/editor/NodeGraph/NodeGraphContext.d.ts +30 -0
  881. package/dist/types/components/editor/NodeGraph/NodeGraphNodeParts.d.ts +86 -0
  882. package/dist/types/components/editor/NodeGraph/NodeGraphNodeSection.d.ts +47 -0
  883. package/dist/types/components/editor/NodeGraph/NodeGraphPin.d.ts +57 -0
  884. package/dist/types/components/editor/NodeGraph/NodeGraphPort.d.ts +30 -0
  885. package/dist/types/components/editor/NodeGraph/NodeGraphPortVisual.d.ts +46 -0
  886. package/dist/types/components/editor/NodeGraph/NodeGraphSlots.d.ts +16 -0
  887. package/dist/types/components/editor/NodeGraph/NodeGraphStore.d.ts +256 -0
  888. package/dist/types/components/editor/NodeGraph/NodeGraphToolbar.d.ts +54 -0
  889. package/dist/types/components/editor/NodeGraph/createTypeMatchValidator.d.ts +43 -0
  890. package/dist/types/components/editor/NodeGraph/nodeGraphActions.d.ts +39 -0
  891. package/dist/types/components/editor/NodeGraph/nodeGraphIds.d.ts +16 -0
  892. package/dist/types/components/editor/NodeGraph/useNodeGraph.d.ts +103 -0
  893. package/dist/types/components/editor/PropertyInspector/PropertyInspector.types.d.ts +51 -5
  894. package/dist/types/components/editor/Timeline/Timeline.d.ts +18 -0
  895. package/dist/types/components/editor/Timeline/Timeline.types.d.ts +348 -0
  896. package/dist/types/components/editor/Timeline/TimelineContext.d.ts +51 -0
  897. package/dist/types/components/editor/Timeline/TimelineFooter.d.ts +8 -0
  898. package/dist/types/components/editor/Timeline/TimelineMinimap.d.ts +21 -0
  899. package/dist/types/components/editor/Timeline/TimelineStore.d.ts +41 -0
  900. package/dist/types/components/editor/Timeline/TimelineToolbar.d.ts +8 -0
  901. package/dist/types/components/editor/Timeline/TimelineTrackScale.d.ts +8 -0
  902. package/dist/types/components/editor/Timeline/index.d.ts +15 -0
  903. package/dist/types/components/editor/Timeline/timelineCoords.d.ts +7 -0
  904. package/dist/types/components/editor/Timeline/timelineEdits.d.ts +18 -0
  905. package/dist/types/components/editor/TransformControl/TransformControl.types.d.ts +2 -2
  906. package/dist/types/components/editor/ViewportGizmo/ViewportGizmo.types.d.ts +1 -1
  907. package/dist/types/components/feedback/Alert/Alert.d.ts +2 -2
  908. package/dist/types/components/feedback/Alert/Alert.types.d.ts +5 -5
  909. package/dist/types/components/feedback/CommandPalette/CommandPalette.types.d.ts +1 -3
  910. package/dist/types/components/feedback/Dialog/Dialog.types.d.ts +2 -2
  911. package/dist/types/components/feedback/Drawer/Drawer.types.d.ts +1 -1
  912. package/dist/types/components/feedback/EmptyState/EmptyState.types.d.ts +2 -2
  913. package/dist/types/components/feedback/LogView/LogView.d.ts +58 -0
  914. package/dist/types/components/feedback/LogView/LogView.types.d.ts +333 -0
  915. package/dist/types/components/feedback/LogView/LogViewBody.d.ts +15 -0
  916. package/dist/types/components/feedback/LogView/LogViewContext.d.ts +9 -0
  917. package/dist/types/components/feedback/LogView/LogViewParts.d.ts +35 -0
  918. package/dist/types/components/feedback/LogView/LogViewStore.d.ts +4 -0
  919. package/dist/types/components/feedback/LogView/logViewLabels.d.ts +9 -0
  920. package/dist/types/components/feedback/LogView/logViewUtils.d.ts +41 -0
  921. package/dist/types/components/feedback/ProgressBar/ProgressBar.types.d.ts +3 -3
  922. package/dist/types/components/feedback/Skeleton/Skeleton.types.d.ts +4 -4
  923. package/dist/types/components/feedback/Stat/Stat.types.d.ts +2 -2
  924. package/dist/types/components/feedback/Toast/Toast.types.d.ts +1 -1
  925. package/dist/types/components/form/FormHelperText.d.ts +2 -2
  926. package/dist/types/components/form/FormLabel.d.ts +1 -1
  927. package/dist/types/components/form/InputWrapper.d.ts +2 -2
  928. package/dist/types/components/layout/Accordion/Accordion.types.d.ts +2 -2
  929. package/dist/types/components/layout/Card/Card.types.d.ts +6 -6
  930. package/dist/types/components/layout/Divider/Divider.types.d.ts +2 -2
  931. package/dist/types/components/layout/Flex/Flex.d.ts +1 -1
  932. package/dist/types/components/layout/Grid/Grid.d.ts +1 -1
  933. package/dist/types/components/layout/ListItem/ListItem.types.d.ts +2 -2
  934. package/dist/types/components/layout/PageHeader/PageHeader.types.d.ts +1 -1
  935. package/dist/types/components/layout/PanelSurface/PanelSurface.types.d.ts +6 -6
  936. package/dist/types/components/layout/ScrollArea/ScrollArea.types.d.ts +2 -2
  937. package/dist/types/components/layout/Stack/Stack.d.ts +1 -1
  938. package/dist/types/components/navigation/Breadcrumbs/BreadcrumbItem.d.ts +1 -0
  939. package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.types.d.ts +7 -0
  940. package/dist/types/components/navigation/ContextMenu/ContextMenu.d.ts +18 -3
  941. package/dist/types/components/navigation/ContextMenu/ContextMenu.types.d.ts +55 -63
  942. package/dist/types/components/navigation/Menu/Menu.d.ts +38 -35
  943. package/dist/types/components/navigation/Menu/Menu.types.d.ts +190 -71
  944. package/dist/types/components/navigation/Pagination/Pagination.types.d.ts +1 -1
  945. package/dist/types/components/navigation/PathBar/PathBar.d.ts +31 -0
  946. package/dist/types/components/navigation/PathBar/PathBar.types.d.ts +79 -0
  947. package/dist/types/components/navigation/SegmentedControl/SegmentedControl.types.d.ts +3 -3
  948. package/dist/types/components/navigation/Tabs/Tabs.types.d.ts +2 -2
  949. package/dist/types/components/primitives/Avatar/Avatar.types.d.ts +2 -2
  950. package/dist/types/components/primitives/Badge/Badge.types.d.ts +1 -1
  951. package/dist/types/components/primitives/Button/Button.d.ts +2 -2
  952. package/dist/types/components/primitives/Checkbox/Checkbox.types.d.ts +2 -2
  953. package/dist/types/components/primitives/Code/Code.types.d.ts +1 -1
  954. package/dist/types/components/primitives/Collapsible/Collapsible.types.d.ts +2 -2
  955. package/dist/types/components/primitives/HoverCard/HoverCard.types.d.ts +3 -3
  956. package/dist/types/components/primitives/Icon/Icon.d.ts +2 -2
  957. package/dist/types/components/primitives/IconButton/IconButton.d.ts +1 -1
  958. package/dist/types/components/primitives/Input/Input.d.ts +1 -1
  959. package/dist/types/components/primitives/Kbd/Kbd.types.d.ts +1 -1
  960. package/dist/types/components/primitives/Link/Link.types.d.ts +1 -1
  961. package/dist/types/components/primitives/Popover/Popover.types.d.ts +2 -2
  962. package/dist/types/components/primitives/Radio/Radio.types.d.ts +3 -3
  963. package/dist/types/components/primitives/Switch/Switch.d.ts +1 -1
  964. package/dist/types/components/primitives/TextArea/TextArea.types.d.ts +1 -1
  965. package/dist/types/components/primitives/Tooltip/Tooltip.d.ts +1 -1
  966. package/dist/types/components/primitives/VisuallyHidden/VisuallyHidden.types.d.ts +1 -1
  967. package/dist/types/components/primitives/canvas/canvas.types.d.ts +16 -1
  968. package/dist/types/components/primitives/viewport/Viewport.d.ts +38 -0
  969. package/dist/types/components/primitives/viewport/Viewport.types.d.ts +257 -0
  970. package/dist/types/components/primitives/viewport/ViewportContext.d.ts +23 -0
  971. package/dist/types/components/primitives/viewport/ViewportLayer.d.ts +26 -0
  972. package/dist/types/components/primitives/viewport/ViewportOverlay.d.ts +27 -0
  973. package/dist/types/components/primitives/viewport/ViewportWorld.d.ts +25 -0
  974. package/dist/types/components/primitives/viewport/viewportCoords.d.ts +25 -0
  975. package/dist/types/components/primitives/viewport/viewportMath.d.ts +35 -0
  976. package/dist/types/components/shell/AppShell/AppShell.types.d.ts +2 -2
  977. package/dist/types/components/shell/FloatingPanel/FloatingPanel.types.d.ts +2 -2
  978. package/dist/types/components/shell/MenuBar/MenuBar.types.d.ts +5 -5
  979. package/dist/types/components/shell/StatusBar/StatusBar.types.d.ts +3 -3
  980. package/dist/types/components/shell/Toolbar/Toolbar.types.d.ts +5 -5
  981. package/dist/types/hooks/useDebounced/useDebouncedValue.d.ts +13 -4
  982. package/dist/types/hooks/useEventCallback/useEventCallback.d.ts +32 -0
  983. package/dist/types/hooks/useIsMounted/useIsMounted.d.ts +28 -0
  984. package/dist/types/hooks/useKeyboard/types.d.ts +1 -1
  985. package/dist/types/hooks/useLatest/useLatest.d.ts +23 -0
  986. package/dist/types/hooks/useResizeObserver/useResizeObserver.d.ts +3 -3
  987. package/dist/types/index.d.ts +71 -6
  988. package/dist/types/theme/ThemeProvider.d.ts +5 -3
  989. package/dist/types/theme/contract.css.d.ts +1 -1
  990. package/dist/types/theme/createCustomTheme.d.ts +1 -1
  991. package/dist/types/theme/darkThemeValues.d.ts +1 -1
  992. package/dist/types/theme/lightThemeValues.d.ts +1 -1
  993. package/dist/types/theme/themeContractData.d.ts +4 -4
  994. package/dist/types/theme-values.d.ts +1 -1
  995. package/dist/types/types/keyframe.d.ts +64 -0
  996. package/package.json +34 -18
  997. package/dist/esm/_virtual/_commonjsHelpers.js +0 -6
  998. package/dist/esm/_virtual/_commonjsHelpers.js.map +0 -1
  999. package/dist/esm/_virtual/cjs.js +0 -4
  1000. package/dist/esm/_virtual/cjs.js.map +0 -1
  1001. package/dist/esm/_virtual/cssesc.js +0 -8
  1002. package/dist/esm/_virtual/cssesc.js.map +0 -1
  1003. package/dist/esm/_virtual/picocolors.js +0 -8
  1004. package/dist/esm/_virtual/picocolors.js.map +0 -1
  1005. package/dist/esm/_virtual/picocolors2.js +0 -4
  1006. package/dist/esm/_virtual/picocolors2.js.map +0 -1
  1007. package/dist/esm/assets/src/components/navigation/Menu/Menu.css.ts.vanilla-DD0c5D10.css +0 -67
  1008. package/dist/esm/components/navigation/ContextMenu/useContextMenuTarget.js +0 -53
  1009. package/dist/esm/components/navigation/ContextMenu/useContextMenuTarget.js.map +0 -1
  1010. package/dist/esm/components/navigation/Menu/Menu.helpers.js +0 -53
  1011. package/dist/esm/components/navigation/Menu/Menu.helpers.js.map +0 -1
  1012. package/dist/esm/components/navigation/Menu/useMenu.js +0 -88
  1013. package/dist/esm/components/navigation/Menu/useMenu.js.map +0 -1
  1014. package/dist/esm/node_modules/@emotion/hash/dist/emotion-hash.esm.js +0 -56
  1015. package/dist/esm/node_modules/@emotion/hash/dist/emotion-hash.esm.js.map +0 -1
  1016. package/dist/esm/node_modules/@vanilla-extract/css/adapter/dist/vanilla-extract-css-adapter.esm.js +0 -46
  1017. package/dist/esm/node_modules/@vanilla-extract/css/adapter/dist/vanilla-extract-css-adapter.esm.js.map +0 -1
  1018. package/dist/esm/node_modules/@vanilla-extract/css/dist/taggedTemplateLiteral-10998315.esm.js +0 -13
  1019. package/dist/esm/node_modules/@vanilla-extract/css/dist/taggedTemplateLiteral-10998315.esm.js.map +0 -1
  1020. package/dist/esm/node_modules/@vanilla-extract/css/dist/transformCss-fd0786e1.esm.js +0 -962
  1021. package/dist/esm/node_modules/@vanilla-extract/css/dist/transformCss-fd0786e1.esm.js.map +0 -1
  1022. package/dist/esm/node_modules/@vanilla-extract/css/dist/vanilla-extract-css.esm.js +0 -309
  1023. package/dist/esm/node_modules/@vanilla-extract/css/dist/vanilla-extract-css.esm.js.map +0 -1
  1024. package/dist/esm/node_modules/@vanilla-extract/css/fileScope/dist/vanilla-extract-css-fileScope.esm.js +0 -18
  1025. package/dist/esm/node_modules/@vanilla-extract/css/fileScope/dist/vanilla-extract-css-fileScope.esm.js.map +0 -1
  1026. package/dist/esm/node_modules/@vanilla-extract/css/injectStyles/dist/vanilla-extract-css-injectStyles.esm.js +0 -23
  1027. package/dist/esm/node_modules/@vanilla-extract/css/injectStyles/dist/vanilla-extract-css-injectStyles.esm.js.map +0 -1
  1028. package/dist/esm/node_modules/@vanilla-extract/css/node_modules/lru-cache/dist/esm/index.js +0 -1543
  1029. package/dist/esm/node_modules/@vanilla-extract/css/node_modules/lru-cache/dist/esm/index.js.map +0 -1
  1030. package/dist/esm/node_modules/@vanilla-extract/private/dist/vanilla-extract-private.esm.js +0 -38
  1031. package/dist/esm/node_modules/@vanilla-extract/private/dist/vanilla-extract-private.esm.js.map +0 -1
  1032. package/dist/esm/node_modules/css-what/lib/es/parse.js +0 -424
  1033. package/dist/esm/node_modules/css-what/lib/es/parse.js.map +0 -1
  1034. package/dist/esm/node_modules/css-what/lib/es/types.js +0 -29
  1035. package/dist/esm/node_modules/css-what/lib/es/types.js.map +0 -1
  1036. package/dist/esm/node_modules/cssesc/cssesc.js +0 -120
  1037. package/dist/esm/node_modules/cssesc/cssesc.js.map +0 -1
  1038. package/dist/esm/node_modules/dedent/dist/dedent.js +0 -100
  1039. package/dist/esm/node_modules/dedent/dist/dedent.js.map +0 -1
  1040. package/dist/esm/node_modules/deep-object-diff/mjs/diff.js +0 -40
  1041. package/dist/esm/node_modules/deep-object-diff/mjs/diff.js.map +0 -1
  1042. package/dist/esm/node_modules/deep-object-diff/mjs/utils.js +0 -9
  1043. package/dist/esm/node_modules/deep-object-diff/mjs/utils.js.map +0 -1
  1044. package/dist/esm/node_modules/deepmerge/dist/cjs.js +0 -143
  1045. package/dist/esm/node_modules/deepmerge/dist/cjs.js.map +0 -1
  1046. package/dist/esm/node_modules/media-query-parser/dist/media-query-parser.esm.js +0 -1386
  1047. package/dist/esm/node_modules/media-query-parser/dist/media-query-parser.esm.js.map +0 -1
  1048. package/dist/esm/node_modules/modern-ahocorasick/dist/index.js +0 -102
  1049. package/dist/esm/node_modules/modern-ahocorasick/dist/index.js.map +0 -1
  1050. package/dist/esm/node_modules/picocolors/picocolors.js +0 -87
  1051. package/dist/esm/node_modules/picocolors/picocolors.js.map +0 -1
  1052. package/dist/types/components/navigation/ContextMenu/useContextMenuTarget.d.ts +0 -5
  1053. package/dist/types/components/navigation/Menu/useMenu.d.ts +0 -16
@@ -0,0 +1,85 @@
1
+ "use client";
2
+ import { useRef, useEffectEvent, useEffect } from 'react';
3
+ import { resolveLoop } from './timelineCoords.js';
4
+
5
+ /**
6
+ * Advance a playhead by `dtSeconds` of wall-clock time at `fps`. Forward only.
7
+ * With a `loop` region the playhead wraps within it; without one it stops at
8
+ * `range.endFrame`. Pure — the rAF hook below drives it.
9
+ */
10
+ function advancePlayback(current, dtSeconds, fps, range, loop) {
11
+ const next = current + Math.max(0, dtSeconds) * Math.max(0, fps);
12
+ if (loop) {
13
+ if (next < loop.endFrame)
14
+ return { frame: next, ended: false };
15
+ const span = Math.max(1e-6, loop.endFrame - loop.startFrame);
16
+ return {
17
+ frame: loop.startFrame + ((next - loop.startFrame) % span),
18
+ ended: false,
19
+ };
20
+ }
21
+ if (next >= range.endFrame)
22
+ return { frame: range.endFrame, ended: true };
23
+ return { frame: next, ended: false };
24
+ }
25
+ /**
26
+ * Drives the playhead while `playing` is true: a rAF loop advancing the frame
27
+ * in real time at `fps`. Keeps its own float accumulator (independent of the
28
+ * snapped/committed frame) and resyncs if the frame is changed externally
29
+ * (e.g. the user scrubs mid-playback).
30
+ */
31
+ function useTimelinePlayback(opts) {
32
+ const accRef = useRef(opts.frame);
33
+ const lastEmittedRef = useRef(opts.frame);
34
+ // Canonical `useEffectEvent` use case: `tick` is called *only* from inside
35
+ // the rAF loop below (never attached to JSX or passed out), so it may read
36
+ // the latest props/state without re-arming the loop. This is the React
37
+ // "timer with latest values" pattern — keep it here; do not convert it to a
38
+ // handler that escapes the effect.
39
+ const tick = useEffectEvent((dt) => {
40
+ // External scrub during playback → resync the accumulator.
41
+ if (opts.frame !== lastEmittedRef.current) {
42
+ accRef.current = opts.frame;
43
+ }
44
+ const range = {
45
+ startFrame: opts.startFrame,
46
+ endFrame: opts.endFrame,
47
+ };
48
+ const region = resolveLoop(opts.loop, range.startFrame, range.endFrame);
49
+ const result = advancePlayback(accRef.current, dt, opts.fps, range, region);
50
+ accRef.current = result.frame;
51
+ lastEmittedRef.current = result.frame;
52
+ opts.onAdvance(result.frame);
53
+ if (result.ended) {
54
+ opts.onEnd();
55
+ return true;
56
+ }
57
+ return false;
58
+ });
59
+ useEffect(() => {
60
+ if (!opts.playing || typeof window === 'undefined')
61
+ return;
62
+ accRef.current = opts.frame;
63
+ lastEmittedRef.current = opts.frame;
64
+ let raf = 0;
65
+ let last = performance.now();
66
+ const loop = (now) => {
67
+ const dt = (now - last) / 1000;
68
+ last = now;
69
+ const ended = tick(dt);
70
+ if (!ended)
71
+ raf = requestAnimationFrame(loop);
72
+ };
73
+ raf = requestAnimationFrame(loop);
74
+ return () => {
75
+ cancelAnimationFrame(raf);
76
+ };
77
+ // Only `playing` drives the rAF lifecycle. `opts.frame` is read solely to
78
+ // seed the accumulator at playback start; including it would restart the
79
+ // loop on every emitted frame, so it is intentionally excluded.
80
+ // eslint-disable-next-line react-hooks/exhaustive-deps
81
+ }, [opts.playing]);
82
+ }
83
+
84
+ export { advancePlayback, useTimelinePlayback };
85
+ //# sourceMappingURL=useTimelinePlayback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTimelinePlayback.js","sources":["src/components/editor/Timeline/useTimelinePlayback.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useEffectEvent, useRef } from 'react';\n\nimport { resolveLoop } from './timelineCoords';\n\nimport type { TimelineLoop } from './Timeline.types';\n\nexport interface PlaybackRange {\n startFrame: number;\n endFrame: number;\n}\n\nexport interface AdvanceResult {\n frame: number;\n /** True when a non-looping playback has reached the end. */\n ended: boolean;\n}\n\n/**\n * Advance a playhead by `dtSeconds` of wall-clock time at `fps`. Forward only.\n * With a `loop` region the playhead wraps within it; without one it stops at\n * `range.endFrame`. Pure — the rAF hook below drives it.\n */\nexport function advancePlayback(\n current: number,\n dtSeconds: number,\n fps: number,\n range: PlaybackRange,\n loop: PlaybackRange | null\n): AdvanceResult {\n const next = current + Math.max(0, dtSeconds) * Math.max(0, fps);\n if (loop) {\n if (next < loop.endFrame) return { frame: next, ended: false };\n const span = Math.max(1e-6, loop.endFrame - loop.startFrame);\n return {\n frame: loop.startFrame + ((next - loop.startFrame) % span),\n ended: false,\n };\n }\n if (next >= range.endFrame) return { frame: range.endFrame, ended: true };\n return { frame: next, ended: false };\n}\n\ninterface UseTimelinePlaybackOptions {\n playing: boolean;\n frame: number;\n fps: number;\n startFrame: number;\n endFrame: number;\n loop: TimelineLoop | undefined;\n /** Push the advanced (float) frame — the component clamps + fires onFrameChange. */\n onAdvance: (frame: number) => void;\n /** Called once when non-looping playback reaches the end. */\n onEnd: () => void;\n}\n\n/**\n * Drives the playhead while `playing` is true: a rAF loop advancing the frame\n * in real time at `fps`. Keeps its own float accumulator (independent of the\n * snapped/committed frame) and resyncs if the frame is changed externally\n * (e.g. the user scrubs mid-playback).\n */\nexport function useTimelinePlayback(opts: UseTimelinePlaybackOptions): void {\n const accRef = useRef(opts.frame);\n const lastEmittedRef = useRef(opts.frame);\n\n // Canonical `useEffectEvent` use case: `tick` is called *only* from inside\n // the rAF loop below (never attached to JSX or passed out), so it may read\n // the latest props/state without re-arming the loop. This is the React\n // \"timer with latest values\" pattern — keep it here; do not convert it to a\n // handler that escapes the effect.\n const tick = useEffectEvent((dt: number): boolean => {\n // External scrub during playback → resync the accumulator.\n if (opts.frame !== lastEmittedRef.current) {\n accRef.current = opts.frame;\n }\n const range: PlaybackRange = {\n startFrame: opts.startFrame,\n endFrame: opts.endFrame,\n };\n const region = resolveLoop(opts.loop, range.startFrame, range.endFrame);\n const result = advancePlayback(accRef.current, dt, opts.fps, range, region);\n accRef.current = result.frame;\n lastEmittedRef.current = result.frame;\n opts.onAdvance(result.frame);\n if (result.ended) {\n opts.onEnd();\n return true;\n }\n return false;\n });\n\n useEffect(() => {\n if (!opts.playing || typeof window === 'undefined') return;\n accRef.current = opts.frame;\n lastEmittedRef.current = opts.frame;\n let raf = 0;\n let last = performance.now();\n const loop = (now: number): void => {\n const dt = (now - last) / 1000;\n last = now;\n const ended = tick(dt);\n if (!ended) raf = requestAnimationFrame(loop);\n };\n raf = requestAnimationFrame(loop);\n return () => {\n cancelAnimationFrame(raf);\n };\n // Only `playing` drives the rAF lifecycle. `opts.frame` is read solely to\n // seed the accumulator at playback start; including it would restart the\n // loop on every emitted frame, so it is intentionally excluded.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [opts.playing]);\n}\n"],"names":[],"mappings":";;;;AAmBA;;;;AAIG;AACG;;;AASF;;AACA;;AAEE;AACA;;;AAGJ;;;AAEF;AAeA;;;;;AAKG;AACG;;;;;;;;AASJ;;;AAGI;;AAEF;;;;AAIA;AACA;AACA;AACA;AACA;AACA;;AAEE;;AAEF;AACF;;;;AAIE;AACA;;AAEA;AACA;;;AAGE;AACA;AAAY;AACd;AACA;AACA;;AAEA;;;;;AAKF;AACF;;"}
@@ -1,13 +1,13 @@
1
1
  "use client";
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
3
  import { useMemo, useCallback } from 'react';
4
- import { cx } from '../../../utils/cx.js';
5
- import { useControlledState } from '../../../hooks/useControlledState/useControlledState.js';
6
- import { VectorInput } from '../../controls/VectorInput/VectorInput.js';
7
4
  import { Select } from '../../controls/Select/Select.js';
5
+ import { VectorInput } from '../../controls/VectorInput/VectorInput.js';
6
+ import { PropertyRow } from '../PropertyInspector/PropertyRow.js';
8
7
  import { LockIcon } from '../../Icons/LockIcon.js';
9
8
  import { UnlockIcon } from '../../Icons/UnlockIcon.js';
10
- import { PropertyRow } from '../PropertyInspector/PropertyRow.js';
9
+ import { useControlledState } from '../../../hooks/useControlledState/useControlledState.js';
10
+ import { cx } from '../../../utils/cx.js';
11
11
  import { rowInner, lockSpacerRecipe, rowVectorWrapper, lockButtonRecipe, transformRoot } from './TransformControl.css.js';
12
12
 
13
13
  // --- Defaults ---
@@ -1 +1 @@
1
- {"version":3,"file":"TransformControl.js","sources":["../../../../../../src/components/editor/TransformControl/TransformControl.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;AAyBA;AAEA;AACE;AACA;AACA;;AAGF;AACE;AACA;AACA;;AAGF;AACE;AACA;AACA;AACA;;AAGF;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AAEA;AACE;AACA;AACA;AACD;AAED;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BG;AACI;AAyBL;AACE;;;AAGA;AACD;AAED;AAEI;AACA;AACA;AACA;AACD;AAEH;AACE;AACA;AACA;AACA;AACD;AAED;AACA;AACA;AACA;AAEA;AACE;AACA;AACA;AACA;;AAGF;AACE;AACA;AACA;;AAGF;AACE;AACA;AACA;;AAGF;AACE;AACA;AACA;;AAGF;;AAOA;AAEI;AACF;AAIF;AAEI;AACF;;AAME;;;AAGE;;;AAEA;;AAEJ;AAIF;;AAEA;AAEA;;;;AAIE;;AAMF;AACE;AACF;AAEA;AACE;AACF;AAEA;AACE;AACF;;AAIA;AAiIF;AAEA;;"}
1
+ {"version":3,"file":"TransformControl.js","sources":["src/components/editor/TransformControl/TransformControl.tsx"],"sourcesContent":["'use client';\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { Select } from '@/components/controls/Select';\nimport { VectorInput } from '@/components/controls/VectorInput';\nimport { PropertyRow } from '@/components/editor/PropertyInspector/PropertyRow';\nimport { LockIcon } from '@/components/Icons/LockIcon';\nimport { UnlockIcon } from '@/components/Icons/UnlockIcon';\nimport { useControlledState } from '@/hooks/useControlledState';\nimport { cx } from '@/utils/cx';\n\nimport {\n lockButtonRecipe,\n lockSpacerRecipe,\n rowInner,\n rowVectorWrapper,\n transformRoot,\n} from './TransformControl.css';\n\nimport type {\n CoordinateSpace,\n CoordinateSpaceOption,\n TransformControlProps,\n TransformValue,\n Vec3,\n} from './TransformControl.types';\n\n// --- Defaults ---\n\nconst DEFAULT_TRANSFORM: TransformValue = {\n position: { x: 0, y: 0, z: 0 },\n rotation: { x: 0, y: 0, z: 0 },\n scale: { x: 1, y: 1, z: 1 },\n};\n\nconst DEFAULT_COORDINATE_SPACE_OPTIONS: CoordinateSpaceOption[] = [\n { value: 'local', label: 'Local' },\n { value: 'world', label: 'World' },\n { value: 'parent', label: 'Parent' },\n];\n\nconst DEFAULT_LABELS = {\n position: 'Position',\n rotation: 'Rotation',\n scale: 'Scale',\n coordinateSpace: 'Space',\n} as const;\n\nconst DEFAULT_PRECISION = { position: 3, rotation: 1, scale: 3 } as const;\nconst DEFAULT_STEP = { position: 0.1, rotation: 1, scale: 0.01 } as const;\nconst DEFAULT_UNITS = { position: 'm', rotation: '°', scale: '' } as const;\n\n// Narrow label column so the three axis inputs (with units) have room\n// to render without clipping inside typical 320–400 px property panels.\nconst ROW_SPLIT_RATIO: [number, number] = [25, 75];\n\n// --- Helpers ---\n\nconst vecToArray = (v: Vec3): number[] => [v.x, v.y, v.z];\n\nconst arrayToVec = (arr: number[]): Vec3 => ({\n x: arr[0] ?? 0,\n y: arr[1] ?? 0,\n z: arr[2] ?? 0,\n});\n\n// --- Component ---\n\n/**\n * The canonical position / rotation / scale property control for 3D\n * editor interfaces. Composes `VectorInput` (per row) with `Select`\n * (coordinate space) and `PropertyRow` (layout) into one high-level\n * component, mirroring the transform widget found in Blender, Unity and\n * Unreal.\n *\n * Three independent atoms — `value`, `coordinateSpace`, `linkedScale` —\n * each support controlled and uncontrolled usage.\n *\n * Changing the coordinate-space dropdown does NOT transform the numeric\n * values. The component is purely a UI surface; the consumer's editor\n * logic is responsible for re-projecting values when the space changes.\n *\n * The component intentionally renders no `PropertySection` wrapper — slot\n * it inside an existing section in your panel.\n *\n * @example\n * ```tsx\n * <PropertySection title=\"Transform\">\n * <TransformControl\n * value={transform}\n * onChange={setTransform}\n * showReset\n * />\n * </PropertySection>\n * ```\n */\nexport const TransformControl: React.FC<TransformControlProps> = ({\n value: valueProp,\n defaultValue,\n onChange,\n coordinateSpace: coordinateSpaceProp,\n defaultCoordinateSpace,\n onCoordinateSpaceChange,\n coordinateSpaceOptions,\n linkedScale: linkedScaleProp,\n defaultLinkedScale,\n onLinkedScaleChange,\n show,\n labels,\n precision,\n step,\n units,\n size = 'sm',\n disabled = false,\n showReset = false,\n className,\n style,\n testId,\n ref,\n ...rest\n}) => {\n const [value, setValue] = useControlledState<TransformValue>({\n value: valueProp,\n defaultValue,\n onChange,\n fallback: DEFAULT_TRANSFORM,\n });\n\n const [coordinateSpace, setCoordinateSpace] =\n useControlledState<CoordinateSpace>({\n value: coordinateSpaceProp,\n defaultValue: defaultCoordinateSpace,\n onChange: onCoordinateSpaceChange,\n fallback: 'local',\n });\n\n const [linkedScale, setLinkedScale] = useControlledState<boolean>({\n value: linkedScaleProp,\n defaultValue: defaultLinkedScale,\n onChange: onLinkedScaleChange,\n fallback: true,\n });\n\n const showPosition = show?.position !== false;\n const showRotation = show?.rotation !== false;\n const showScale = show?.scale !== false;\n const showCoordinateSpace = showPosition || showRotation;\n\n const resolvedLabels = {\n position: labels?.position ?? DEFAULT_LABELS.position,\n rotation: labels?.rotation ?? DEFAULT_LABELS.rotation,\n scale: labels?.scale ?? DEFAULT_LABELS.scale,\n coordinateSpace: labels?.coordinateSpace ?? DEFAULT_LABELS.coordinateSpace,\n };\n\n const resolvedPrecision = {\n position: precision?.position ?? DEFAULT_PRECISION.position,\n rotation: precision?.rotation ?? DEFAULT_PRECISION.rotation,\n scale: precision?.scale ?? DEFAULT_PRECISION.scale,\n };\n\n const resolvedStep = {\n position: step?.position ?? DEFAULT_STEP.position,\n rotation: step?.rotation ?? DEFAULT_STEP.rotation,\n scale: step?.scale ?? DEFAULT_STEP.scale,\n };\n\n const resolvedUnits = {\n position: units?.position ?? DEFAULT_UNITS.position,\n rotation: units?.rotation ?? DEFAULT_UNITS.rotation,\n scale: units?.scale ?? DEFAULT_UNITS.scale,\n };\n\n const resolvedSpaceOptions = useMemo(\n () => coordinateSpaceOptions ?? DEFAULT_COORDINATE_SPACE_OPTIONS,\n [coordinateSpaceOptions]\n );\n\n // --- Per-row change handlers ---\n\n const handlePositionChange = useCallback(\n (next: number[]) => {\n setValue(prev => ({ ...prev, position: arrayToVec(next) }));\n },\n [setValue]\n );\n\n const handleRotationChange = useCallback(\n (next: number[]) => {\n setValue(prev => ({ ...prev, rotation: arrayToVec(next) }));\n },\n [setValue]\n );\n\n const handleScaleChange = useCallback(\n (next: number[], axisIndex: number) => {\n const nextScale = arrayToVec(next);\n if (linkedScale) {\n const v = next[axisIndex] ?? 0;\n setValue(prev => ({ ...prev, scale: { x: v, y: v, z: v } }));\n } else {\n setValue(prev => ({ ...prev, scale: nextScale }));\n }\n },\n [linkedScale, setValue]\n );\n\n const handleLockToggle = useCallback(() => {\n setLinkedScale(prev => !prev);\n }, [setLinkedScale]);\n\n const handleSpaceChange = useCallback(\n (next: string | null) => {\n if (next == null) return;\n setCoordinateSpace(next);\n },\n [setCoordinateSpace]\n );\n\n // --- Reset handlers ---\n\n const handlePositionReset = useCallback(() => {\n setValue(prev => ({ ...prev, position: { x: 0, y: 0, z: 0 } }));\n }, [setValue]);\n\n const handleRotationReset = useCallback(() => {\n setValue(prev => ({ ...prev, rotation: { x: 0, y: 0, z: 0 } }));\n }, [setValue]);\n\n const handleScaleReset = useCallback(() => {\n setValue(prev => ({ ...prev, scale: { x: 1, y: 1, z: 1 } }));\n }, [setValue]);\n\n // --- Render ---\n\n return (\n <div\n ref={ref}\n className={cx(transformRoot, className)}\n style={style}\n data-testid={testId}\n {...rest}\n >\n {showCoordinateSpace && (\n <PropertyRow\n label={resolvedLabels.coordinateSpace}\n size={size}\n disabled={disabled}\n splitRatio={ROW_SPLIT_RATIO}\n >\n <Select\n value={coordinateSpace}\n options={resolvedSpaceOptions}\n onChange={handleSpaceChange}\n size={size}\n disabled={disabled}\n aria-label={resolvedLabels.coordinateSpace}\n />\n </PropertyRow>\n )}\n\n {showPosition && (\n <PropertyRow\n label={resolvedLabels.position}\n size={size}\n disabled={disabled}\n splitRatio={ROW_SPLIT_RATIO}\n onReset={showReset ? handlePositionReset : undefined}\n >\n <div className={rowInner}>\n <span aria-hidden=\"true\" className={lockSpacerRecipe({ size })} />\n <div className={rowVectorWrapper}>\n <VectorInput\n value={vecToArray(value.position)}\n onChange={handlePositionChange}\n dimension={3}\n labelPreset=\"xyz\"\n colorPreset=\"spatial\"\n precision={resolvedPrecision.position}\n step={resolvedStep.position}\n unit={resolvedUnits.position}\n size={size}\n disabled={disabled}\n aria-label={resolvedLabels.position}\n />\n </div>\n </div>\n </PropertyRow>\n )}\n\n {showRotation && (\n <PropertyRow\n label={resolvedLabels.rotation}\n size={size}\n disabled={disabled}\n splitRatio={ROW_SPLIT_RATIO}\n onReset={showReset ? handleRotationReset : undefined}\n >\n <div className={rowInner}>\n <span aria-hidden=\"true\" className={lockSpacerRecipe({ size })} />\n <div className={rowVectorWrapper}>\n <VectorInput\n value={vecToArray(value.rotation)}\n onChange={handleRotationChange}\n dimension={3}\n labelPreset=\"xyz\"\n colorPreset=\"spatial\"\n precision={resolvedPrecision.rotation}\n step={resolvedStep.rotation}\n unit={resolvedUnits.rotation}\n size={size}\n disabled={disabled}\n aria-label={resolvedLabels.rotation}\n />\n </div>\n </div>\n </PropertyRow>\n )}\n\n {showScale && (\n <PropertyRow\n label={resolvedLabels.scale}\n size={size}\n disabled={disabled}\n splitRatio={ROW_SPLIT_RATIO}\n onReset={showReset ? handleScaleReset : undefined}\n >\n <div className={rowInner}>\n <button\n type=\"button\"\n className={lockButtonRecipe({ active: linkedScale, size })}\n onClick={handleLockToggle}\n disabled={disabled}\n aria-pressed={linkedScale}\n aria-label={linkedScale ? 'Unlink scale axes' : 'Link scale axes'}\n title={linkedScale ? 'Linked scale' : 'Unlinked scale'}\n data-testid=\"transform-scale-lock\"\n >\n {linkedScale ? (\n <LockIcon size={size} decorative />\n ) : (\n <UnlockIcon size={size} decorative />\n )}\n </button>\n <div className={rowVectorWrapper}>\n <VectorInput\n value={vecToArray(value.scale)}\n onChange={handleScaleChange}\n dimension={3}\n labelPreset=\"xyz\"\n colorPreset=\"spatial\"\n precision={resolvedPrecision.scale}\n step={resolvedStep.scale}\n unit={resolvedUnits.scale}\n size={size}\n disabled={disabled}\n aria-label={resolvedLabels.scale}\n />\n </div>\n </div>\n </PropertyRow>\n )}\n </div>\n );\n};\n\nTransformControl.displayName = 'TransformControl';\n"],"names":[],"mappings":";;;;;;;;;;;;AA4BA;AAEA;AACE;AACA;AACA;;AAGF;AACE;AACA;AACA;;AAGF;AACE;AACA;AACA;AACA;;AAGF;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AAEA;AACE;AACA;AACA;AACD;AAED;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BG;AACI;AAyBL;AACE;;;AAGA;AACD;AAED;AAEI;AACA;AACA;AACA;AACD;AAEH;AACE;AACA;AACA;AACA;AACD;AAED;AACA;AACA;AACA;AAEA;AACE;AACA;AACA;AACA;;AAGF;AACE;AACA;AACA;;AAGF;AACE;AACA;AACA;;AAGF;AACE;AACA;AACA;;AAGF;;AAOA;AAEI;AACF;AAIF;AAEI;AACF;;AAME;;;AAGE;;;AAEA;;AAEJ;AAIF;;AAEA;AAEA;;;;AAIE;;AAMF;AACE;AACF;AAEA;AACE;AACF;AAEA;AACE;AACF;;AAIA;AAiIF;AAEA;;"}
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
- import { useRef, useMemo } from 'react';
4
3
  import { assignInlineVars } from '@vanilla-extract/dynamic';
4
+ import { useRef, useMemo } from 'react';
5
5
  import { cx } from '../../../utils/cx.js';
6
- import { AXIS_COLORS, useGizmoRenderer } from './useGizmoRenderer.js';
7
6
  import { useGizmoInteraction } from './useGizmoInteraction.js';
7
+ import { AXIS_COLORS, useGizmoRenderer } from './useGizmoRenderer.js';
8
8
  import { gizmoCanvasStyle, ariaLiveRegionStyle, gizmoDiameterVar, gizmoWrapperRecipe } from './ViewportGizmo.css.js';
9
9
 
10
10
  const DEFAULT_LABELS = { x: 'X', y: 'Y', z: 'Z' };
@@ -74,7 +74,6 @@ const ViewportGizmo = ({ orientation, upAxis = 'y-up', axisColorPreset = 'blende
74
74
  showOriginHandle,
75
75
  background,
76
76
  disabled,
77
- isDragging: interaction.isDragging,
78
77
  hoveredRegion: interaction.hoveredRegion,
79
78
  });
80
79
  // ARIA
@@ -82,7 +81,12 @@ const ViewportGizmo = ({ orientation, upAxis = 'y-up', axisColorPreset = 'blende
82
81
  return (jsxs("div", { className: cx(gizmoWrapperRecipe({ background, disabled }), className), style: {
83
82
  ...style,
84
83
  ...assignInlineVars({ [gizmoDiameterVar]: `${diameter}px` }),
85
- }, "data-testid": testId, id: id, ...rest, children: [jsx("canvas", { ref: canvasRef, className: gizmoCanvasStyle({ disabled }), role: "application", "aria-label": "Viewport orientation gizmo", "aria-roledescription": ariaDescription, tabIndex: disabled ? -1 : 0, onPointerDown: interaction.handlers.onPointerDown, onPointerMove: interaction.handlers.onPointerMove, onPointerUp: interaction.handlers.onPointerUp, onKeyDown: interaction.handlers.onKeyDown }), jsx("div", { className: ariaLiveRegionStyle, "aria-live": "polite", role: "status", children: ariaDescription })] }));
84
+ }, "data-testid": testId, id: id, ...rest, children: [jsx("canvas", { ref: canvasRef, className: gizmoCanvasStyle({ disabled }),
85
+ // The canvas is a self-contained interactive widget driven entirely by
86
+ // custom pointer/keyboard handlers, so it is exposed as an ARIA
87
+ // application rather than its implicit canvas role.
88
+ // eslint-disable-next-line jsx-a11y/no-interactive-element-to-noninteractive-role
89
+ role: "application", "aria-label": "Viewport orientation gizmo", "aria-roledescription": ariaDescription, tabIndex: disabled ? -1 : 0, onPointerDown: interaction.handlers.onPointerDown, onPointerMove: interaction.handlers.onPointerMove, onPointerUp: interaction.handlers.onPointerUp, onKeyDown: interaction.handlers.onKeyDown }), jsx("div", { className: ariaLiveRegionStyle, "aria-live": "polite", role: "status", children: ariaDescription })] }));
86
90
  };
87
91
  ViewportGizmo.displayName = 'ViewportGizmo';
88
92
 
@@ -1 +1 @@
1
- {"version":3,"file":"ViewportGizmo.js","sources":["../../../../../../src/components/editor/ViewportGizmo/ViewportGizmo.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;AAeA;AACA;AAEO;AA2BL;;AAGA;AACE;;;;;;;AAOA;AACF;AAEA;;;;;;;;AAQE;AACF;AAEA;;;;;;;;AAQE;AACF;;;;;;;;;;;;;;;;AAiBC;;AAGD;;;;;;;;;;;;;;;;;AAiBC;;;AAKD;AAIM;;AAED;AAsBP;AAEA;;"}
1
+ {"version":3,"file":"ViewportGizmo.js","sources":["src/components/editor/ViewportGizmo/ViewportGizmo.tsx"],"sourcesContent":["'use client';\n\nimport { assignInlineVars } from '@vanilla-extract/dynamic';\nimport React, { useRef, useMemo } from 'react';\n\nimport { cx } from '@/utils/cx';\n\nimport { useGizmoInteraction } from './useGizmoInteraction';\nimport { useGizmoRenderer, AXIS_COLORS } from './useGizmoRenderer';\nimport {\n gizmoWrapperRecipe,\n gizmoCanvasStyle,\n gizmoDiameterVar,\n ariaLiveRegionStyle,\n} from './ViewportGizmo.css';\n\nimport type { ViewportGizmoProps } from './ViewportGizmo.types';\n\nconst DEFAULT_LABELS: Record<string, string> = { x: 'X', y: 'Y', z: 'Z' };\nconst DEFAULT_VISIBLE: Record<string, boolean> = { x: true, y: true, z: true };\n\nexport const ViewportGizmo: React.FC<ViewportGizmoProps> = ({\n orientation,\n upAxis = 'y-up',\n axisColorPreset = 'blender',\n axisConfig,\n showLabels = true,\n showNegativeAxes = true,\n showOrbitRing = true,\n showOriginHandle = true,\n background = 'subtle',\n interactionMode = 'full',\n orbitSpeed = 1,\n constrainPitch = true,\n onOrbit,\n onOrbitEnd,\n onSnapToView,\n onAxisClick,\n onOriginClick,\n diameter = 120,\n size = 'md',\n disabled = false,\n className,\n testId,\n id,\n style,\n ...rest\n}) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n // Resolve axis colors from preset or custom config\n const axisColors = useMemo((): Record<string, string> => {\n if (axisColorPreset === 'custom' && axisConfig) {\n return {\n x: axisConfig[0].color ?? '#E63946',\n y: axisConfig[1].color ?? '#6AA84F',\n z: axisConfig[2].color ?? '#4A86C8',\n };\n }\n return { ...AXIS_COLORS };\n }, [axisColorPreset, axisConfig]);\n\n const axisLabels = useMemo((): Record<string, string> => {\n if (axisConfig) {\n return {\n x: axisConfig[0].label ?? 'X',\n y: axisConfig[1].label ?? 'Y',\n z: axisConfig[2].label ?? 'Z',\n };\n }\n return DEFAULT_LABELS;\n }, [axisConfig]);\n\n const axisVisible = useMemo((): Record<string, boolean> => {\n if (axisConfig) {\n return {\n x: axisConfig[0].visible ?? true,\n y: axisConfig[1].visible ?? true,\n z: axisConfig[2].visible ?? true,\n };\n }\n return DEFAULT_VISIBLE;\n }, [axisConfig]);\n\n // Interaction\n const interaction = useGizmoInteraction({\n orientation,\n canvasRef,\n diameter,\n upAxis,\n interactionMode,\n orbitSpeed,\n constrainPitch,\n disabled,\n onOrbit,\n onOrbitEnd,\n onSnapToView,\n onAxisClick,\n onOriginClick,\n });\n\n // Renderer\n useGizmoRenderer({\n canvasRef,\n orientation,\n diameter,\n upAxis,\n size,\n axisColors,\n axisLabels,\n axisVisible,\n showLabels,\n showNegativeAxes,\n showOrbitRing,\n showOriginHandle,\n background,\n disabled,\n isDragging: interaction.isDragging,\n hoveredRegion: interaction.hoveredRegion,\n });\n\n // ARIA\n const ariaDescription = `3D orientation gizmo, yaw: ${Math.round(orientation.yaw)}deg, pitch: ${Math.round(orientation.pitch)}deg`;\n\n return (\n <div\n className={cx(gizmoWrapperRecipe({ background, disabled }), className)}\n style={{\n ...style,\n ...assignInlineVars({ [gizmoDiameterVar]: `${diameter}px` }),\n }}\n data-testid={testId}\n id={id}\n {...rest}\n >\n <canvas\n ref={canvasRef}\n className={gizmoCanvasStyle({ disabled })}\n // The canvas is a self-contained interactive widget driven entirely by\n // custom pointer/keyboard handlers, so it is exposed as an ARIA\n // application rather than its implicit canvas role.\n // eslint-disable-next-line jsx-a11y/no-interactive-element-to-noninteractive-role\n role=\"application\"\n aria-label=\"Viewport orientation gizmo\"\n aria-roledescription={ariaDescription}\n tabIndex={disabled ? -1 : 0}\n onPointerDown={interaction.handlers.onPointerDown}\n onPointerMove={interaction.handlers.onPointerMove}\n onPointerUp={interaction.handlers.onPointerUp}\n onKeyDown={interaction.handlers.onKeyDown}\n />\n <div className={ariaLiveRegionStyle} aria-live=\"polite\" role=\"status\">\n {ariaDescription}\n </div>\n </div>\n );\n};\n\nViewportGizmo.displayName = 'ViewportGizmo';\n"],"names":[],"mappings":";;;;;;;;;AAkBA;AACA;AAEO;AA2BL;;AAGA;AACE;;;;;;;AAOA;AACF;AAEA;;;;;;;;AAQE;AACF;AAEA;;;;;;;;AAQE;AACF;;;;;;;;;;;;;;;;AAiBC;;AAGD;;;;;;;;;;;;;;;;AAiBC;;;AAKD;AAIM;;;;;;;AAcA;AAcR;AAEA;;"}
@@ -63,11 +63,15 @@ function projectToCanvas(point, orientation, center, scale) {
63
63
  * Get all 6 axis arm endpoints projected to 2D, sorted by depth (furthest first).
64
64
  */
65
65
  function projectAxes(orientation, center, armLength, upAxis) {
66
+ // The drawn direction of each labelled axis depends on the up-axis
67
+ // convention. For z-up (Blender, Unreal, CAD) the world is rotated -90°
68
+ // about X relative to y-up, so the Z arm points up and the Y arm points
69
+ // into the scene. (x, y, z) -> (x, z, -y).
66
70
  const axes = upAxis === 'z-up'
67
71
  ? [
68
72
  { x: 1, y: 0, z: 0 }, // X
69
- { x: 0, y: 1, z: 0 }, // Y
70
- { x: 0, y: 0, z: 1 }, // Z (up)
73
+ { x: 0, y: 0, z: -1 }, // Y (into the scene)
74
+ { x: 0, y: 1, z: 0 }, // Z (up)
71
75
  ]
72
76
  : [
73
77
  { x: 1, y: 0, z: 0 }, // X
@@ -1 +1 @@
1
- {"version":3,"file":"gizmoMath.js","sources":["../../../../../../src/components/editor/ViewportGizmo/gizmoMath.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gizmoMath.js","sources":["src/components/editor/ViewportGizmo/gizmoMath.ts"],"sourcesContent":["import type {\n GizmoOrientation,\n GizmoPresetView,\n GizmoUpAxis,\n GizmoHitRegion,\n} from './ViewportGizmo.types';\n\n// ─── Vector Type ───\n\n/** 3D vector */\nexport interface Vec3 {\n x: number;\n y: number;\n z: number;\n}\n\n// ─── Constants ───\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n// ─── Euler → Rotation Matrix ───\n\n/**\n * Build a 3×3 rotation matrix from Euler angles (YXZ intrinsic order).\n * Matches Three.js default Euler order.\n *\n * @param yaw - Y-axis rotation in degrees\n * @param pitch - X-axis rotation in degrees\n * @param roll - Z-axis rotation in degrees\n * @returns [right, up, forward] basis vectors (columns of rotation matrix)\n */\nexport function eulerToRotationMatrix(\n yaw: number,\n pitch: number,\n roll: number = 0\n): [Vec3, Vec3, Vec3] {\n const cy = Math.cos(yaw * DEG2RAD);\n const sy = Math.sin(yaw * DEG2RAD);\n const cp = Math.cos(pitch * DEG2RAD);\n const sp = Math.sin(pitch * DEG2RAD);\n const cr = Math.cos(roll * DEG2RAD);\n const sr = Math.sin(roll * DEG2RAD);\n\n // YXZ rotation: R = Ry * Rx * Rz\n // Column 0 (right vector)\n const r00 = cy * cr + sy * sp * sr;\n const r10 = cp * sr;\n const r20 = -sy * cr + cy * sp * sr;\n\n // Column 1 (up vector)\n const r01 = -cy * sr + sy * sp * cr;\n const r11 = cp * cr;\n const r21 = sy * sr + cy * sp * cr;\n\n // Column 2 (forward vector)\n const r02 = sy * cp;\n const r12 = -sp;\n const r22 = cy * cp;\n\n return [\n { x: r00, y: r10, z: r20 }, // right\n { x: r01, y: r11, z: r21 }, // up\n { x: r02, y: r12, z: r22 }, // forward\n ];\n}\n\n// ─── 3D → 2D Projection ───\n\n/**\n * Project a 3D point to 2D canvas coordinates using orthographic projection.\n *\n * @param point - 3D point to project\n * @param orientation - Camera orientation\n * @param center - Canvas center in pixels\n * @param scale - Pixels per unit\n * @returns Projected position { x, y, depth }\n */\nexport function projectToCanvas(\n point: Vec3,\n orientation: GizmoOrientation,\n center: { x: number; y: number },\n scale: number\n): { x: number; y: number; depth: number } {\n const [right, up, forward] = eulerToRotationMatrix(\n orientation.yaw,\n orientation.pitch,\n orientation.roll ?? 0\n );\n\n // Project point onto camera basis (view space)\n const viewX = point.x * right.x + point.y * right.y + point.z * right.z;\n const viewY = point.x * up.x + point.y * up.y + point.z * up.z;\n const viewZ = point.x * forward.x + point.y * forward.y + point.z * forward.z;\n\n return {\n x: center.x + viewX * scale,\n y: center.y - viewY * scale, // canvas Y is flipped\n depth: viewZ,\n };\n}\n\n/** Projected axis arm data */\nexport interface ProjectedArm {\n axis: 'x' | 'y' | 'z';\n positive: boolean;\n screenX: number;\n screenY: number;\n depth: number;\n}\n\n/**\n * Get all 6 axis arm endpoints projected to 2D, sorted by depth (furthest first).\n */\nexport function projectAxes(\n orientation: GizmoOrientation,\n center: { x: number; y: number },\n armLength: number,\n upAxis: GizmoUpAxis\n): ProjectedArm[] {\n // The drawn direction of each labelled axis depends on the up-axis\n // convention. For z-up (Blender, Unreal, CAD) the world is rotated -90°\n // about X relative to y-up, so the Z arm points up and the Y arm points\n // into the scene. (x, y, z) -> (x, z, -y).\n const axes: Vec3[] =\n upAxis === 'z-up'\n ? [\n { x: 1, y: 0, z: 0 }, // X\n { x: 0, y: 0, z: -1 }, // Y (into the scene)\n { x: 0, y: 1, z: 0 }, // Z (up)\n ]\n : [\n { x: 1, y: 0, z: 0 }, // X\n { x: 0, y: 1, z: 0 }, // Y (up)\n { x: 0, y: 0, z: 1 }, // Z\n ];\n\n const axisNames: Array<'x' | 'y' | 'z'> = ['x', 'y', 'z'];\n const arms: ProjectedArm[] = [];\n\n for (let i = 0; i < 3; i++) {\n const ax = axes[i];\n const name = axisNames[i];\n if (!ax || !name) continue;\n\n // Positive arm\n const pos = projectToCanvas(\n { x: ax.x, y: ax.y, z: ax.z },\n orientation,\n center,\n armLength\n );\n arms.push({\n axis: name,\n positive: true,\n screenX: pos.x,\n screenY: pos.y,\n depth: pos.depth,\n });\n\n // Negative arm\n const neg = projectToCanvas(\n { x: -ax.x, y: -ax.y, z: -ax.z },\n orientation,\n center,\n armLength * 0.4\n );\n arms.push({\n axis: name,\n positive: false,\n screenX: neg.x,\n screenY: neg.y,\n depth: neg.depth,\n });\n }\n\n // Sort by depth — furthest first (painter's algorithm)\n arms.sort((a, b) => a.depth - b.depth);\n\n return arms;\n}\n\n// ─── Hit Testing ───\n\nfunction distPointToSegment(\n px: number,\n py: number,\n x1: number,\n y1: number,\n x2: number,\n y2: number\n): number {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.sqrt((px - x1) ** 2 + (py - y1) ** 2);\n\n let t = ((px - x1) * dx + (py - y1) * dy) / lenSq;\n t = Math.max(0, Math.min(1, t));\n\n const projX = x1 + t * dx;\n const projY = y1 + t * dy;\n return Math.sqrt((px - projX) ** 2 + (py - projY) ** 2);\n}\n\n/**\n * Hit test a screen position against the gizmo geometry.\n */\nexport function gizmoHitTest(\n px: number,\n py: number,\n orientation: GizmoOrientation,\n center: { x: number; y: number },\n armLength: number,\n upAxis: GizmoUpAxis,\n tolerancePx: number = 12,\n originRadius: number = 6\n): GizmoHitRegion {\n // Test origin handle first\n const originDist = Math.sqrt((px - center.x) ** 2 + (py - center.y) ** 2);\n if (originDist <= originRadius + tolerancePx * 0.5) {\n return { type: 'origin', distance: originDist };\n }\n\n const arms = projectAxes(orientation, center, armLength, upAxis);\n let closest: GizmoHitRegion = { type: 'none', distance: Infinity };\n\n for (const arm of arms) {\n // Check tip first (label / axis tip)\n const tipDist = Math.sqrt(\n (px - arm.screenX) ** 2 + (py - arm.screenY) ** 2\n );\n\n if (tipDist <= tolerancePx) {\n const hitType = arm.positive ? 'axis-positive' : 'axis-negative';\n if (tipDist < closest.distance) {\n closest = { type: hitType, axis: arm.axis, distance: tipDist };\n }\n }\n\n // Check arm line segment\n const segDist = distPointToSegment(\n px,\n py,\n center.x,\n center.y,\n arm.screenX,\n arm.screenY\n );\n if (segDist <= tolerancePx * 0.7 && segDist < closest.distance) {\n const hitType = arm.positive ? 'axis-positive' : 'axis-negative';\n closest = { type: hitType, axis: arm.axis, distance: segDist };\n }\n }\n\n // Check orbit ring\n const ringDist = Math.abs(originDist - armLength * 1.1);\n if (ringDist <= tolerancePx * 0.5 && ringDist < closest.distance) {\n return { type: 'ring', distance: ringDist };\n }\n\n return closest;\n}\n\n// ─── Preset Views ───\n\n/**\n * Convert a preset view name to Euler angles.\n */\nexport function presetViewToOrientation(\n view: GizmoPresetView,\n upAxis: GizmoUpAxis\n): GizmoOrientation {\n if (upAxis === 'y-up') {\n switch (view) {\n case 'front':\n return { yaw: 0, pitch: 0 };\n case 'back':\n return { yaw: 180, pitch: 0 };\n case 'right':\n return { yaw: 90, pitch: 0 };\n case 'left':\n return { yaw: -90, pitch: 0 };\n case 'top':\n return { yaw: 0, pitch: 90 };\n case 'bottom':\n return { yaw: 0, pitch: -90 };\n }\n }\n\n // Z-up\n switch (view) {\n case 'front':\n return { yaw: 0, pitch: 0 };\n case 'back':\n return { yaw: 180, pitch: 0 };\n case 'right':\n return { yaw: 90, pitch: 0 };\n case 'left':\n return { yaw: -90, pitch: 0 };\n case 'top':\n return { yaw: 0, pitch: 90 };\n case 'bottom':\n return { yaw: 0, pitch: -90 };\n }\n}\n\n// ─── Quaternion ↔ Euler ───\n\n/**\n * Convert quaternion [x, y, z, w] to Euler representation (YXZ order, degrees).\n * Utility for Three.js integration where `camera.quaternion` is available.\n */\nexport function quaternionToEuler(\n qx: number,\n qy: number,\n qz: number,\n qw: number\n): GizmoOrientation {\n // YXZ intrinsic rotation decomposition\n // Matrix from quaternion\n const xx = qx * qx;\n const yy = qy * qy;\n const zz = qz * qz;\n const xy = qx * qy;\n const xz = qx * qz;\n const yz = qy * qz;\n const wx = qw * qx;\n const wy = qw * qy;\n const wz = qw * qz;\n\n const m11 = 1 - 2 * (yy + zz);\n const m13 = 2 * (xz + wy);\n const m21 = 2 * (xy + wz);\n const m22 = 1 - 2 * (xx + zz);\n const m23 = 2 * (yz - wx);\n const m31 = 2 * (xz - wy);\n const m33 = 1 - 2 * (xx + yy);\n\n // YXZ order extraction\n const pitch = Math.asin(-Math.max(-1, Math.min(1, m23)));\n let yaw: number;\n let roll: number;\n\n if (Math.abs(m23) < 0.9999) {\n yaw = Math.atan2(m13, m33);\n roll = Math.atan2(m21, m22);\n } else {\n yaw = Math.atan2(-m31, m11);\n roll = 0;\n }\n\n return {\n yaw: yaw * RAD2DEG,\n pitch: pitch * RAD2DEG,\n roll: roll * RAD2DEG,\n };\n}\n\n/**\n * Map an axis tip click to the corresponding preset view.\n */\nexport function axisToPresetView(\n axis: 'x' | 'y' | 'z',\n positive: boolean,\n upAxis: GizmoUpAxis\n): GizmoPresetView | null {\n if (upAxis === 'y-up') {\n switch (axis) {\n case 'x':\n return positive ? 'right' : 'left';\n case 'y':\n return positive ? 'top' : 'bottom';\n case 'z':\n return positive ? 'front' : 'back';\n }\n }\n\n // Z-up\n switch (axis) {\n case 'x':\n return positive ? 'right' : 'left';\n case 'y':\n return positive ? 'front' : 'back';\n case 'z':\n return positive ? 'top' : 'bottom';\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { useState, useRef, useCallback } from 'react';
2
+ import { useState, useRef, useMemo, useCallback } from 'react';
3
3
  import { clamp } from '../../../utils/mathUtils.js';
4
4
  import { gizmoHitTest, axisToPresetView } from './gizmoMath.js';
5
5
 
@@ -9,15 +9,17 @@ const ORBIT_FINE_STEP = 5;
9
9
  function useGizmoInteraction(options) {
10
10
  const { orientation, canvasRef, diameter, upAxis, interactionMode, orbitSpeed, constrainPitch, disabled, onOrbit, onOrbitEnd, onSnapToView, onAxisClick, onOriginClick, } = options;
11
11
  const [hoveredRegion, setHoveredRegion] = useState(NONE_HIT);
12
+ // Ref drives synchronous reads inside the pointer handlers; the state mirror
13
+ // is the value exposed for rendering (kept in sync on drag start/end).
12
14
  const isDraggingRef = useRef(false);
13
- const [, setForceUpdate] = useState(0);
15
+ const [isDragging, setIsDragging] = useState(false);
14
16
  const lastPointerRef = useRef({ x: 0, y: 0 });
15
17
  const startPointerRef = useRef({ x: 0, y: 0 });
16
18
  const hasDraggedRef = useRef(false);
17
19
  const allowSnap = interactionMode === 'full' || interactionMode === 'snap-only';
18
20
  const allowOrbit = interactionMode === 'full' || interactionMode === 'orbit-only';
19
21
  const armLength = (diameter / 2) * 0.65;
20
- const center = { x: diameter / 2, y: diameter / 2 };
22
+ const center = useMemo(() => ({ x: diameter / 2, y: diameter / 2 }), [diameter]);
21
23
  const getPointerPos = useCallback((e) => {
22
24
  const canvas = canvasRef.current;
23
25
  if (!canvas)
@@ -36,7 +38,7 @@ function useGizmoInteraction(options) {
36
38
  hasDraggedRef.current = false;
37
39
  lastPointerRef.current = { x: e.clientX, y: e.clientY };
38
40
  startPointerRef.current = { x: e.clientX, y: e.clientY };
39
- setForceUpdate(n => n + 1);
41
+ setIsDragging(true);
40
42
  canvas.setPointerCapture(e.pointerId);
41
43
  // Store hit for click detection on pointer up
42
44
  const hit = gizmoHitTest(px, py, orientation, center, armLength, upAxis);
@@ -115,7 +117,7 @@ function useGizmoInteraction(options) {
115
117
  return;
116
118
  if (isDraggingRef.current) {
117
119
  isDraggingRef.current = false;
118
- setForceUpdate(n => n + 1);
120
+ setIsDragging(false);
119
121
  canvas.releasePointerCapture(e.pointerId);
120
122
  if (hasDraggedRef.current) {
121
123
  // Finished orbit drag
@@ -235,7 +237,7 @@ function useGizmoInteraction(options) {
235
237
  onOriginClick,
236
238
  ]);
237
239
  return {
238
- isDragging: isDraggingRef.current,
240
+ isDragging,
239
241
  hoveredRegion,
240
242
  handlers: {
241
243
  onPointerDown,
@@ -1 +1 @@
1
- {"version":3,"file":"useGizmoInteraction.js","sources":["../../../../../../src/components/editor/ViewportGizmo/useGizmoInteraction.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAyCA;AAEA;AACA;AAEM;AAGJ;;AAiBA;;AAEA;AACA;AACA;;;;AAQA;AAEA;AAEI;AACA;;AACA;;AAEF;AAIF;;;AAII;AACA;;;AAIA;AACA;AACA;AACA;;AAEA;;AAGA;;AAEF;;;;;;;;;AAUC;AAGH;AAEI;AACA;;AAEA;;;;;;AAOE;AACE;;AAGF;AACE;;;AAIE;AACA;;;;AAMJ;;;;;;;AAOF;;;;AAKE;;AACK;AACL;;;AAEA;;;AAEA;;AAEJ;;;;;;;;;;;;;AAcC;AAGH;AAEI;AACA;;AAEA;AACE;;AAEA;AAEA;;AAEE;;;;;AAIA;AASA;;;;;AAIE;AACA;AAAU;;;;AAGV;AACA;AAAU;;;;AAIlB;;;;;;;;;;;;AAaC;AAGH;AAEI;;AAEA;;;AAIA;AACE;;AAEI;;;;AAIJ;;AAEI;;;;AAIJ;;;;;AAKQ;;;;;;AAMR;;AAEI;;;AAGI;;;;;;AAMR;;AAEI;;;;AAIJ;;AAEI;;;;AAIJ;;AAEI;;;;AAIJ;AACA;;;;;;;;AASJ;;;;;;;;;;AAWC;;;;AAMD;;;;;AAKC;;AAEL;;"}
1
+ {"version":3,"file":"useGizmoInteraction.js","sources":["src/components/editor/ViewportGizmo/useGizmoInteraction.ts"],"sourcesContent":["'use client';\n\nimport { useState, useCallback, useMemo, useRef } from 'react';\n\nimport { clamp } from '@/utils/mathUtils';\n\nimport { gizmoHitTest, axisToPresetView } from './gizmoMath';\n\nimport type {\n GizmoOrientation,\n GizmoUpAxis,\n GizmoPresetView,\n GizmoHitRegion,\n OrbitDelta,\n} from './ViewportGizmo.types';\nimport type React from 'react';\n\ninterface UseGizmoInteractionOptions {\n orientation: GizmoOrientation;\n canvasRef: React.RefObject<HTMLCanvasElement | null>;\n diameter: number;\n upAxis: GizmoUpAxis;\n interactionMode: 'full' | 'snap-only' | 'orbit-only' | 'display-only';\n orbitSpeed: number;\n constrainPitch: boolean;\n disabled: boolean;\n onOrbit?: (delta: OrbitDelta) => void;\n onOrbitEnd?: (finalOrientation: GizmoOrientation) => void;\n onSnapToView?: (view: GizmoPresetView) => void;\n onAxisClick?: (axis: 'x' | 'y' | 'z', positive: boolean) => void;\n onOriginClick?: () => void;\n}\n\ninterface UseGizmoInteractionReturn {\n isDragging: boolean;\n hoveredRegion: GizmoHitRegion;\n handlers: {\n onPointerDown: (e: React.PointerEvent) => void;\n onPointerMove: (e: React.PointerEvent) => void;\n onPointerUp: (e: React.PointerEvent) => void;\n onKeyDown: (e: React.KeyboardEvent) => void;\n };\n}\n\nconst NONE_HIT: GizmoHitRegion = { type: 'none', distance: Infinity };\n\nconst ORBIT_KEY_STEP = 15;\nconst ORBIT_FINE_STEP = 5;\n\nexport function useGizmoInteraction(\n options: UseGizmoInteractionOptions\n): UseGizmoInteractionReturn {\n const {\n orientation,\n canvasRef,\n diameter,\n upAxis,\n interactionMode,\n orbitSpeed,\n constrainPitch,\n disabled,\n onOrbit,\n onOrbitEnd,\n onSnapToView,\n onAxisClick,\n onOriginClick,\n } = options;\n\n const [hoveredRegion, setHoveredRegion] = useState<GizmoHitRegion>(NONE_HIT);\n // Ref drives synchronous reads inside the pointer handlers; the state mirror\n // is the value exposed for rendering (kept in sync on drag start/end).\n const isDraggingRef = useRef(false);\n const [isDragging, setIsDragging] = useState(false);\n const lastPointerRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const startPointerRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const hasDraggedRef = useRef(false);\n\n const allowSnap =\n interactionMode === 'full' || interactionMode === 'snap-only';\n const allowOrbit =\n interactionMode === 'full' || interactionMode === 'orbit-only';\n\n const armLength = (diameter / 2) * 0.65;\n const center = useMemo(\n () => ({ x: diameter / 2, y: diameter / 2 }),\n [diameter]\n );\n\n const getPointerPos = useCallback(\n (e: React.PointerEvent) => {\n const canvas = canvasRef.current;\n if (!canvas) return { px: 0, py: 0 };\n const rect = canvas.getBoundingClientRect();\n return { px: e.clientX - rect.left, py: e.clientY - rect.top };\n },\n [canvasRef]\n );\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (disabled || interactionMode === 'display-only' || e.button !== 0)\n return;\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const { px, py } = getPointerPos(e);\n\n isDraggingRef.current = true;\n hasDraggedRef.current = false;\n lastPointerRef.current = { x: e.clientX, y: e.clientY };\n startPointerRef.current = { x: e.clientX, y: e.clientY };\n setIsDragging(true);\n canvas.setPointerCapture(e.pointerId);\n\n // Store hit for click detection on pointer up\n const hit = gizmoHitTest(px, py, orientation, center, armLength, upAxis);\n setHoveredRegion(hit);\n },\n [\n disabled,\n interactionMode,\n canvasRef,\n getPointerPos,\n orientation,\n center,\n armLength,\n upAxis,\n ]\n );\n\n const onPointerMove = useCallback(\n (e: React.PointerEvent) => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n if (isDraggingRef.current && allowOrbit) {\n const dx = e.clientX - lastPointerRef.current.x;\n const dy = e.clientY - lastPointerRef.current.y;\n\n // Only count as drag if moved > 3px from start\n const totalDx = e.clientX - startPointerRef.current.x;\n const totalDy = e.clientY - startPointerRef.current.y;\n if (Math.sqrt(totalDx ** 2 + totalDy ** 2) > 3) {\n hasDraggedRef.current = true;\n }\n\n if (hasDraggedRef.current) {\n const deltaYaw = dx * orbitSpeed * 0.5;\n let deltaPitch = -dy * orbitSpeed * 0.5;\n\n if (constrainPitch) {\n const newPitch = orientation.pitch + deltaPitch;\n deltaPitch = clamp(newPitch, -90, 90) - orientation.pitch;\n }\n\n onOrbit?.({ deltaYaw, deltaPitch });\n }\n\n lastPointerRef.current = { x: e.clientX, y: e.clientY };\n return;\n }\n\n // Hover detection\n if (interactionMode === 'display-only') return;\n const { px, py } = getPointerPos(e);\n const hit = gizmoHitTest(px, py, orientation, center, armLength, upAxis);\n setHoveredRegion(hit);\n\n // Cursor\n if (disabled) {\n canvas.style.cursor = 'default';\n } else if (hit.type === 'axis-positive' || hit.type === 'origin') {\n canvas.style.cursor = 'pointer';\n } else if (allowOrbit) {\n canvas.style.cursor = isDraggingRef.current ? 'grabbing' : 'grab';\n } else {\n canvas.style.cursor = 'default';\n }\n },\n [\n canvasRef,\n allowOrbit,\n orbitSpeed,\n constrainPitch,\n orientation,\n interactionMode,\n disabled,\n getPointerPos,\n center,\n armLength,\n upAxis,\n onOrbit,\n ]\n );\n\n const onPointerUp = useCallback(\n (e: React.PointerEvent) => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n if (isDraggingRef.current) {\n isDraggingRef.current = false;\n setIsDragging(false);\n canvas.releasePointerCapture(e.pointerId);\n\n if (hasDraggedRef.current) {\n // Finished orbit drag\n onOrbitEnd?.(orientation);\n } else if (allowSnap) {\n // Click (no drag) — check hit\n const { px, py } = getPointerPos(e);\n const hit = gizmoHitTest(\n px,\n py,\n orientation,\n center,\n armLength,\n upAxis\n );\n\n if (hit.type === 'origin') {\n onOriginClick?.();\n } else if (hit.type === 'axis-positive' && hit.axis) {\n onAxisClick?.(hit.axis, true);\n const view = axisToPresetView(hit.axis, true, upAxis);\n if (view) onSnapToView?.(view);\n } else if (hit.type === 'axis-negative' && hit.axis) {\n onAxisClick?.(hit.axis, false);\n const view = axisToPresetView(hit.axis, false, upAxis);\n if (view) onSnapToView?.(view);\n }\n }\n }\n },\n [\n canvasRef,\n allowSnap,\n getPointerPos,\n orientation,\n center,\n armLength,\n upAxis,\n onOrbitEnd,\n onOriginClick,\n onAxisClick,\n onSnapToView,\n ]\n );\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled || interactionMode === 'display-only') return;\n\n const fine = e.shiftKey;\n const step = fine ? ORBIT_FINE_STEP : ORBIT_KEY_STEP;\n let handled = false;\n\n switch (e.key) {\n case 'ArrowLeft':\n if (allowOrbit) {\n onOrbit?.({ deltaYaw: -step, deltaPitch: 0 });\n handled = true;\n }\n break;\n case 'ArrowRight':\n if (allowOrbit) {\n onOrbit?.({ deltaYaw: step, deltaPitch: 0 });\n handled = true;\n }\n break;\n case 'ArrowUp':\n if (allowOrbit) {\n let deltaPitch = step;\n if (constrainPitch) {\n deltaPitch =\n clamp(orientation.pitch + step, -90, 90) - orientation.pitch;\n }\n onOrbit?.({ deltaYaw: 0, deltaPitch });\n handled = true;\n }\n break;\n case 'ArrowDown':\n if (allowOrbit) {\n let deltaPitch = -step;\n if (constrainPitch) {\n deltaPitch =\n clamp(orientation.pitch - step, -90, 90) - orientation.pitch;\n }\n onOrbit?.({ deltaYaw: 0, deltaPitch });\n handled = true;\n }\n break;\n case '1':\n if (allowSnap) {\n onSnapToView?.(e.ctrlKey ? 'back' : 'front');\n handled = true;\n }\n break;\n case '3':\n if (allowSnap) {\n onSnapToView?.(e.ctrlKey ? 'left' : 'right');\n handled = true;\n }\n break;\n case '7':\n if (allowSnap) {\n onSnapToView?.(e.ctrlKey ? 'bottom' : 'top');\n handled = true;\n }\n break;\n case '5':\n case 'Home':\n onOriginClick?.();\n handled = true;\n break;\n }\n\n if (handled) {\n e.preventDefault();\n }\n },\n [\n disabled,\n interactionMode,\n allowOrbit,\n allowSnap,\n constrainPitch,\n orientation,\n onOrbit,\n onSnapToView,\n onOriginClick,\n ]\n );\n\n return {\n isDragging,\n hoveredRegion,\n handlers: {\n onPointerDown,\n onPointerMove,\n onPointerUp,\n onKeyDown,\n },\n };\n}\n"],"names":[],"mappings":";;;;;AA4CA;AAEA;AACA;AAEM;AAGJ;;;;AAmBA;;AAEA;AACA;AACA;;;;;AAaA;AAEI;AACA;;AACA;;AAEF;AAIF;;;AAII;AACA;;;AAIA;AACA;AACA;AACA;;AAEA;;AAGA;;AAEF;;;;;;;;;AAUC;AAGH;AAEI;AACA;;AAEA;;;;;;AAOE;AACE;;AAGF;AACE;;;AAIE;AACA;;;;AAMJ;;;;;;;AAOF;;;;AAKE;;AACK;AACL;;;AAEA;;;AAEA;;AAEJ;;;;;;;;;;;;;AAcC;AAGH;AAEI;AACA;;AAEA;AACE;;AAEA;AAEA;;AAEE;;;;;AAIA;AASA;;;;;AAIE;AACA;AAAU;;;;AAGV;AACA;AAAU;;;;AAIlB;;;;;;;;;;;;AAaC;AAGH;AAEI;;AAEA;;;AAIA;AACE;;AAEI;;;;AAIJ;;AAEI;;;;AAIJ;;;;;AAKQ;;;;;;AAMR;;AAEI;;;AAGI;;;;;;AAMR;;AAEI;;;;AAIJ;;AAEI;;;;AAIJ;;AAEI;;;;AAIJ;AACA;;;;;;;;AASJ;;;;;;;;;;AAWC;;;;AAMD;;;;;AAKC;;AAEL;;"}
@@ -40,7 +40,7 @@ const AXIS_COLORS = {
40
40
  z: '#4A86C8',
41
41
  };
42
42
  function useGizmoRenderer(options) {
43
- const { canvasRef, orientation, diameter, upAxis, size, axisColors, axisLabels, axisVisible, showLabels, showNegativeAxes, showOrbitRing, showOriginHandle, background, disabled, isDragging, hoveredRegion, } = options;
43
+ const { canvasRef, orientation, diameter, upAxis, size, axisColors, axisLabels, axisVisible, showLabels, showNegativeAxes, showOrbitRing, showOriginHandle, background, disabled, hoveredRegion, } = options;
44
44
  const draw = useCallback(() => {
45
45
  const canvas = canvasRef.current;
46
46
  if (!canvas)
@@ -176,7 +176,6 @@ function useGizmoRenderer(options) {
176
176
  showOriginHandle,
177
177
  background,
178
178
  disabled,
179
- isDragging,
180
179
  hoveredRegion,
181
180
  ]);
182
181
  useCanvasRenderer({
@@ -1 +1 @@
1
- {"version":3,"file":"useGizmoRenderer.js","sources":["../../../../../../src/components/editor/ViewportGizmo/useGizmoRenderer.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;AA2BA;AACE;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACD;;AAGH;AAEA;AACE;AACA;AACA;;AAwBI;AACJ;AAmBA;AACE;AACA;;;AAGA;;AAEA;AAEA;AACA;AACA;AAEA;AACE;AACA;AACA;;;AAEA;;AAGF;AACA;;AAEA;;;;AAMA;AACE;AACA;;;;;AAIK;AACL;AACA;;;AAIF;;;AAIE;AACA;AACA;;;;AAIA;;;AAIF;AAEA;AACE;;AACA;;AAEA;;;AAII;AAEJ;AACA;;AAEE;;AAGF;AACA;AACA;AACA;;;;;;AAOA;AACE;AACA;AACA;;;;;;AAOE;;;;;AAMA;AACA;AACA;;;AAIA;AACA;AACA;AACA;AACA;;;;;;;AAQJ;;AAEE;AACA;AAEF;AACA;;;;;AAMA;AACA;AACA;;;AAIF;AACF;;;;;;;;;;;;;;;;;AAiBC;AAED;;;AAGE;AACD;AACH;;"}
1
+ {"version":3,"file":"useGizmoRenderer.js","sources":["src/components/editor/ViewportGizmo/useGizmoRenderer.ts"],"sourcesContent":["'use client';\n\nimport { useCallback } from 'react';\n\nimport { resolveCanvasTheme } from '@/components/primitives/canvas/canvasTheme';\nimport { useCanvasRenderer } from '@/components/primitives/canvas/useCanvasRenderer';\n\nimport { projectAxes } from './gizmoMath';\n\nimport type {\n GizmoOrientation,\n GizmoUpAxis,\n GizmoHitRegion,\n ViewportGizmoSize,\n} from './ViewportGizmo.types';\nimport type { CanvasThemeColors } from '@/components/primitives/canvas/canvas.types';\nimport type React from 'react';\n\n// ─── Size Presets ───\n\ninterface SizePreset {\n labelFontSize: number;\n fontWeight: number;\n armWidthPositive: number;\n armWidthNegative: number;\n tipRadius: number;\n tipHoverRadius: number;\n originRadius: number;\n}\n\nconst SIZE_PRESETS: Record<ViewportGizmoSize, SizePreset> = {\n sm: {\n labelFontSize: 9,\n fontWeight: 600,\n armWidthPositive: 1.5,\n armWidthNegative: 0.75,\n tipRadius: 4,\n tipHoverRadius: 5,\n originRadius: 4,\n },\n md: {\n labelFontSize: 11,\n fontWeight: 600,\n armWidthPositive: 2.5,\n armWidthNegative: 1,\n tipRadius: 5,\n tipHoverRadius: 7,\n originRadius: 5,\n },\n lg: {\n labelFontSize: 13,\n fontWeight: 600,\n armWidthPositive: 3,\n armWidthNegative: 1.5,\n tipRadius: 6,\n tipHoverRadius: 8,\n originRadius: 6,\n },\n};\n\n// ─── Default Axis Colors ───\n\nconst AXIS_COLORS: Record<string, string> = {\n x: '#E63946',\n y: '#6AA84F',\n z: '#4A86C8',\n};\n\ninterface UseGizmoRendererOptions {\n canvasRef: React.RefObject<HTMLCanvasElement | null>;\n orientation: GizmoOrientation;\n diameter: number;\n upAxis: GizmoUpAxis;\n size: ViewportGizmoSize;\n axisColors: Record<string, string>;\n axisLabels: Record<string, string>;\n axisVisible: Record<string, boolean>;\n showLabels: boolean;\n showNegativeAxes: boolean;\n showOrbitRing: boolean;\n showOriginHandle: boolean;\n background: 'transparent' | 'subtle' | 'solid';\n disabled: boolean;\n isDragging: boolean;\n hoveredRegion: GizmoHitRegion;\n}\n\nexport { AXIS_COLORS };\n\nexport function useGizmoRenderer(options: UseGizmoRendererOptions): void {\n const {\n canvasRef,\n orientation,\n diameter,\n upAxis,\n size,\n axisColors,\n axisLabels,\n axisVisible,\n showLabels,\n showNegativeAxes,\n showOrbitRing,\n showOriginHandle,\n background,\n disabled,\n hoveredRegion,\n } = options;\n\n const draw = useCallback(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const dpr =\n typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n const rect = canvas.getBoundingClientRect();\n const w = rect.width;\n const h = rect.height;\n\n if (canvas.width !== w * dpr || canvas.height !== h * dpr) {\n canvas.width = w * dpr;\n canvas.height = h * dpr;\n ctx.scale(dpr, dpr);\n } else {\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n }\n\n const theme: CanvasThemeColors = resolveCanvasTheme(canvas);\n const preset = SIZE_PRESETS[size];\n const opacity = disabled ? 0.4 : 1;\n const center = { x: w / 2, y: h / 2 };\n const armLength = (diameter / 2) * 0.65;\n\n // 1. Clear / background\n ctx.clearRect(0, 0, w, h);\n\n if (background === 'subtle') {\n ctx.globalAlpha = opacity * 0.15;\n ctx.fillStyle = theme.backgroundSecondary;\n ctx.beginPath();\n ctx.arc(center.x, center.y, diameter / 2, 0, Math.PI * 2);\n ctx.fill();\n } else if (background === 'solid') {\n ctx.globalAlpha = opacity;\n ctx.fillStyle = theme.backgroundSecondary;\n ctx.fillRect(0, 0, w, h);\n }\n\n ctx.globalAlpha = opacity;\n\n // 2. Orbit ring\n if (showOrbitRing) {\n ctx.strokeStyle = theme.borderDefault;\n ctx.lineWidth = 1;\n ctx.globalAlpha = opacity * 0.3;\n ctx.beginPath();\n ctx.arc(center.x, center.y, armLength * 1.1, 0, Math.PI * 2);\n ctx.stroke();\n ctx.globalAlpha = opacity;\n }\n\n // 3. Draw arms — depth sorted (furthest first = painter's algorithm)\n const arms = projectAxes(orientation, center, armLength, upAxis);\n\n for (const arm of arms) {\n if (!axisVisible[arm.axis]) continue;\n if (!arm.positive && !showNegativeAxes) continue;\n\n const color = axisColors[arm.axis] ?? AXIS_COLORS[arm.axis] ?? '#888';\n const isHovered =\n hoveredRegion.axis === arm.axis &&\n ((arm.positive && hoveredRegion.type === 'axis-positive') ||\n (!arm.positive && hoveredRegion.type === 'axis-negative'));\n\n const alpha = arm.positive ? 1.0 : 0.35;\n const lineWidth = arm.positive\n ? preset.armWidthPositive\n : preset.armWidthNegative;\n\n // Draw arm line\n ctx.globalAlpha = opacity * alpha;\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.lineCap = 'round';\n ctx.beginPath();\n ctx.moveTo(center.x, center.y);\n ctx.lineTo(arm.screenX, arm.screenY);\n ctx.stroke();\n\n // Draw tip handle (positive arms only)\n if (arm.positive) {\n const tipR = isHovered ? preset.tipHoverRadius : preset.tipRadius;\n ctx.globalAlpha = opacity;\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.arc(arm.screenX, arm.screenY, tipR, 0, Math.PI * 2);\n ctx.fill();\n\n // Draw label\n if (showLabels) {\n const label = axisLabels[arm.axis] ?? arm.axis.toUpperCase();\n const labelOffset = tipR + preset.labelFontSize * 0.6;\n\n // Position label outward from center\n const dx = arm.screenX - center.x;\n const dy = arm.screenY - center.y;\n const dist = Math.sqrt(dx * dx + dy * dy) || 1;\n const nx = dx / dist;\n const ny = dy / dist;\n const lx = arm.screenX + nx * labelOffset;\n const ly = arm.screenY + ny * labelOffset;\n\n ctx.globalAlpha = opacity;\n ctx.fillStyle = color;\n ctx.font = `${preset.fontWeight} ${preset.labelFontSize}px sans-serif`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(label, lx, ly);\n }\n }\n }\n\n // 4. Origin handle\n if (showOriginHandle) {\n const isOriginHovered = hoveredRegion.type === 'origin';\n const originR = isOriginHovered\n ? preset.originRadius + 1.5\n : preset.originRadius;\n\n ctx.globalAlpha = opacity * 0.6;\n ctx.fillStyle = theme.textSecondary;\n ctx.beginPath();\n ctx.arc(center.x, center.y, originR, 0, Math.PI * 2);\n ctx.fill();\n\n // Border ring\n ctx.globalAlpha = opacity * 0.3;\n ctx.strokeStyle = theme.textMuted;\n ctx.lineWidth = 1;\n ctx.stroke();\n }\n\n ctx.globalAlpha = 1;\n }, [\n canvasRef,\n orientation,\n diameter,\n upAxis,\n size,\n axisColors,\n axisLabels,\n axisVisible,\n showLabels,\n showNegativeAxes,\n showOrbitRing,\n showOriginHandle,\n background,\n disabled,\n hoveredRegion,\n ]);\n\n useCanvasRenderer({\n draw,\n deps: [draw],\n paused: false,\n });\n}\n"],"names":[],"mappings":";;;;;;AA8BA;AACE;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACD;;AAGH;AAEA;AACE;AACA;AACA;;AAwBI;AACJ;AAkBA;AACE;AACA;;;AAGA;;AAEA;AAEA;AACA;AACA;AAEA;AACE;AACA;AACA;;;AAEA;;AAGF;AACA;;AAEA;;;;AAMA;AACE;AACA;;;;;AAIK;AACL;AACA;;;AAIF;;;AAIE;AACA;AACA;;;;AAIA;;;AAIF;AAEA;AACE;;AACA;;AAEA;;;AAII;AAEJ;AACA;;AAEE;;AAGF;AACA;AACA;AACA;;;;;;AAOA;AACE;AACA;AACA;;;;;;AAOE;;;;;AAMA;AACA;AACA;;;AAIA;AACA;AACA;AACA;AACA;;;;;;;AAQJ;;AAEE;AACA;AAEF;AACA;;;;;AAMA;AACA;AACA;;;AAIF;AACF;;;;;;;;;;;;;;;;AAgBC;AAED;;;AAGE;AACD;AACH;;"}
@@ -1,19 +1,19 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from 'react/jsx-runtime';
3
- import React from 'react';
4
3
  import { assignInlineVars } from '@vanilla-extract/dynamic';
5
- import { cx } from '../../../utils/cx.js';
6
- import { vars } from '../../../theme/contract.css.js';
7
- import { IconButton } from '../../primitives/IconButton/IconButton.js';
4
+ import React from 'react';
5
+ import { CheckIcon } from '../../Icons/CheckIcon.js';
8
6
  import { CloseIcon } from '../../Icons/CloseIcon.js';
7
+ import { ErrorIcon } from '../../Icons/ErrorIcon.js';
9
8
  import { InfoIcon } from '../../Icons/InfoIcon.js';
10
- import { CheckIcon } from '../../Icons/CheckIcon.js';
11
9
  import { WarningIcon } from '../../Icons/WarningIcon.js';
12
- import { ErrorIcon } from '../../Icons/ErrorIcon.js';
10
+ import { IconButton } from '../../primitives/IconButton/IconButton.js';
11
+ import { vars } from '../../../theme/contract.css.js';
12
+ import { cx } from '../../../utils/cx.js';
13
13
  import { alertColorVar, alertIconSolidStyle, alertIconStyle, alertContentStyle, alertCloseColumnStyle, alertCloseButtonSolidStyle, alertRecipe } from './Alert.css.js';
14
- import { AlertTitle } from './AlertTitle.js';
15
- import { AlertDescription } from './AlertDescription.js';
16
14
  import { AlertActions } from './AlertActions.js';
15
+ import { AlertDescription } from './AlertDescription.js';
16
+ import { AlertTitle } from './AlertTitle.js';
17
17
 
18
18
  const VARIANT_COLOR = {
19
19
  info: vars.colors.accent.primary,
@@ -1 +1 @@
1
- {"version":3,"file":"Alert.js","sources":["../../../../../../src/components/feedback/Alert/Alert.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;;;;AA0BA;AACE;AACA;AACA;AACA;AACA;;AAGF;AAEI;AACA;AACA;AACA;;;AAIJ;;;;;AAKE;;AAGF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BG;AACH;AAgBI;AACA;AAEA;AAEI;;AAEE;;;AAIJ;AACD;AAED;;AAoDF;AAGF;AAeO;AACP;AACA;AACA;;"}
1
+ {"version":3,"file":"Alert.js","sources":["src/components/feedback/Alert/Alert.tsx"],"sourcesContent":["'use client';\n\nimport { assignInlineVars } from '@vanilla-extract/dynamic';\nimport React from 'react';\n\nimport { CheckIcon } from '@/components/Icons/CheckIcon';\nimport { CloseIcon } from '@/components/Icons/CloseIcon';\nimport { ErrorIcon } from '@/components/Icons/ErrorIcon';\nimport { InfoIcon } from '@/components/Icons/InfoIcon';\nimport { WarningIcon } from '@/components/Icons/WarningIcon';\nimport { IconButton } from '@/components/primitives/IconButton';\nimport { vars } from '@/theme/contract.css';\nimport { cx } from '@/utils/cx';\n\nimport {\n alertCloseButtonSolidStyle,\n alertCloseColumnStyle,\n alertColorVar,\n alertContentStyle,\n alertIconSolidStyle,\n alertIconStyle,\n alertRecipe,\n} from './Alert.css';\nimport { AlertActions } from './AlertActions';\nimport { AlertDescription } from './AlertDescription';\nimport { AlertTitle } from './AlertTitle';\n\nimport type { AlertProps, AlertVariant } from './Alert.types';\n\nconst VARIANT_COLOR: Record<AlertVariant, string> = {\n info: vars.colors.accent.primary,\n success: vars.colors.accent.success,\n warning: vars.colors.accent.warning,\n error: vars.colors.accent.error,\n neutral: vars.colors.text.muted,\n};\n\nconst VARIANT_ROLE: Record<AlertVariant, { role: string; ariaLabel?: string }> =\n {\n info: { role: 'status' },\n success: { role: 'status' },\n warning: { role: 'alert' },\n error: { role: 'alert' },\n neutral: { role: 'region', ariaLabel: 'Notice' },\n };\n\nconst VARIANT_DEFAULT_ICON: Record<AlertVariant, React.ReactNode> = {\n info: <InfoIcon size=\"md\" decorative />,\n success: <CheckIcon size=\"md\" decorative />,\n warning: <WarningIcon size=\"md\" decorative />,\n error: <ErrorIcon size=\"md\" decorative />,\n neutral: null,\n};\n\n/**\n * Persistent inline alert / callout.\n *\n * Use for non-transient status messages tied to the surrounding UI — read-only\n * notices, expired credentials, unsaved-changes banners, etc. For transient\n * confirmations like \"File saved\", reach for `useToast` instead.\n *\n * Compound API: pair with `<Alert.Title>`, `<Alert.Description>`, and\n * `<Alert.Actions>` for richer layouts. The same components are also\n * available as standalone named exports (`AlertTitle`, `AlertDescription`,\n * `AlertActions`).\n *\n * Accessibility: roles are derived from the variant — `alert` for\n * `error`/`warning`, `status` for `info`/`success`, `region` for `neutral`.\n * The component never auto-focuses; inline alerts shouldn't grab focus.\n *\n * @example\n * ```tsx\n * <Alert variant=\"warning\" title=\"Read-only mode\">\n * Switch to edit mode to make changes.\n * </Alert>\n *\n * <Alert variant=\"error\" onClose={() => setOpen(false)}>\n * <Alert.Title>Couldn't reach the server</Alert.Title>\n * <Alert.Description>The request timed out.</Alert.Description>\n * <Alert.Actions align=\"right\">\n * <Button onClick={retry}>Retry</Button>\n * </Alert.Actions>\n * </Alert>\n * ```\n */\nconst AlertImpl = /*#__PURE__*/ React.memo<AlertProps>(\n ({\n variant = 'info',\n appearance = 'subtle',\n icon = true,\n onClose,\n title,\n width = '100%',\n children,\n className,\n style,\n testId,\n 'aria-label': ariaLabelProp,\n ref,\n ...rest\n }) => {\n const isSolid = appearance === 'solid';\n const { role, ariaLabel: defaultAriaLabel } = VARIANT_ROLE[variant];\n\n const resolvedIcon: React.ReactNode =\n icon === false\n ? null\n : icon === true\n ? VARIANT_DEFAULT_ICON[variant]\n : icon;\n\n const inlineVars = assignInlineVars({\n [alertColorVar]: VARIANT_COLOR[variant],\n });\n\n const resolvedWidth = typeof width === 'number' ? `${width}px` : width;\n\n return (\n <div\n ref={ref}\n role={role}\n aria-label={ariaLabelProp ?? defaultAriaLabel}\n className={cx(alertRecipe({ variant, appearance }), className)}\n style={{ ...inlineVars, width: resolvedWidth, ...style }}\n data-testid={testId}\n data-variant={variant}\n data-appearance={appearance}\n {...rest}\n >\n {resolvedIcon ? (\n <div\n className={cx(alertIconStyle, isSolid && alertIconSolidStyle)}\n data-alert-icon=\"\"\n aria-hidden=\"true\"\n >\n {resolvedIcon}\n </div>\n ) : null}\n\n <div className={alertContentStyle}>\n {title !== undefined && title !== null ? (\n <AlertTitle>{title}</AlertTitle>\n ) : null}\n {typeof children === 'string' ? (\n <AlertDescription>{children}</AlertDescription>\n ) : (\n children\n )}\n </div>\n\n {onClose ? (\n <div className={alertCloseColumnStyle}>\n <IconButton\n type=\"button\"\n aria-label=\"Close alert\"\n variant=\"ghost\"\n size=\"sm\"\n radius=\"sm\"\n onClick={onClose}\n className={isSolid ? alertCloseButtonSolidStyle : undefined}\n >\n <CloseIcon size=\"sm\" decorative />\n </IconButton>\n </div>\n ) : null}\n </div>\n );\n }\n);\n\nAlertImpl.displayName = 'Alert';\n\n/**\n * Public API: `Alert` with attached compound members.\n *\n * `React.memo` returns an exotic component that doesn't accept arbitrary\n * static fields with proper typing — we expose the compound members through\n * a typed wrapper.\n */\ntype AlertCompound = typeof AlertImpl & {\n Title: typeof AlertTitle;\n Description: typeof AlertDescription;\n Actions: typeof AlertActions;\n};\n\nexport const Alert = AlertImpl as AlertCompound;\nAlert.Title = AlertTitle;\nAlert.Description = AlertDescription;\nAlert.Actions = AlertActions;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AA6BA;AACE;AACA;AACA;AACA;AACA;;AAGF;AAEI;AACA;AACA;AACA;;;AAIJ;;;;;AAKE;;AAGF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BG;AACH;AAgBI;AACA;AAEA;AAEI;;AAEE;;;AAIJ;AACD;AAED;;AAoDF;AAGF;AAeO;AACP;AACA;AACA;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"AlertActions.js","sources":["../../../../../../src/components/feedback/Alert/AlertActions.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;;AAOA;;;;;;;;;;;;;;;;AAgBG;AACI;AAEH;AAYF;AAGF;;"}
1
+ {"version":3,"file":"AlertActions.js","sources":["src/components/feedback/Alert/AlertActions.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\n\nimport { cx } from '@/utils/cx';\n\nimport { alertActionsRecipe } from './Alert.css';\n\nimport type { AlertActionsProps } from './Alert.types';\n\n/**\n * Action-button row for an `Alert`. Lays out children with a horizontal gap\n * and configurable alignment. Renders only when actions are needed — for\n * dismissible alerts the close button in the top-right is usually enough.\n *\n * @example\n * ```tsx\n * <Alert variant=\"error\">\n * <Alert.Title>Couldn't reach the server</Alert.Title>\n * <Alert.Description>The request timed out after 30 seconds.</Alert.Description>\n * <Alert.Actions align=\"right\">\n * <Button variant=\"filled\" onClick={retry}>Retry</Button>\n * <Button onClick={dismiss}>Dismiss</Button>\n * </Alert.Actions>\n * </Alert>\n * ```\n */\nexport const AlertActions = /*#__PURE__*/ React.memo<AlertActionsProps>(\n ({ children, align = 'left', className, style, testId, ref, ...rest }) => {\n return (\n <div\n ref={ref}\n className={cx(alertActionsRecipe({ align }), className)}\n style={style}\n data-testid={testId}\n data-alert-actions=\"\"\n {...rest}\n >\n {children}\n </div>\n );\n }\n);\n\nAlertActions.displayName = 'AlertActions';\n"],"names":[],"mappings":";;;;;;AAUA;;;;;;;;;;;;;;;;AAgBG;AACI;AAEH;AAYF;AAGF;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"AlertDescription.js","sources":["../../../../../../src/components/feedback/Alert/AlertDescription.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;;AAOA;;;;;;;;;;;;;;AAcG;AACI;AAEH;AAYF;AAGF;;"}
1
+ {"version":3,"file":"AlertDescription.js","sources":["src/components/feedback/Alert/AlertDescription.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\n\nimport { cx } from '@/utils/cx';\n\nimport { alertDescriptionStyle } from './Alert.css';\n\nimport type { AlertDescriptionProps } from './Alert.types';\n\n/**\n * Body text slot for an `Alert`. Most one-line alerts can pass a string as\n * children to `<Alert>` directly; reach for this when you need to compose\n * multiple paragraphs or inline elements.\n *\n * @example\n * ```tsx\n * <Alert variant=\"info\">\n * <Alert.Title>Heads up</Alert.Title>\n * <Alert.Description>\n * This editor is read-only. Open the file in edit mode to make changes.\n * </Alert.Description>\n * </Alert>\n * ```\n */\nexport const AlertDescription = /*#__PURE__*/ React.memo<AlertDescriptionProps>(\n ({ children, className, style, testId, ref, ...rest }) => {\n return (\n <div\n ref={ref}\n className={cx(alertDescriptionStyle, className)}\n style={style}\n data-testid={testId}\n data-alert-description=\"\"\n {...rest}\n >\n {children}\n </div>\n );\n }\n);\n\nAlertDescription.displayName = 'AlertDescription';\n"],"names":[],"mappings":";;;;;;AAUA;;;;;;;;;;;;;;AAcG;AACI;AAEH;AAYF;AAGF;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"AlertTitle.js","sources":["../../../../../../src/components/feedback/Alert/AlertTitle.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;;AAOA;;;;;;;;;;;;;;AAcG;AACI;AAEH;AAYF;AAGF;;"}
1
+ {"version":3,"file":"AlertTitle.js","sources":["src/components/feedback/Alert/AlertTitle.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\n\nimport { cx } from '@/utils/cx';\n\nimport { alertTitleStyle } from './Alert.css';\n\nimport type { AlertTitleProps } from './Alert.types';\n\n/**\n * Title slot for an `Alert`. Renders a single line of emphasized text above\n * the description.\n *\n * Equivalent to passing `title` directly on `<Alert>`. Use this form when you\n * want richer content (links, inline elements) inside the title.\n *\n * @example\n * ```tsx\n * <Alert variant=\"warning\">\n * <Alert.Title>Read-only mode</Alert.Title>\n * <Alert.Description>Switch to edit to change this file.</Alert.Description>\n * </Alert>\n * ```\n */\nexport const AlertTitle = /*#__PURE__*/ React.memo<AlertTitleProps>(\n ({ children, className, style, testId, ref, ...rest }) => {\n return (\n <div\n ref={ref}\n className={cx(alertTitleStyle, className)}\n style={style}\n data-testid={testId}\n data-alert-title=\"\"\n {...rest}\n >\n {children}\n </div>\n );\n }\n);\n\nAlertTitle.displayName = 'AlertTitle';\n"],"names":[],"mappings":";;;;;;AAUA;;;;;;;;;;;;;;AAcG;AACI;AAEH;AAYF;AAGF;;"}