react-panel-layout 0.5.2 → 0.6.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 (463) hide show
  1. package/dist/{FloatingPanelFrame-D9Cp2al1.cjs → FloatingPanelFrame-CEmXDvUA.cjs} +2 -2
  2. package/dist/{FloatingPanelFrame-D9Cp2al1.cjs.map → FloatingPanelFrame-CEmXDvUA.cjs.map} +1 -1
  3. package/dist/{FloatingPanelFrame-lLg-Lpg7.js → FloatingPanelFrame-SgYLc6Ud.js} +11 -11
  4. package/dist/{FloatingPanelFrame-lLg-Lpg7.js.map → FloatingPanelFrame-SgYLc6Ud.js.map} +1 -1
  5. package/dist/FloatingWindow-BpdOpg_L.js +400 -0
  6. package/dist/FloatingWindow-BpdOpg_L.js.map +1 -0
  7. package/dist/FloatingWindow-TCDNY5gE.cjs +2 -0
  8. package/dist/FloatingWindow-TCDNY5gE.cjs.map +1 -0
  9. package/dist/GridLayout-B4VRsC0r.cjs +2 -0
  10. package/dist/GridLayout-B4VRsC0r.cjs.map +1 -0
  11. package/dist/GridLayout-BltqeCPK.js +927 -0
  12. package/dist/GridLayout-BltqeCPK.js.map +1 -0
  13. package/dist/HorizontalDivider-B5Z-KZLk.cjs +2 -0
  14. package/dist/HorizontalDivider-B5Z-KZLk.cjs.map +1 -0
  15. package/dist/HorizontalDivider-WF1k_qND.js +30 -0
  16. package/dist/HorizontalDivider-WF1k_qND.js.map +1 -0
  17. package/dist/PanelSystem-Bs8bQwQF.cjs +3 -0
  18. package/dist/PanelSystem-Bs8bQwQF.cjs.map +1 -0
  19. package/dist/PanelSystem-Dr1TBhxM.js +1946 -0
  20. package/dist/PanelSystem-Dr1TBhxM.js.map +1 -0
  21. package/dist/ResizeHandle-CScipO5l.cjs +2 -0
  22. package/dist/ResizeHandle-CScipO5l.cjs.map +1 -0
  23. package/dist/ResizeHandle-CdA_JYfN.js +120 -0
  24. package/dist/ResizeHandle-CdA_JYfN.js.map +1 -0
  25. package/dist/SwipePivotTabBar-BGO9X94m.js +407 -0
  26. package/dist/SwipePivotTabBar-BGO9X94m.js.map +1 -0
  27. package/dist/SwipePivotTabBar-BrQismcZ.cjs +2 -0
  28. package/dist/SwipePivotTabBar-BrQismcZ.cjs.map +1 -0
  29. package/dist/config.cjs +1 -1
  30. package/dist/config.cjs.map +1 -1
  31. package/dist/config.js +11 -9
  32. package/dist/config.js.map +1 -1
  33. package/dist/constants/styles.d.ts +18 -4
  34. package/dist/floating.cjs +1 -1
  35. package/dist/floating.js +1 -1
  36. package/dist/grid/index.d.ts +58 -0
  37. package/dist/grid.cjs +2 -0
  38. package/dist/grid.cjs.map +1 -0
  39. package/dist/grid.js +13 -0
  40. package/dist/grid.js.map +1 -0
  41. package/dist/hooks/gesture/presets.d.ts +33 -0
  42. package/dist/hooks/gesture/testing/createGestureSimulator.d.ts +110 -0
  43. package/dist/hooks/gesture/thresholdValue.d.ts +44 -0
  44. package/dist/hooks/gesture/types.d.ts +254 -0
  45. package/dist/hooks/gesture/useDirectionalLock.d.ts +20 -0
  46. package/dist/hooks/gesture/useEdgeSwipeInput.d.ts +23 -0
  47. package/dist/hooks/gesture/useNativeGestureGuard.d.ts +23 -0
  48. package/dist/hooks/gesture/usePointerTracking.d.ts +22 -0
  49. package/dist/hooks/gesture/useScrollBoundary.d.ts +23 -0
  50. package/dist/hooks/gesture/useSwipeInput.d.ts +5 -0
  51. package/dist/hooks/gesture/utils.d.ts +40 -0
  52. package/dist/hooks/useAnimatedVisibility.d.ts +58 -0
  53. package/dist/hooks/useAnimationFrame.d.ts +84 -0
  54. package/dist/hooks/useSnapAnimation.d.ts +54 -0
  55. package/dist/hooks/useSwipeContentTransform.d.ts +79 -0
  56. package/dist/index.cjs +1 -2
  57. package/dist/index.cjs.map +1 -1
  58. package/dist/index.d.ts +0 -1
  59. package/dist/index.js +25 -2006
  60. package/dist/index.js.map +1 -1
  61. package/dist/modules/pivot/PivotContent.d.ts +1 -1
  62. package/dist/modules/pivot/SwipePivotContent.d.ts +39 -0
  63. package/dist/modules/pivot/SwipePivotContent.debug.tmp.d.ts +25 -0
  64. package/dist/modules/pivot/SwipePivotContent.test.d.ts +1 -0
  65. package/dist/modules/pivot/SwipePivotTabBar.d.ts +89 -0
  66. package/dist/modules/pivot/index.d.ts +3 -0
  67. package/dist/modules/pivot/scaleInputState.d.ts +37 -0
  68. package/dist/modules/pivot/types.d.ts +67 -2
  69. package/dist/modules/pivot/usePivotSwipeInput.d.ts +68 -0
  70. package/dist/modules/stack/StackContent.d.ts +15 -0
  71. package/dist/modules/stack/SwipeStackContent.d.ts +63 -0
  72. package/dist/modules/stack/SwipeStackOutlet.d.ts +80 -0
  73. package/dist/modules/stack/computeStackContentState.d.ts +99 -0
  74. package/dist/modules/stack/computeSwipeStackTransform.d.ts +76 -0
  75. package/dist/modules/stack/types.d.ts +194 -0
  76. package/dist/modules/stack/useStackAnimationState.d.ts +32 -0
  77. package/dist/modules/stack/useStackNavigation.d.ts +23 -0
  78. package/dist/modules/stack/useStackSwipeInput.d.ts +27 -0
  79. package/dist/panels/index.d.ts +67 -0
  80. package/dist/panels.cjs +2 -0
  81. package/dist/panels.cjs.map +1 -0
  82. package/dist/panels.js +28 -0
  83. package/dist/panels.js.map +1 -0
  84. package/dist/pivot/index.d.ts +3 -0
  85. package/dist/pivot.cjs +1 -1
  86. package/dist/pivot.cjs.map +1 -1
  87. package/dist/pivot.js +20 -2
  88. package/dist/pivot.js.map +1 -1
  89. package/dist/resizer/index.d.ts +57 -0
  90. package/dist/resizer.cjs +2 -0
  91. package/dist/resizer.cjs.map +1 -0
  92. package/dist/resizer.js +8 -0
  93. package/dist/resizer.js.map +1 -0
  94. package/dist/stack/index.d.ts +72 -0
  95. package/dist/stack.cjs +2 -0
  96. package/dist/stack.cjs.map +1 -0
  97. package/dist/stack.js +980 -0
  98. package/dist/stack.js.map +1 -0
  99. package/dist/sticky-header/StickyArea.d.ts +38 -0
  100. package/dist/sticky-header/index.d.ts +4 -4
  101. package/dist/sticky-header/types.d.ts +35 -22
  102. package/dist/sticky-header.cjs +1 -1
  103. package/dist/sticky-header.cjs.map +1 -1
  104. package/dist/sticky-header.js +65 -174
  105. package/dist/sticky-header.js.map +1 -1
  106. package/dist/styles-DPPuJ0sf.js +57 -0
  107. package/dist/styles-DPPuJ0sf.js.map +1 -0
  108. package/dist/styles-qf6ptVLD.cjs +2 -0
  109. package/dist/styles-qf6ptVLD.cjs.map +1 -0
  110. package/dist/useContentCache-CO3LYNmz.js +24 -0
  111. package/dist/useContentCache-CO3LYNmz.js.map +1 -0
  112. package/dist/useContentCache-DqXtLrLs.cjs +2 -0
  113. package/dist/useContentCache-DqXtLrLs.cjs.map +1 -0
  114. package/dist/useDocumentPointerEvents-CKdhGXd0.js +46 -0
  115. package/dist/useDocumentPointerEvents-CKdhGXd0.js.map +1 -0
  116. package/dist/useDocumentPointerEvents-ChqrKXDk.cjs +2 -0
  117. package/dist/useDocumentPointerEvents-ChqrKXDk.cjs.map +1 -0
  118. package/dist/useEffectEvent-Dp7HLCf0.js +13 -0
  119. package/dist/useEffectEvent-Dp7HLCf0.js.map +1 -0
  120. package/dist/useEffectEvent-huSsGUnl.cjs +2 -0
  121. package/dist/useEffectEvent-huSsGUnl.cjs.map +1 -0
  122. package/dist/useFloatingState-C4kRaW_R.cjs +2 -0
  123. package/dist/useFloatingState-C4kRaW_R.cjs.map +1 -0
  124. package/dist/useFloatingState-tEfA_wbc.js +74 -0
  125. package/dist/useFloatingState-tEfA_wbc.js.map +1 -0
  126. package/dist/window/index.d.ts +61 -0
  127. package/dist/window.cjs +2 -0
  128. package/dist/window.cjs.map +1 -0
  129. package/dist/window.js +149 -0
  130. package/dist/window.js.map +1 -0
  131. package/docs/design-tokens.md +405 -0
  132. package/package.json +29 -4
  133. package/src/PanelSystemContext.tsx +88 -0
  134. package/src/components/grid/GridLayerList.tsx +172 -0
  135. package/src/components/grid/GridLayerResizeHandles.tsx +145 -0
  136. package/src/components/grid/GridLayout.spec.tsx +743 -0
  137. package/src/components/grid/GridLayout.tsx +130 -0
  138. package/src/components/grid/GridTrackResizeHandle.tsx +87 -0
  139. package/src/components/paneling/FloatingPanelFrame.tsx +203 -0
  140. package/src/components/panels/DropSuggestOverlay.tsx +131 -0
  141. package/src/components/panels/PanelGroupView.tsx +112 -0
  142. package/src/components/pivot/PivotLayer.tsx +27 -0
  143. package/src/components/resizer/HorizontalDivider.tsx +52 -0
  144. package/src/components/resizer/ResizeHandle.tsx +118 -0
  145. package/src/components/tabs/TabBar.tsx +223 -0
  146. package/src/components/tabs/TabBarTab.tsx +133 -0
  147. package/src/components/tabs/TabDragOverlay.tsx +92 -0
  148. package/src/components/window/DialogOverlay.tsx +180 -0
  149. package/src/components/window/Drawer.tsx +282 -0
  150. package/src/components/window/DrawerLayers.tsx +58 -0
  151. package/src/components/window/FloatingWindow.tsx +95 -0
  152. package/src/components/window/PopupLayerPortal.tsx +218 -0
  153. package/src/config/PanelContentDeclaration.tsx +427 -0
  154. package/src/config/index.tsx +52 -0
  155. package/src/config/panelJsx.spec.tsx +54 -0
  156. package/src/config/panelJsxConfig.spec.tsx +54 -0
  157. package/src/config/panelJsxDrawer.spec.tsx +33 -0
  158. package/src/config/panelRouter.spec.ts +68 -0
  159. package/src/config/panelRouter.tsx +155 -0
  160. package/src/constants/styles.ts +261 -0
  161. package/src/demo/Layout.module.css +258 -0
  162. package/src/demo/Layout.tsx +176 -0
  163. package/src/demo/components/CodeBlock.module.css +54 -0
  164. package/src/demo/components/CodeBlock.tsx +34 -0
  165. package/src/demo/components/CodePreview.module.css +37 -0
  166. package/src/demo/components/CodePreview.tsx +31 -0
  167. package/src/demo/components/DataPreview.module.css +177 -0
  168. package/src/demo/components/DataPreview.tsx +115 -0
  169. package/src/demo/components/Story.module.css +68 -0
  170. package/src/demo/components/Story.tsx +54 -0
  171. package/src/demo/components/layout/CodePanel.module.css +183 -0
  172. package/src/demo/components/layout/CodePanel.tsx +149 -0
  173. package/src/demo/components/layout/DemoPage.module.css +60 -0
  174. package/src/demo/components/layout/DemoPage.tsx +56 -0
  175. package/src/demo/components/layout/SingleSamplePage.module.css +11 -0
  176. package/src/demo/components/layout/SingleSamplePage.tsx +35 -0
  177. package/src/demo/components/layout/SplitDemoLayout.module.css +107 -0
  178. package/src/demo/components/layout/SplitDemoLayout.tsx +218 -0
  179. package/src/demo/components/layout/index.ts +11 -0
  180. package/src/demo/components/tab-styles/ChromeTabBar.module.css +75 -0
  181. package/src/demo/components/tab-styles/ChromeTabBar.tsx +111 -0
  182. package/src/demo/components/tab-styles/GitHubTabBar.module.css +81 -0
  183. package/src/demo/components/tab-styles/GitHubTabBar.tsx +109 -0
  184. package/src/demo/components/tab-styles/VSCodeTabBar.module.css +78 -0
  185. package/src/demo/components/tab-styles/VSCodeTabBar.tsx +109 -0
  186. package/src/demo/components/tab-styles/index.ts +6 -0
  187. package/src/demo/components/ui/DemoButton.module.css +63 -0
  188. package/src/demo/components/ui/DemoButton.tsx +32 -0
  189. package/src/demo/components/ui/DemoCard.module.css +15 -0
  190. package/src/demo/components/ui/DemoCard.tsx +30 -0
  191. package/src/demo/components/ui/DemoContainer.module.css +17 -0
  192. package/src/demo/components/ui/DemoContainer.tsx +30 -0
  193. package/src/demo/components/ui/DemoPanel.module.css +23 -0
  194. package/src/demo/components/ui/DemoPanel.tsx +33 -0
  195. package/src/demo/components/ui/PanelText.module.css +18 -0
  196. package/src/demo/components/ui/PanelText.tsx +29 -0
  197. package/src/demo/components/ui/PanelTitle.module.css +18 -0
  198. package/src/demo/components/ui/PanelTitle.tsx +31 -0
  199. package/src/demo/contexts/TabbarDemoConfig.tsx +218 -0
  200. package/src/demo/demo.css +172 -0
  201. package/src/demo/hooks/useMedia.ts +41 -0
  202. package/src/demo/hooks/useShikiHighlight.ts +55 -0
  203. package/src/demo/index.tsx +293 -0
  204. package/src/demo/pages/Drawer/animations/index.tsx +22 -0
  205. package/src/demo/pages/Drawer/basics/index.tsx +17 -0
  206. package/src/demo/pages/Drawer/components/DrawerAnimations.module.css +125 -0
  207. package/src/demo/pages/Drawer/components/DrawerAnimations.tsx +118 -0
  208. package/src/demo/pages/Drawer/components/DrawerBasics.module.css +55 -0
  209. package/src/demo/pages/Drawer/components/DrawerBasics.tsx +76 -0
  210. package/src/demo/pages/Drawer/components/DrawerMenuLayout.module.css +332 -0
  211. package/src/demo/pages/Drawer/components/DrawerMenuLayout.tsx +199 -0
  212. package/src/demo/pages/Drawer/menu/index.tsx +17 -0
  213. package/src/demo/pages/FloatingPanelFrame/ResizableFloatingPanelsPreview.module.css +163 -0
  214. package/src/demo/pages/FloatingPanelFrame/ResizableFloatingPanelsPreview.tsx +234 -0
  215. package/src/demo/pages/FloatingPanelFrame/basic/index.tsx +17 -0
  216. package/src/demo/pages/FloatingPanelFrame/complex/index.tsx +26 -0
  217. package/src/demo/pages/FloatingPanelFrame/components/BasicPanel.module.css +16 -0
  218. package/src/demo/pages/FloatingPanelFrame/components/BasicPanel.tsx +24 -0
  219. package/src/demo/pages/FloatingPanelFrame/components/ComplexPanel.module.css +54 -0
  220. package/src/demo/pages/FloatingPanelFrame/components/ComplexPanel.tsx +67 -0
  221. package/src/demo/pages/FloatingPanelFrame/components/PanelWithControls.module.css +21 -0
  222. package/src/demo/pages/FloatingPanelFrame/components/PanelWithControls.tsx +41 -0
  223. package/src/demo/pages/FloatingPanelFrame/components/PanelWithMeta.module.css +5 -0
  224. package/src/demo/pages/FloatingPanelFrame/components/PanelWithMeta.tsx +43 -0
  225. package/src/demo/pages/FloatingPanelFrame/components/ScrollablePanel.module.css +11 -0
  226. package/src/demo/pages/FloatingPanelFrame/components/ScrollablePanel.tsx +42 -0
  227. package/src/demo/pages/FloatingPanelFrame/index.tsx +80 -0
  228. package/src/demo/pages/FloatingPanelFrame/scrollable/index.tsx +30 -0
  229. package/src/demo/pages/FloatingPanelFrame/with-controls/index.tsx +30 -0
  230. package/src/demo/pages/FloatingPanelFrame/with-meta/index.tsx +17 -0
  231. package/src/demo/pages/HorizontalDivider/components/PanelsWithRichContent.module.css +112 -0
  232. package/src/demo/pages/HorizontalDivider/components/PanelsWithRichContent.tsx +56 -0
  233. package/src/demo/pages/HorizontalDivider/components/SimpleResizablePanels.module.css +46 -0
  234. package/src/demo/pages/HorizontalDivider/components/SimpleResizablePanels.tsx +29 -0
  235. package/src/demo/pages/HorizontalDivider/components/ThreePanelLayout.module.css +54 -0
  236. package/src/demo/pages/HorizontalDivider/components/ThreePanelLayout.tsx +30 -0
  237. package/src/demo/pages/HorizontalDivider/index.module.css +14 -0
  238. package/src/demo/pages/HorizontalDivider/index.tsx +64 -0
  239. package/src/demo/pages/HorizontalDivider/panels-with-rich-content/index.tsx +21 -0
  240. package/src/demo/pages/HorizontalDivider/simple-resizable-panels/index.tsx +21 -0
  241. package/src/demo/pages/HorizontalDivider/three-panel-layout/index.tsx +21 -0
  242. package/src/demo/pages/PanelLayout/PanelLayoutDemo.module.css +174 -0
  243. package/src/demo/pages/PanelLayout/PanelLayoutDemo.tsx +248 -0
  244. package/src/demo/pages/PanelLayout/components/DashboardLayout.module.css +115 -0
  245. package/src/demo/pages/PanelLayout/components/DashboardLayout.tsx +124 -0
  246. package/src/demo/pages/PanelLayout/components/DraggableOverlays.module.css +101 -0
  247. package/src/demo/pages/PanelLayout/components/DraggableOverlays.tsx +122 -0
  248. package/src/demo/pages/PanelLayout/components/IDELayout.module.css +104 -0
  249. package/src/demo/pages/PanelLayout/components/IDELayout.tsx +143 -0
  250. package/src/demo/pages/PanelLayout/components/SimpleGrid.module.css +19 -0
  251. package/src/demo/pages/PanelLayout/components/SimpleGrid.tsx +62 -0
  252. package/src/demo/pages/PanelLayout/dashboard/index.tsx +22 -0
  253. package/src/demo/pages/PanelLayout/draggable-overlays/index.tsx +22 -0
  254. package/src/demo/pages/PanelLayout/ide-layout/index.tsx +22 -0
  255. package/src/demo/pages/PanelLayout/index.tsx +94 -0
  256. package/src/demo/pages/PanelLayout/simple-grid/index.tsx +22 -0
  257. package/src/demo/pages/PanelSystem/PanelSystemPreview.module.css +20 -0
  258. package/src/demo/pages/PanelSystem/PanelSystemPreview.tsx +101 -0
  259. package/src/demo/pages/PanelSystem/preview/index.tsx +18 -0
  260. package/src/demo/pages/PanelSystem/tabbar/index.tsx +129 -0
  261. package/src/demo/pages/Pivot/basics/index.tsx +17 -0
  262. package/src/demo/pages/Pivot/components/Pivot.module.css +278 -0
  263. package/src/demo/pages/Pivot/components/PivotBasics.tsx +103 -0
  264. package/src/demo/pages/Pivot/components/PivotSidebar.tsx +168 -0
  265. package/src/demo/pages/Pivot/components/PivotTabs.tsx +129 -0
  266. package/src/demo/pages/Pivot/components/PivotTransitions.tsx +120 -0
  267. package/src/demo/pages/Pivot/components/SwipePivot.module.css +114 -0
  268. package/src/demo/pages/Pivot/components/SwipePivot.tsx +193 -0
  269. package/src/demo/pages/Pivot/components/SwipeTabsPivot.module.css +203 -0
  270. package/src/demo/pages/Pivot/components/SwipeTabsPivot.tsx +289 -0
  271. package/src/demo/pages/Pivot/sidebar/index.tsx +17 -0
  272. package/src/demo/pages/Pivot/swipe/index.tsx +16 -0
  273. package/src/demo/pages/Pivot/swipe-debug/index.tsx +287 -0
  274. package/src/demo/pages/Pivot/swipe-tabs/index.tsx +15 -0
  275. package/src/demo/pages/Pivot/tabs/index.tsx +17 -0
  276. package/src/demo/pages/Pivot/transitions/index.tsx +17 -0
  277. package/src/demo/pages/ResizeHandle/both-directions/index.tsx +17 -0
  278. package/src/demo/pages/ResizeHandle/components/BothDirectionsDemo.module.css +72 -0
  279. package/src/demo/pages/ResizeHandle/components/BothDirectionsDemo.tsx +41 -0
  280. package/src/demo/pages/ResizeHandle/components/HorizontalResizeDemo.module.css +61 -0
  281. package/src/demo/pages/ResizeHandle/components/HorizontalResizeDemo.tsx +33 -0
  282. package/src/demo/pages/ResizeHandle/components/NestedPanelsDemo.module.css +83 -0
  283. package/src/demo/pages/ResizeHandle/components/NestedPanelsDemo.tsx +53 -0
  284. package/src/demo/pages/ResizeHandle/components/VerticalResizeDemo.module.css +68 -0
  285. package/src/demo/pages/ResizeHandle/components/VerticalResizeDemo.tsx +33 -0
  286. package/src/demo/pages/ResizeHandle/horizontal/index.tsx +17 -0
  287. package/src/demo/pages/ResizeHandle/index.module.css +11 -0
  288. package/src/demo/pages/ResizeHandle/index.tsx +71 -0
  289. package/src/demo/pages/ResizeHandle/nested-panels/index.tsx +17 -0
  290. package/src/demo/pages/ResizeHandle/vertical/index.tsx +17 -0
  291. package/src/demo/pages/ResponsiveLayout/adaptive-workspace/index.tsx +22 -0
  292. package/src/demo/pages/ResponsiveLayout/components/ResponsiveWorkspace.module.css +423 -0
  293. package/src/demo/pages/ResponsiveLayout/components/ResponsiveWorkspace.tsx +398 -0
  294. package/src/demo/pages/Stack/basics/index.tsx +22 -0
  295. package/src/demo/pages/Stack/components/Stack.module.css +234 -0
  296. package/src/demo/pages/Stack/components/StackBasics.tsx +217 -0
  297. package/src/demo/pages/Stack/components/StackTablet.module.css +299 -0
  298. package/src/demo/pages/Stack/components/StackTablet.tsx +401 -0
  299. package/src/demo/pages/Stack/tablet/index.tsx +22 -0
  300. package/src/demo/pages/StickyHeader/basics/index.tsx +17 -0
  301. package/src/demo/pages/StickyHeader/components/StickyHeader.module.css +219 -0
  302. package/src/demo/pages/StickyHeader/components/StickyHeaderBasics.tsx +103 -0
  303. package/src/demo/routes.tsx +193 -0
  304. package/src/demo/styles/animations.css +68 -0
  305. package/src/demo/styles/stack-themes.css +35 -0
  306. package/src/demo/utils/createPanelView.tsx +58 -0
  307. package/src/floating/index.ts +24 -0
  308. package/src/grid/index.ts +75 -0
  309. package/src/hooks/ContentCacheContext.tsx +87 -0
  310. package/src/hooks/gesture/presets.spec.ts +86 -0
  311. package/src/hooks/gesture/presets.ts +95 -0
  312. package/src/hooks/gesture/testing/createGestureSimulator.spec.ts +237 -0
  313. package/src/hooks/gesture/testing/createGestureSimulator.ts +310 -0
  314. package/src/hooks/gesture/thresholdValue.spec.ts +103 -0
  315. package/src/hooks/gesture/thresholdValue.ts +77 -0
  316. package/src/hooks/gesture/types.ts +290 -0
  317. package/src/hooks/gesture/useDirectionalLock.spec.ts +271 -0
  318. package/src/hooks/gesture/useDirectionalLock.ts +115 -0
  319. package/src/hooks/gesture/useEdgeSwipeInput.spec.ts +454 -0
  320. package/src/hooks/gesture/useEdgeSwipeInput.ts +131 -0
  321. package/src/hooks/gesture/useNativeGestureGuard.spec.ts +413 -0
  322. package/src/hooks/gesture/useNativeGestureGuard.ts +133 -0
  323. package/src/hooks/gesture/usePointerTracking.spec.ts +364 -0
  324. package/src/hooks/gesture/usePointerTracking.ts +134 -0
  325. package/src/hooks/gesture/useScrollBoundary.spec.ts +249 -0
  326. package/src/hooks/gesture/useScrollBoundary.ts +113 -0
  327. package/src/hooks/gesture/useSwipeInput.spec.ts +592 -0
  328. package/src/hooks/gesture/useSwipeInput.ts +310 -0
  329. package/src/hooks/gesture/utils.spec.ts +152 -0
  330. package/src/hooks/gesture/utils.ts +87 -0
  331. package/src/hooks/useAnimatedVisibility.spec.ts +257 -0
  332. package/src/hooks/useAnimatedVisibility.ts +146 -0
  333. package/src/hooks/useAnimationFrame.ts +200 -0
  334. package/src/hooks/useCSSMatrix.spec.ts +214 -0
  335. package/src/hooks/useCSSMatrix.ts +262 -0
  336. package/src/hooks/useClonedElementPreview.ts +28 -0
  337. package/src/hooks/useContainerScroll.ts +78 -0
  338. package/src/hooks/useContentCache.spec.tsx +232 -0
  339. package/src/hooks/useContentCache.tsx +127 -0
  340. package/src/hooks/useDocumentPointerEvents.ts +137 -0
  341. package/src/hooks/useDocumentScroll.ts +41 -0
  342. package/src/hooks/useEffectEvent.ts +40 -0
  343. package/src/hooks/useElementComponentWrapper.tsx +63 -0
  344. package/src/hooks/useIntersectionObserver.tsx +125 -0
  345. package/src/hooks/useIsomorphicLayoutEffect.ts +29 -0
  346. package/src/hooks/useResizeObserver.tsx +81 -0
  347. package/src/hooks/useScrollContainer.ts +79 -0
  348. package/src/hooks/useSnapAnimation.ts +128 -0
  349. package/src/hooks/useSwipeContentTransform.spec.ts +133 -0
  350. package/src/hooks/useSwipeContentTransform.ts +235 -0
  351. package/src/hooks/useTransitionState.ts +95 -0
  352. package/src/index.tsx +88 -0
  353. package/src/modules/grid/GridLayoutContext.tsx +57 -0
  354. package/src/modules/grid/LayerInstanceContext.tsx +56 -0
  355. package/src/modules/grid/resizeHandles.ts +157 -0
  356. package/src/modules/grid/trackUtils.ts +146 -0
  357. package/src/modules/grid/useGridPlacements.ts +143 -0
  358. package/src/modules/grid/useGridTracks.ts +156 -0
  359. package/src/modules/grid/useLayerDragHandle.ts +16 -0
  360. package/src/modules/grid/useLayerInteractions.tsx +850 -0
  361. package/src/modules/keybindings/KeybindingsProvider.tsx +111 -0
  362. package/src/modules/panels/dom/DomRegistry.tsx +94 -0
  363. package/src/modules/panels/index.ts +45 -0
  364. package/src/modules/panels/interactions/InteractionsContext.test.tsx +330 -0
  365. package/src/modules/panels/interactions/InteractionsContext.tsx +394 -0
  366. package/src/modules/panels/interactions/dnd.ts +28 -0
  367. package/src/modules/panels/keybindings/KeybindingsInstaller.tsx +15 -0
  368. package/src/modules/panels/layout/adapter.ts +124 -0
  369. package/src/modules/panels/rendering/ContentRegistry.spec.tsx +304 -0
  370. package/src/modules/panels/rendering/ContentRegistry.tsx +205 -0
  371. package/src/modules/panels/rendering/GroupContainer.tsx +65 -0
  372. package/src/modules/panels/rendering/RenderBridge.tsx +115 -0
  373. package/src/modules/panels/rendering/RenderContext.tsx +31 -0
  374. package/src/modules/panels/state/PanelSplitHandles.tsx +147 -0
  375. package/src/modules/panels/state/PanelSystemContext.splitLimits.spec.tsx +50 -0
  376. package/src/modules/panels/state/PanelSystemContext.tsx +289 -0
  377. package/src/modules/panels/state/StateContext.tsx +12 -0
  378. package/src/modules/panels/state/cleanup.ts +37 -0
  379. package/src/modules/panels/state/commands.ts +53 -0
  380. package/src/modules/panels/state/focus/Context.tsx +25 -0
  381. package/src/modules/panels/state/focus/logic.ts +57 -0
  382. package/src/modules/panels/state/groups/Context.tsx +25 -0
  383. package/src/modules/panels/state/groups/logic.ts +105 -0
  384. package/src/modules/panels/state/splitLimits.spec.ts +46 -0
  385. package/src/modules/panels/state/splitLimits.ts +90 -0
  386. package/src/modules/panels/state/state.spec.ts +49 -0
  387. package/src/modules/panels/state/tree/Context.tsx +24 -0
  388. package/src/modules/panels/state/tree/logic.spec.ts +34 -0
  389. package/src/modules/panels/state/tree/logic.ts +138 -0
  390. package/src/modules/panels/state/types.ts +142 -0
  391. package/src/modules/panels/system/PanelSystem.empty-tabbar.spec.tsx +53 -0
  392. package/src/modules/panels/system/PanelSystem.tab-click-activates.spec.tsx +44 -0
  393. package/src/modules/panels/system/PanelSystem.tab-reorder.spec.tsx +64 -0
  394. package/src/modules/panels/system/PanelSystem.tabs-no-dup.spec.tsx +57 -0
  395. package/src/modules/panels/system/PanelSystem.tsx +206 -0
  396. package/src/modules/pivot/PivotContent.spec.tsx +179 -0
  397. package/src/modules/pivot/PivotContent.tsx +77 -0
  398. package/src/modules/pivot/SwipePivotContent.debug.tmp.tsx +237 -0
  399. package/src/modules/pivot/SwipePivotContent.position.spec.tsx +167 -0
  400. package/src/modules/pivot/SwipePivotContent.spec.tsx +464 -0
  401. package/src/modules/pivot/SwipePivotContent.test.tsx +502 -0
  402. package/src/modules/pivot/SwipePivotContent.tsx +197 -0
  403. package/src/modules/pivot/SwipePivotTabBar.spec.tsx +865 -0
  404. package/src/modules/pivot/SwipePivotTabBar.tsx +523 -0
  405. package/src/modules/pivot/index.ts +8 -0
  406. package/src/modules/pivot/scaleInputState.spec.ts +210 -0
  407. package/src/modules/pivot/scaleInputState.ts +66 -0
  408. package/src/modules/pivot/types.ts +139 -0
  409. package/src/modules/pivot/usePivot.spec.ts +621 -0
  410. package/src/modules/pivot/usePivot.spec.tsx +186 -0
  411. package/src/modules/pivot/usePivot.tsx +345 -0
  412. package/src/modules/pivot/usePivotSwipeInput.spec.ts +649 -0
  413. package/src/modules/pivot/usePivotSwipeInput.ts +136 -0
  414. package/src/modules/resizer/useResizeDrag.ts +94 -0
  415. package/src/modules/stack/StackContent.spec.tsx +264 -0
  416. package/src/modules/stack/StackContent.tsx +111 -0
  417. package/src/modules/stack/SwipeStackContent.spec.tsx +1277 -0
  418. package/src/modules/stack/SwipeStackContent.tsx +356 -0
  419. package/src/modules/stack/SwipeStackOutlet.spec.tsx +252 -0
  420. package/src/modules/stack/SwipeStackOutlet.tsx +221 -0
  421. package/src/modules/stack/computeStackContentState.spec.ts +281 -0
  422. package/src/modules/stack/computeStackContentState.ts +304 -0
  423. package/src/modules/stack/computeSwipeStackTransform.spec.ts +186 -0
  424. package/src/modules/stack/computeSwipeStackTransform.ts +145 -0
  425. package/src/modules/stack/types.ts +226 -0
  426. package/src/modules/stack/useStackAnimationState.spec.ts +186 -0
  427. package/src/modules/stack/useStackAnimationState.ts +138 -0
  428. package/src/modules/stack/useStackNavigation.spec.ts +477 -0
  429. package/src/modules/stack/useStackNavigation.tsx +336 -0
  430. package/src/modules/stack/useStackSwipeInput.spec.ts +276 -0
  431. package/src/modules/stack/useStackSwipeInput.ts +139 -0
  432. package/src/modules/window/useDrawerState.ts +81 -0
  433. package/src/modules/window/useFloatingState.spec.ts +252 -0
  434. package/src/modules/window/useFloatingState.ts +141 -0
  435. package/src/panels/index.ts +119 -0
  436. package/src/pivot/index.ts +19 -0
  437. package/src/resizer/index.ts +68 -0
  438. package/src/stack/index.ts +91 -0
  439. package/src/sticky-header/StickyArea.tsx +221 -0
  440. package/src/sticky-header/index.ts +18 -0
  441. package/src/sticky-header/types.ts +68 -0
  442. package/src/types.ts +323 -0
  443. package/src/utils/CSSMatrix.ts +321 -0
  444. package/src/utils/css.ts +65 -0
  445. package/src/utils/dialogUtils.ts +43 -0
  446. package/src/utils/math.ts +18 -0
  447. package/src/utils/polyfills/createDialogPolyfill.ts +18 -0
  448. package/src/utils/typedActions.ts +103 -0
  449. package/src/vite-env.d.ts +6 -0
  450. package/src/window/index.ts +67 -0
  451. package/dist/GridLayout-BQQ63eA1.cjs +0 -2
  452. package/dist/GridLayout-BQQ63eA1.cjs.map +0 -1
  453. package/dist/GridLayout-CJTKq7Mp.js +0 -1465
  454. package/dist/GridLayout-CJTKq7Mp.js.map +0 -1
  455. package/dist/sticky-header/StickyHeader.d.ts +0 -53
  456. package/dist/styles-CA2_zLZt.js +0 -52
  457. package/dist/styles-CA2_zLZt.js.map +0 -1
  458. package/dist/styles-PsqGOEJP.cjs +0 -2
  459. package/dist/styles-PsqGOEJP.cjs.map +0 -1
  460. package/dist/usePivot-7ctin_P_.cjs +0 -2
  461. package/dist/usePivot-7ctin_P_.cjs.map +0 -1
  462. package/dist/usePivot-CgQxB8rc.js +0 -124
  463. package/dist/usePivot-CgQxB8rc.js.map +0 -1
