react-panel-layout 0.5.2 → 0.6.1

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 (541) hide show
  1. package/dist/{FloatingPanelFrame-lLg-Lpg7.js → FloatingPanelFrame-3eU9AwPo.js} +11 -11
  2. package/dist/{FloatingPanelFrame-lLg-Lpg7.js.map → FloatingPanelFrame-3eU9AwPo.js.map} +1 -1
  3. package/dist/{FloatingPanelFrame-D9Cp2al1.cjs → FloatingPanelFrame-CEmXDvUA.cjs} +2 -2
  4. package/dist/{FloatingPanelFrame-D9Cp2al1.cjs.map → FloatingPanelFrame-CEmXDvUA.cjs.map} +1 -1
  5. package/dist/FloatingWindow-CUXnEtrb.js +827 -0
  6. package/dist/FloatingWindow-CUXnEtrb.js.map +1 -0
  7. package/dist/FloatingWindow-DMwyK0eK.cjs +2 -0
  8. package/dist/FloatingWindow-DMwyK0eK.cjs.map +1 -0
  9. package/dist/GridLayout-DKTg_N61.cjs +2 -0
  10. package/dist/GridLayout-DKTg_N61.cjs.map +1 -0
  11. package/dist/GridLayout-UWNxXw77.js +926 -0
  12. package/dist/GridLayout-UWNxXw77.js.map +1 -0
  13. package/dist/HorizontalDivider-DdxzfV0l.js +30 -0
  14. package/dist/HorizontalDivider-DdxzfV0l.js.map +1 -0
  15. package/dist/HorizontalDivider-_pgV4Mcv.cjs +2 -0
  16. package/dist/HorizontalDivider-_pgV4Mcv.cjs.map +1 -0
  17. package/dist/PanelSystem-BqUzNtf2.js +1946 -0
  18. package/dist/PanelSystem-BqUzNtf2.js.map +1 -0
  19. package/dist/PanelSystem-D603LKKv.cjs +3 -0
  20. package/dist/PanelSystem-D603LKKv.cjs.map +1 -0
  21. package/dist/ResizeHandle-CBcAS918.cjs +2 -0
  22. package/dist/ResizeHandle-CBcAS918.cjs.map +1 -0
  23. package/dist/ResizeHandle-CXjc1meV.js +119 -0
  24. package/dist/ResizeHandle-CXjc1meV.js.map +1 -0
  25. package/dist/SwipePivotTabBar-DWrCuwEI.js +411 -0
  26. package/dist/SwipePivotTabBar-DWrCuwEI.js.map +1 -0
  27. package/dist/SwipePivotTabBar-fjjXkpj7.cjs +2 -0
  28. package/dist/SwipePivotTabBar-fjjXkpj7.cjs.map +1 -0
  29. package/dist/components/gesture/SwipeSafeZone.d.ts +40 -0
  30. package/dist/components/window/Drawer.d.ts +3 -1
  31. package/dist/components/window/DrawerLayers.d.ts +1 -1
  32. package/dist/components/window/drawerStyles.d.ts +69 -0
  33. package/dist/components/window/drawerSwipeConfig.d.ts +29 -0
  34. package/dist/components/window/useDrawerSwipeTransform.d.ts +23 -0
  35. package/dist/config.cjs +1 -1
  36. package/dist/config.cjs.map +1 -1
  37. package/dist/config.js +11 -9
  38. package/dist/config.js.map +1 -1
  39. package/dist/constants/styles.d.ts +35 -4
  40. package/dist/dialog/index.d.ts +69 -0
  41. package/dist/floating.cjs +1 -1
  42. package/dist/floating.js +1 -1
  43. package/dist/grid/index.d.ts +58 -0
  44. package/dist/grid.cjs +2 -0
  45. package/dist/grid.cjs.map +1 -0
  46. package/dist/grid.js +13 -0
  47. package/dist/grid.js.map +1 -0
  48. package/dist/hooks/gesture/presets.d.ts +33 -0
  49. package/dist/hooks/gesture/testing/createGestureSimulator.d.ts +117 -0
  50. package/dist/hooks/gesture/thresholdValue.d.ts +44 -0
  51. package/dist/hooks/gesture/types.d.ts +297 -0
  52. package/dist/hooks/gesture/useDirectionalLock.d.ts +20 -0
  53. package/dist/hooks/gesture/useEdgeSwipeInput.d.ts +23 -0
  54. package/dist/hooks/gesture/useNativeGestureGuard.d.ts +23 -0
  55. package/dist/hooks/gesture/usePointerTracking.d.ts +22 -0
  56. package/dist/hooks/gesture/useScrollBoundary.d.ts +23 -0
  57. package/dist/hooks/gesture/useSwipeInput.d.ts +5 -0
  58. package/dist/hooks/gesture/utils.d.ts +59 -0
  59. package/dist/hooks/useAnimatedVisibility.d.ts +58 -0
  60. package/dist/hooks/useAnimationFrame.d.ts +86 -0
  61. package/dist/hooks/useOperationContinuity.d.ts +64 -0
  62. package/dist/hooks/useResizeObserver.d.ts +33 -1
  63. package/dist/hooks/useSharedElementTransition.d.ts +112 -0
  64. package/dist/hooks/useSnapAnimation.d.ts +54 -0
  65. package/dist/hooks/useSwipeContentTransform.d.ts +86 -0
  66. package/dist/index.cjs +1 -2
  67. package/dist/index.cjs.map +1 -1
  68. package/dist/index.d.ts +0 -1
  69. package/dist/index.js +25 -2006
  70. package/dist/index.js.map +1 -1
  71. package/dist/modules/dialog/AlertDialog.d.ts +9 -0
  72. package/dist/modules/dialog/DialogContainer.d.ts +37 -0
  73. package/dist/modules/dialog/Modal.d.ts +26 -0
  74. package/dist/modules/dialog/SwipeDialogContainer.d.ts +16 -0
  75. package/dist/modules/dialog/dialogAnimationUtils.d.ts +113 -0
  76. package/dist/modules/dialog/types.d.ts +183 -0
  77. package/dist/modules/dialog/useDialog.d.ts +39 -0
  78. package/dist/modules/dialog/useDialogContainer.d.ts +47 -0
  79. package/dist/modules/dialog/useDialogSwipeInput.d.ts +70 -0
  80. package/dist/modules/dialog/useDialogTransform.d.ts +82 -0
  81. package/dist/modules/drawer/types.d.ts +74 -0
  82. package/dist/modules/drawer/useDrawerSwipeInput.d.ts +24 -0
  83. package/dist/modules/pivot/PivotContent.d.ts +1 -1
  84. package/dist/modules/pivot/SwipePivotContent.d.ts +39 -0
  85. package/dist/modules/pivot/SwipePivotContent.debug.tmp.d.ts +25 -0
  86. package/dist/modules/pivot/SwipePivotContent.test.d.ts +1 -0
  87. package/dist/modules/pivot/SwipePivotTabBar.d.ts +92 -0
  88. package/dist/modules/pivot/index.d.ts +3 -0
  89. package/dist/modules/pivot/scaleInputState.d.ts +37 -0
  90. package/dist/modules/pivot/types.d.ts +67 -2
  91. package/dist/modules/pivot/usePivotSwipeInput.d.ts +68 -0
  92. package/dist/modules/stack/StackContent.d.ts +15 -0
  93. package/dist/modules/stack/SwipeStackContent.d.ts +66 -0
  94. package/dist/modules/stack/SwipeStackOutlet.d.ts +80 -0
  95. package/dist/modules/stack/computeStackContentState.d.ts +99 -0
  96. package/dist/modules/stack/computeSwipeStackTransform.d.ts +76 -0
  97. package/dist/modules/stack/types.d.ts +194 -0
  98. package/dist/modules/stack/useStackAnimationState.d.ts +32 -0
  99. package/dist/modules/stack/useStackNavigation.d.ts +23 -0
  100. package/dist/modules/stack/useStackSwipeInput.d.ts +27 -0
  101. package/dist/panels/index.d.ts +67 -0
  102. package/dist/panels.cjs +2 -0
  103. package/dist/panels.cjs.map +1 -0
  104. package/dist/panels.js +28 -0
  105. package/dist/panels.js.map +1 -0
  106. package/dist/pivot/index.d.ts +3 -0
  107. package/dist/pivot.cjs +1 -1
  108. package/dist/pivot.cjs.map +1 -1
  109. package/dist/pivot.js +20 -2
  110. package/dist/pivot.js.map +1 -1
  111. package/dist/resizer/index.d.ts +57 -0
  112. package/dist/resizer.cjs +2 -0
  113. package/dist/resizer.cjs.map +1 -0
  114. package/dist/resizer.js +8 -0
  115. package/dist/resizer.js.map +1 -0
  116. package/dist/stack/index.d.ts +72 -0
  117. package/dist/stack.cjs +2 -0
  118. package/dist/stack.cjs.map +1 -0
  119. package/dist/stack.js +721 -0
  120. package/dist/stack.js.map +1 -0
  121. package/dist/sticky-header/StickyArea.d.ts +38 -0
  122. package/dist/sticky-header/calculateStickyMetrics.d.ts +28 -0
  123. package/dist/sticky-header/index.d.ts +4 -4
  124. package/dist/sticky-header/types.d.ts +35 -22
  125. package/dist/sticky-header.cjs +1 -1
  126. package/dist/sticky-header.cjs.map +1 -1
  127. package/dist/sticky-header.js +73 -174
  128. package/dist/sticky-header.js.map +1 -1
  129. package/dist/styles-NkjuMOVS.js +57 -0
  130. package/dist/styles-NkjuMOVS.js.map +1 -0
  131. package/dist/styles-qf6ptVLD.cjs +2 -0
  132. package/dist/styles-qf6ptVLD.cjs.map +1 -0
  133. package/dist/types.d.ts +16 -0
  134. package/dist/useContentCache-CO3LYNmz.js +24 -0
  135. package/dist/useContentCache-CO3LYNmz.js.map +1 -0
  136. package/dist/useContentCache-DqXtLrLs.cjs +2 -0
  137. package/dist/useContentCache-DqXtLrLs.cjs.map +1 -0
  138. package/dist/useDocumentPointerEvents-DXxw3qWj.js +54 -0
  139. package/dist/useDocumentPointerEvents-DXxw3qWj.js.map +1 -0
  140. package/dist/useDocumentPointerEvents-DxDSOtip.cjs +2 -0
  141. package/dist/useDocumentPointerEvents-DxDSOtip.cjs.map +1 -0
  142. package/dist/useFloatingState-C4kRaW_R.cjs +2 -0
  143. package/dist/useFloatingState-C4kRaW_R.cjs.map +1 -0
  144. package/dist/useFloatingState-tEfA_wbc.js +74 -0
  145. package/dist/useFloatingState-tEfA_wbc.js.map +1 -0
  146. package/dist/useNativeGestureGuard-C7TSqEkr.cjs +2 -0
  147. package/dist/useNativeGestureGuard-C7TSqEkr.cjs.map +1 -0
  148. package/dist/useNativeGestureGuard-CGYo6O0r.js +347 -0
  149. package/dist/useNativeGestureGuard-CGYo6O0r.js.map +1 -0
  150. package/dist/window/index.d.ts +63 -0
  151. package/dist/window.cjs +2 -0
  152. package/dist/window.cjs.map +1 -0
  153. package/dist/window.js +160 -0
  154. package/dist/window.js.map +1 -0
  155. package/docs/design-tokens.md +405 -0
  156. package/package.json +34 -4
  157. package/src/PanelSystemContext.tsx +88 -0
  158. package/src/components/gesture/SwipeSafeZone.tsx +69 -0
  159. package/src/components/grid/GridLayerList.tsx +172 -0
  160. package/src/components/grid/GridLayerResizeHandles.tsx +145 -0
  161. package/src/components/grid/GridLayout.spec.tsx +743 -0
  162. package/src/components/grid/GridLayout.tsx +130 -0
  163. package/src/components/grid/GridTrackResizeHandle.tsx +87 -0
  164. package/src/components/paneling/FloatingPanelFrame.tsx +203 -0
  165. package/src/components/panels/DropSuggestOverlay.tsx +131 -0
  166. package/src/components/panels/PanelGroupView.tsx +112 -0
  167. package/src/components/pivot/PivotLayer.tsx +27 -0
  168. package/src/components/resizer/HorizontalDivider.tsx +52 -0
  169. package/src/components/resizer/ResizeHandle.tsx +118 -0
  170. package/src/components/tabs/TabBar.tsx +223 -0
  171. package/src/components/tabs/TabBarTab.tsx +133 -0
  172. package/src/components/tabs/TabDragOverlay.tsx +92 -0
  173. package/src/components/window/DialogOverlay.tsx +180 -0
  174. package/src/components/window/Drawer.tsx +369 -0
  175. package/src/components/window/DrawerLayers.tsx +68 -0
  176. package/src/components/window/FloatingWindow.tsx +95 -0
  177. package/src/components/window/PopupLayerPortal.tsx +218 -0
  178. package/src/components/window/drawerStyles.spec.ts +263 -0
  179. package/src/components/window/drawerStyles.ts +228 -0
  180. package/src/components/window/drawerSwipeConfig.spec.ts +131 -0
  181. package/src/components/window/drawerSwipeConfig.ts +112 -0
  182. package/src/components/window/useDrawerSwipeTransform.spec.ts +234 -0
  183. package/src/components/window/useDrawerSwipeTransform.ts +129 -0
  184. package/src/config/PanelContentDeclaration.tsx +427 -0
  185. package/src/config/index.tsx +52 -0
  186. package/src/config/panelJsx.spec.tsx +54 -0
  187. package/src/config/panelJsxConfig.spec.tsx +54 -0
  188. package/src/config/panelJsxDrawer.spec.tsx +33 -0
  189. package/src/config/panelRouter.spec.ts +68 -0
  190. package/src/config/panelRouter.tsx +155 -0
  191. package/src/constants/styles.ts +280 -0
  192. package/src/demo/Layout.module.css +258 -0
  193. package/src/demo/Layout.tsx +176 -0
  194. package/src/demo/components/CodeBlock.module.css +54 -0
  195. package/src/demo/components/CodeBlock.tsx +34 -0
  196. package/src/demo/components/CodePreview.module.css +37 -0
  197. package/src/demo/components/CodePreview.tsx +31 -0
  198. package/src/demo/components/DataPreview.module.css +177 -0
  199. package/src/demo/components/DataPreview.tsx +115 -0
  200. package/src/demo/components/Story.module.css +68 -0
  201. package/src/demo/components/Story.tsx +54 -0
  202. package/src/demo/components/layout/CodePanel.module.css +183 -0
  203. package/src/demo/components/layout/CodePanel.tsx +149 -0
  204. package/src/demo/components/layout/DemoPage.module.css +60 -0
  205. package/src/demo/components/layout/DemoPage.tsx +56 -0
  206. package/src/demo/components/layout/SingleSamplePage.module.css +11 -0
  207. package/src/demo/components/layout/SingleSamplePage.tsx +35 -0
  208. package/src/demo/components/layout/SplitDemoLayout.module.css +107 -0
  209. package/src/demo/components/layout/SplitDemoLayout.tsx +218 -0
  210. package/src/demo/components/layout/index.ts +11 -0
  211. package/src/demo/components/tab-styles/ChromeTabBar.module.css +75 -0
  212. package/src/demo/components/tab-styles/ChromeTabBar.tsx +111 -0
  213. package/src/demo/components/tab-styles/GitHubTabBar.module.css +81 -0
  214. package/src/demo/components/tab-styles/GitHubTabBar.tsx +109 -0
  215. package/src/demo/components/tab-styles/VSCodeTabBar.module.css +78 -0
  216. package/src/demo/components/tab-styles/VSCodeTabBar.tsx +109 -0
  217. package/src/demo/components/tab-styles/index.ts +6 -0
  218. package/src/demo/components/ui/DemoButton.module.css +63 -0
  219. package/src/demo/components/ui/DemoButton.tsx +32 -0
  220. package/src/demo/components/ui/DemoCard.module.css +15 -0
  221. package/src/demo/components/ui/DemoCard.tsx +30 -0
  222. package/src/demo/components/ui/DemoContainer.module.css +17 -0
  223. package/src/demo/components/ui/DemoContainer.tsx +30 -0
  224. package/src/demo/components/ui/DemoPanel.module.css +23 -0
  225. package/src/demo/components/ui/DemoPanel.tsx +33 -0
  226. package/src/demo/components/ui/PanelText.module.css +18 -0
  227. package/src/demo/components/ui/PanelText.tsx +29 -0
  228. package/src/demo/components/ui/PanelTitle.module.css +18 -0
  229. package/src/demo/components/ui/PanelTitle.tsx +31 -0
  230. package/src/demo/contexts/TabbarDemoConfig.tsx +218 -0
  231. package/src/demo/demo.css +172 -0
  232. package/src/demo/hooks/useMedia.ts +41 -0
  233. package/src/demo/hooks/useShikiHighlight.ts +55 -0
  234. package/src/demo/index.tsx +293 -0
  235. package/src/demo/pages/Dialog/alerts/index.tsx +22 -0
  236. package/src/demo/pages/Dialog/card/index.tsx +22 -0
  237. package/src/demo/pages/Dialog/components/AlertDialogDemo.tsx +124 -0
  238. package/src/demo/pages/Dialog/components/CardExpandDemo.module.css +243 -0
  239. package/src/demo/pages/Dialog/components/CardExpandDemo.tsx +204 -0
  240. package/src/demo/pages/Dialog/components/CustomAlertDialogDemo.tsx +219 -0
  241. package/src/demo/pages/Dialog/components/DialogDemos.module.css +77 -0
  242. package/src/demo/pages/Dialog/components/ModalBasics.tsx +45 -0
  243. package/src/demo/pages/Dialog/components/SwipeDialogDemo.module.css +77 -0
  244. package/src/demo/pages/Dialog/components/SwipeDialogDemo.tsx +181 -0
  245. package/src/demo/pages/Dialog/custom-alert/index.tsx +22 -0
  246. package/src/demo/pages/Dialog/modal/index.tsx +17 -0
  247. package/src/demo/pages/Dialog/swipe/index.tsx +22 -0
  248. package/src/demo/pages/Drawer/animations/index.tsx +22 -0
  249. package/src/demo/pages/Drawer/basics/index.tsx +17 -0
  250. package/src/demo/pages/Drawer/components/DrawerAnimations.module.css +125 -0
  251. package/src/demo/pages/Drawer/components/DrawerAnimations.tsx +118 -0
  252. package/src/demo/pages/Drawer/components/DrawerBasics.module.css +55 -0
  253. package/src/demo/pages/Drawer/components/DrawerBasics.tsx +76 -0
  254. package/src/demo/pages/Drawer/components/DrawerMenuLayout.module.css +332 -0
  255. package/src/demo/pages/Drawer/components/DrawerMenuLayout.tsx +199 -0
  256. package/src/demo/pages/Drawer/components/DrawerSwipe.module.css +316 -0
  257. package/src/demo/pages/Drawer/components/DrawerSwipe.tsx +178 -0
  258. package/src/demo/pages/Drawer/menu/index.tsx +17 -0
  259. package/src/demo/pages/Drawer/swipe/index.tsx +17 -0
  260. package/src/demo/pages/FloatingPanelFrame/ResizableFloatingPanelsPreview.module.css +163 -0
  261. package/src/demo/pages/FloatingPanelFrame/ResizableFloatingPanelsPreview.tsx +234 -0
  262. package/src/demo/pages/FloatingPanelFrame/basic/index.tsx +17 -0
  263. package/src/demo/pages/FloatingPanelFrame/complex/index.tsx +26 -0
  264. package/src/demo/pages/FloatingPanelFrame/components/BasicPanel.module.css +16 -0
  265. package/src/demo/pages/FloatingPanelFrame/components/BasicPanel.tsx +24 -0
  266. package/src/demo/pages/FloatingPanelFrame/components/ComplexPanel.module.css +54 -0
  267. package/src/demo/pages/FloatingPanelFrame/components/ComplexPanel.tsx +67 -0
  268. package/src/demo/pages/FloatingPanelFrame/components/PanelWithControls.module.css +21 -0
  269. package/src/demo/pages/FloatingPanelFrame/components/PanelWithControls.tsx +41 -0
  270. package/src/demo/pages/FloatingPanelFrame/components/PanelWithMeta.module.css +5 -0
  271. package/src/demo/pages/FloatingPanelFrame/components/PanelWithMeta.tsx +43 -0
  272. package/src/demo/pages/FloatingPanelFrame/components/ScrollablePanel.module.css +11 -0
  273. package/src/demo/pages/FloatingPanelFrame/components/ScrollablePanel.tsx +42 -0
  274. package/src/demo/pages/FloatingPanelFrame/index.tsx +80 -0
  275. package/src/demo/pages/FloatingPanelFrame/scrollable/index.tsx +30 -0
  276. package/src/demo/pages/FloatingPanelFrame/with-controls/index.tsx +30 -0
  277. package/src/demo/pages/FloatingPanelFrame/with-meta/index.tsx +17 -0
  278. package/src/demo/pages/HorizontalDivider/components/PanelsWithRichContent.module.css +112 -0
  279. package/src/demo/pages/HorizontalDivider/components/PanelsWithRichContent.tsx +56 -0
  280. package/src/demo/pages/HorizontalDivider/components/SimpleResizablePanels.module.css +46 -0
  281. package/src/demo/pages/HorizontalDivider/components/SimpleResizablePanels.tsx +29 -0
  282. package/src/demo/pages/HorizontalDivider/components/ThreePanelLayout.module.css +54 -0
  283. package/src/demo/pages/HorizontalDivider/components/ThreePanelLayout.tsx +30 -0
  284. package/src/demo/pages/HorizontalDivider/index.module.css +14 -0
  285. package/src/demo/pages/HorizontalDivider/index.tsx +64 -0
  286. package/src/demo/pages/HorizontalDivider/panels-with-rich-content/index.tsx +21 -0
  287. package/src/demo/pages/HorizontalDivider/simple-resizable-panels/index.tsx +21 -0
  288. package/src/demo/pages/HorizontalDivider/three-panel-layout/index.tsx +21 -0
  289. package/src/demo/pages/PanelLayout/PanelLayoutDemo.module.css +174 -0
  290. package/src/demo/pages/PanelLayout/PanelLayoutDemo.tsx +248 -0
  291. package/src/demo/pages/PanelLayout/components/DashboardLayout.module.css +115 -0
  292. package/src/demo/pages/PanelLayout/components/DashboardLayout.tsx +124 -0
  293. package/src/demo/pages/PanelLayout/components/DraggableOverlays.module.css +101 -0
  294. package/src/demo/pages/PanelLayout/components/DraggableOverlays.tsx +122 -0
  295. package/src/demo/pages/PanelLayout/components/IDELayout.module.css +104 -0
  296. package/src/demo/pages/PanelLayout/components/IDELayout.tsx +143 -0
  297. package/src/demo/pages/PanelLayout/components/SimpleGrid.module.css +19 -0
  298. package/src/demo/pages/PanelLayout/components/SimpleGrid.tsx +62 -0
  299. package/src/demo/pages/PanelLayout/dashboard/index.tsx +22 -0
  300. package/src/demo/pages/PanelLayout/draggable-overlays/index.tsx +22 -0
  301. package/src/demo/pages/PanelLayout/ide-layout/index.tsx +22 -0
  302. package/src/demo/pages/PanelLayout/index.tsx +94 -0
  303. package/src/demo/pages/PanelLayout/simple-grid/index.tsx +22 -0
  304. package/src/demo/pages/PanelSystem/PanelSystemPreview.module.css +20 -0
  305. package/src/demo/pages/PanelSystem/PanelSystemPreview.tsx +101 -0
  306. package/src/demo/pages/PanelSystem/preview/index.tsx +18 -0
  307. package/src/demo/pages/PanelSystem/tabbar/index.tsx +129 -0
  308. package/src/demo/pages/Pivot/basics/index.tsx +17 -0
  309. package/src/demo/pages/Pivot/components/Pivot.module.css +278 -0
  310. package/src/demo/pages/Pivot/components/PivotBasics.tsx +103 -0
  311. package/src/demo/pages/Pivot/components/PivotSidebar.tsx +168 -0
  312. package/src/demo/pages/Pivot/components/PivotTabs.tsx +129 -0
  313. package/src/demo/pages/Pivot/components/PivotTransitions.tsx +120 -0
  314. package/src/demo/pages/Pivot/components/SwipePivot.module.css +114 -0
  315. package/src/demo/pages/Pivot/components/SwipePivot.tsx +193 -0
  316. package/src/demo/pages/Pivot/components/SwipeTabsPivot.module.css +203 -0
  317. package/src/demo/pages/Pivot/components/SwipeTabsPivot.tsx +320 -0
  318. package/src/demo/pages/Pivot/sidebar/index.tsx +17 -0
  319. package/src/demo/pages/Pivot/swipe/index.tsx +16 -0
  320. package/src/demo/pages/Pivot/swipe-debug/index.tsx +287 -0
  321. package/src/demo/pages/Pivot/swipe-tabs/index.tsx +15 -0
  322. package/src/demo/pages/Pivot/tabs/index.tsx +17 -0
  323. package/src/demo/pages/Pivot/transitions/index.tsx +17 -0
  324. package/src/demo/pages/ResizeHandle/both-directions/index.tsx +17 -0
  325. package/src/demo/pages/ResizeHandle/components/BothDirectionsDemo.module.css +72 -0
  326. package/src/demo/pages/ResizeHandle/components/BothDirectionsDemo.tsx +41 -0
  327. package/src/demo/pages/ResizeHandle/components/HorizontalResizeDemo.module.css +61 -0
  328. package/src/demo/pages/ResizeHandle/components/HorizontalResizeDemo.tsx +33 -0
  329. package/src/demo/pages/ResizeHandle/components/NestedPanelsDemo.module.css +83 -0
  330. package/src/demo/pages/ResizeHandle/components/NestedPanelsDemo.tsx +53 -0
  331. package/src/demo/pages/ResizeHandle/components/VerticalResizeDemo.module.css +68 -0
  332. package/src/demo/pages/ResizeHandle/components/VerticalResizeDemo.tsx +33 -0
  333. package/src/demo/pages/ResizeHandle/horizontal/index.tsx +17 -0
  334. package/src/demo/pages/ResizeHandle/index.module.css +11 -0
  335. package/src/demo/pages/ResizeHandle/index.tsx +71 -0
  336. package/src/demo/pages/ResizeHandle/nested-panels/index.tsx +17 -0
  337. package/src/demo/pages/ResizeHandle/vertical/index.tsx +17 -0
  338. package/src/demo/pages/ResponsiveLayout/adaptive-workspace/index.tsx +22 -0
  339. package/src/demo/pages/ResponsiveLayout/components/ResponsiveWorkspace.module.css +423 -0
  340. package/src/demo/pages/ResponsiveLayout/components/ResponsiveWorkspace.tsx +398 -0
  341. package/src/demo/pages/Stack/basics/index.tsx +22 -0
  342. package/src/demo/pages/Stack/components/Stack.module.css +234 -0
  343. package/src/demo/pages/Stack/components/StackBasics.spec.tsx +152 -0
  344. package/src/demo/pages/Stack/components/StackBasics.tsx +301 -0
  345. package/src/demo/pages/Stack/components/StackTablet.module.css +299 -0
  346. package/src/demo/pages/Stack/components/StackTablet.spec.tsx +120 -0
  347. package/src/demo/pages/Stack/components/StackTablet.tsx +422 -0
  348. package/src/demo/pages/Stack/tablet/index.tsx +22 -0
  349. package/src/demo/pages/StickyHeader/basics/index.tsx +17 -0
  350. package/src/demo/pages/StickyHeader/components/StickyHeader.module.css +219 -0
  351. package/src/demo/pages/StickyHeader/components/StickyHeaderBasics.tsx +103 -0
  352. package/src/demo/routes.tsx +214 -0
  353. package/src/demo/styles/animations.css +68 -0
  354. package/src/demo/styles/stack-themes.css +35 -0
  355. package/src/demo/utils/createPanelView.tsx +58 -0
  356. package/src/dialog/index.ts +85 -0
  357. package/src/floating/index.ts +24 -0
  358. package/src/grid/index.ts +75 -0
  359. package/src/hooks/ContentCacheContext.tsx +87 -0
  360. package/src/hooks/gesture/presets.spec.ts +86 -0
  361. package/src/hooks/gesture/presets.ts +95 -0
  362. package/src/hooks/gesture/testing/createGestureSimulator.spec.ts +241 -0
  363. package/src/hooks/gesture/testing/createGestureSimulator.ts +385 -0
  364. package/src/hooks/gesture/thresholdValue.spec.ts +103 -0
  365. package/src/hooks/gesture/thresholdValue.ts +77 -0
  366. package/src/hooks/gesture/types.ts +367 -0
  367. package/src/hooks/gesture/useDirectionalLock.spec.ts +271 -0
  368. package/src/hooks/gesture/useDirectionalLock.ts +115 -0
  369. package/src/hooks/gesture/useEdgeSwipeInput.spec.ts +462 -0
  370. package/src/hooks/gesture/useEdgeSwipeInput.ts +131 -0
  371. package/src/hooks/gesture/useNativeGestureGuard.spec.ts +473 -0
  372. package/src/hooks/gesture/useNativeGestureGuard.ts +135 -0
  373. package/src/hooks/gesture/usePointerTracking.spec.ts +364 -0
  374. package/src/hooks/gesture/usePointerTracking.ts +134 -0
  375. package/src/hooks/gesture/useScrollBoundary.spec.ts +249 -0
  376. package/src/hooks/gesture/useScrollBoundary.ts +113 -0
  377. package/src/hooks/gesture/useSwipeInput.spec.ts +592 -0
  378. package/src/hooks/gesture/useSwipeInput.ts +310 -0
  379. package/src/hooks/gesture/utils.spec.ts +152 -0
  380. package/src/hooks/gesture/utils.ts +178 -0
  381. package/src/hooks/useAnimatedVisibility.spec.ts +277 -0
  382. package/src/hooks/useAnimatedVisibility.ts +172 -0
  383. package/src/hooks/useAnimationFrame.ts +208 -0
  384. package/src/hooks/useCSSMatrix.spec.ts +214 -0
  385. package/src/hooks/useCSSMatrix.ts +262 -0
  386. package/src/hooks/useClonedElementPreview.ts +28 -0
  387. package/src/hooks/useContainerScroll.ts +78 -0
  388. package/src/hooks/useContentCache.spec.tsx +232 -0
  389. package/src/hooks/useContentCache.tsx +127 -0
  390. package/src/hooks/useDocumentPointerEvents.ts +137 -0
  391. package/src/hooks/useDocumentScroll.ts +41 -0
  392. package/src/hooks/useEffectEvent.ts +40 -0
  393. package/src/hooks/useElementComponentWrapper.tsx +63 -0
  394. package/src/hooks/useIntersectionObserver.tsx +125 -0
  395. package/src/hooks/useIsomorphicLayoutEffect.ts +29 -0
  396. package/src/hooks/useOperationContinuity.spec.ts +387 -0
  397. package/src/hooks/useOperationContinuity.ts +135 -0
  398. package/src/hooks/useResizeObserver.spec.tsx +277 -0
  399. package/src/hooks/useResizeObserver.tsx +150 -0
  400. package/src/hooks/useScrollContainer.ts +73 -0
  401. package/src/hooks/useSharedElementTransition.ts +333 -0
  402. package/src/hooks/useSnapAnimation.ts +128 -0
  403. package/src/hooks/useSwipeContentTransform.spec.ts +133 -0
  404. package/src/hooks/useSwipeContentTransform.ts +373 -0
  405. package/src/hooks/useTransitionState.ts +95 -0
  406. package/src/index.tsx +88 -0
  407. package/src/modules/dialog/AlertDialog.spec.tsx +387 -0
  408. package/src/modules/dialog/AlertDialog.tsx +221 -0
  409. package/src/modules/dialog/DialogContainer.spec.tsx +228 -0
  410. package/src/modules/dialog/DialogContainer.tsx +188 -0
  411. package/src/modules/dialog/Modal.spec.tsx +220 -0
  412. package/src/modules/dialog/Modal.tsx +182 -0
  413. package/src/modules/dialog/SwipeDialogContainer.tsx +208 -0
  414. package/src/modules/dialog/dialogAnimationUtils.spec.ts +253 -0
  415. package/src/modules/dialog/dialogAnimationUtils.ts +297 -0
  416. package/src/modules/dialog/types.ts +186 -0
  417. package/src/modules/dialog/useDialog.spec.tsx +447 -0
  418. package/src/modules/dialog/useDialog.ts +214 -0
  419. package/src/modules/dialog/useDialogContainer.spec.ts +331 -0
  420. package/src/modules/dialog/useDialogContainer.ts +150 -0
  421. package/src/modules/dialog/useDialogSwipeInput.spec.ts +157 -0
  422. package/src/modules/dialog/useDialogSwipeInput.ts +319 -0
  423. package/src/modules/dialog/useDialogTransform.spec.ts +370 -0
  424. package/src/modules/dialog/useDialogTransform.ts +407 -0
  425. package/src/modules/drawer/types.ts +102 -0
  426. package/src/modules/drawer/useDrawerSwipeInput.spec.ts +566 -0
  427. package/src/modules/drawer/useDrawerSwipeInput.ts +399 -0
  428. package/src/modules/grid/GridLayoutContext.tsx +57 -0
  429. package/src/modules/grid/LayerInstanceContext.tsx +56 -0
  430. package/src/modules/grid/resizeHandles.ts +157 -0
  431. package/src/modules/grid/trackUtils.ts +146 -0
  432. package/src/modules/grid/useGridPlacements.ts +143 -0
  433. package/src/modules/grid/useGridTracks.ts +156 -0
  434. package/src/modules/grid/useLayerDragHandle.ts +16 -0
  435. package/src/modules/grid/useLayerInteractions.tsx +850 -0
  436. package/src/modules/keybindings/KeybindingsProvider.tsx +111 -0
  437. package/src/modules/panels/dom/DomRegistry.tsx +94 -0
  438. package/src/modules/panels/index.ts +45 -0
  439. package/src/modules/panels/interactions/InteractionsContext.test.tsx +330 -0
  440. package/src/modules/panels/interactions/InteractionsContext.tsx +394 -0
  441. package/src/modules/panels/interactions/dnd.ts +28 -0
  442. package/src/modules/panels/keybindings/KeybindingsInstaller.tsx +15 -0
  443. package/src/modules/panels/layout/adapter.ts +124 -0
  444. package/src/modules/panels/rendering/ContentRegistry.spec.tsx +311 -0
  445. package/src/modules/panels/rendering/ContentRegistry.tsx +205 -0
  446. package/src/modules/panels/rendering/GroupContainer.tsx +65 -0
  447. package/src/modules/panels/rendering/RenderBridge.tsx +115 -0
  448. package/src/modules/panels/rendering/RenderContext.tsx +31 -0
  449. package/src/modules/panels/state/PanelSplitHandles.tsx +147 -0
  450. package/src/modules/panels/state/PanelSystemContext.splitLimits.spec.tsx +50 -0
  451. package/src/modules/panels/state/PanelSystemContext.tsx +289 -0
  452. package/src/modules/panels/state/StateContext.tsx +12 -0
  453. package/src/modules/panels/state/cleanup.ts +37 -0
  454. package/src/modules/panels/state/commands.ts +53 -0
  455. package/src/modules/panels/state/focus/Context.tsx +25 -0
  456. package/src/modules/panels/state/focus/logic.ts +57 -0
  457. package/src/modules/panels/state/groups/Context.tsx +25 -0
  458. package/src/modules/panels/state/groups/logic.ts +105 -0
  459. package/src/modules/panels/state/splitLimits.spec.ts +46 -0
  460. package/src/modules/panels/state/splitLimits.ts +90 -0
  461. package/src/modules/panels/state/state.spec.ts +49 -0
  462. package/src/modules/panels/state/tree/Context.tsx +24 -0
  463. package/src/modules/panels/state/tree/logic.spec.ts +34 -0
  464. package/src/modules/panels/state/tree/logic.ts +138 -0
  465. package/src/modules/panels/state/types.ts +142 -0
  466. package/src/modules/panels/system/PanelSystem.empty-tabbar.spec.tsx +53 -0
  467. package/src/modules/panels/system/PanelSystem.tab-click-activates.spec.tsx +44 -0
  468. package/src/modules/panels/system/PanelSystem.tab-reorder.spec.tsx +64 -0
  469. package/src/modules/panels/system/PanelSystem.tabs-no-dup.spec.tsx +57 -0
  470. package/src/modules/panels/system/PanelSystem.tsx +206 -0
  471. package/src/modules/pivot/PivotContent.spec.tsx +179 -0
  472. package/src/modules/pivot/PivotContent.tsx +77 -0
  473. package/src/modules/pivot/SwipePivotContent.debug.tmp.tsx +237 -0
  474. package/src/modules/pivot/SwipePivotContent.position.spec.tsx +171 -0
  475. package/src/modules/pivot/SwipePivotContent.spec.tsx +494 -0
  476. package/src/modules/pivot/SwipePivotContent.test.tsx +502 -0
  477. package/src/modules/pivot/SwipePivotContent.tsx +197 -0
  478. package/src/modules/pivot/SwipePivotTabBar.spec.tsx +882 -0
  479. package/src/modules/pivot/SwipePivotTabBar.tsx +583 -0
  480. package/src/modules/pivot/index.ts +8 -0
  481. package/src/modules/pivot/scaleInputState.spec.ts +219 -0
  482. package/src/modules/pivot/scaleInputState.ts +66 -0
  483. package/src/modules/pivot/types.ts +139 -0
  484. package/src/modules/pivot/usePivot.spec.ts +635 -0
  485. package/src/modules/pivot/usePivot.spec.tsx +186 -0
  486. package/src/modules/pivot/usePivot.tsx +345 -0
  487. package/src/modules/pivot/usePivotSwipeInput.spec.ts +708 -0
  488. package/src/modules/pivot/usePivotSwipeInput.ts +136 -0
  489. package/src/modules/resizer/useResizeDrag.ts +94 -0
  490. package/src/modules/stack/StackContent.spec.tsx +264 -0
  491. package/src/modules/stack/StackContent.tsx +111 -0
  492. package/src/modules/stack/SwipeStackContent.spec.tsx +1564 -0
  493. package/src/modules/stack/SwipeStackContent.tsx +366 -0
  494. package/src/modules/stack/SwipeStackOutlet.spec.tsx +250 -0
  495. package/src/modules/stack/SwipeStackOutlet.tsx +221 -0
  496. package/src/modules/stack/computeStackContentState.spec.ts +281 -0
  497. package/src/modules/stack/computeStackContentState.ts +304 -0
  498. package/src/modules/stack/computeSwipeStackTransform.spec.ts +186 -0
  499. package/src/modules/stack/computeSwipeStackTransform.ts +145 -0
  500. package/src/modules/stack/swipeTransitionContinuity.spec.tsx +1133 -0
  501. package/src/modules/stack/types.ts +226 -0
  502. package/src/modules/stack/useStackAnimationState.spec.ts +188 -0
  503. package/src/modules/stack/useStackAnimationState.ts +143 -0
  504. package/src/modules/stack/useStackNavigation.spec.ts +672 -0
  505. package/src/modules/stack/useStackNavigation.tsx +393 -0
  506. package/src/modules/stack/useStackSwipeInput.spec.ts +309 -0
  507. package/src/modules/stack/useStackSwipeInput.ts +139 -0
  508. package/src/modules/window/useDrawerState.ts +81 -0
  509. package/src/modules/window/useFloatingState.spec.ts +252 -0
  510. package/src/modules/window/useFloatingState.ts +141 -0
  511. package/src/panels/index.ts +119 -0
  512. package/src/pivot/index.ts +19 -0
  513. package/src/resizer/index.ts +68 -0
  514. package/src/stack/index.ts +91 -0
  515. package/src/sticky-header/StickyArea.tsx +193 -0
  516. package/src/sticky-header/calculateStickyMetrics.spec.ts +105 -0
  517. package/src/sticky-header/calculateStickyMetrics.ts +50 -0
  518. package/src/sticky-header/index.ts +18 -0
  519. package/src/sticky-header/types.ts +68 -0
  520. package/src/types.ts +341 -0
  521. package/src/utils/CSSMatrix.ts +321 -0
  522. package/src/utils/css.ts +65 -0
  523. package/src/utils/dialogUtils.ts +43 -0
  524. package/src/utils/math.ts +18 -0
  525. package/src/utils/polyfills/createDialogPolyfill.ts +18 -0
  526. package/src/utils/typedActions.ts +103 -0
  527. package/src/vite-env.d.ts +6 -0
  528. package/src/window/index.ts +69 -0
  529. package/dist/GridLayout-BQQ63eA1.cjs +0 -2
  530. package/dist/GridLayout-BQQ63eA1.cjs.map +0 -1
  531. package/dist/GridLayout-CJTKq7Mp.js +0 -1465
  532. package/dist/GridLayout-CJTKq7Mp.js.map +0 -1
  533. package/dist/sticky-header/StickyHeader.d.ts +0 -53
  534. package/dist/styles-CA2_zLZt.js +0 -52
  535. package/dist/styles-CA2_zLZt.js.map +0 -1
  536. package/dist/styles-PsqGOEJP.cjs +0 -2
  537. package/dist/styles-PsqGOEJP.cjs.map +0 -1
  538. package/dist/usePivot-7ctin_P_.cjs +0 -2
  539. package/dist/usePivot-7ctin_P_.cjs.map +0 -1
  540. package/dist/usePivot-CgQxB8rc.js +0 -124
  541. package/dist/usePivot-CgQxB8rc.js.map +0 -1
