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,450 @@
1
+ "use client";
2
+ import { jsx, jsxs } from 'react/jsx-runtime';
3
+ import React, { useRef, useState, useMemo, useCallback, useSyncExternalStore, useLayoutEffect, useImperativeHandle, useEffect } from 'react';
4
+ import '../../../utils/devWarn.js';
5
+ import { useControlledState } from '../../../hooks/useControlledState/useControlledState.js';
6
+ import { useLatest } from '../../../hooks/useLatest/useLatest.js';
7
+ import { useResizeObserver } from '../../../hooks/useResizeObserver/useResizeObserver.js';
8
+ import '../../../hooks/useBreakpoint/useBreakpoint.js';
9
+ import './../../../assets/src/theme/lightTheme.css.ts.vanilla-Ct6f9Iym.css';
10
+ import '@vanilla-extract/css';
11
+ import './../../../assets/src/theme/darkTheme.css.ts.vanilla-BHZ3ecRn.css';
12
+ import './../../../assets/src/theme/globalScrollbars.css.ts.vanilla-BAJwnUEJ.css';
13
+ import '../../../hooks/useNavigationHistory/useNavigationHistory.js';
14
+ import { cx } from '../../../utils/cx.js';
15
+ import { timelineMainRowStyle, timelineBodyStyle, timelineCanvasStyle, timelineOverlayLayerStyle, ariaLiveRegionStyle, timelineShellStyle, timelineToolbarStyle, timelineFooterStyle } from './Timeline.css.js';
16
+ import { TIMELINE_SLOT } from './Timeline.types.js';
17
+ import { TimelineStoreContext } from './TimelineContext.js';
18
+ import { resolveLoop, snapFrame, nextFollowView } from './timelineCoords.js';
19
+ import { computeRows } from './timelineLayout.js';
20
+ import { TimelineStore } from './TimelineStore.js';
21
+ import { TimelineTrackHeaders } from './TimelineTrackHeaders.js';
22
+ import { useTimelineDraw } from './useTimelineDraw.js';
23
+ import { useTimelineGestures } from './useTimelineGestures.js';
24
+ import { useTimelinePlayback } from './useTimelinePlayback.js';
25
+ import { clamp } from '../../../utils/mathUtils.js';
26
+
27
+ const RULER_HEIGHT = 22;
28
+ const LOOP_STRIP_HEIGHT = 12;
29
+ function getSlotKind(el) {
30
+ const marker = el.type[TIMELINE_SLOT];
31
+ return marker ?? null;
32
+ }
33
+ function categorizeChildren(children) {
34
+ const slots = {
35
+ toolbar: null,
36
+ footer: null,
37
+ minimap: null,
38
+ trackScale: null,
39
+ overlay: [],
40
+ };
41
+ React.Children.forEach(children, child => {
42
+ if (!React.isValidElement(child)) {
43
+ if (child !== null && child !== undefined && child !== false) {
44
+ slots.overlay.push(child);
45
+ }
46
+ return;
47
+ }
48
+ const kind = getSlotKind(child);
49
+ const props = child.props;
50
+ if (kind === 'track-scale') {
51
+ slots.trackScale = child.props;
52
+ return;
53
+ }
54
+ if (kind === 'toolbar') {
55
+ slots.toolbar = (jsx("div", { className: cx(timelineToolbarStyle, props.className), style: props.style, children: props.children }));
56
+ }
57
+ else if (kind === 'footer') {
58
+ slots.footer = (jsx("div", { className: cx(timelineFooterStyle, props.className), style: props.style, children: props.children }));
59
+ }
60
+ else if (kind === 'minimap') {
61
+ slots.minimap = child;
62
+ }
63
+ else {
64
+ slots.overlay.push(child);
65
+ }
66
+ });
67
+ return slots;
68
+ }
69
+ /**
70
+ * Horizontal multi-track animation timeline / dope sheet. Tracks hold
71
+ * keyframes (the shared `CurveKeyframe` model) along a frame-based time axis;
72
+ * a playhead scrubs across all tracks. Canvas-rendered keyframes with DOM
73
+ * chrome, store-driven via `useSyncExternalStore`.
74
+ *
75
+ * Children read live state via `useTimelineContext()` / `useTimelineGeometry()`
76
+ * / `useTimelinePlayhead()` / `useTimelineSelection()`.
77
+ */
78
+ const Timeline = (props) => {
79
+ const { tracks, onTracksChange, onTracksChangeComplete, startFrame = 0, endFrame, fps = 30, frame, defaultFrame, onFrameChange, onFrameChangeComplete, view, defaultView, onViewChange, minFramesVisible = 1, maxFramesVisible, selection, defaultSelection, onSelectionChange, editable = true, allowAddKeyframe = true, allowDeleteKeyframe = true, snap = true, mode, defaultMode, onModeChange, playing, defaultPlaying, onPlayingChange, loop, defaultLoop, onLoopChange, followMode = 'smooth', loopStrip = false, loopHandles = 'edges', groups, onGroupsChange, trackHeight = 28, expandedTrackHeight = 96, groupHeaderHeight = 22, showRuler = true, showPlayhead = true, trackHeaderWidth = 160, responsive = true, height, playheadColor, backgroundColor, trackScale: trackScaleProp, renderOverlay, renderTrackHeader, formatTime, ariaLabel = 'Timeline', className, style, testId, id, children, ref, } = props;
80
+ const bodyRef = useRef(null);
81
+ const canvasRef = useRef(null);
82
+ const headerColumnRef = useRef(null);
83
+ const [size, setSize] = useState({ width: 0, height: 0 });
84
+ const [scrollTop, setScrollTop] = useState(0);
85
+ const fullView = useMemo(() => ({ startFrame, endFrame }), [startFrame, endFrame]);
86
+ // ── Controlled / uncontrolled state ──
87
+ const [frameState, setFrame] = useControlledState({
88
+ value: frame,
89
+ defaultValue: defaultFrame,
90
+ onChange: onFrameChange,
91
+ fallback: startFrame,
92
+ });
93
+ const [viewState, setView] = useControlledState({
94
+ value: view,
95
+ defaultValue: defaultView,
96
+ onChange: onViewChange,
97
+ fallback: fullView,
98
+ });
99
+ const [selectionState, setSelection] = useControlledState({
100
+ value: selection,
101
+ defaultValue: defaultSelection,
102
+ onChange: onSelectionChange,
103
+ fallback: [],
104
+ });
105
+ const [modeState] = useControlledState({
106
+ value: mode,
107
+ defaultValue: defaultMode,
108
+ onChange: onModeChange,
109
+ fallback: 'dope-sheet',
110
+ });
111
+ const [playingState, setPlaying] = useControlledState({
112
+ value: playing,
113
+ defaultValue: defaultPlaying,
114
+ onChange: onPlayingChange,
115
+ fallback: false,
116
+ });
117
+ const [loopState, setLoop] = useControlledState({
118
+ value: loop,
119
+ defaultValue: defaultLoop,
120
+ onChange: onLoopChange,
121
+ fallback: false,
122
+ });
123
+ const loopRegion = useMemo(() => resolveLoop(loopState, startFrame, endFrame), [loopState, startFrame, endFrame]);
124
+ // ── Groups (controlled or uncontrolled) ──
125
+ const [internalGroups, setInternalGroups] = useState(groups ?? []);
126
+ const groupsState = groups ?? internalGroups;
127
+ const setGroups = useCallback((next) => {
128
+ if (groups === undefined)
129
+ setInternalGroups(next);
130
+ onGroupsChange?.(next);
131
+ }, [groups, onGroupsChange]);
132
+ // ── Row layout (variable heights: expanded lanes + group headers) ──
133
+ const layout = useMemo(() => computeRows(tracks, {
134
+ trackHeight,
135
+ expandedHeight: expandedTrackHeight,
136
+ groupHeaderHeight,
137
+ globalGraph: modeState === 'graph',
138
+ groups: groupsState,
139
+ }), [
140
+ tracks,
141
+ trackHeight,
142
+ expandedTrackHeight,
143
+ groupHeaderHeight,
144
+ modeState,
145
+ groupsState,
146
+ ]);
147
+ // ── Store ──
148
+ const store = useMemo(() => new TimelineStore(), []);
149
+ const drag = useSyncExternalStore(store.subscribeDrag, store.getDrag);
150
+ const hover = useSyncExternalStore(store.subscribeHover, store.getHover);
151
+ const hoverPlayhead = useSyncExternalStore(store.subscribeHoverPlayhead, store.getHoverPlayhead);
152
+ const hoverLoop = useSyncExternalStore(store.subscribeHoverLoop, store.getHoverLoop);
153
+ useLayoutEffect(() => {
154
+ store.setGeometry({
155
+ view: viewState,
156
+ size,
157
+ trackHeight,
158
+ scrollTop,
159
+ startFrame,
160
+ endFrame,
161
+ fps,
162
+ mode: modeState,
163
+ });
164
+ }, [
165
+ store,
166
+ viewState,
167
+ size,
168
+ trackHeight,
169
+ scrollTop,
170
+ startFrame,
171
+ endFrame,
172
+ fps,
173
+ modeState,
174
+ ]);
175
+ useLayoutEffect(() => {
176
+ store.setPlayhead({ frame: frameState, playing: playingState });
177
+ }, [store, frameState, playingState]);
178
+ useLayoutEffect(() => {
179
+ store.setSelection(selectionState);
180
+ }, [store, selectionState]);
181
+ // ── Seek helpers (snap + clamp) ──
182
+ const applyFrame = useCallback((f) => clamp(snapFrame(f, snap), startFrame, endFrame), [snap, startFrame, endFrame]);
183
+ const seekLive = useCallback((f) => {
184
+ setFrame(applyFrame(f));
185
+ }, [setFrame, applyFrame]);
186
+ // Consumer callbacks live behind refs so the handlers that fire them keep a
187
+ // stable identity even when the parent passes a fresh inline function every
188
+ // render (component-patterns.md rules #3 / #11).
189
+ const onFrameCompleteRef = useLatest(onFrameChangeComplete);
190
+ const seekCommit = useCallback((f) => {
191
+ const v = applyFrame(f);
192
+ setFrame(v);
193
+ onFrameCompleteRef.current?.(v);
194
+ }, [setFrame, applyFrame, onFrameCompleteRef]);
195
+ // ── Playback (optional built-in rAF loop) ──
196
+ const setFrameRaw = useCallback((f) => {
197
+ setFrame(clamp(f, startFrame, endFrame));
198
+ }, [setFrame, startFrame, endFrame]);
199
+ const handlePlaybackEnd = useCallback(() => {
200
+ setPlaying(false);
201
+ }, [setPlaying]);
202
+ useTimelinePlayback({
203
+ playing: playingState,
204
+ frame: frameState,
205
+ fps,
206
+ startFrame,
207
+ endFrame,
208
+ loop: loopState,
209
+ onAdvance: setFrameRaw,
210
+ onEnd: handlePlaybackEnd,
211
+ });
212
+ // ── Follow-playhead during playback ──
213
+ // `smooth` keeps the playhead centred in the view — the view slides
214
+ // continuously once the playhead reaches the centre (one frame per tick,
215
+ // so visually smooth). `paged` waits until the playhead leaves the view
216
+ // and then jumps forward by a full span (After Effects vs Premiere style).
217
+ // `off` leaves the view alone.
218
+ useLayoutEffect(() => {
219
+ if (!playingState)
220
+ return;
221
+ const next = nextFollowView(followMode, viewState, frameState, startFrame, endFrame);
222
+ if (next)
223
+ setView(next);
224
+ }, [
225
+ playingState,
226
+ followMode,
227
+ frameState,
228
+ viewState,
229
+ setView,
230
+ startFrame,
231
+ endFrame,
232
+ ]);
233
+ // ── Track-edit helpers ──
234
+ // Track-change callbacks behind refs (same rationale as `seekCommit`): the
235
+ // gesture hook + header handlers stay stable while the parent may pass fresh
236
+ // inline `onTracksChange` / `onTracksChangeComplete` each render.
237
+ const onTracksChangeRef = useLatest(onTracksChange);
238
+ const onTracksChangeCompleteRef = useLatest(onTracksChangeComplete);
239
+ const setTracksLive = useCallback((t) => {
240
+ onTracksChangeRef.current?.(t);
241
+ }, [onTracksChangeRef]);
242
+ const commitTracks = useCallback((t) => {
243
+ onTracksChangeCompleteRef.current?.(t);
244
+ }, [onTracksChangeCompleteRef]);
245
+ const handleReorderTracks = useCallback((next) => {
246
+ setTracksLive(next);
247
+ commitTracks(next);
248
+ }, [setTracksLive, commitTracks]);
249
+ const handleToggleTrackExpanded = useCallback((trackId) => {
250
+ const next = tracks.map(t => t.id === trackId ? { ...t, expanded: !t.expanded } : t);
251
+ setTracksLive(next);
252
+ commitTracks(next);
253
+ }, [tracks, setTracksLive, commitTracks]);
254
+ const handleToggleGroupCollapsed = useCallback((groupId) => {
255
+ setGroups(groupsState.map(g => g.id === groupId ? { ...g, collapsed: !g.collapsed } : g));
256
+ }, [groupsState, setGroups]);
257
+ // ── View helpers + imperative handle ──
258
+ const rangeSpan = Math.max(1, endFrame - startFrame);
259
+ const clampView = useCallback((v) => {
260
+ const maxSpan = maxFramesVisible ?? rangeSpan;
261
+ const span = Math.min(maxSpan, Math.max(minFramesVisible, v.endFrame - v.startFrame));
262
+ const center = (v.startFrame + v.endFrame) / 2;
263
+ return { startFrame: center - span / 2, endFrame: center + span / 2 };
264
+ }, [minFramesVisible, maxFramesVisible, rangeSpan]);
265
+ const requestZoomToFit = useCallback((paddingFrames) => {
266
+ const p = paddingFrames ?? 0;
267
+ setView(clampView({ startFrame: startFrame - p, endFrame: endFrame + p }));
268
+ }, [setView, clampView, startFrame, endFrame]);
269
+ // Live reads for the imperative `zoomToSelection`, kept in refs so the
270
+ // callback (wired into the store handle below) has a stable identity.
271
+ const selectionRef = useLatest(selectionState);
272
+ const tracksRef = useLatest(tracks);
273
+ const requestZoomToSelection = useCallback(() => {
274
+ const sel = selectionRef.current;
275
+ if (sel.length === 0)
276
+ return;
277
+ // O(|selection|) walk: index tracks once, look up the keyframe per ref.
278
+ const tracksById = new Map(tracksRef.current.map(t => [t.id, t]));
279
+ let min = Infinity;
280
+ let max = -Infinity;
281
+ for (const ref of sel) {
282
+ const track = tracksById.get(ref.trackId);
283
+ if (!track)
284
+ continue;
285
+ const kf = track.keyframes.find(k => k.id === ref.keyframeId);
286
+ if (!kf)
287
+ continue;
288
+ if (kf.x < min)
289
+ min = kf.x;
290
+ if (kf.x > max)
291
+ max = kf.x;
292
+ }
293
+ if (!Number.isFinite(min) || !Number.isFinite(max))
294
+ return;
295
+ const pad = Math.max(1, (max - min) * 0.1);
296
+ setView(clampView({ startFrame: min - pad, endFrame: max + pad }));
297
+ }, [selectionRef, tracksRef, setView, clampView]);
298
+ const requestSetView = useCallback((v) => {
299
+ setView(clampView(v));
300
+ }, [setView, clampView]);
301
+ useLayoutEffect(() => {
302
+ store.configureHandle({
303
+ focus: () => bodyRef.current?.focus(),
304
+ getElement: () => bodyRef.current,
305
+ seek: seekCommit,
306
+ setPlaying,
307
+ setView: requestSetView,
308
+ zoomToFit: requestZoomToFit,
309
+ zoomToSelection: requestZoomToSelection,
310
+ });
311
+ }, [
312
+ store,
313
+ seekCommit,
314
+ setPlaying,
315
+ requestSetView,
316
+ requestZoomToFit,
317
+ requestZoomToSelection,
318
+ ]);
319
+ useImperativeHandle(ref, () => store.handle, [store]);
320
+ // ── Responsive sizing ──
321
+ useResizeObserver(bodyRef, entry => {
322
+ const { width, height: h } = entry.contentRect;
323
+ setSize(prev => prev.width === width && prev.height === h ? prev : { width, height: h });
324
+ });
325
+ // ── Vertical scroll ──
326
+ const rulerHeight = showRuler ? RULER_HEIGHT : 0;
327
+ const loopStripHeight = loopStrip ? LOOP_STRIP_HEIGHT : 0;
328
+ const chromeHeight = rulerHeight + loopStripHeight;
329
+ const maxScrollTop = Math.max(0, layout.contentHeight - (size.height - chromeHeight));
330
+ // Clamp the scroll offset when the scrollable area shrinks (content removed
331
+ // or viewport grown). Adjusting state during render is React's documented
332
+ // alternative to a layout effect here — it avoids an extra commit, and the
333
+ // guard makes it self-terminating.
334
+ if (scrollTop > maxScrollTop) {
335
+ setScrollTop(maxScrollTop);
336
+ }
337
+ const scrollBy = useCallback((deltaPixels) => {
338
+ setScrollTop(s => clamp(s + deltaPixels, 0, maxScrollTop));
339
+ }, [maxScrollTop]);
340
+ // ── Gestures ──
341
+ const { handlers, onWheel } = useTimelineGestures({
342
+ containerRef: bodyRef,
343
+ store,
344
+ view: viewState,
345
+ size,
346
+ tracks,
347
+ selection: selectionState,
348
+ frame: frameState,
349
+ startFrame,
350
+ endFrame,
351
+ trackHeight,
352
+ scrollTop,
353
+ rulerHeight,
354
+ loopStripHeight,
355
+ loopHandles,
356
+ snap,
357
+ editable,
358
+ allowAddKeyframe,
359
+ allowDeleteKeyframe,
360
+ showPlayhead,
361
+ rows: layout.rows,
362
+ trackTops: layout.trackTops,
363
+ expandedHeight: expandedTrackHeight,
364
+ groups: groupsState,
365
+ minFramesVisible,
366
+ maxFramesVisible,
367
+ loopRegion,
368
+ maxScrollTop,
369
+ seekLive,
370
+ seekCommit,
371
+ setSelection,
372
+ setTracks: setTracksLive,
373
+ commitTracks: commitTracks,
374
+ setView,
375
+ setLoop,
376
+ scrollBy,
377
+ setGroups,
378
+ });
379
+ // Native non-passive wheel listener (React onWheel is passive). Attach to
380
+ // both the track body and the left header column so vertical scrolling works
381
+ // when the cursor is over the track names too. `onWheel` is a stable
382
+ // `useCallback` (it reads live state through a ref), so this effect attaches
383
+ // once and never re-subscribes.
384
+ useEffect(() => {
385
+ const body = bodyRef.current;
386
+ const header = headerColumnRef.current;
387
+ body?.addEventListener('wheel', onWheel, { passive: false });
388
+ header?.addEventListener('wheel', onWheel, { passive: false });
389
+ return () => {
390
+ body?.removeEventListener('wheel', onWheel);
391
+ header?.removeEventListener('wheel', onWheel);
392
+ };
393
+ }, [onWheel]);
394
+ // ── Slots + draw ──
395
+ const slots = useMemo(() => categorizeChildren(children), [children]);
396
+ // Prop wins; the deprecated `<Timeline.TrackScale />` slot still works.
397
+ const trackScale = trackScaleProp ?? slots.trackScale ?? undefined;
398
+ useTimelineDraw({
399
+ canvasRef,
400
+ size,
401
+ view: viewState,
402
+ startFrame,
403
+ endFrame,
404
+ fps,
405
+ frame: frameState,
406
+ rows: layout.rows,
407
+ scrollTop,
408
+ rulerHeight,
409
+ loopStripHeight,
410
+ loopHandles,
411
+ showPlayhead,
412
+ selection: selectionState,
413
+ hover,
414
+ hoverPlayhead,
415
+ marquee: drag.marquee,
416
+ loopRegion,
417
+ loopHover: drag.kind === 'none' ? hoverLoop : null,
418
+ ...(backgroundColor !== undefined ? { backgroundColor } : {}),
419
+ ...(playheadColor !== undefined ? { playheadColor } : {}),
420
+ ...(trackScale ? { trackScale } : {}),
421
+ ...(renderOverlay ? { renderOverlay } : {}),
422
+ ...(formatTime ? { formatTime } : {}),
423
+ });
424
+ // ── Layout ──
425
+ // Announce the playhead on discrete moves (keyboard / click), but stay quiet
426
+ // during continuous scrub drags and playback so AT isn't flooded.
427
+ const liveMessage = drag.kind === 'none' && !playingState
428
+ ? `Playhead at frame ${Math.round(frameState)}`
429
+ : '';
430
+ const shellHeight = height !== undefined ? `${height}px` : responsive ? '100%' : '240px';
431
+ return (jsx(TimelineStoreContext.Provider, { value: store, children: jsxs("div", { className: cx(timelineShellStyle, className), "data-testid": testId, id: id, style: { height: shellHeight, ...style }, children: [slots.toolbar, jsxs("div", { className: timelineMainRowStyle, children: [jsx(TimelineTrackHeaders, { ref: headerColumnRef, rows: layout.rows, contentHeight: layout.contentHeight, tracks: tracks, rulerHeight: chromeHeight, scrollTop: scrollTop, width: trackHeaderWidth, selection: selectionState, editable: editable, renderTrackHeader: renderTrackHeader, onReorderTracks: handleReorderTracks, onToggleGroupCollapsed: handleToggleGroupCollapsed, onToggleTrackExpanded: handleToggleTrackExpanded }), jsxs("div", { ref: bodyRef, className: timelineBodyStyle, "data-dragging": drag.kind !== 'none' || undefined, "data-hover-target": drag.kind !== 'none'
432
+ ? undefined
433
+ : hoverPlayhead
434
+ ? 'playhead'
435
+ : hoverLoop === 'start' || hoverLoop === 'end'
436
+ ? 'loop-edge'
437
+ : hoverLoop === 'body'
438
+ ? 'loop-body'
439
+ : undefined, role: "group", "aria-label": ariaLabel, "aria-roledescription": "Timeline",
440
+ // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- focusable interactive canvas surface
441
+ tabIndex: 0, onPointerDown: handlers.onPointerDown, onPointerMove: handlers.onPointerMove, onPointerUp: handlers.onPointerUp, onPointerCancel: handlers.onPointerCancel, onPointerLeave: handlers.onPointerLeave, onDoubleClick: handlers.onDoubleClick, onKeyDown: handlers.onKeyDown, children: [jsx("canvas", { ref: canvasRef, className: timelineCanvasStyle }), jsx("div", { className: timelineOverlayLayerStyle, children: slots.overlay }), jsx("div", { className: ariaLiveRegionStyle, "aria-live": "polite", role: "status", children: liveMessage })] })] }), slots.minimap
442
+ ? React.cloneElement(slots.minimap, {
443
+ setView: requestSetView,
444
+ })
445
+ : null, slots.footer] }) }));
446
+ };
447
+ Timeline.displayName = 'Timeline';
448
+
449
+ export { Timeline };
450
+ //# sourceMappingURL=Timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Timeline.js","sources":["src/components/editor/Timeline/Timeline.tsx"],"sourcesContent":["'use client';\n\nimport React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react';\n\nimport { useControlledState, useLatest, useResizeObserver } from '@/hooks';\nimport { cx } from '@/utils/cx';\n\nimport {\n timelineShellStyle,\n timelineBodyStyle,\n timelineCanvasStyle,\n timelineOverlayLayerStyle,\n timelineMainRowStyle,\n timelineToolbarStyle,\n timelineFooterStyle,\n ariaLiveRegionStyle,\n} from './Timeline.css';\nimport { TIMELINE_SLOT } from './Timeline.types';\nimport { TimelineStoreContext } from './TimelineContext';\nimport {\n clamp,\n nextFollowView,\n resolveLoop,\n snapFrame,\n} from './timelineCoords';\nimport { computeRows } from './timelineLayout';\nimport { TimelineStore } from './TimelineStore';\nimport { TimelineTrackHeaders } from './TimelineTrackHeaders';\nimport { useTimelineDraw } from './useTimelineDraw';\nimport { useTimelineGestures } from './useTimelineGestures';\nimport { useTimelinePlayback } from './useTimelinePlayback';\n\nimport type {\n TimelineGroup,\n TimelineLoop,\n TimelineMinimapProps,\n TimelineMode,\n TimelineProps,\n TimelineSelection,\n TimelineSlotKind,\n TimelineSlotMarker,\n TimelineTrack,\n TimelineTrackScaleProps,\n TimelineView,\n} from './Timeline.types';\nimport type { ViewportSize } from '@/components/primitives/viewport';\n\nconst RULER_HEIGHT = 22;\nconst LOOP_STRIP_HEIGHT = 12;\n\ninterface CategorizedSlots {\n toolbar: React.ReactNode;\n footer: React.ReactNode;\n minimap: React.ReactElement | null;\n /** Deprecated: prefer the `trackScale` prop on `<Timeline>`. */\n trackScale: TimelineTrackScaleProps | null;\n overlay: React.ReactNode[];\n}\n\nfunction getSlotKind(el: React.ReactElement): TimelineSlotKind | null {\n const marker = (el.type as Partial<TimelineSlotMarker>)[TIMELINE_SLOT];\n return marker ?? null;\n}\n\nfunction categorizeChildren(children: React.ReactNode): CategorizedSlots {\n const slots: CategorizedSlots = {\n toolbar: null,\n footer: null,\n minimap: null,\n trackScale: null,\n overlay: [],\n };\n React.Children.forEach(children, child => {\n if (!React.isValidElement(child)) {\n if (child !== null && child !== undefined && child !== false) {\n slots.overlay.push(child);\n }\n return;\n }\n const kind = getSlotKind(child);\n const props = child.props as {\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n };\n if (kind === 'track-scale') {\n slots.trackScale = child.props as TimelineTrackScaleProps;\n return;\n }\n if (kind === 'toolbar') {\n slots.toolbar = (\n <div\n className={cx(timelineToolbarStyle, props.className)}\n style={props.style}\n >\n {props.children}\n </div>\n );\n } else if (kind === 'footer') {\n slots.footer = (\n <div\n className={cx(timelineFooterStyle, props.className)}\n style={props.style}\n >\n {props.children}\n </div>\n );\n } else if (kind === 'minimap') {\n slots.minimap = child;\n } else {\n slots.overlay.push(child);\n }\n });\n return slots;\n}\n\n/**\n * Horizontal multi-track animation timeline / dope sheet. Tracks hold\n * keyframes (the shared `CurveKeyframe` model) along a frame-based time axis;\n * a playhead scrubs across all tracks. Canvas-rendered keyframes with DOM\n * chrome, store-driven via `useSyncExternalStore`.\n *\n * Children read live state via `useTimelineContext()` / `useTimelineGeometry()`\n * / `useTimelinePlayhead()` / `useTimelineSelection()`.\n */\nexport const Timeline = (props: TimelineProps): React.ReactElement => {\n const {\n tracks,\n onTracksChange,\n onTracksChangeComplete,\n startFrame = 0,\n endFrame,\n fps = 30,\n frame,\n defaultFrame,\n onFrameChange,\n onFrameChangeComplete,\n view,\n defaultView,\n onViewChange,\n minFramesVisible = 1,\n maxFramesVisible,\n selection,\n defaultSelection,\n onSelectionChange,\n editable = true,\n allowAddKeyframe = true,\n allowDeleteKeyframe = true,\n snap = true,\n mode,\n defaultMode,\n onModeChange,\n playing,\n defaultPlaying,\n onPlayingChange,\n loop,\n defaultLoop,\n onLoopChange,\n followMode = 'smooth',\n loopStrip = false,\n loopHandles = 'edges',\n groups,\n onGroupsChange,\n trackHeight = 28,\n expandedTrackHeight = 96,\n groupHeaderHeight = 22,\n showRuler = true,\n showPlayhead = true,\n trackHeaderWidth = 160,\n responsive = true,\n height,\n playheadColor,\n backgroundColor,\n trackScale: trackScaleProp,\n renderOverlay,\n renderTrackHeader,\n formatTime,\n ariaLabel = 'Timeline',\n className,\n style,\n testId,\n id,\n children,\n ref,\n } = props;\n\n const bodyRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const headerColumnRef = useRef<HTMLDivElement>(null);\n\n const [size, setSize] = useState<ViewportSize>({ width: 0, height: 0 });\n const [scrollTop, setScrollTop] = useState(0);\n\n const fullView = useMemo<TimelineView>(\n () => ({ startFrame, endFrame }),\n [startFrame, endFrame]\n );\n\n // ── Controlled / uncontrolled state ──\n\n const [frameState, setFrame] = useControlledState<number>({\n value: frame,\n defaultValue: defaultFrame,\n onChange: onFrameChange,\n fallback: startFrame,\n });\n const [viewState, setView] = useControlledState<TimelineView>({\n value: view,\n defaultValue: defaultView,\n onChange: onViewChange,\n fallback: fullView,\n });\n const [selectionState, setSelection] = useControlledState<TimelineSelection>({\n value: selection,\n defaultValue: defaultSelection,\n onChange: onSelectionChange,\n fallback: [],\n });\n const [modeState] = useControlledState<TimelineMode>({\n value: mode,\n defaultValue: defaultMode,\n onChange: onModeChange,\n fallback: 'dope-sheet',\n });\n const [playingState, setPlaying] = useControlledState<boolean>({\n value: playing,\n defaultValue: defaultPlaying,\n onChange: onPlayingChange,\n fallback: false,\n });\n const [loopState, setLoop] = useControlledState<TimelineLoop>({\n value: loop,\n defaultValue: defaultLoop,\n onChange: onLoopChange,\n fallback: false,\n });\n const loopRegion = useMemo(\n () => resolveLoop(loopState, startFrame, endFrame),\n [loopState, startFrame, endFrame]\n );\n\n // ── Groups (controlled or uncontrolled) ──\n\n const [internalGroups, setInternalGroups] = useState<\n ReadonlyArray<TimelineGroup>\n >(groups ?? []);\n const groupsState = groups ?? internalGroups;\n const setGroups = useCallback(\n (next: TimelineGroup[]): void => {\n if (groups === undefined) setInternalGroups(next);\n onGroupsChange?.(next);\n },\n [groups, onGroupsChange]\n );\n\n // ── Row layout (variable heights: expanded lanes + group headers) ──\n\n const layout = useMemo(\n () =>\n computeRows(tracks, {\n trackHeight,\n expandedHeight: expandedTrackHeight,\n groupHeaderHeight,\n globalGraph: modeState === 'graph',\n groups: groupsState,\n }),\n [\n tracks,\n trackHeight,\n expandedTrackHeight,\n groupHeaderHeight,\n modeState,\n groupsState,\n ]\n );\n\n // ── Store ──\n\n const store = useMemo(() => new TimelineStore(), []);\n const drag = useSyncExternalStore(store.subscribeDrag, store.getDrag);\n const hover = useSyncExternalStore(store.subscribeHover, store.getHover);\n const hoverPlayhead = useSyncExternalStore(\n store.subscribeHoverPlayhead,\n store.getHoverPlayhead\n );\n const hoverLoop = useSyncExternalStore(\n store.subscribeHoverLoop,\n store.getHoverLoop\n );\n\n useLayoutEffect(() => {\n store.setGeometry({\n view: viewState,\n size,\n trackHeight,\n scrollTop,\n startFrame,\n endFrame,\n fps,\n mode: modeState,\n });\n }, [\n store,\n viewState,\n size,\n trackHeight,\n scrollTop,\n startFrame,\n endFrame,\n fps,\n modeState,\n ]);\n\n useLayoutEffect(() => {\n store.setPlayhead({ frame: frameState, playing: playingState });\n }, [store, frameState, playingState]);\n\n useLayoutEffect(() => {\n store.setSelection(selectionState);\n }, [store, selectionState]);\n\n // ── Seek helpers (snap + clamp) ──\n\n const applyFrame = useCallback(\n (f: number): number => clamp(snapFrame(f, snap), startFrame, endFrame),\n [snap, startFrame, endFrame]\n );\n const seekLive = useCallback(\n (f: number): void => {\n setFrame(applyFrame(f));\n },\n [setFrame, applyFrame]\n );\n // Consumer callbacks live behind refs so the handlers that fire them keep a\n // stable identity even when the parent passes a fresh inline function every\n // render (component-patterns.md rules #3 / #11).\n const onFrameCompleteRef = useLatest(onFrameChangeComplete);\n const seekCommit = useCallback(\n (f: number): void => {\n const v = applyFrame(f);\n setFrame(v);\n onFrameCompleteRef.current?.(v);\n },\n [setFrame, applyFrame, onFrameCompleteRef]\n );\n\n // ── Playback (optional built-in rAF loop) ──\n\n const setFrameRaw = useCallback(\n (f: number): void => {\n setFrame(clamp(f, startFrame, endFrame));\n },\n [setFrame, startFrame, endFrame]\n );\n const handlePlaybackEnd = useCallback((): void => {\n setPlaying(false);\n }, [setPlaying]);\n useTimelinePlayback({\n playing: playingState,\n frame: frameState,\n fps,\n startFrame,\n endFrame,\n loop: loopState,\n onAdvance: setFrameRaw,\n onEnd: handlePlaybackEnd,\n });\n\n // ── Follow-playhead during playback ──\n // `smooth` keeps the playhead centred in the view — the view slides\n // continuously once the playhead reaches the centre (one frame per tick,\n // so visually smooth). `paged` waits until the playhead leaves the view\n // and then jumps forward by a full span (After Effects vs Premiere style).\n // `off` leaves the view alone.\n useLayoutEffect(() => {\n if (!playingState) return;\n const next = nextFollowView(\n followMode,\n viewState,\n frameState,\n startFrame,\n endFrame\n );\n if (next) setView(next);\n }, [\n playingState,\n followMode,\n frameState,\n viewState,\n setView,\n startFrame,\n endFrame,\n ]);\n\n // ── Track-edit helpers ──\n\n // Track-change callbacks behind refs (same rationale as `seekCommit`): the\n // gesture hook + header handlers stay stable while the parent may pass fresh\n // inline `onTracksChange` / `onTracksChangeComplete` each render.\n const onTracksChangeRef = useLatest(onTracksChange);\n const onTracksChangeCompleteRef = useLatest(onTracksChangeComplete);\n const setTracksLive = useCallback(\n (t: TimelineTrack[]): void => {\n onTracksChangeRef.current?.(t);\n },\n [onTracksChangeRef]\n );\n const commitTracks = useCallback(\n (t: TimelineTrack[]): void => {\n onTracksChangeCompleteRef.current?.(t);\n },\n [onTracksChangeCompleteRef]\n );\n const handleReorderTracks = useCallback(\n (next: TimelineTrack[]): void => {\n setTracksLive(next);\n commitTracks(next);\n },\n [setTracksLive, commitTracks]\n );\n const handleToggleTrackExpanded = useCallback(\n (trackId: string): void => {\n const next = tracks.map(t =>\n t.id === trackId ? { ...t, expanded: !t.expanded } : t\n );\n setTracksLive(next);\n commitTracks(next);\n },\n [tracks, setTracksLive, commitTracks]\n );\n const handleToggleGroupCollapsed = useCallback(\n (groupId: string): void => {\n setGroups(\n groupsState.map(g =>\n g.id === groupId ? { ...g, collapsed: !g.collapsed } : g\n )\n );\n },\n [groupsState, setGroups]\n );\n\n // ── View helpers + imperative handle ──\n\n const rangeSpan = Math.max(1, endFrame - startFrame);\n const clampView = useCallback(\n (v: TimelineView): TimelineView => {\n const maxSpan = maxFramesVisible ?? rangeSpan;\n const span = Math.min(\n maxSpan,\n Math.max(minFramesVisible, v.endFrame - v.startFrame)\n );\n const center = (v.startFrame + v.endFrame) / 2;\n return { startFrame: center - span / 2, endFrame: center + span / 2 };\n },\n [minFramesVisible, maxFramesVisible, rangeSpan]\n );\n\n const requestZoomToFit = useCallback(\n (paddingFrames?: number): void => {\n const p = paddingFrames ?? 0;\n setView(\n clampView({ startFrame: startFrame - p, endFrame: endFrame + p })\n );\n },\n [setView, clampView, startFrame, endFrame]\n );\n\n // Live reads for the imperative `zoomToSelection`, kept in refs so the\n // callback (wired into the store handle below) has a stable identity.\n const selectionRef = useLatest(selectionState);\n const tracksRef = useLatest(tracks);\n const requestZoomToSelection = useCallback((): void => {\n const sel = selectionRef.current;\n if (sel.length === 0) return;\n // O(|selection|) walk: index tracks once, look up the keyframe per ref.\n const tracksById = new Map(tracksRef.current.map(t => [t.id, t]));\n let min = Infinity;\n let max = -Infinity;\n for (const ref of sel) {\n const track = tracksById.get(ref.trackId);\n if (!track) continue;\n const kf = track.keyframes.find(k => k.id === ref.keyframeId);\n if (!kf) continue;\n if (kf.x < min) min = kf.x;\n if (kf.x > max) max = kf.x;\n }\n if (!Number.isFinite(min) || !Number.isFinite(max)) return;\n const pad = Math.max(1, (max - min) * 0.1);\n setView(clampView({ startFrame: min - pad, endFrame: max + pad }));\n }, [selectionRef, tracksRef, setView, clampView]);\n\n const requestSetView = useCallback(\n (v: TimelineView): void => {\n setView(clampView(v));\n },\n [setView, clampView]\n );\n\n useLayoutEffect(() => {\n store.configureHandle({\n focus: () => bodyRef.current?.focus(),\n getElement: () => bodyRef.current,\n seek: seekCommit,\n setPlaying,\n setView: requestSetView,\n zoomToFit: requestZoomToFit,\n zoomToSelection: requestZoomToSelection,\n });\n }, [\n store,\n seekCommit,\n setPlaying,\n requestSetView,\n requestZoomToFit,\n requestZoomToSelection,\n ]);\n\n useImperativeHandle(ref, () => store.handle, [store]);\n\n // ── Responsive sizing ──\n\n useResizeObserver(bodyRef, entry => {\n const { width, height: h } = entry.contentRect;\n setSize(prev =>\n prev.width === width && prev.height === h ? prev : { width, height: h }\n );\n });\n\n // ── Vertical scroll ──\n\n const rulerHeight = showRuler ? RULER_HEIGHT : 0;\n const loopStripHeight = loopStrip ? LOOP_STRIP_HEIGHT : 0;\n const chromeHeight = rulerHeight + loopStripHeight;\n const maxScrollTop = Math.max(\n 0,\n layout.contentHeight - (size.height - chromeHeight)\n );\n\n // Clamp the scroll offset when the scrollable area shrinks (content removed\n // or viewport grown). Adjusting state during render is React's documented\n // alternative to a layout effect here — it avoids an extra commit, and the\n // guard makes it self-terminating.\n if (scrollTop > maxScrollTop) {\n setScrollTop(maxScrollTop);\n }\n\n const scrollBy = useCallback(\n (deltaPixels: number): void => {\n setScrollTop(s => clamp(s + deltaPixels, 0, maxScrollTop));\n },\n [maxScrollTop]\n );\n\n // ── Gestures ──\n\n const { handlers, onWheel } = useTimelineGestures({\n containerRef: bodyRef,\n store,\n view: viewState,\n size,\n tracks,\n selection: selectionState,\n frame: frameState,\n startFrame,\n endFrame,\n trackHeight,\n scrollTop,\n rulerHeight,\n loopStripHeight,\n loopHandles,\n snap,\n editable,\n allowAddKeyframe,\n allowDeleteKeyframe,\n showPlayhead,\n rows: layout.rows,\n trackTops: layout.trackTops,\n expandedHeight: expandedTrackHeight,\n groups: groupsState,\n minFramesVisible,\n maxFramesVisible,\n loopRegion,\n maxScrollTop,\n seekLive,\n seekCommit,\n setSelection,\n setTracks: setTracksLive,\n commitTracks: commitTracks,\n setView,\n setLoop,\n scrollBy,\n setGroups,\n });\n\n // Native non-passive wheel listener (React onWheel is passive). Attach to\n // both the track body and the left header column so vertical scrolling works\n // when the cursor is over the track names too. `onWheel` is a stable\n // `useCallback` (it reads live state through a ref), so this effect attaches\n // once and never re-subscribes.\n useEffect(() => {\n const body = bodyRef.current;\n const header = headerColumnRef.current;\n body?.addEventListener('wheel', onWheel, { passive: false });\n header?.addEventListener('wheel', onWheel, { passive: false });\n return () => {\n body?.removeEventListener('wheel', onWheel);\n header?.removeEventListener('wheel', onWheel);\n };\n }, [onWheel]);\n\n // ── Slots + draw ──\n\n const slots = useMemo(() => categorizeChildren(children), [children]);\n // Prop wins; the deprecated `<Timeline.TrackScale />` slot still works.\n const trackScale = trackScaleProp ?? slots.trackScale ?? undefined;\n\n useTimelineDraw({\n canvasRef,\n size,\n view: viewState,\n startFrame,\n endFrame,\n fps,\n frame: frameState,\n rows: layout.rows,\n scrollTop,\n rulerHeight,\n loopStripHeight,\n loopHandles,\n showPlayhead,\n selection: selectionState,\n hover,\n hoverPlayhead,\n marquee: drag.marquee,\n loopRegion,\n loopHover: drag.kind === 'none' ? hoverLoop : null,\n ...(backgroundColor !== undefined ? { backgroundColor } : {}),\n ...(playheadColor !== undefined ? { playheadColor } : {}),\n ...(trackScale ? { trackScale } : {}),\n ...(renderOverlay ? { renderOverlay } : {}),\n ...(formatTime ? { formatTime } : {}),\n });\n\n // ── Layout ──\n\n // Announce the playhead on discrete moves (keyboard / click), but stay quiet\n // during continuous scrub drags and playback so AT isn't flooded.\n const liveMessage =\n drag.kind === 'none' && !playingState\n ? `Playhead at frame ${Math.round(frameState)}`\n : '';\n\n const shellHeight =\n height !== undefined ? `${height}px` : responsive ? '100%' : '240px';\n\n return (\n <TimelineStoreContext.Provider value={store}>\n <div\n className={cx(timelineShellStyle, className)}\n data-testid={testId}\n id={id}\n style={{ height: shellHeight, ...style }}\n >\n {slots.toolbar}\n <div className={timelineMainRowStyle}>\n <TimelineTrackHeaders\n ref={headerColumnRef}\n rows={layout.rows}\n contentHeight={layout.contentHeight}\n tracks={tracks}\n rulerHeight={chromeHeight}\n scrollTop={scrollTop}\n width={trackHeaderWidth}\n selection={selectionState}\n editable={editable}\n renderTrackHeader={renderTrackHeader}\n onReorderTracks={handleReorderTracks}\n onToggleGroupCollapsed={handleToggleGroupCollapsed}\n onToggleTrackExpanded={handleToggleTrackExpanded}\n />\n {/* The timeline body is a labelled group that doubles as an\n interactive canvas surface (focusable, with pointer + key\n handlers driving the gesture model). */}\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions */}\n <div\n ref={bodyRef}\n className={timelineBodyStyle}\n data-dragging={drag.kind !== 'none' || undefined}\n data-hover-target={\n drag.kind !== 'none'\n ? undefined\n : hoverPlayhead\n ? 'playhead'\n : hoverLoop === 'start' || hoverLoop === 'end'\n ? 'loop-edge'\n : hoverLoop === 'body'\n ? 'loop-body'\n : undefined\n }\n role=\"group\"\n aria-label={ariaLabel}\n aria-roledescription=\"Timeline\"\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- focusable interactive canvas surface\n tabIndex={0}\n onPointerDown={handlers.onPointerDown}\n onPointerMove={handlers.onPointerMove}\n onPointerUp={handlers.onPointerUp}\n onPointerCancel={handlers.onPointerCancel}\n onPointerLeave={handlers.onPointerLeave}\n onDoubleClick={handlers.onDoubleClick}\n onKeyDown={handlers.onKeyDown}\n >\n <canvas ref={canvasRef} className={timelineCanvasStyle} />\n <div className={timelineOverlayLayerStyle}>{slots.overlay}</div>\n <div\n className={ariaLiveRegionStyle}\n aria-live=\"polite\"\n role=\"status\"\n >\n {liveMessage}\n </div>\n </div>\n </div>\n {slots.minimap\n ? React.cloneElement(slots.minimap, {\n setView: requestSetView,\n } as Partial<TimelineMinimapProps>)\n : null}\n {slots.footer}\n </div>\n </TimelineStoreContext.Provider>\n );\n};\n\nTimeline.displayName = 'Timeline';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAwDA;AACA;AAWA;;;AAGA;AAEA;AACE;AACE;AACA;AACA;AACA;AACA;;;;AAIE;AACE;;;;AAIJ;AACA;AAKA;AACE;;;AAGF;;;AASO;;;AASA;AACL;;;AAEA;;AAEJ;AACA;AACF;AAEA;;;;;;;;AAQG;AACI;AACL;AA4DA;AACA;AACA;AAEA;;;;AAUA;AACE;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACA;AACD;AACD;AACE;AACA;AACA;AACA;AACD;;;AAQD;AAGA;AACA;;;AAGI;AACF;;;;AAUI;;;AAGA;AACD;;;;;;;AAQF;;AAKH;AACA;AACA;AACA;AAIA;;;AAOI;;;;;;;AAOA;AACD;AACH;;;;;;;;;;AAUC;;AAGC;;;AAIA;AACF;;AAIA;AAIA;AAEI;AACF;;;;AAMF;AACA;AAEI;;AAEA;;;AAOJ;;;AAMA;;AAEA;AACA;AACE;AACA;;;;AAIA;AACA;AACA;AACD;;;;;;;;AASC;;AACA;AAOA;;AACF;;;;;;;;AAQC;;;;;AAOD;AACA;AACA;AAEI;AACF;AAGF;AAEI;AACF;AAGF;;;AAIE;AAGF;AAEI;;;;AAQJ;AAEI;AAKF;;AAMF;AACA;AAEI;;AAKA;AACA;;AAKJ;AAEI;AACA;;;;AASJ;AACA;AACA;AACE;AACA;;;;;AAIA;AACA;;AAEE;;;AAEA;;AACA;AAAgB;AAChB;AAAgB;;AAElB;;AACA;AACA;;AAGF;AAEI;AACF;;;;AAOE;AACA;;AAEA;AACA;AACA;AACD;AACH;;;;;;;AAOC;AAED;;AAIA;;AAEE;AAGF;;;;AAMA;;;;;;AAUA;;;AAIA;AAEI;AACF;;AAMF;AACE;;AAEA;;;AAGA;AACA;;;;;;;;;;;;;;;AAeA;AACA;;;;;;;;AAQA;AACA;;;;;AAKD;;;;;;;AAQC;AACA;AACA;AACA;AACA;AACE;AACA;AACF;AACF;;AAIA;;;AAIA;;;AAGE;;;;AAIA;;;;;;;AAOA;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACD;;;;;;;;AAcD;AAmCc;AACA;AACE;AACA;AACE;;AAEE;;;AAOV;;AAsBE;;;AAOd;AAEA;;"}
@@ -0,0 +1,10 @@
1
+ // ─── Slot markers ───
2
+ /**
3
+ * Symbol attached to `Timeline.Toolbar` / `.Footer` so the parent
4
+ * `<Timeline>` can identify slot children without relying on `displayName`
5
+ * (clobbered by `React.memo` / Vanilla Extract recipes).
6
+ */
7
+ const TIMELINE_SLOT = Symbol.for('etui.timeline.slot');
8
+
9
+ export { TIMELINE_SLOT };
10
+ //# sourceMappingURL=Timeline.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Timeline.types.js","sources":["src/components/editor/Timeline/Timeline.types.ts"],"sourcesContent":["import type { ViewportSize } from '@/components/primitives/viewport';\nimport type { BaseComponent } from '@/types/common';\nimport type { CurveData, CurveKeyframe } from '@/types/keyframe';\nimport type { Prettify } from '@/types/utilities';\nimport type React from 'react';\n\n// ─── Core model ───\n\n/** Dope sheet (keyframe timing) or graph editor (value curves). */\nexport type TimelineMode = 'dope-sheet' | 'graph';\n\n/** Pre/post-infinity behaviour, reused from the shared curve model. */\nexport type TimelineInfinity = {\n pre?: CurveData['preInfinity'];\n post?: CurveData['postInfinity'];\n};\n\n/**\n * One animated property. Keyframes use the shared `CurveKeyframe` model\n * (`x` = frame, `y` = value); graph mode assembles a `CurveData` per track\n * from `{ keyframes, domainX: [startFrame, endFrame], domainY: valueRange }`.\n */\nexport interface TimelineTrack {\n id: string;\n /** Display label in the header column. */\n label?: string;\n /** Keyframe / lane accent color (theme accent fallback). */\n color?: string;\n /** Keyframes — `x` is a frame, `y` is the value at that frame. */\n keyframes: CurveKeyframe[];\n /** Value range (graph-mode domainY). Auto-fit from keyframes when omitted. */\n valueRange?: [number, number];\n /** Pre/post-infinity behaviour for graph mode. */\n infinity?: TimelineInfinity;\n /** Visible but not editable. */\n locked?: boolean;\n /** Collapsed / not drawn. */\n hidden?: boolean;\n /** Expand this track into a graph (curve) lane regardless of the global mode. */\n expanded?: boolean;\n /** Group this track belongs to (matches a `TimelineGroup.id`). */\n groupId?: string;\n /** Row-height override (CSS px). */\n height?: number;\n}\n\n/** A collapsible group of tracks (matched by `TimelineTrack.groupId`). */\nexport interface TimelineGroup {\n id: string;\n label?: string;\n color?: string;\n collapsed?: boolean;\n}\n\n/** A reference to one keyframe on one track. */\nexport interface TimelineKeyframeRef {\n trackId: string;\n keyframeId: string;\n}\n\n/** Current keyframe selection, flat across tracks. */\nexport type TimelineSelection = ReadonlyArray<TimelineKeyframeRef>;\n\n/** The visible frame window (zoom/pan over time). */\nexport interface TimelineView {\n startFrame: number;\n endFrame: number;\n}\n\n/** A loop sub-range, or `true` for the whole timeline range. */\nexport type TimelineLoop = boolean | { startFrame: number; endFrame: number };\n\n// ─── Render info ───\n\n/**\n * Helpers + current state passed to `renderOverlay`. Exposes the same\n * frame ↔ pixel math the built-in drawing uses, so consumer drawing stays\n * aligned with everything else.\n */\nexport interface TimelineDrawInfo {\n /** Track-area size in CSS pixels (canvas already DPR-scaled). */\n size: ViewportSize;\n /** Visible frame window. */\n view: TimelineView;\n /** Global frame range. */\n startFrame: number;\n endFrame: number;\n /** Frames per second. */\n fps: number;\n /** Current playhead frame. */\n frame: number;\n /** Map a frame to a track-area CSS-pixel X. */\n frameToX: (frame: number) => number;\n /** Inverse of `frameToX`. */\n xToFrame: (x: number) => number;\n}\n\n/** State passed to the `renderTrackHeader` render prop. */\nexport interface TimelineTrackHeaderInfo {\n /** Row index of the track. */\n index: number;\n /** Whether any of this track's keyframes are currently selected. */\n hasSelection: boolean;\n}\n\n// ─── Slot markers ───\n\n/**\n * Symbol attached to `Timeline.Toolbar` / `.Footer` so the parent\n * `<Timeline>` can identify slot children without relying on `displayName`\n * (clobbered by `React.memo` / Vanilla Extract recipes).\n */\nexport const TIMELINE_SLOT: unique symbol = Symbol.for('etui.timeline.slot');\n\nexport type TimelineSlotKind = 'toolbar' | 'footer' | 'minimap' | 'track-scale';\n\nexport interface TimelineSlotMarker {\n [TIMELINE_SLOT]: TimelineSlotKind;\n}\n\n// ─── Imperative handle ───\n\n/**\n * Imperative handle exposed via `ref` on `<Timeline>`. Stable for the\n * lifetime of the component.\n */\nexport interface TimelineHandle {\n /** Focus the timeline body so keyboard navigation starts working. */\n focus(): void;\n /** Access the underlying body DOM element. */\n getElement(): HTMLDivElement | null;\n /** Move the playhead to a frame (snapped + clamped). */\n seek(frame: number): void;\n /** Start playback. */\n play(): void;\n /** Pause playback. */\n pause(): void;\n /** Toggle playback. */\n toggle(): void;\n /** Current playhead frame. */\n getFrame(): number;\n /** Fit the view to the whole frame range, with optional padding (frames). */\n zoomToFit(paddingFrames?: number): void;\n /** Fit the view to the current selection. No-op when nothing is selected. */\n zoomToSelection(): void;\n /** Current visible frame window. */\n getView(): TimelineView;\n /** Set the visible frame window (clamped to bounds + minFramesVisible). */\n setView(view: TimelineView): void;\n /** Map a frame to a track-area CSS-pixel X. */\n frameToX(frame: number): number;\n /** Inverse of `frameToX`. */\n xToFrame(x: number): number;\n}\n\n// ─── Props ───\n\nexport interface TimelineBaseProps extends Omit<\n BaseComponent,\n 'onChange' | 'ref'\n> {\n /** Tracks rendered top-to-bottom. */\n tracks: ReadonlyArray<TimelineTrack>;\n /** Fires continuously during keyframe drag. */\n onTracksChange?: (tracks: TimelineTrack[]) => void;\n /** Fires once on commit (drag end, add, delete) — use for undo integration. */\n onTracksChangeComplete?: (tracks: TimelineTrack[]) => void;\n\n /** First frame of the global range. @default 0 */\n startFrame?: number;\n /** Last frame of the global range (the duration). */\n endFrame: number;\n /** Frames per second — drives timecode display + the snap grid. @default 30 */\n fps?: number;\n\n /** Playhead frame (controlled). */\n frame?: number;\n /** Initial playhead frame (uncontrolled). @default startFrame */\n defaultFrame?: number;\n /** Fires continuously while scrubbing. */\n onFrameChange?: (frame: number) => void;\n /** Fires once on scrub end. */\n onFrameChangeComplete?: (frame: number) => void;\n\n /** Visible frame window (controlled). */\n view?: TimelineView;\n /** Initial visible frame window (uncontrolled). @default whole range */\n defaultView?: TimelineView;\n /** Fires when the view zooms/pans. */\n onViewChange?: (view: TimelineView) => void;\n /** Minimum frames visible (max zoom-in). @default 1 */\n minFramesVisible?: number;\n /** Maximum frames visible (max zoom-out). @default range span */\n maxFramesVisible?: number;\n\n /** Keyframe selection (controlled). */\n selection?: TimelineSelection;\n /** Initial selection (uncontrolled). @default [] */\n defaultSelection?: TimelineSelection;\n /** Fires when the selection changes. */\n onSelectionChange?: (selection: TimelineSelection) => void;\n\n /** Master editing switch. @default true */\n editable?: boolean;\n /** Allow double-click to add keyframes. @default true */\n allowAddKeyframe?: boolean;\n /** Allow Delete/Backspace to remove keyframes. @default true */\n allowDeleteKeyframe?: boolean;\n /** Snap-to-frame: `true` = 1 frame, number = N-frame grid, `false` = off. @default true */\n snap?: boolean | number;\n\n /** Editor mode (controlled). */\n mode?: TimelineMode;\n /** Initial mode (uncontrolled). @default 'dope-sheet' */\n defaultMode?: TimelineMode;\n /** Fires when the mode toggles. */\n onModeChange?: (mode: TimelineMode) => void;\n\n /** Playback running (controlled). */\n playing?: boolean;\n /** Initial playback state (uncontrolled). @default false */\n defaultPlaying?: boolean;\n /** Fires when playback starts/stops. */\n onPlayingChange?: (playing: boolean) => void;\n /** Loop the whole range (`true`) or a sub-range (controlled). @default false */\n loop?: TimelineLoop;\n /** Initial loop (uncontrolled). */\n defaultLoop?: TimelineLoop;\n /** Fires when the loop region is dragged on the ruler. */\n onLoopChange?: (loop: TimelineLoop) => void;\n /**\n * How the view tracks the playhead during playback.\n * - `'smooth'` — keep the playhead centred in the view; the view slides\n * continuously once the playhead reaches the centre.\n * - `'paged'` — leave the view still until the playhead leaves it, then\n * jump forward by one full view span.\n * - `'off'` — never auto-scroll; user manages the view.\n * @default 'smooth'\n */\n followMode?: 'smooth' | 'paged' | 'off';\n\n /**\n * Adds a thin dedicated **loop strip** directly under the time ruler. A\n * plain drag on the strip creates / re-draws the loop region (no Alt\n * needed); the strip also makes loop edges easier to grab. The main ruler\n * keeps its scrub behaviour. @default false\n */\n loopStrip?: boolean;\n\n /**\n * Visual style for the loop region's edge markers.\n * - `'edges'` — full-height vertical bars on each loop edge (default).\n * - `'brackets'` — `[ ]` bracket markers in the chrome (ruler / loop\n * strip) with serifs at the top and bottom, no full-height bars. Bigger\n * pick targets, less visual noise across the track area.\n * @default 'edges'\n */\n loopHandles?: 'edges' | 'brackets';\n\n /** Track groups (collapsible). Tracks join a group via `groupId`. */\n groups?: ReadonlyArray<TimelineGroup>;\n /** Fires when a group is collapsed / expanded via its header. */\n onGroupsChange?: (groups: TimelineGroup[]) => void;\n\n /** Default row height in CSS px. @default 28 */\n trackHeight?: number;\n /** Row height for a graph-expanded track in CSS px. @default 96 */\n expandedTrackHeight?: number;\n /** Group header row height in CSS px. @default 22 */\n groupHeaderHeight?: number;\n /** Show the time ruler. @default true */\n showRuler?: boolean;\n /** Show the playhead. @default true */\n showPlayhead?: boolean;\n /** Width of the left track-header column in CSS px. @default 160 */\n trackHeaderWidth?: number;\n /** Fill the parent container (ResizeObserver). @default true */\n responsive?: boolean;\n /** Fixed height in CSS px (ignored when `responsive`). */\n height?: number;\n\n /** Playhead line color. Defaults to theme accent. */\n playheadColor?: string;\n /** Background color. Defaults to theme `--etui-color-bg-secondary`. */\n backgroundColor?: string;\n\n /**\n * Per-track value scale on graph / expanded-track lanes (axis line + min/max\n * labels, optional midpoint + gridlines). Omit to hide the scale entirely.\n */\n trackScale?: TimelineTrackScaleProps;\n\n /** Custom canvas pass, drawn after built-in content, before the playhead. */\n renderOverlay?: (\n ctx: CanvasRenderingContext2D,\n info: TimelineDrawInfo\n ) => void;\n /** Custom track-header renderer. Falls back to a built-in header. */\n renderTrackHeader?: (\n track: TimelineTrack,\n info: TimelineTrackHeaderInfo\n ) => React.ReactNode;\n /** Ruler label formatter. Defaults to `HH:MM:SS:FF` timecode. */\n formatTime?: (frame: number, fps: number) => string;\n\n /** @default 'Timeline' */\n ariaLabel?: string;\n\n /**\n * Slot children: `<Timeline.Toolbar>`, `<Timeline.Footer>`. Unrecognised\n * children render as a free-form overlay layer.\n */\n children?: React.ReactNode;\n\n /** Imperative handle. */\n ref?: React.Ref<TimelineHandle>;\n}\n\nexport type TimelineProps = Prettify<TimelineBaseProps>;\n\n// ─── Subcomponent props ───\n\nexport interface TimelineToolbarProps {\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport interface TimelineFooterProps {\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport interface TimelineTrackScaleProps {\n /**\n * Which side of the lane the scale axis is drawn on.\n * @default 'start'\n */\n position?: 'start' | 'end';\n /**\n * Custom value formatter. Receives the raw value and returns the label.\n * @default `(v) => Number(v.toFixed(2)).toString()`\n */\n format?: (value: number) => string;\n /**\n * Draw a tick + label at the midpoint of the range too. @default false\n */\n showMidpoint?: boolean;\n /**\n * Draw thin horizontal gridlines across the whole lane width at each tick\n * (`min` / `max`, plus midpoint when `showMidpoint` is on). @default false\n */\n gridlines?: boolean;\n /**\n * Lanes shorter than this (CSS px) skip the scale, so the labels never\n * overlap into an unreadable blob on a short / collapsed graph lane.\n * @default 48\n */\n minLaneHeight?: number;\n /**\n * Override the axis / label color. Defaults to the muted text colour.\n */\n color?: string;\n}\n\nexport interface TimelineMinimapProps {\n /**\n * Tracks to summarize as keyframe markers in the minimap.\n * Pass the same array you pass to `<Timeline tracks={...} />`.\n */\n tracks: ReadonlyArray<TimelineTrack>;\n /** Strip height in CSS px. @default 40 */\n height?: number;\n /** Override the keyframe marker color. */\n markerColor?: string;\n /** Override the viewport rectangle color. */\n viewportColor?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ─── Context value ───\n\n/**\n * Live state available to children of a `<Timeline>` via\n * `useTimelineContext()`. Prefer the per-slice hooks for perf-conscious\n * consumers — each subscribes to a single slice.\n */\nexport interface TimelineContextValue {\n view: TimelineView;\n size: ViewportSize;\n startFrame: number;\n endFrame: number;\n fps: number;\n frame: number;\n playing: boolean;\n mode: TimelineMode;\n selection: TimelineSelection;\n frameToX: (frame: number) => number;\n xToFrame: (x: number) => number;\n}\n"],"names":[],"mappings":"AAyGA;AAEA;;;;AAIG;AACI,MAAM,aAAa,GAAkB,MAAM,CAAC,GAAG,CAAC,oBAAoB;;;;"}
@@ -0,0 +1,69 @@
1
+ "use client";
2
+ import { createContext, useSyncExternalStore, useContext, useMemo, useCallback } from 'react';
3
+ import { selectedTangentMode, setSelectedTangentMode } from './timelineEdits.js';
4
+
5
+ const TimelineStoreContext = createContext(null);
6
+ function useTimelineStoreInternal() {
7
+ const store = useContext(TimelineStoreContext);
8
+ if (!store) {
9
+ throw new Error('useTimeline* hooks must be called inside a <Timeline> component');
10
+ }
11
+ return store;
12
+ }
13
+ /**
14
+ * Subscribe to **all** Timeline state. Convenient catch-all but re-renders on
15
+ * every store mutation. For perf-sensitive consumers, prefer the slice hooks
16
+ * (`useTimelineGeometry`, `useTimelinePlayhead`, `useTimelineSelection`).
17
+ */
18
+ function useTimelineContext() {
19
+ const store = useTimelineStoreInternal();
20
+ return useSyncExternalStore(store.subscribe, store.getSnapshot);
21
+ }
22
+ /** Subscribe to the geometry slice (view / sizes / range / mode). */
23
+ function useTimelineGeometry() {
24
+ const store = useTimelineStoreInternal();
25
+ return useSyncExternalStore(store.subscribeGeometry, store.getGeometry);
26
+ }
27
+ /** Subscribe to the playhead slice (frame / playing). */
28
+ function useTimelinePlayhead() {
29
+ const store = useTimelineStoreInternal();
30
+ return useSyncExternalStore(store.subscribePlayhead, store.getPlayhead);
31
+ }
32
+ /** Subscribe to the selection slice. */
33
+ function useTimelineSelection() {
34
+ const store = useTimelineStoreInternal();
35
+ return useSyncExternalStore(store.subscribeSelection, store.getSelection);
36
+ }
37
+ /**
38
+ * Convenience hook for building a tangent-mode toggle UI (the six modes:
39
+ * `auto` / `linear` / `step` / `aligned` / `mirrored` / `free`). Reads the
40
+ * current selection from the Timeline store, exposes the unified mode (or
41
+ * `'mixed'`), and applies a chosen mode to every selected keyframe via the
42
+ * caller's `onTracksChange`.
43
+ *
44
+ * @example
45
+ * ```tsx
46
+ * function TangentBar({ tracks, onTracksChange }) {
47
+ * const t = useTimelineSelectedTangentMode(tracks, onTracksChange);
48
+ * if (t.current === null) return null;
49
+ * return (
50
+ * <>
51
+ * <button onClick={() => t.set('auto')} aria-pressed={t.current === 'auto'}>auto</button>
52
+ * <button onClick={() => t.set('aligned')} aria-pressed={t.current === 'aligned'}>aligned</button>
53
+ * …
54
+ * </>
55
+ * );
56
+ * }
57
+ * ```
58
+ */
59
+ function useTimelineSelectedTangentMode(tracks, onTracksChange) {
60
+ const selection = useTimelineSelection();
61
+ const current = useMemo(() => selectedTangentMode(tracks, selection), [tracks, selection]);
62
+ const set = useCallback((mode) => {
63
+ onTracksChange(setSelectedTangentMode(tracks, selection, mode));
64
+ }, [tracks, selection, onTracksChange]);
65
+ return { current, set };
66
+ }
67
+
68
+ export { TimelineStoreContext, useTimelineContext, useTimelineGeometry, useTimelinePlayhead, useTimelineSelectedTangentMode, useTimelineSelection };
69
+ //# sourceMappingURL=TimelineContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimelineContext.js","sources":["src/components/editor/Timeline/TimelineContext.ts"],"sourcesContent":["'use client';\n\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useSyncExternalStore,\n} from 'react';\n\nimport { selectedTangentMode, setSelectedTangentMode } from './timelineEdits';\n\nimport type {\n TimelineContextValue,\n TimelineSelection,\n TimelineTrack,\n} from './Timeline.types';\nimport type {\n TimelineGeometryState,\n TimelinePlayheadState,\n TimelineStore,\n} from './TimelineStore';\nimport type { TangentMode } from '@/types/keyframe';\n\nexport const TimelineStoreContext = createContext<TimelineStore | null>(null);\n\nfunction useTimelineStoreInternal(): TimelineStore {\n const store = useContext(TimelineStoreContext);\n if (!store) {\n throw new Error(\n 'useTimeline* hooks must be called inside a <Timeline> component'\n );\n }\n return store;\n}\n\n/**\n * Subscribe to **all** Timeline state. Convenient catch-all but re-renders on\n * every store mutation. For perf-sensitive consumers, prefer the slice hooks\n * (`useTimelineGeometry`, `useTimelinePlayhead`, `useTimelineSelection`).\n */\nexport function useTimelineContext(): TimelineContextValue {\n const store = useTimelineStoreInternal();\n return useSyncExternalStore(store.subscribe, store.getSnapshot);\n}\n\n/** Subscribe to the geometry slice (view / sizes / range / mode). */\nexport function useTimelineGeometry(): TimelineGeometryState {\n const store = useTimelineStoreInternal();\n return useSyncExternalStore(store.subscribeGeometry, store.getGeometry);\n}\n\n/** Subscribe to the playhead slice (frame / playing). */\nexport function useTimelinePlayhead(): TimelinePlayheadState {\n const store = useTimelineStoreInternal();\n return useSyncExternalStore(store.subscribePlayhead, store.getPlayhead);\n}\n\n/** Subscribe to the selection slice. */\nexport function useTimelineSelection(): TimelineSelection {\n const store = useTimelineStoreInternal();\n return useSyncExternalStore(store.subscribeSelection, store.getSelection);\n}\n\nexport interface TimelineSelectedTangentMode {\n /**\n * The tangent mode shared by all selected keyframes; `'mixed'` if they\n * disagree; `null` when nothing applicable is selected.\n */\n current: TangentMode | 'mixed' | null;\n /** Apply a tangent mode to every selected keyframe. */\n set: (mode: TangentMode) => void;\n}\n\n/**\n * Convenience hook for building a tangent-mode toggle UI (the six modes:\n * `auto` / `linear` / `step` / `aligned` / `mirrored` / `free`). Reads the\n * current selection from the Timeline store, exposes the unified mode (or\n * `'mixed'`), and applies a chosen mode to every selected keyframe via the\n * caller's `onTracksChange`.\n *\n * @example\n * ```tsx\n * function TangentBar({ tracks, onTracksChange }) {\n * const t = useTimelineSelectedTangentMode(tracks, onTracksChange);\n * if (t.current === null) return null;\n * return (\n * <>\n * <button onClick={() => t.set('auto')} aria-pressed={t.current === 'auto'}>auto</button>\n * <button onClick={() => t.set('aligned')} aria-pressed={t.current === 'aligned'}>aligned</button>\n * …\n * </>\n * );\n * }\n * ```\n */\nexport function useTimelineSelectedTangentMode(\n tracks: ReadonlyArray<TimelineTrack>,\n onTracksChange: (next: TimelineTrack[]) => void\n): TimelineSelectedTangentMode {\n const selection = useTimelineSelection();\n const current = useMemo(\n () => selectedTangentMode(tracks, selection),\n [tracks, selection]\n );\n const set = useCallback(\n (mode: TangentMode): void => {\n onTracksChange(setSelectedTangentMode(tracks, selection, mode));\n },\n [tracks, selection, onTracksChange]\n );\n return { current, set };\n}\n"],"names":[],"mappings":";;;;;AA0BA;AACE;;AAEE;;AAIF;AACF;AAEA;;;;AAIG;;AAED;;AAEF;AAEA;;AAEE;;AAEF;AAEA;;AAEE;;AAEF;AAEA;;AAEE;;AAEF;AAYA;;;;;;;;;;;;;;;;;;;;;AAqBG;AACG;AAIJ;;AAKA;;;AAMA;AACF;;"}
@@ -0,0 +1,16 @@
1
+ import { TIMELINE_SLOT } from './Timeline.types.js';
2
+
3
+ /**
4
+ * Footer strip rendered below the timeline body (status bar — selected
5
+ * keyframe info, current frame / timecode). Picked out of `<Timeline>`
6
+ * children by the `TIMELINE_SLOT` symbol — its position in the child tree
7
+ * does not affect placement.
8
+ */
9
+ const TimelineFooterImpl = () => null;
10
+ const TimelineFooter = Object.assign(TimelineFooterImpl, {
11
+ displayName: 'Timeline.Footer',
12
+ [TIMELINE_SLOT]: 'footer',
13
+ });
14
+
15
+ export { TimelineFooter };
16
+ //# sourceMappingURL=TimelineFooter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimelineFooter.js","sources":["src/components/editor/Timeline/TimelineFooter.tsx"],"sourcesContent":["import { TIMELINE_SLOT } from './Timeline.types';\n\nimport type { TimelineFooterProps } from './Timeline.types';\n\n/**\n * Footer strip rendered below the timeline body (status bar — selected\n * keyframe info, current frame / timecode). Picked out of `<Timeline>`\n * children by the `TIMELINE_SLOT` symbol — its position in the child tree\n * does not affect placement.\n */\nconst TimelineFooterImpl: (props: TimelineFooterProps) => null = () => null;\n\nexport const TimelineFooter = Object.assign(TimelineFooterImpl, {\n displayName: 'Timeline.Footer',\n [TIMELINE_SLOT]: 'footer' as const,\n});\n"],"names":[],"mappings":";;AAIA;;;;;AAKG;AACH,MAAM,kBAAkB,GAAyC,MAAM,IAAI;MAE9D,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE;AAC9D,IAAA,WAAW,EAAE,iBAAiB;IAC9B,CAAC,aAAa,GAAG,QAAiB;AACnC,CAAA;;;;"}