@@ -0,0 +1,214 @@
1
+ /**
2
+ * @file Tests for useCSSMatrix hook
3
+ */
4
+
5
+ import { renderHook } from '@testing-library/react';
6
+ import { useCSSMatrix, useCSSMatrixObject, type MatrixOperation } from './useCSSMatrix';
7
+ import { matrix } from '../utils/CSSMatrix';
8
+
9
+ describe('useCSSMatrix', () => {
10
+ it('should return identity matrix CSS for empty operations', () => {
11
+ const { result } = renderHook(() => useCSSMatrix([]));
12
+ expect(result.current).toBe(matrix().toCSS());
13
+ });
14
+
15
+ it('should apply single translation', () => {
16
+ const operations: MatrixOperation[] = [['translate', 100, 50]];
17
+ const { result } = renderHook(() => useCSSMatrix(operations));
18
+
19
+ const expected = matrix().translate(100, 50).toCSS();
20
+ expect(result.current).toBe(expected);
21
+ });
22
+
23
+ it('should apply multiple operations in sequence', () => {
24
+ const operations: MatrixOperation[] = [
25
+ ['translate', 100, 50],
26
+ ['rotateZ', Math.PI / 4],
27
+ ['scale', 2, 2],
28
+ ];
29
+ const { result } = renderHook(() => useCSSMatrix(operations));
30
+
31
+ const expected = matrix()
32
+ .translate(100, 50)
33
+ .rotateZ(Math.PI / 4)
34
+ .scale(2, 2)
35
+ .toCSS();
36
+ expect(result.current).toBe(expected);
37
+ });
38
+
39
+ it('should handle 3D operations', () => {
40
+ const operations: MatrixOperation[] = [
41
+ ['perspective', 1000],
42
+ ['translate3d', 0, 0, -500],
43
+ ['rotateY', Math.PI / 6],
44
+ ];
45
+ const { result } = renderHook(() => useCSSMatrix(operations));
46
+
47
+ const expected = matrix()
48
+ .perspective(1000)
49
+ .translate3d(0, 0, -500)
50
+ .rotateY(Math.PI / 6)
51
+ .toCSS();
52
+ expect(result.current).toBe(expected);
53
+ });
54
+
55
+ it('should efficiently update when operations change at the end', () => {
56
+ const operations1: MatrixOperation[] = [
57
+ ['translate', 100, 50],
58
+ ['rotateZ', 0],
59
+ ];
60
+ const operations2: MatrixOperation[] = [
61
+ ['translate', 100, 50],
62
+ ['rotateZ', Math.PI / 4],
63
+ ];
64
+
65
+ const { result, rerender } = renderHook(
66
+ ({ ops }) => useCSSMatrix(ops),
67
+ { initialProps: { ops: operations1 } }
68
+ );
69
+
70
+ const result1 = result.current;
71
+
72
+ // Change only the last operation
73
+ rerender({ ops: operations2 });
74
+ const result2 = result.current;
75
+
76
+ // Results should be different
77
+ expect(result1).not.toBe(result2);
78
+
79
+ // Result should match expected
80
+ const expected = matrix()
81
+ .translate(100, 50)
82
+ .rotateZ(Math.PI / 4)
83
+ .toCSS();
84
+ expect(result2).toBe(expected);
85
+ });
86
+
87
+ it('should efficiently update when operations change at the beginning', () => {
88
+ const operations1: MatrixOperation[] = [
89
+ ['translate', 100, 50],
90
+ ['rotateZ', Math.PI / 4],
91
+ ];
92
+ const operations2: MatrixOperation[] = [
93
+ ['translate', 200, 100],
94
+ ['rotateZ', Math.PI / 4],
95
+ ];
96
+
97
+ const { result, rerender } = renderHook(
98
+ ({ ops }) => useCSSMatrix(ops),
99
+ { initialProps: { ops: operations1 } }
100
+ );
101
+
102
+ const result1 = result.current;
103
+
104
+ // Change the first operation
105
+ rerender({ ops: operations2 });
106
+ const result2 = result.current;
107
+
108
+ expect(result1).not.toBe(result2);
109
+
110
+ const expected = matrix()
111
+ .translate(200, 100)
112
+ .rotateZ(Math.PI / 4)
113
+ .toCSS();
114
+ expect(result2).toBe(expected);
115
+ });
116
+
117
+ it('should handle adding operations', () => {
118
+ const operations1: MatrixOperation[] = [
119
+ ['translate', 100, 50],
120
+ ];
121
+ const operations2: MatrixOperation[] = [
122
+ ['translate', 100, 50],
123
+ ['rotateZ', Math.PI / 4],
124
+ ];
125
+
126
+ const { result, rerender } = renderHook(
127
+ ({ ops }) => useCSSMatrix(ops),
128
+ { initialProps: { ops: operations1 } }
129
+ );
130
+
131
+ rerender({ ops: operations2 });
132
+
133
+ const expected = matrix()
134
+ .translate(100, 50)
135
+ .rotateZ(Math.PI / 4)
136
+ .toCSS();
137
+ expect(result.current).toBe(expected);
138
+ });
139
+
140
+ it('should handle removing operations', () => {
141
+ const operations1: MatrixOperation[] = [
142
+ ['translate', 100, 50],
143
+ ['rotateZ', Math.PI / 4],
144
+ ['scale', 2, 2],
145
+ ];
146
+ const operations2: MatrixOperation[] = [
147
+ ['translate', 100, 50],
148
+ ];
149
+
150
+ const { result, rerender } = renderHook(
151
+ ({ ops }) => useCSSMatrix(ops),
152
+ { initialProps: { ops: operations1 } }
153
+ );
154
+
155
+ rerender({ ops: operations2 });
156
+
157
+ const expected = matrix().translate(100, 50).toCSS();
158
+ expect(result.current).toBe(expected);
159
+ });
160
+
161
+ it('should not recompute when operations array reference changes but content is same', () => {
162
+ const operations1: MatrixOperation[] = [
163
+ ['translate', 100, 50],
164
+ ['rotateZ', Math.PI / 4],
165
+ ];
166
+ const operations2: MatrixOperation[] = [
167
+ ['translate', 100, 50],
168
+ ['rotateZ', Math.PI / 4],
169
+ ];
170
+
171
+ const { result, rerender } = renderHook(
172
+ ({ ops }) => useCSSMatrix(ops),
173
+ { initialProps: { ops: operations1 } }
174
+ );
175
+
176
+ const result1 = result.current;
177
+
178
+ // Different array reference, same content
179
+ rerender({ ops: operations2 });
180
+ const result2 = result.current;
181
+
182
+ // Should return same result due to memoization
183
+ expect(result1).toBe(result2);
184
+ });
185
+ });
186
+
187
+ describe('useCSSMatrixObject', () => {
188
+ it('should return CSSMatrix object', () => {
189
+ const operations: MatrixOperation[] = [['translate', 100, 50]];
190
+ const { result } = renderHook(() => useCSSMatrixObject(operations));
191
+
192
+ expect(result.current).toBeDefined();
193
+ expect(typeof result.current.toCSS).toBe('function');
194
+ expect(typeof result.current.toArray).toBe('function');
195
+ });
196
+
197
+ it('should return correct matrix values', () => {
198
+ const operations: MatrixOperation[] = [['translate', 100, 50]];
199
+ const { result } = renderHook(() => useCSSMatrixObject(operations));
200
+
201
+ const expected = matrix().translate(100, 50);
202
+ expect(result.current.toCSS()).toBe(expected.toCSS());
203
+ });
204
+
205
+ it('should allow chaining additional operations', () => {
206
+ const operations: MatrixOperation[] = [['translate', 100, 50]];
207
+ const { result } = renderHook(() => useCSSMatrixObject(operations));
208
+
209
+ const final = result.current.rotateZ(Math.PI / 4);
210
+ const expected = matrix().translate(100, 50).rotateZ(Math.PI / 4);
211
+
212
+ expect(final.toCSS()).toBe(expected.toCSS());
213
+ });
214
+ });
@@ -0,0 +1,262 @@
1
+ /**
2
+ * @file useCSSMatrix - Efficient CSS matrix transformation hook with incremental updates
3
+ */
4
+
5
+ import { useRef, useMemo } from 'react';
6
+ import { matrix, type CSSMatrix } from '../utils/CSSMatrix';
7
+
8
+ /**
9
+ * Matrix operation types
10
+ */
11
+ export type MatrixOperation =
12
+ | ['translate', number?, number?, number?]
13
+ | ['translate3d', number, number, number]
14
+ | ['translateX', number]
15
+ | ['translateY', number]
16
+ | ['translateZ', number]
17
+ | ['scale', number?, number?, number?]
18
+ | ['scale3d', number, number, number]
19
+ | ['scaleX', number]
20
+ | ['scaleY', number]
21
+ | ['scaleZ', number]
22
+ | ['rotateX', number]
23
+ | ['rotateY', number]
24
+ | ['rotateZ', number]
25
+ | ['rotate', number, number, number, number]
26
+ | ['rotate3d', number, number, number, number]
27
+ | ['skew', number?, number?]
28
+ | ['skewX', number]
29
+ | ['skewY', number]
30
+ | ['perspective', number];
31
+
32
+ /**
33
+ * Cache entry for computed matrices
34
+ */
35
+ type CacheEntry = {
36
+ operation: MatrixOperation;
37
+ result: CSSMatrix;
38
+ };
39
+
40
+ /**
41
+ * Apply a single operation to a matrix
42
+ */
43
+ const applyOperation = (m: CSSMatrix, op: MatrixOperation): CSSMatrix => {
44
+ const [name, ...params] = op;
45
+
46
+ switch (name) {
47
+ case 'translate':
48
+ return m.translate(params[0], params[1], params[2]);
49
+ case 'translate3d':
50
+ return m.translate3d(params[0]!, params[1]!, params[2]!);
51
+ case 'translateX':
52
+ return m.translateX(params[0]!);
53
+ case 'translateY':
54
+ return m.translateY(params[0]!);
55
+ case 'translateZ':
56
+ return m.translateZ(params[0]!);
57
+ case 'scale':
58
+ return m.scale(params[0], params[1], params[2]);
59
+ case 'scale3d':
60
+ return m.scale3d(params[0]!, params[1]!, params[2]!);
61
+ case 'scaleX':
62
+ return m.scaleX(params[0]!);
63
+ case 'scaleY':
64
+ return m.scaleY(params[0]!);
65
+ case 'scaleZ':
66
+ return m.scaleZ(params[0]!);
67
+ case 'rotateX':
68
+ return m.rotateX(params[0]!);
69
+ case 'rotateY':
70
+ return m.rotateY(params[0]!);
71
+ case 'rotateZ':
72
+ return m.rotateZ(params[0]!);
73
+ case 'rotate':
74
+ return m.rotate(params[0]!, params[1]!, params[2]!, params[3]!);
75
+ case 'rotate3d':
76
+ return m.rotate3d(params[0]!, params[1]!, params[2]!, params[3]!);
77
+ case 'skew':
78
+ return m.skew(params[0], params[1]);
79
+ case 'skewX':
80
+ return m.skewX(params[0]!);
81
+ case 'skewY':
82
+ return m.skewY(params[0]!);
83
+ case 'perspective':
84
+ return m.perspective(params[0]!);
85
+ default:
86
+ return m;
87
+ }
88
+ };
89
+
90
+ /**
91
+ * Compare two operations for equality
92
+ */
93
+ const operationsEqual = (a: MatrixOperation, b: MatrixOperation): boolean => {
94
+ if (a.length !== b.length) {
95
+ return false;
96
+ }
97
+ for (let i = 0; i < a.length; i++) {
98
+ if (a[i] !== b[i]) {
99
+ return false;
100
+ }
101
+ }
102
+ return true;
103
+ };
104
+
105
+ /**
106
+ * Find the first index where operations differ
107
+ */
108
+ const findDiffIndex = (
109
+ prev: MatrixOperation[],
110
+ current: MatrixOperation[]
111
+ ): number => {
112
+ const minLength = Math.min(prev.length, current.length);
113
+ for (let i = 0; i < minLength; i++) {
114
+ if (!operationsEqual(prev[i]!, current[i]!)) {
115
+ return i;
116
+ }
117
+ }
118
+ // If all compared operations are equal, check length difference
119
+ if (prev.length !== current.length) {
120
+ return minLength;
121
+ }
122
+ return -1; // No difference
123
+ };
124
+
125
+ /**
126
+ * Efficient CSS matrix transformation hook with incremental updates
127
+ *
128
+ * Constructs a computation tree and only recalculates from the point of change,
129
+ * caching intermediate results for optimal performance.
130
+ *
131
+ * @param operations - Array of matrix operations to apply
132
+ * @returns CSS transform string (matrix3d format)
133
+ *
134
+ * @example
135
+ * ```tsx
136
+ * const transform = useCSSMatrix([
137
+ * ['translate', 100, 50],
138
+ * ['rotateZ', angle],
139
+ * ['scale', 2, 2]
140
+ * ]);
141
+ * return <div style={{ transform }} />;
142
+ * ```
143
+ */
144
+ export const useCSSMatrix = (operations: MatrixOperation[]): string => {
145
+ // Cache for intermediate computation results
146
+ const cacheRef = useRef<CacheEntry[]>([]);
147
+ const prevOperationsRef = useRef<MatrixOperation[]>([]);
148
+
149
+ const result = useMemo(() => {
150
+ const prevOps = prevOperationsRef.current;
151
+ const cache = cacheRef.current;
152
+
153
+ // Find where operations differ from previous render
154
+ const diffIndex = findDiffIndex(prevOps, operations);
155
+
156
+ // If no difference and lengths match, return cached result
157
+ if (diffIndex === -1 && cache.length === operations.length) {
158
+ return cache[cache.length - 1]?.result.toCSS() ?? matrix().toCSS();
159
+ }
160
+
161
+ // Start from the last valid cached result or identity matrix
162
+ // eslint-disable-next-line no-restricted-syntax -- Performance: avoid function call overhead
163
+ let currentMatrix: CSSMatrix;
164
+ // eslint-disable-next-line no-restricted-syntax -- Performance: avoid function call overhead
165
+ let startIndex: number;
166
+
167
+ if (diffIndex > 0 && cache[diffIndex - 1]) {
168
+ // Use cached result up to the point of change
169
+ currentMatrix = cache[diffIndex - 1]!.result;
170
+ startIndex = diffIndex;
171
+ } else {
172
+ // Start from identity matrix
173
+ currentMatrix = matrix();
174
+ startIndex = 0;
175
+ }
176
+
177
+ // Rebuild cache from the point of change
178
+ const newCache: CacheEntry[] = cache.slice(0, startIndex);
179
+
180
+ for (let i = startIndex; i < operations.length; i++) {
181
+ const operation = operations[i]!;
182
+ currentMatrix = applyOperation(currentMatrix, operation);
183
+ newCache.push({
184
+ operation,
185
+ result: currentMatrix,
186
+ });
187
+ }
188
+
189
+ // Update refs for next render
190
+ cacheRef.current = newCache;
191
+ prevOperationsRef.current = [...operations];
192
+
193
+ return currentMatrix.toCSS();
194
+ }, [operations]);
195
+
196
+ return result;
197
+ };
198
+
199
+ /**
200
+ * Hook variant that returns the CSSMatrix object instead of CSS string
201
+ *
202
+ * Useful when you need access to the raw matrix values or want to
203
+ * apply additional operations.
204
+ *
205
+ * @param operations - Array of matrix operations to apply
206
+ * @returns CSSMatrix object
207
+ *
208
+ * @example
209
+ * ```tsx
210
+ * const matrixObj = useCSSMatrixObject([
211
+ * ['translate', 100, 50],
212
+ * ['rotateZ', angle]
213
+ * ]);
214
+ * const values = matrixObj.toArray();
215
+ * ```
216
+ */
217
+ export const useCSSMatrixObject = (operations: MatrixOperation[]): CSSMatrix => {
218
+ const cacheRef = useRef<CacheEntry[]>([]);
219
+ const prevOperationsRef = useRef<MatrixOperation[]>([]);
220
+
221
+ const result = useMemo(() => {
222
+ const prevOps = prevOperationsRef.current;
223
+ const cache = cacheRef.current;
224
+
225
+ const diffIndex = findDiffIndex(prevOps, operations);
226
+
227
+ if (diffIndex === -1 && cache.length === operations.length) {
228
+ return cache[cache.length - 1]?.result ?? matrix();
229
+ }
230
+
231
+ // eslint-disable-next-line no-restricted-syntax -- Performance: avoid function call overhead
232
+ let currentMatrix: CSSMatrix;
233
+ // eslint-disable-next-line no-restricted-syntax -- Performance: avoid function call overhead
234
+ let startIndex: number;
235
+
236
+ if (diffIndex > 0 && cache[diffIndex - 1]) {
237
+ currentMatrix = cache[diffIndex - 1]!.result;
238
+ startIndex = diffIndex;
239
+ } else {
240
+ currentMatrix = matrix();
241
+ startIndex = 0;
242
+ }
243
+
244
+ const newCache: CacheEntry[] = cache.slice(0, startIndex);
245
+
246
+ for (let i = startIndex; i < operations.length; i++) {
247
+ const operation = operations[i]!;
248
+ currentMatrix = applyOperation(currentMatrix, operation);
249
+ newCache.push({
250
+ operation,
251
+ result: currentMatrix,
252
+ });
253
+ }
254
+
255
+ cacheRef.current = newCache;
256
+ prevOperationsRef.current = [...operations];
257
+
258
+ return currentMatrix;
259
+ }, [operations]);
260
+
261
+ return result;
262
+ };
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @file Clone a DOM element for preview while keeping SSR safe.
3
+ * Provides the cloned element as HTML string plus its measured size.
4
+ */
5
+ import * as React from "react";
6
+ import { useIsomorphicLayoutEffect } from "./useIsomorphicLayoutEffect";
7
+
8
+ const isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
9
+
10
+ export const useClonedElementPreview = (
11
+ sourceEl: HTMLElement | null,
12
+ ): { html: string | null; size: { width: number; height: number } | null } => {
13
+ const [size, setSize] = React.useState<{ width: number; height: number } | null>(null);
14
+ const [html, setHtml] = React.useState<string | null>(null);
15
+
16
+ useIsomorphicLayoutEffect(() => {
17
+ if (!isBrowser || !sourceEl) {
18
+ setSize(null);
19
+ setHtml(null);
20
+ return;
21
+ }
22
+ const rect = sourceEl.getBoundingClientRect();
23
+ setSize({ width: rect.width, height: rect.height });
24
+ setHtml(sourceEl.outerHTML);
25
+ }, [sourceEl]);
26
+
27
+ return { html, size };
28
+ };
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @file useContainerScroll - Track scroll position of a container or document
3
+ *
4
+ * Tracks scroll position for either a specific scroll container element
5
+ * or the document (when container is null).
6
+ */
7
+ import * as React from "react";
8
+
9
+ export type ScrollPosition = {
10
+ /** Vertical scroll position */
11
+ scrollTop: number;
12
+ /** Horizontal scroll position */
13
+ scrollLeft: number;
14
+ };
15
+
16
+ /**
17
+ * Track scroll position of a container element or the document.
18
+ *
19
+ * @param container - Scroll container element, or null for document scroll
20
+ * @returns Current scroll position
21
+ *
22
+ * @example
23
+ * ```tsx
24
+ * // For document scroll
25
+ * const scroll = useContainerScroll(null);
26
+ *
27
+ * // For container scroll
28
+ * const containerRef = useRef<HTMLDivElement>(null);
29
+ * const scroll = useContainerScroll(containerRef.current);
30
+ * ```
31
+ */
32
+ export function useContainerScroll(container: HTMLElement | null): ScrollPosition {
33
+ const [position, setPosition] = React.useState<ScrollPosition>(() => {
34
+ if (typeof window === "undefined") {
35
+ return { scrollTop: 0, scrollLeft: 0 };
36
+ }
37
+
38
+ if (container) {
39
+ return {
40
+ scrollTop: container.scrollTop,
41
+ scrollLeft: container.scrollLeft,
42
+ };
43
+ }
44
+
45
+ return {
46
+ scrollTop: window.scrollY,
47
+ scrollLeft: window.scrollX,
48
+ };
49
+ });
50
+
51
+ React.useEffect(() => {
52
+ const handleScroll = () => {
53
+ if (container) {
54
+ setPosition({
55
+ scrollTop: container.scrollTop,
56
+ scrollLeft: container.scrollLeft,
57
+ });
58
+ } else {
59
+ setPosition({
60
+ scrollTop: window.scrollY,
61
+ scrollLeft: window.scrollX,
62
+ });
63
+ }
64
+ };
65
+
66
+ // Initialize position
67
+ handleScroll();
68
+
69
+ const target = container ?? window;
70
+ target.addEventListener("scroll", handleScroll, { passive: true });
71
+
72
+ return () => {
73
+ target.removeEventListener("scroll", handleScroll);
74
+ };
75
+ }, [container]);
76
+
77
+ return position;
78
+ }