@@ -0,0 +1,373 @@
1
+ /**
2
+ * @file Shared hook for DOM-based swipe content transform.
3
+ *
4
+ * This hook provides immediate DOM manipulation for swipe gestures,
5
+ * with smooth snap-back animation when the swipe ends.
6
+ *
7
+ * Used by both Pivot and Stack for consistent swipe behavior.
8
+ */
9
+ import * as React from "react";
10
+ import { useAnimationFrame, interpolate, easings } from "./useAnimationFrame.js";
11
+ import type { GestureAxis } from "./gesture/types.js";
12
+
13
+ const DEFAULT_ANIMATION_DURATION = 300;
14
+
15
+ /**
16
+ * Options for useSwipeContentTransform hook.
17
+ */
18
+ export type UseSwipeContentTransformOptions = {
19
+ /** Ref to the element to transform */
20
+ elementRef: React.RefObject<HTMLElement | null>;
21
+ /** Target position in pixels (where element should be at rest) */
22
+ targetPx: number;
23
+ /** Current swipe displacement in pixels */
24
+ displacement: number;
25
+ /** Whether swipe gesture is active */
26
+ isOperating: boolean;
27
+ /** Axis of transformation */
28
+ axis?: GestureAxis;
29
+ /** Duration of snap animation in ms */
30
+ animationDuration?: number;
31
+ /** Container size in pixels (used for snap on resize) */
32
+ containerSize?: number;
33
+ /**
34
+ * Whether to animate when targetPx changes (without swipe).
35
+ * Use this for tab bar animations triggered by click/button.
36
+ * @default false
37
+ */
38
+ animateOnTargetChange?: boolean;
39
+ /**
40
+ * Initial position in pixels when first mounted.
41
+ * If different from targetPx, will animate from initialPx to targetPx.
42
+ * Use this for push animations where new panel comes from off-screen.
43
+ */
44
+ initialPx?: number;
45
+ /**
46
+ * Skip animation when targetPx changes.
47
+ * Use this when the target changed during an operation (from useOperationContinuity).
48
+ * When true, target changes will snap instead of animate.
49
+ * @default false
50
+ */
51
+ skipTargetChangeAnimation?: boolean;
52
+ };
53
+
54
+ /**
55
+ * Animation direction information.
56
+ */
57
+ export type AnimationDirection = {
58
+ /** Source position in pixels */
59
+ from: number;
60
+ /** Target position in pixels */
61
+ to: number;
62
+ };
63
+
64
+ /**
65
+ * Result from useSwipeContentTransform hook.
66
+ */
67
+ export type UseSwipeContentTransformResult = {
68
+ /** Whether snap animation is currently running */
69
+ isAnimating: boolean;
70
+ /** Current position in pixels (for visibility calculations) */
71
+ currentPx: number;
72
+ /** Animation direction info, or null if not animating */
73
+ animationDirection: AnimationDirection | null;
74
+ };
75
+
76
+ /**
77
+ * Get CSS transform function name for axis.
78
+ */
79
+ const getTransformFn = (axis: GestureAxis): "translateX" | "translateY" => {
80
+ return axis === "horizontal" ? "translateX" : "translateY";
81
+ };
82
+
83
+ /**
84
+ * Check if initial mount animation should be scheduled.
85
+ * Returns animation info if conditions are met, null otherwise.
86
+ *
87
+ * Conditions for scheduling:
88
+ * 1. Animation not already consumed
89
+ * 2. containerSize is valid (> 0) - handles React effect execution order
90
+ * 3. initialPx is provided
91
+ * 4. initialPx differs from targetPx
92
+ */
93
+ const computeInitialMountAnimation = (
94
+ hasConsumed: boolean,
95
+ containerSize: number | undefined,
96
+ initialPx: number | undefined,
97
+ targetPx: number,
98
+ ): { from: number; to: number } | null => {
99
+ if (hasConsumed) {
100
+ return null;
101
+ }
102
+ if (containerSize === undefined) {
103
+ return null;
104
+ }
105
+ if (containerSize <= 0) {
106
+ return null;
107
+ }
108
+ if (initialPx === undefined) {
109
+ return null;
110
+ }
111
+ if (initialPx === targetPx) {
112
+ return null;
113
+ }
114
+ return { from: initialPx, to: targetPx };
115
+ };
116
+
117
+ /**
118
+ * Result type for target change handling.
119
+ */
120
+ type TargetChangeResult =
121
+ | { type: "animate"; animation: { from: number; to: number } }
122
+ | { type: "snap"; position: number }
123
+ | { type: "none" };
124
+
125
+ /**
126
+ * Compute action for target position change when not swiping.
127
+ * Returns the appropriate action: animate, snap, or none.
128
+ *
129
+ * @param skipAnimation - If true, skip animation and snap directly.
130
+ * Use this when the target changed during an operation (from useOperationContinuity).
131
+ */
132
+ const computeTargetChangeAction = (
133
+ targetPx: number,
134
+ prevTargetPx: number,
135
+ currentPx: number,
136
+ isOperating: boolean,
137
+ isAnimating: boolean,
138
+ animateOnTargetChange: boolean,
139
+ skipAnimation: boolean,
140
+ ): TargetChangeResult => {
141
+ if (targetPx === prevTargetPx) {
142
+ return { type: "none" };
143
+ }
144
+ if (isOperating) {
145
+ return { type: "none" };
146
+ }
147
+ if (isAnimating) {
148
+ return { type: "none" };
149
+ }
150
+ if (!animateOnTargetChange) {
151
+ return { type: "snap", position: targetPx };
152
+ }
153
+
154
+ const distance = Math.abs(currentPx - targetPx);
155
+ if (distance <= 1) {
156
+ return { type: "snap", position: targetPx };
157
+ }
158
+
159
+ // Skip animation if requested (e.g., role changed during operation)
160
+ // This prevents unwanted animations after an operation ends.
161
+ // However, allow forward animations (currentPx < targetPx) for normal swipe-to-complete.
162
+ // Only skip backward animations (currentPx > targetPx) which occur during over-swipe.
163
+ if (skipAnimation) {
164
+ // Backward direction (over-swipe): snap, don't animate backward
165
+ if (currentPx > targetPx) {
166
+ return { type: "snap", position: targetPx };
167
+ }
168
+ // Forward direction (normal swipe-to-complete): animate from current position
169
+ return { type: "animate", animation: { from: currentPx, to: targetPx } };
170
+ }
171
+
172
+ return { type: "animate", animation: { from: currentPx, to: targetPx } };
173
+ };
174
+
175
+ /**
176
+ * Check if container size change requires position snap.
177
+ * Returns the new position to snap to, or null if no snap needed.
178
+ */
179
+ const computeContainerResizeSnap = (
180
+ containerSize: number | undefined,
181
+ prevContainerSize: number | undefined,
182
+ targetPx: number,
183
+ ): number | null => {
184
+ if (containerSize === undefined) {
185
+ return null;
186
+ }
187
+ if (containerSize === prevContainerSize) {
188
+ return null;
189
+ }
190
+ if (containerSize <= 0) {
191
+ return null;
192
+ }
193
+ return targetPx;
194
+ };
195
+
196
+ /**
197
+ * Hook for DOM-based swipe content transform.
198
+ *
199
+ * During swipe: immediately updates element.style.transform to follow finger.
200
+ * After swipe: animates from current position to target position.
201
+ *
202
+ * @example
203
+ * ```tsx
204
+ * const containerRef = useRef<HTMLDivElement>(null);
205
+ * const { isAnimating, currentPx } = useSwipeContentTransform({
206
+ * elementRef: containerRef,
207
+ * targetPx: 0,
208
+ * displacement: inputState.displacement.x,
209
+ * isOperating: inputState.phase === "swiping",
210
+ * });
211
+ * ```
212
+ */
213
+ export function useSwipeContentTransform(
214
+ options: UseSwipeContentTransformOptions,
215
+ ): UseSwipeContentTransformResult {
216
+ const {
217
+ elementRef,
218
+ targetPx,
219
+ displacement,
220
+ isOperating,
221
+ axis = "horizontal",
222
+ animationDuration = DEFAULT_ANIMATION_DURATION,
223
+ containerSize,
224
+ animateOnTargetChange = false,
225
+ initialPx,
226
+ skipTargetChangeAnimation = false,
227
+ } = options;
228
+
229
+ // Use initialPx if provided, otherwise use targetPx
230
+ const effectiveInitialPx = initialPx ?? targetPx;
231
+ const currentPxRef = React.useRef<number>(effectiveInitialPx);
232
+ const animRef = React.useRef<{ from: number; to: number } | null>(null);
233
+ const prevTargetPxRef = React.useRef<number>(targetPx);
234
+ const prevContainerSizeRef = React.useRef<number | undefined>(containerSize);
235
+ const pendingAnimationRef = React.useRef<{ from: number; to: number } | null>(null);
236
+ // Track if initial mount animation has been consumed
237
+ const hasConsumedInitialMountRef = React.useRef<boolean>(false);
238
+
239
+ // Schedule animation on first mount if initialPx differs from targetPx.
240
+ const initialMountAnimation = computeInitialMountAnimation(
241
+ hasConsumedInitialMountRef.current,
242
+ containerSize,
243
+ initialPx,
244
+ targetPx,
245
+ );
246
+ if (initialMountAnimation !== null) {
247
+ pendingAnimationRef.current = initialMountAnimation;
248
+ hasConsumedInitialMountRef.current = true;
249
+ }
250
+
251
+ // Handle target changes when not swiping
252
+ const targetChangeAction = computeTargetChangeAction(
253
+ targetPx,
254
+ prevTargetPxRef.current,
255
+ currentPxRef.current,
256
+ isOperating,
257
+ animRef.current !== null,
258
+ animateOnTargetChange,
259
+ skipTargetChangeAnimation,
260
+ );
261
+ if (targetChangeAction.type === "animate") {
262
+ pendingAnimationRef.current = targetChangeAction.animation;
263
+ prevTargetPxRef.current = targetPx;
264
+ } else if (targetChangeAction.type === "snap") {
265
+ currentPxRef.current = targetChangeAction.position;
266
+ prevTargetPxRef.current = targetPx;
267
+ }
268
+
269
+ // Snap when container size changes (resize)
270
+ const resizeSnapPosition = computeContainerResizeSnap(
271
+ containerSize,
272
+ prevContainerSizeRef.current,
273
+ targetPx,
274
+ );
275
+ if (resizeSnapPosition !== null) {
276
+ currentPxRef.current = resizeSnapPosition;
277
+ prevContainerSizeRef.current = containerSize;
278
+ }
279
+
280
+ // Animation frame handler
281
+ const handleFrame = React.useCallback(
282
+ ({ easedProgress }: { easedProgress: number }) => {
283
+ const element = elementRef.current;
284
+ const anim = animRef.current;
285
+ if (!element || !anim) {
286
+ return;
287
+ }
288
+ const value = interpolate(anim.from, anim.to, easedProgress);
289
+ currentPxRef.current = value;
290
+ element.style.transform = `${getTransformFn(axis)}(${value}px)`;
291
+ },
292
+ [axis, elementRef],
293
+ );
294
+
295
+ const handleComplete = React.useCallback(() => {
296
+ animRef.current = null;
297
+ currentPxRef.current = targetPx;
298
+ prevTargetPxRef.current = targetPx;
299
+ }, [targetPx]);
300
+
301
+ const { isAnimating, start, cancel } = useAnimationFrame({
302
+ duration: animationDuration,
303
+ easing: easings.easeOutExpo,
304
+ onFrame: handleFrame,
305
+ onComplete: handleComplete,
306
+ });
307
+
308
+ // When swipe ends or target changes with animateOnTargetChange, animate to target
309
+ React.useLayoutEffect(() => {
310
+ if (isOperating) {
311
+ cancel();
312
+ animRef.current = null;
313
+ pendingAnimationRef.current = null;
314
+ return;
315
+ }
316
+
317
+ // Check for pending animation (from target change or initial mount)
318
+ if (pendingAnimationRef.current) {
319
+ const pending = pendingAnimationRef.current;
320
+ animRef.current = pending;
321
+ pendingAnimationRef.current = null;
322
+ // Set initial position before animation starts
323
+ const element = elementRef.current;
324
+ if (element) {
325
+ element.style.transform = `${getTransformFn(axis)}(${pending.from}px)`;
326
+ }
327
+ start();
328
+ return;
329
+ }
330
+
331
+ const currentPx = currentPxRef.current;
332
+ const distance = Math.abs(currentPx - targetPx);
333
+
334
+ if (distance > 1) {
335
+ // Need to animate from current to target
336
+ animRef.current = { from: currentPx, to: targetPx };
337
+ start();
338
+ } else {
339
+ // Close enough, snap directly
340
+ currentPxRef.current = targetPx;
341
+ prevTargetPxRef.current = targetPx;
342
+ }
343
+ }, [isOperating, targetPx, start, cancel]);
344
+
345
+ // Direct DOM update during swipe
346
+ React.useLayoutEffect(() => {
347
+ const element = elementRef.current;
348
+ if (!element) {
349
+ return;
350
+ }
351
+
352
+ // Skip if animation is running, about to start, or pending
353
+ if (isAnimating) {
354
+ return;
355
+ }
356
+ if (animRef.current !== null) {
357
+ return;
358
+ }
359
+ if (pendingAnimationRef.current !== null) {
360
+ return;
361
+ }
362
+
363
+ const displayPx = targetPx + displacement;
364
+ currentPxRef.current = displayPx;
365
+ element.style.transform = `${getTransformFn(axis)}(${displayPx}px)`;
366
+ }, [targetPx, displacement, axis, isAnimating, elementRef]);
367
+
368
+ return {
369
+ isAnimating,
370
+ currentPx: currentPxRef.current,
371
+ animationDirection: animRef.current,
372
+ };
373
+ }
@@ -0,0 +1,95 @@
1
+ /**
2
+ * @file Generic transition state management with animation support.
3
+ */
4
+ import * as React from "react";
5
+
6
+ export type TransitionMode = "none" | "css";
7
+
8
+ export type TransitionOptions = {
9
+ mode?: TransitionMode;
10
+ element?: React.RefObject<HTMLElement>;
11
+ duration?: number;
12
+ };
13
+
14
+ export type UseTransitionStateOptions = {
15
+ onOpen?: (id: string) => void;
16
+ onClose?: (id: string) => void;
17
+ onTransitionEnd?: (id: string, isOpen: boolean) => void;
18
+ };
19
+
20
+ const waitForTransitionEnd = (el: HTMLElement, timeout: number): Promise<void> =>
21
+ new Promise((resolve) => {
22
+ // eslint-disable-next-line no-restricted-syntax -- mutable flag needed for deduplication
23
+ let resolved = false;
24
+ const done = () => {
25
+ if (resolved) {return;}
26
+ resolved = true;
27
+ el.removeEventListener("transitionend", handler);
28
+ resolve();
29
+ };
30
+ const handler = (e: TransitionEvent) => {
31
+ if (e.target === el) {done();}
32
+ };
33
+ el.addEventListener("transitionend", handler);
34
+ setTimeout(done, timeout + 50);
35
+ });
36
+
37
+ export const runTransition = async (
38
+ update: () => void,
39
+ mode: TransitionMode,
40
+ el: HTMLElement | null | undefined,
41
+ duration: number,
42
+ ): Promise<void> => {
43
+ switch (mode) {
44
+ case "none":
45
+ update();
46
+ return;
47
+
48
+ case "css":
49
+ update();
50
+ if (el) {await waitForTransitionEnd(el, duration);}
51
+ return;
52
+ }
53
+ };
54
+
55
+ export const useTransitionState = (options?: UseTransitionStateOptions) => {
56
+ const [states, setStates] = React.useState<Record<string, boolean>>({});
57
+ const optionsRef = React.useRef(options);
58
+ optionsRef.current = options;
59
+
60
+ const update = React.useCallback(
61
+ async (id: string, isOpen: boolean, transitionOptions?: TransitionOptions) => {
62
+ const { mode = "none", element, duration = 300 } = transitionOptions ?? {};
63
+
64
+ const applyState = () => {
65
+ setStates((prev) => {
66
+ if (prev[id] === isOpen) {return prev;}
67
+ return { ...prev, [id]: isOpen };
68
+ });
69
+ };
70
+
71
+ await runTransition(applyState, mode, element?.current, duration);
72
+
73
+ const opts = optionsRef.current;
74
+ if (isOpen) {
75
+ opts?.onOpen?.(id);
76
+ } else {
77
+ opts?.onClose?.(id);
78
+ }
79
+ opts?.onTransitionEnd?.(id, isOpen);
80
+ },
81
+ [],
82
+ );
83
+
84
+ const state = React.useCallback((id: string): boolean => states[id] ?? false, [states]);
85
+ const open = React.useCallback(
86
+ (id: string, opts?: TransitionOptions) => update(id, true, opts),
87
+ [update],
88
+ );
89
+ const close = React.useCallback(
90
+ (id: string, opts?: TransitionOptions) => update(id, false, opts),
91
+ [update],
92
+ );
93
+
94
+ return { state, open, close };
95
+ };
package/src/index.tsx ADDED
@@ -0,0 +1,88 @@
1
+ /**
2
+ * @file Main entry point for the React Panel Layout library
3
+ */
4
+
5
+ // ============================================================================
6
+ // Core Type Definitions
7
+ // ============================================================================
8
+ export type {
9
+ // Grid / panel
10
+ GridTrack,
11
+ PanelLayoutConfig,
12
+ LayerPositionMode,
13
+ LayerDefinition,
14
+ PanelLayoutProps,
15
+ // Window / popup / drawer
16
+ Position,
17
+ WindowOffset,
18
+ WindowPosition,
19
+ WindowSize,
20
+ WindowBounds,
21
+ WindowConstraints,
22
+ PopupWindowFeatures,
23
+ PopupWindowOptions,
24
+ PopupWindowFactoryConfig,
25
+ FloatingWindowMode,
26
+ FloatingBehavior,
27
+ FloatingHeaderConfig,
28
+ DrawerBehavior,
29
+ } from "./types";
30
+
31
+ // ============================================================================
32
+ // Main Layout Component
33
+ // ============================================================================
34
+ export { GridLayout } from "./components/grid/GridLayout";
35
+ export type { GridLayoutProps } from "./components/grid/GridLayout";
36
+
37
+ // ============================================================================
38
+ // Drawer Components
39
+ // ============================================================================
40
+ export { Drawer } from "./components/window/Drawer";
41
+ export type { DrawerProps } from "./components/window/Drawer";
42
+ export { DrawerLayers } from "./components/window/DrawerLayers";
43
+ export type { DrawerLayersProps } from "./components/window/DrawerLayers";
44
+
45
+ // ============================================================================
46
+ // Floating Window Components
47
+ // ============================================================================
48
+ export { FloatingWindow } from "./components/window/FloatingWindow";
49
+ export type { FloatingWindowProps } from "./components/window/FloatingWindow";
50
+
51
+ // ============================================================================
52
+ // Panel Components
53
+ // ============================================================================
54
+ export { HorizontalDivider } from "./components/resizer/HorizontalDivider";
55
+ export type { HorizontalDividerProps } from "./components/resizer/HorizontalDivider";
56
+
57
+ export { ResizeHandle } from "./components/resizer/ResizeHandle";
58
+ export type { ResizeHandleProps } from "./components/resizer/ResizeHandle";
59
+
60
+ // ============================================================================
61
+ // Public Hooks
62
+ // ============================================================================
63
+ export { useLayerDragHandle } from "./modules/grid/useLayerDragHandle";
64
+ export { useFloatingState } from "./modules/window/useFloatingState";
65
+ export { useTransitionState, runTransition } from "./hooks/useTransitionState";
66
+ export type { TransitionMode, TransitionOptions, UseTransitionStateOptions } from "./hooks/useTransitionState";
67
+
68
+ // ============================================================================
69
+ // Style Constants
70
+ // ============================================================================
71
+ export { CSS_VAR_PREFIX } from "./constants/styles";
72
+
73
+ // ============================================================================
74
+ // Panel System (tabs + splits)
75
+ // ============================================================================
76
+ export { PanelSystem } from "./modules/panels/system/PanelSystem";
77
+ export { buildInitialState } from "./modules/panels";
78
+ export type {
79
+ PanelSystemProps,
80
+ PanelSystemState,
81
+ GroupModel,
82
+ TabDefinition,
83
+ SplitDirection,
84
+ TabBarRenderProps,
85
+ PanelGroupRenderProps,
86
+ PanelSplitLimits,
87
+ } from "./modules/panels/state/types";
88
+