react-panel-layout 0.5.1 → 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 (466) hide show
  1. package/dist/{FloatingPanelFrame-D9Cp2al1.cjs → FloatingPanelFrame-CEmXDvUA.cjs} +2 -2
  2. package/dist/FloatingPanelFrame-CEmXDvUA.cjs.map +1 -0
  3. package/dist/{FloatingPanelFrame-6W5OexYe.js → FloatingPanelFrame-SgYLc6Ud.js} +12 -15
  4. package/dist/FloatingPanelFrame-SgYLc6Ud.js.map +1 -0
  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 +73 -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/types.d.ts +12 -0
  111. package/dist/useContentCache-CO3LYNmz.js +24 -0
  112. package/dist/useContentCache-CO3LYNmz.js.map +1 -0
  113. package/dist/useContentCache-DqXtLrLs.cjs +2 -0
  114. package/dist/useContentCache-DqXtLrLs.cjs.map +1 -0
  115. package/dist/useDocumentPointerEvents-CKdhGXd0.js +46 -0
  116. package/dist/useDocumentPointerEvents-CKdhGXd0.js.map +1 -0
  117. package/dist/useDocumentPointerEvents-ChqrKXDk.cjs +2 -0
  118. package/dist/useDocumentPointerEvents-ChqrKXDk.cjs.map +1 -0
  119. package/dist/useEffectEvent-Dp7HLCf0.js +13 -0
  120. package/dist/useEffectEvent-Dp7HLCf0.js.map +1 -0
  121. package/dist/useEffectEvent-huSsGUnl.cjs +2 -0
  122. package/dist/useEffectEvent-huSsGUnl.cjs.map +1 -0
  123. package/dist/useFloatingState-C4kRaW_R.cjs +2 -0
  124. package/dist/useFloatingState-C4kRaW_R.cjs.map +1 -0
  125. package/dist/useFloatingState-tEfA_wbc.js +74 -0
  126. package/dist/useFloatingState-tEfA_wbc.js.map +1 -0
  127. package/dist/window/index.d.ts +61 -0
  128. package/dist/window.cjs +2 -0
  129. package/dist/window.cjs.map +1 -0
  130. package/dist/window.js +149 -0
  131. package/dist/window.js.map +1 -0
  132. package/docs/design-tokens.md +405 -0
  133. package/package.json +29 -4
  134. package/src/PanelSystemContext.tsx +88 -0
  135. package/src/components/grid/GridLayerList.tsx +172 -0
  136. package/src/components/grid/GridLayerResizeHandles.tsx +145 -0
  137. package/src/components/grid/GridLayout.spec.tsx +743 -0
  138. package/src/components/grid/GridLayout.tsx +130 -0
  139. package/src/components/grid/GridTrackResizeHandle.tsx +87 -0
  140. package/src/components/paneling/FloatingPanelFrame.tsx +203 -0
  141. package/src/components/panels/DropSuggestOverlay.tsx +131 -0
  142. package/src/components/panels/PanelGroupView.tsx +112 -0
  143. package/src/components/pivot/PivotLayer.tsx +27 -0
  144. package/src/components/resizer/HorizontalDivider.tsx +52 -0
  145. package/src/components/resizer/ResizeHandle.tsx +118 -0
  146. package/src/components/tabs/TabBar.tsx +223 -0
  147. package/src/components/tabs/TabBarTab.tsx +133 -0
  148. package/src/components/tabs/TabDragOverlay.tsx +92 -0
  149. package/src/components/window/DialogOverlay.tsx +180 -0
  150. package/src/components/window/Drawer.tsx +282 -0
  151. package/src/components/window/DrawerLayers.tsx +58 -0
  152. package/src/components/window/FloatingWindow.tsx +95 -0
  153. package/src/components/window/PopupLayerPortal.tsx +218 -0
  154. package/src/config/PanelContentDeclaration.tsx +427 -0
  155. package/src/config/index.tsx +52 -0
  156. package/src/config/panelJsx.spec.tsx +54 -0
  157. package/src/config/panelJsxConfig.spec.tsx +54 -0
  158. package/src/config/panelJsxDrawer.spec.tsx +33 -0
  159. package/src/config/panelRouter.spec.ts +68 -0
  160. package/src/config/panelRouter.tsx +155 -0
  161. package/src/constants/styles.ts +261 -0
  162. package/src/demo/Layout.module.css +258 -0
  163. package/src/demo/Layout.tsx +176 -0
  164. package/src/demo/components/CodeBlock.module.css +54 -0
  165. package/src/demo/components/CodeBlock.tsx +34 -0
  166. package/src/demo/components/CodePreview.module.css +37 -0
  167. package/src/demo/components/CodePreview.tsx +31 -0
  168. package/src/demo/components/DataPreview.module.css +177 -0
  169. package/src/demo/components/DataPreview.tsx +115 -0
  170. package/src/demo/components/Story.module.css +68 -0
  171. package/src/demo/components/Story.tsx +54 -0
  172. package/src/demo/components/layout/CodePanel.module.css +183 -0
  173. package/src/demo/components/layout/CodePanel.tsx +149 -0
  174. package/src/demo/components/layout/DemoPage.module.css +60 -0
  175. package/src/demo/components/layout/DemoPage.tsx +56 -0
  176. package/src/demo/components/layout/SingleSamplePage.module.css +11 -0
  177. package/src/demo/components/layout/SingleSamplePage.tsx +35 -0
  178. package/src/demo/components/layout/SplitDemoLayout.module.css +107 -0
  179. package/src/demo/components/layout/SplitDemoLayout.tsx +218 -0
  180. package/src/demo/components/layout/index.ts +11 -0
  181. package/src/demo/components/tab-styles/ChromeTabBar.module.css +75 -0
  182. package/src/demo/components/tab-styles/ChromeTabBar.tsx +111 -0
  183. package/src/demo/components/tab-styles/GitHubTabBar.module.css +81 -0
  184. package/src/demo/components/tab-styles/GitHubTabBar.tsx +109 -0
  185. package/src/demo/components/tab-styles/VSCodeTabBar.module.css +78 -0
  186. package/src/demo/components/tab-styles/VSCodeTabBar.tsx +109 -0
  187. package/src/demo/components/tab-styles/index.ts +6 -0
  188. package/src/demo/components/ui/DemoButton.module.css +63 -0
  189. package/src/demo/components/ui/DemoButton.tsx +32 -0
  190. package/src/demo/components/ui/DemoCard.module.css +15 -0
  191. package/src/demo/components/ui/DemoCard.tsx +30 -0
  192. package/src/demo/components/ui/DemoContainer.module.css +17 -0
  193. package/src/demo/components/ui/DemoContainer.tsx +30 -0
  194. package/src/demo/components/ui/DemoPanel.module.css +23 -0
  195. package/src/demo/components/ui/DemoPanel.tsx +33 -0
  196. package/src/demo/components/ui/PanelText.module.css +18 -0
  197. package/src/demo/components/ui/PanelText.tsx +29 -0
  198. package/src/demo/components/ui/PanelTitle.module.css +18 -0
  199. package/src/demo/components/ui/PanelTitle.tsx +31 -0
  200. package/src/demo/contexts/TabbarDemoConfig.tsx +218 -0
  201. package/src/demo/demo.css +172 -0
  202. package/src/demo/hooks/useMedia.ts +41 -0
  203. package/src/demo/hooks/useShikiHighlight.ts +55 -0
  204. package/src/demo/index.tsx +293 -0
  205. package/src/demo/pages/Drawer/animations/index.tsx +22 -0
  206. package/src/demo/pages/Drawer/basics/index.tsx +17 -0
  207. package/src/demo/pages/Drawer/components/DrawerAnimations.module.css +125 -0
  208. package/src/demo/pages/Drawer/components/DrawerAnimations.tsx +118 -0
  209. package/src/demo/pages/Drawer/components/DrawerBasics.module.css +55 -0
  210. package/src/demo/pages/Drawer/components/DrawerBasics.tsx +76 -0
  211. package/src/demo/pages/Drawer/components/DrawerMenuLayout.module.css +332 -0
  212. package/src/demo/pages/Drawer/components/DrawerMenuLayout.tsx +199 -0
  213. package/src/demo/pages/Drawer/menu/index.tsx +17 -0
  214. package/src/demo/pages/FloatingPanelFrame/ResizableFloatingPanelsPreview.module.css +163 -0
  215. package/src/demo/pages/FloatingPanelFrame/ResizableFloatingPanelsPreview.tsx +234 -0
  216. package/src/demo/pages/FloatingPanelFrame/basic/index.tsx +17 -0
  217. package/src/demo/pages/FloatingPanelFrame/complex/index.tsx +26 -0
  218. package/src/demo/pages/FloatingPanelFrame/components/BasicPanel.module.css +16 -0
  219. package/src/demo/pages/FloatingPanelFrame/components/BasicPanel.tsx +24 -0
  220. package/src/demo/pages/FloatingPanelFrame/components/ComplexPanel.module.css +54 -0
  221. package/src/demo/pages/FloatingPanelFrame/components/ComplexPanel.tsx +67 -0
  222. package/src/demo/pages/FloatingPanelFrame/components/PanelWithControls.module.css +21 -0
  223. package/src/demo/pages/FloatingPanelFrame/components/PanelWithControls.tsx +41 -0
  224. package/src/demo/pages/FloatingPanelFrame/components/PanelWithMeta.module.css +5 -0
  225. package/src/demo/pages/FloatingPanelFrame/components/PanelWithMeta.tsx +43 -0
  226. package/src/demo/pages/FloatingPanelFrame/components/ScrollablePanel.module.css +11 -0
  227. package/src/demo/pages/FloatingPanelFrame/components/ScrollablePanel.tsx +42 -0
  228. package/src/demo/pages/FloatingPanelFrame/index.tsx +80 -0
  229. package/src/demo/pages/FloatingPanelFrame/scrollable/index.tsx +30 -0
  230. package/src/demo/pages/FloatingPanelFrame/with-controls/index.tsx +30 -0
  231. package/src/demo/pages/FloatingPanelFrame/with-meta/index.tsx +17 -0
  232. package/src/demo/pages/HorizontalDivider/components/PanelsWithRichContent.module.css +112 -0
  233. package/src/demo/pages/HorizontalDivider/components/PanelsWithRichContent.tsx +56 -0
  234. package/src/demo/pages/HorizontalDivider/components/SimpleResizablePanels.module.css +46 -0
  235. package/src/demo/pages/HorizontalDivider/components/SimpleResizablePanels.tsx +29 -0
  236. package/src/demo/pages/HorizontalDivider/components/ThreePanelLayout.module.css +54 -0
  237. package/src/demo/pages/HorizontalDivider/components/ThreePanelLayout.tsx +30 -0
  238. package/src/demo/pages/HorizontalDivider/index.module.css +14 -0
  239. package/src/demo/pages/HorizontalDivider/index.tsx +64 -0
  240. package/src/demo/pages/HorizontalDivider/panels-with-rich-content/index.tsx +21 -0
  241. package/src/demo/pages/HorizontalDivider/simple-resizable-panels/index.tsx +21 -0
  242. package/src/demo/pages/HorizontalDivider/three-panel-layout/index.tsx +21 -0
  243. package/src/demo/pages/PanelLayout/PanelLayoutDemo.module.css +174 -0
  244. package/src/demo/pages/PanelLayout/PanelLayoutDemo.tsx +248 -0
  245. package/src/demo/pages/PanelLayout/components/DashboardLayout.module.css +115 -0
  246. package/src/demo/pages/PanelLayout/components/DashboardLayout.tsx +124 -0
  247. package/src/demo/pages/PanelLayout/components/DraggableOverlays.module.css +101 -0
  248. package/src/demo/pages/PanelLayout/components/DraggableOverlays.tsx +122 -0
  249. package/src/demo/pages/PanelLayout/components/IDELayout.module.css +104 -0
  250. package/src/demo/pages/PanelLayout/components/IDELayout.tsx +143 -0
  251. package/src/demo/pages/PanelLayout/components/SimpleGrid.module.css +19 -0
  252. package/src/demo/pages/PanelLayout/components/SimpleGrid.tsx +62 -0
  253. package/src/demo/pages/PanelLayout/dashboard/index.tsx +22 -0
  254. package/src/demo/pages/PanelLayout/draggable-overlays/index.tsx +22 -0
  255. package/src/demo/pages/PanelLayout/ide-layout/index.tsx +22 -0
  256. package/src/demo/pages/PanelLayout/index.tsx +94 -0
  257. package/src/demo/pages/PanelLayout/simple-grid/index.tsx +22 -0
  258. package/src/demo/pages/PanelSystem/PanelSystemPreview.module.css +20 -0
  259. package/src/demo/pages/PanelSystem/PanelSystemPreview.tsx +101 -0
  260. package/src/demo/pages/PanelSystem/preview/index.tsx +18 -0
  261. package/src/demo/pages/PanelSystem/tabbar/index.tsx +129 -0
  262. package/src/demo/pages/Pivot/basics/index.tsx +17 -0
  263. package/src/demo/pages/Pivot/components/Pivot.module.css +278 -0
  264. package/src/demo/pages/Pivot/components/PivotBasics.tsx +103 -0
  265. package/src/demo/pages/Pivot/components/PivotSidebar.tsx +168 -0
  266. package/src/demo/pages/Pivot/components/PivotTabs.tsx +129 -0
  267. package/src/demo/pages/Pivot/components/PivotTransitions.tsx +120 -0
  268. package/src/demo/pages/Pivot/components/SwipePivot.module.css +114 -0
  269. package/src/demo/pages/Pivot/components/SwipePivot.tsx +193 -0
  270. package/src/demo/pages/Pivot/components/SwipeTabsPivot.module.css +203 -0
  271. package/src/demo/pages/Pivot/components/SwipeTabsPivot.tsx +289 -0
  272. package/src/demo/pages/Pivot/sidebar/index.tsx +17 -0
  273. package/src/demo/pages/Pivot/swipe/index.tsx +16 -0
  274. package/src/demo/pages/Pivot/swipe-debug/index.tsx +287 -0
  275. package/src/demo/pages/Pivot/swipe-tabs/index.tsx +15 -0
  276. package/src/demo/pages/Pivot/tabs/index.tsx +17 -0
  277. package/src/demo/pages/Pivot/transitions/index.tsx +17 -0
  278. package/src/demo/pages/ResizeHandle/both-directions/index.tsx +17 -0
  279. package/src/demo/pages/ResizeHandle/components/BothDirectionsDemo.module.css +72 -0
  280. package/src/demo/pages/ResizeHandle/components/BothDirectionsDemo.tsx +41 -0
  281. package/src/demo/pages/ResizeHandle/components/HorizontalResizeDemo.module.css +61 -0
  282. package/src/demo/pages/ResizeHandle/components/HorizontalResizeDemo.tsx +33 -0
  283. package/src/demo/pages/ResizeHandle/components/NestedPanelsDemo.module.css +83 -0
  284. package/src/demo/pages/ResizeHandle/components/NestedPanelsDemo.tsx +53 -0
  285. package/src/demo/pages/ResizeHandle/components/VerticalResizeDemo.module.css +68 -0
  286. package/src/demo/pages/ResizeHandle/components/VerticalResizeDemo.tsx +33 -0
  287. package/src/demo/pages/ResizeHandle/horizontal/index.tsx +17 -0
  288. package/src/demo/pages/ResizeHandle/index.module.css +11 -0
  289. package/src/demo/pages/ResizeHandle/index.tsx +71 -0
  290. package/src/demo/pages/ResizeHandle/nested-panels/index.tsx +17 -0
  291. package/src/demo/pages/ResizeHandle/vertical/index.tsx +17 -0
  292. package/src/demo/pages/ResponsiveLayout/adaptive-workspace/index.tsx +22 -0
  293. package/src/demo/pages/ResponsiveLayout/components/ResponsiveWorkspace.module.css +423 -0
  294. package/src/demo/pages/ResponsiveLayout/components/ResponsiveWorkspace.tsx +398 -0
  295. package/src/demo/pages/Stack/basics/index.tsx +22 -0
  296. package/src/demo/pages/Stack/components/Stack.module.css +234 -0
  297. package/src/demo/pages/Stack/components/StackBasics.tsx +217 -0
  298. package/src/demo/pages/Stack/components/StackTablet.module.css +299 -0
  299. package/src/demo/pages/Stack/components/StackTablet.tsx +401 -0
  300. package/src/demo/pages/Stack/tablet/index.tsx +22 -0
  301. package/src/demo/pages/StickyHeader/basics/index.tsx +17 -0
  302. package/src/demo/pages/StickyHeader/components/StickyHeader.module.css +219 -0
  303. package/src/demo/pages/StickyHeader/components/StickyHeaderBasics.tsx +103 -0
  304. package/src/demo/routes.tsx +193 -0
  305. package/src/demo/styles/animations.css +68 -0
  306. package/src/demo/styles/stack-themes.css +35 -0
  307. package/src/demo/utils/createPanelView.tsx +58 -0
  308. package/src/floating/index.ts +24 -0
  309. package/src/grid/index.ts +75 -0
  310. package/src/hooks/ContentCacheContext.tsx +87 -0
  311. package/src/hooks/gesture/presets.spec.ts +86 -0
  312. package/src/hooks/gesture/presets.ts +95 -0
  313. package/src/hooks/gesture/testing/createGestureSimulator.spec.ts +237 -0
  314. package/src/hooks/gesture/testing/createGestureSimulator.ts +310 -0
  315. package/src/hooks/gesture/thresholdValue.spec.ts +103 -0
  316. package/src/hooks/gesture/thresholdValue.ts +77 -0
  317. package/src/hooks/gesture/types.ts +290 -0
  318. package/src/hooks/gesture/useDirectionalLock.spec.ts +271 -0
  319. package/src/hooks/gesture/useDirectionalLock.ts +115 -0
  320. package/src/hooks/gesture/useEdgeSwipeInput.spec.ts +454 -0
  321. package/src/hooks/gesture/useEdgeSwipeInput.ts +131 -0
  322. package/src/hooks/gesture/useNativeGestureGuard.spec.ts +413 -0
  323. package/src/hooks/gesture/useNativeGestureGuard.ts +133 -0
  324. package/src/hooks/gesture/usePointerTracking.spec.ts +364 -0
  325. package/src/hooks/gesture/usePointerTracking.ts +134 -0
  326. package/src/hooks/gesture/useScrollBoundary.spec.ts +249 -0
  327. package/src/hooks/gesture/useScrollBoundary.ts +113 -0
  328. package/src/hooks/gesture/useSwipeInput.spec.ts +592 -0
  329. package/src/hooks/gesture/useSwipeInput.ts +310 -0
  330. package/src/hooks/gesture/utils.spec.ts +152 -0
  331. package/src/hooks/gesture/utils.ts +87 -0
  332. package/src/hooks/useAnimatedVisibility.spec.ts +257 -0
  333. package/src/hooks/useAnimatedVisibility.ts +146 -0
  334. package/src/hooks/useAnimationFrame.ts +200 -0
  335. package/src/hooks/useCSSMatrix.spec.ts +214 -0
  336. package/src/hooks/useCSSMatrix.ts +262 -0
  337. package/src/hooks/useClonedElementPreview.ts +28 -0
  338. package/src/hooks/useContainerScroll.ts +78 -0
  339. package/src/hooks/useContentCache.spec.tsx +232 -0
  340. package/src/hooks/useContentCache.tsx +127 -0
  341. package/src/hooks/useDocumentPointerEvents.ts +137 -0
  342. package/src/hooks/useDocumentScroll.ts +41 -0
  343. package/src/hooks/useEffectEvent.ts +40 -0
  344. package/src/hooks/useElementComponentWrapper.tsx +63 -0
  345. package/src/hooks/useIntersectionObserver.tsx +125 -0
  346. package/src/hooks/useIsomorphicLayoutEffect.ts +29 -0
  347. package/src/hooks/useResizeObserver.tsx +81 -0
  348. package/src/hooks/useScrollContainer.ts +79 -0
  349. package/src/hooks/useSnapAnimation.ts +128 -0
  350. package/src/hooks/useSwipeContentTransform.spec.ts +133 -0
  351. package/src/hooks/useSwipeContentTransform.ts +235 -0
  352. package/src/hooks/useTransitionState.ts +95 -0
  353. package/src/index.tsx +88 -0
  354. package/src/modules/grid/GridLayoutContext.tsx +57 -0
  355. package/src/modules/grid/LayerInstanceContext.tsx +56 -0
  356. package/src/modules/grid/resizeHandles.ts +157 -0
  357. package/src/modules/grid/trackUtils.ts +146 -0
  358. package/src/modules/grid/useGridPlacements.ts +143 -0
  359. package/src/modules/grid/useGridTracks.ts +156 -0
  360. package/src/modules/grid/useLayerDragHandle.ts +16 -0
  361. package/src/modules/grid/useLayerInteractions.tsx +850 -0
  362. package/src/modules/keybindings/KeybindingsProvider.tsx +111 -0
  363. package/src/modules/panels/dom/DomRegistry.tsx +94 -0
  364. package/src/modules/panels/index.ts +45 -0
  365. package/src/modules/panels/interactions/InteractionsContext.test.tsx +330 -0
  366. package/src/modules/panels/interactions/InteractionsContext.tsx +394 -0
  367. package/src/modules/panels/interactions/dnd.ts +28 -0
  368. package/src/modules/panels/keybindings/KeybindingsInstaller.tsx +15 -0
  369. package/src/modules/panels/layout/adapter.ts +124 -0
  370. package/src/modules/panels/rendering/ContentRegistry.spec.tsx +304 -0
  371. package/src/modules/panels/rendering/ContentRegistry.tsx +205 -0
  372. package/src/modules/panels/rendering/GroupContainer.tsx +65 -0
  373. package/src/modules/panels/rendering/RenderBridge.tsx +115 -0
  374. package/src/modules/panels/rendering/RenderContext.tsx +31 -0
  375. package/src/modules/panels/state/PanelSplitHandles.tsx +147 -0
  376. package/src/modules/panels/state/PanelSystemContext.splitLimits.spec.tsx +50 -0
  377. package/src/modules/panels/state/PanelSystemContext.tsx +289 -0
  378. package/src/modules/panels/state/StateContext.tsx +12 -0
  379. package/src/modules/panels/state/cleanup.ts +37 -0
  380. package/src/modules/panels/state/commands.ts +53 -0
  381. package/src/modules/panels/state/focus/Context.tsx +25 -0
  382. package/src/modules/panels/state/focus/logic.ts +57 -0
  383. package/src/modules/panels/state/groups/Context.tsx +25 -0
  384. package/src/modules/panels/state/groups/logic.ts +105 -0
  385. package/src/modules/panels/state/splitLimits.spec.ts +46 -0
  386. package/src/modules/panels/state/splitLimits.ts +90 -0
  387. package/src/modules/panels/state/state.spec.ts +49 -0
  388. package/src/modules/panels/state/tree/Context.tsx +24 -0
  389. package/src/modules/panels/state/tree/logic.spec.ts +34 -0
  390. package/src/modules/panels/state/tree/logic.ts +138 -0
  391. package/src/modules/panels/state/types.ts +142 -0
  392. package/src/modules/panels/system/PanelSystem.empty-tabbar.spec.tsx +53 -0
  393. package/src/modules/panels/system/PanelSystem.tab-click-activates.spec.tsx +44 -0
  394. package/src/modules/panels/system/PanelSystem.tab-reorder.spec.tsx +64 -0
  395. package/src/modules/panels/system/PanelSystem.tabs-no-dup.spec.tsx +57 -0
  396. package/src/modules/panels/system/PanelSystem.tsx +206 -0
  397. package/src/modules/pivot/PivotContent.spec.tsx +179 -0
  398. package/src/modules/pivot/PivotContent.tsx +77 -0
  399. package/src/modules/pivot/SwipePivotContent.debug.tmp.tsx +237 -0
  400. package/src/modules/pivot/SwipePivotContent.position.spec.tsx +167 -0
  401. package/src/modules/pivot/SwipePivotContent.spec.tsx +464 -0
  402. package/src/modules/pivot/SwipePivotContent.test.tsx +502 -0
  403. package/src/modules/pivot/SwipePivotContent.tsx +197 -0
  404. package/src/modules/pivot/SwipePivotTabBar.spec.tsx +865 -0
  405. package/src/modules/pivot/SwipePivotTabBar.tsx +523 -0
  406. package/src/modules/pivot/index.ts +8 -0
  407. package/src/modules/pivot/scaleInputState.spec.ts +210 -0
  408. package/src/modules/pivot/scaleInputState.ts +66 -0
  409. package/src/modules/pivot/types.ts +139 -0
  410. package/src/modules/pivot/usePivot.spec.ts +621 -0
  411. package/src/modules/pivot/usePivot.spec.tsx +186 -0
  412. package/src/modules/pivot/usePivot.tsx +345 -0
  413. package/src/modules/pivot/usePivotSwipeInput.spec.ts +649 -0
  414. package/src/modules/pivot/usePivotSwipeInput.ts +136 -0
  415. package/src/modules/resizer/useResizeDrag.ts +94 -0
  416. package/src/modules/stack/StackContent.spec.tsx +264 -0
  417. package/src/modules/stack/StackContent.tsx +111 -0
  418. package/src/modules/stack/SwipeStackContent.spec.tsx +1277 -0
  419. package/src/modules/stack/SwipeStackContent.tsx +356 -0
  420. package/src/modules/stack/SwipeStackOutlet.spec.tsx +252 -0
  421. package/src/modules/stack/SwipeStackOutlet.tsx +221 -0
  422. package/src/modules/stack/computeStackContentState.spec.ts +281 -0
  423. package/src/modules/stack/computeStackContentState.ts +304 -0
  424. package/src/modules/stack/computeSwipeStackTransform.spec.ts +186 -0
  425. package/src/modules/stack/computeSwipeStackTransform.ts +145 -0
  426. package/src/modules/stack/types.ts +226 -0
  427. package/src/modules/stack/useStackAnimationState.spec.ts +186 -0
  428. package/src/modules/stack/useStackAnimationState.ts +138 -0
  429. package/src/modules/stack/useStackNavigation.spec.ts +477 -0
  430. package/src/modules/stack/useStackNavigation.tsx +336 -0
  431. package/src/modules/stack/useStackSwipeInput.spec.ts +276 -0
  432. package/src/modules/stack/useStackSwipeInput.ts +139 -0
  433. package/src/modules/window/useDrawerState.ts +81 -0
  434. package/src/modules/window/useFloatingState.spec.ts +252 -0
  435. package/src/modules/window/useFloatingState.ts +141 -0
  436. package/src/panels/index.ts +119 -0
  437. package/src/pivot/index.ts +19 -0
  438. package/src/resizer/index.ts +68 -0
  439. package/src/stack/index.ts +91 -0
  440. package/src/sticky-header/StickyArea.tsx +221 -0
  441. package/src/sticky-header/index.ts +18 -0
  442. package/src/sticky-header/types.ts +68 -0
  443. package/src/types.ts +323 -0
  444. package/src/utils/CSSMatrix.ts +321 -0
  445. package/src/utils/css.ts +65 -0
  446. package/src/utils/dialogUtils.ts +43 -0
  447. package/src/utils/math.ts +18 -0
  448. package/src/utils/polyfills/createDialogPolyfill.ts +18 -0
  449. package/src/utils/typedActions.ts +103 -0
  450. package/src/vite-env.d.ts +6 -0
  451. package/src/window/index.ts +67 -0
  452. package/dist/FloatingPanelFrame-6W5OexYe.js.map +0 -1
  453. package/dist/FloatingPanelFrame-D9Cp2al1.cjs.map +0 -1
  454. package/dist/GridLayout-BzrIDrC9.js +0 -1465
  455. package/dist/GridLayout-BzrIDrC9.js.map +0 -1
  456. package/dist/GridLayout-ZrOhoLLB.cjs +0 -2
  457. package/dist/GridLayout-ZrOhoLLB.cjs.map +0 -1
  458. package/dist/sticky-header/StickyHeader.d.ts +0 -53
  459. package/dist/styles-CA2_zLZt.js +0 -52
  460. package/dist/styles-CA2_zLZt.js.map +0 -1
  461. package/dist/styles-PsqGOEJP.cjs +0 -2
  462. package/dist/styles-PsqGOEJP.cjs.map +0 -1
  463. package/dist/usePivot-BS-DGfwd.cjs +0 -2
  464. package/dist/usePivot-BS-DGfwd.cjs.map +0 -1
  465. package/dist/usePivot-BvOGxLQQ.js +0 -124
  466. package/dist/usePivot-BvOGxLQQ.js.map +0 -1
@@ -0,0 +1,221 @@
1
+ /**
2
+ * @file SwipeStackOutlet component for rendering stack with swipe support.
3
+ *
4
+ * Uses SwipeStackContent for direct DOM manipulation during swipe gestures,
5
+ * providing iOS-style smooth swipe-to-go-back behavior.
6
+ */
7
+ import * as React from "react";
8
+ import { SwipeStackContent } from "./SwipeStackContent.js";
9
+ import type { SwipeInputState } from "../../hooks/gesture/types.js";
10
+ import type { StackPanel, StackNavigationState } from "./types.js";
11
+
12
+ const DEFAULT_ANIMATION_DURATION = 300;
13
+
14
+ /**
15
+ * Props for SwipeStackOutlet component.
16
+ */
17
+ export type SwipeStackOutletProps = {
18
+ /** Array of panel definitions */
19
+ panels: ReadonlyArray<StackPanel>;
20
+ /** Current navigation state */
21
+ navigationState: StackNavigationState;
22
+ /** Swipe input state from useStackSwipeInput */
23
+ inputState: SwipeInputState;
24
+ /** Container size in pixels (width for horizontal swipe) */
25
+ containerSize: number;
26
+ /** Function to get cached content for a panel */
27
+ getCachedContent?: (panelId: string) => React.ReactNode | null;
28
+ /** Behind panel offset ratio. @default -0.3 */
29
+ behindOffset?: number;
30
+ /**
31
+ * Whether to animate new panels on mount.
32
+ * @default false
33
+ */
34
+ animateOnMount?: boolean;
35
+ /**
36
+ * Animation duration in ms.
37
+ * @default 300
38
+ */
39
+ animationDuration?: number;
40
+ /**
41
+ * Whether to show iOS-style edge shadow on active panels.
42
+ * @default true
43
+ */
44
+ showShadow?: boolean;
45
+ /**
46
+ * Display mode for visual styling.
47
+ * - "overlay": panels overlay, no scale (iOS style)
48
+ * - "slide": panels slide with parallax
49
+ * - "stack": panels scale down and offset (stacked cards style)
50
+ * @default "overlay"
51
+ */
52
+ displayMode?: "overlay" | "slide" | "stack";
53
+ /**
54
+ * Whether to show dimming overlay on behind panels.
55
+ * @default true
56
+ */
57
+ showDimming?: boolean;
58
+ };
59
+
60
+ /**
61
+ * Get visible panels for rendering during swipe.
62
+ *
63
+ * Only renders active panel and immediate behind panel for performance.
64
+ * Also includes exiting panel when navigating back.
65
+ */
66
+ function getVisiblePanels(
67
+ panels: ReadonlyArray<StackPanel>,
68
+ navigationState: StackNavigationState,
69
+ exitingPanelId: string | null,
70
+ ): Array<{ panel: StackPanel; depth: number; isExiting: boolean }> {
71
+ const { stack, depth } = navigationState;
72
+
73
+ // During swipe, we only need active and behind panels
74
+ const visibleDepths = [depth];
75
+ if (depth > 0) {
76
+ visibleDepths.push(depth - 1);
77
+ }
78
+
79
+ const result: Array<{ panel: StackPanel; depth: number; isExiting: boolean }> = [];
80
+
81
+ // Add panels at visible depths
82
+ for (const d of visibleDepths) {
83
+ const id = stack[d];
84
+ const panel = panels.find((p) => p.id === id);
85
+ if (panel) {
86
+ result.push({ panel, depth: d, isExiting: false });
87
+ }
88
+ }
89
+
90
+ // Add exiting panel if it's not already included
91
+ if (exitingPanelId != null) {
92
+ const alreadyIncluded = result.some((r) => r.panel.id === exitingPanelId);
93
+ if (!alreadyIncluded) {
94
+ const exitingPanel = panels.find((p) => p.id === exitingPanelId);
95
+ if (exitingPanel) {
96
+ // Exiting panel is at depth + 1 (was previously active)
97
+ result.push({ panel: exitingPanel, depth: depth + 1, isExiting: true });
98
+ }
99
+ }
100
+ }
101
+
102
+ // Render in order: behind first, then active, then exiting
103
+ return result.sort((a, b) => a.depth - b.depth);
104
+ }
105
+
106
+ /**
107
+ * SwipeStackOutlet renders stack panels with swipe gesture support.
108
+ *
109
+ * Unlike the default StackOutlet, this component:
110
+ * - Uses SwipeStackContent for direct DOM manipulation
111
+ * - Only renders active and behind panels for performance
112
+ * - Supports iOS-style parallax reveal animation
113
+ *
114
+ * @example
115
+ * ```tsx
116
+ * const navigation = useStackNavigation({ panels, displayMode: 'overlay' });
117
+ * const swipeInput = useStackSwipeInput({ containerRef, navigation });
118
+ *
119
+ * return (
120
+ * <div ref={containerRef} {...swipeInput.containerProps}>
121
+ * <SwipeStackOutlet
122
+ * panels={navigation.panels}
123
+ * navigationState={navigation.state}
124
+ * inputState={swipeInput.inputState}
125
+ * containerSize={containerWidth}
126
+ * />
127
+ * </div>
128
+ * );
129
+ * ```
130
+ */
131
+ export const SwipeStackOutlet: React.FC<SwipeStackOutletProps> = React.memo(
132
+ ({
133
+ panels,
134
+ navigationState,
135
+ inputState,
136
+ containerSize,
137
+ getCachedContent,
138
+ behindOffset,
139
+ animateOnMount = false,
140
+ animationDuration = DEFAULT_ANIMATION_DURATION,
141
+ showShadow,
142
+ displayMode,
143
+ showDimming,
144
+ }) => {
145
+ // Track the exiting panel ID when navigating back
146
+ const [exitingPanelId, setExitingPanelId] = React.useState<string | null>(null);
147
+ const prevDepthRef = React.useRef(navigationState.depth);
148
+ const prevStackRef = React.useRef<ReadonlyArray<string>>(navigationState.stack);
149
+
150
+ // Detect when we navigate back and need to animate out
151
+ React.useLayoutEffect(() => {
152
+ const prevDepth = prevDepthRef.current;
153
+ const prevStack = prevStackRef.current;
154
+ const { depth, stack } = navigationState;
155
+
156
+ // Update refs
157
+ prevDepthRef.current = depth;
158
+ prevStackRef.current = stack;
159
+
160
+ // Check if we went back (depth decreased)
161
+ if (depth < prevDepth) {
162
+ // The panel at prevDepth is exiting
163
+ const exitingId = prevStack[prevDepth];
164
+ if (exitingId != null) {
165
+ setExitingPanelId(exitingId);
166
+
167
+ // Clear exiting panel after animation completes
168
+ const timeoutId = setTimeout(() => {
169
+ setExitingPanelId(null);
170
+ }, animationDuration);
171
+
172
+ return () => clearTimeout(timeoutId);
173
+ }
174
+ }
175
+ }, [navigationState.depth, navigationState.stack, animationDuration]);
176
+
177
+ const visiblePanels = React.useMemo(
178
+ () => getVisiblePanels(panels, navigationState, exitingPanelId),
179
+ [panels, navigationState, exitingPanelId],
180
+ );
181
+
182
+ const containerStyle: React.CSSProperties = React.useMemo(
183
+ () => ({
184
+ position: "relative",
185
+ width: "100%",
186
+ height: "100%",
187
+ overflow: "hidden",
188
+ }),
189
+ [],
190
+ );
191
+
192
+ return (
193
+ <div style={containerStyle} data-swipe-stack-container>
194
+ {visiblePanels.map(({ panel, depth, isExiting }) => {
195
+ const isActive = depth === navigationState.depth && !isExiting;
196
+ const content = getCachedContent?.(panel.id) ?? panel.content;
197
+
198
+ return (
199
+ <SwipeStackContent
200
+ key={panel.id}
201
+ id={panel.id}
202
+ depth={depth}
203
+ navigationDepth={navigationState.depth}
204
+ isActive={isActive}
205
+ inputState={inputState}
206
+ containerSize={containerSize}
207
+ behindOffset={behindOffset}
208
+ animateOnMount={animateOnMount}
209
+ animationDuration={animationDuration}
210
+ showShadow={showShadow}
211
+ displayMode={displayMode}
212
+ showDimming={showDimming}
213
+ >
214
+ {content}
215
+ </SwipeStackContent>
216
+ );
217
+ })}
218
+ </div>
219
+ );
220
+ },
221
+ );
@@ -0,0 +1,281 @@
1
+ /**
2
+ * @file Unit tests for computeStackContentState pure function.
3
+ *
4
+ * Tests the state computation logic for StackContent separated from React/CSS concerns.
5
+ */
6
+ import {
7
+ computeAnimationType,
8
+ computeVisibility,
9
+ computeStackContentState,
10
+ type StackContentStateInput,
11
+ } from "./computeStackContentState.js";
12
+
13
+ describe("computeAnimationType", () => {
14
+ describe("when transitionMode is 'none'", () => {
15
+ it("returns null regardless of active state change", () => {
16
+ expect(computeAnimationType({ wasActive: false, isActive: true, transitionMode: "none" })).toBe(null);
17
+ expect(computeAnimationType({ wasActive: true, isActive: false, transitionMode: "none" })).toBe(null);
18
+ });
19
+ });
20
+
21
+ describe("when transitionMode is 'css'", () => {
22
+ it("returns 'push' when becoming active", () => {
23
+ const result = computeAnimationType({ wasActive: false, isActive: true, transitionMode: "css" });
24
+ expect(result).toBe("push");
25
+ });
26
+
27
+ it("returns 'pop' when becoming inactive", () => {
28
+ const result = computeAnimationType({ wasActive: true, isActive: false, transitionMode: "css" });
29
+ expect(result).toBe("pop");
30
+ });
31
+
32
+ it("returns null when active state has not changed", () => {
33
+ expect(computeAnimationType({ wasActive: true, isActive: true, transitionMode: "css" })).toBe(null);
34
+ expect(computeAnimationType({ wasActive: false, isActive: false, transitionMode: "css" })).toBe(null);
35
+ });
36
+ });
37
+ });
38
+
39
+ describe("computeVisibility", () => {
40
+ describe("overlay displayMode", () => {
41
+ const baseInput = {
42
+ displayMode: "overlay" as const,
43
+ depth: 1,
44
+ navigationDepth: 2,
45
+ isActive: false,
46
+ isAnimatingOut: false,
47
+ isRevealing: false,
48
+ revealDepth: null as number | null,
49
+ };
50
+
51
+ it("returns 'visible' when panel is active", () => {
52
+ const result = computeVisibility({ ...baseInput, isActive: true });
53
+ expect(result).toBe("visible");
54
+ });
55
+
56
+ it("returns 'visible' when panel is animating out (pop)", () => {
57
+ const result = computeVisibility({ ...baseInput, isAnimatingOut: true });
58
+ expect(result).toBe("visible");
59
+ });
60
+
61
+ it("returns 'visible' when revealing and depth matches revealDepth", () => {
62
+ const result = computeVisibility({
63
+ ...baseInput,
64
+ isRevealing: true,
65
+ revealDepth: 1,
66
+ depth: 1,
67
+ });
68
+ expect(result).toBe("visible");
69
+ });
70
+
71
+ it("returns 'hidden' when not active, not animating, not revealing", () => {
72
+ const result = computeVisibility(baseInput);
73
+ expect(result).toBe("hidden");
74
+ });
75
+
76
+ it("returns 'hidden' when revealing but depth does not match revealDepth", () => {
77
+ const result = computeVisibility({
78
+ ...baseInput,
79
+ isRevealing: true,
80
+ revealDepth: 0,
81
+ depth: 1,
82
+ });
83
+ expect(result).toBe("hidden");
84
+ });
85
+ });
86
+
87
+ describe("slide/stack displayMode", () => {
88
+ const baseInput = {
89
+ displayMode: "slide" as const,
90
+ depth: 1,
91
+ navigationDepth: 2,
92
+ isActive: false,
93
+ isAnimatingOut: false,
94
+ isRevealing: false,
95
+ revealDepth: null as number | null,
96
+ };
97
+
98
+ it("returns 'visible' when depth <= navigationDepth", () => {
99
+ expect(computeVisibility({ ...baseInput, depth: 0, navigationDepth: 2 })).toBe("visible");
100
+ expect(computeVisibility({ ...baseInput, depth: 1, navigationDepth: 2 })).toBe("visible");
101
+ expect(computeVisibility({ ...baseInput, depth: 2, navigationDepth: 2 })).toBe("visible");
102
+ });
103
+
104
+ it("returns 'hidden' when depth > navigationDepth", () => {
105
+ const result = computeVisibility({ ...baseInput, depth: 3, navigationDepth: 2 });
106
+ expect(result).toBe("hidden");
107
+ });
108
+
109
+ it("returns 'visible' when animating out even if depth > navigationDepth", () => {
110
+ const result = computeVisibility({
111
+ ...baseInput,
112
+ depth: 3,
113
+ navigationDepth: 2,
114
+ isAnimatingOut: true,
115
+ });
116
+ expect(result).toBe("visible");
117
+ });
118
+
119
+ it("works the same for 'stack' displayMode", () => {
120
+ const stackInput = { ...baseInput, displayMode: "stack" as const };
121
+ expect(computeVisibility({ ...stackInput, depth: 1, navigationDepth: 2 })).toBe("visible");
122
+ expect(computeVisibility({ ...stackInput, depth: 3, navigationDepth: 2 })).toBe("hidden");
123
+ });
124
+ });
125
+ });
126
+
127
+ describe("computeStackContentState", () => {
128
+ const baseInput: StackContentStateInput = {
129
+ depth: 1,
130
+ isActive: true,
131
+ wasActive: true,
132
+ currentAnimationType: null,
133
+ displayMode: "overlay",
134
+ transitionMode: "css",
135
+ navigationState: {
136
+ depth: 1,
137
+ isRevealing: false,
138
+ revealDepth: null,
139
+ },
140
+ swipeProgress: undefined,
141
+ };
142
+
143
+ describe("nextAnimationType computation", () => {
144
+ it("computes push animation when becoming active", () => {
145
+ const result = computeStackContentState({
146
+ ...baseInput,
147
+ wasActive: false,
148
+ isActive: true,
149
+ });
150
+ expect(result.nextAnimationType).toBe("push");
151
+ });
152
+
153
+ it("computes pop animation when becoming inactive", () => {
154
+ const result = computeStackContentState({
155
+ ...baseInput,
156
+ wasActive: true,
157
+ isActive: false,
158
+ });
159
+ expect(result.nextAnimationType).toBe("pop");
160
+ });
161
+
162
+ it("preserves current animation type when no state change", () => {
163
+ const result = computeStackContentState({
164
+ ...baseInput,
165
+ currentAnimationType: "push",
166
+ });
167
+ expect(result.nextAnimationType).toBe("push");
168
+ });
169
+ });
170
+
171
+ describe("visibility computation", () => {
172
+ it("sets visibility based on display mode and state", () => {
173
+ const result = computeStackContentState({
174
+ ...baseInput,
175
+ isActive: false,
176
+ wasActive: false,
177
+ displayMode: "overlay",
178
+ });
179
+ expect(result.visibility).toBe("hidden");
180
+ });
181
+
182
+ it("keeps panel visible during pop animation", () => {
183
+ const result = computeStackContentState({
184
+ ...baseInput,
185
+ isActive: false,
186
+ wasActive: true,
187
+ displayMode: "overlay",
188
+ });
189
+ // wasActive=true, isActive=false means pop animation is starting
190
+ expect(result.nextAnimationType).toBe("pop");
191
+ expect(result.visibility).toBe("visible");
192
+ });
193
+ });
194
+
195
+ describe("transform computation", () => {
196
+ it("returns translateX(0) for active panel", () => {
197
+ const result = computeStackContentState(baseInput);
198
+ expect(result.transform).toBe("translateX(0)");
199
+ });
200
+
201
+ it("applies swipe progress transform when swiping", () => {
202
+ const result = computeStackContentState({
203
+ ...baseInput,
204
+ swipeProgress: 0.5,
205
+ });
206
+ expect(result.transform).toBe("translateX(50%)");
207
+ });
208
+
209
+ it("does not apply swipe progress to non-active panels", () => {
210
+ const result = computeStackContentState({
211
+ ...baseInput,
212
+ isActive: false,
213
+ wasActive: false,
214
+ depth: 0,
215
+ navigationState: { depth: 1, isRevealing: false, revealDepth: null },
216
+ displayMode: "slide",
217
+ swipeProgress: 0.5,
218
+ });
219
+ // Previous panel in slide mode has fixed transform
220
+ expect(result.transform).toBe("translateX(-30%)");
221
+ });
222
+ });
223
+
224
+ describe("animation and transition", () => {
225
+ it("returns animation for push when becoming active", () => {
226
+ const result = computeStackContentState({
227
+ ...baseInput,
228
+ wasActive: false,
229
+ isActive: true,
230
+ });
231
+ expect(result.animation).toBeDefined();
232
+ expect(result.animation).toContain("var(--rpl-stack-animation-push");
233
+ });
234
+
235
+ it("returns animation for pop when becoming inactive", () => {
236
+ const result = computeStackContentState({
237
+ ...baseInput,
238
+ wasActive: true,
239
+ isActive: false,
240
+ });
241
+ expect(result.animation).toBeDefined();
242
+ expect(result.animation).toContain("var(--rpl-stack-animation-pop");
243
+ });
244
+
245
+ it("returns undefined animation when no animation type", () => {
246
+ const result = computeStackContentState(baseInput);
247
+ expect(result.animation).toBeUndefined();
248
+ });
249
+
250
+ it("returns transition when transitionMode is css", () => {
251
+ const result = computeStackContentState(baseInput);
252
+ expect(result.transition).toBeDefined();
253
+ expect(result.transition).toContain("transform");
254
+ });
255
+
256
+ it("returns undefined transition when transitionMode is none", () => {
257
+ const result = computeStackContentState({
258
+ ...baseInput,
259
+ transitionMode: "none",
260
+ });
261
+ expect(result.transition).toBeUndefined();
262
+ });
263
+ });
264
+
265
+ describe("static properties", () => {
266
+ it("sets zIndex to depth", () => {
267
+ const result = computeStackContentState({ ...baseInput, depth: 5 });
268
+ expect(result.zIndex).toBe(5);
269
+ });
270
+
271
+ it("sets pointerEvents to 'auto' when active", () => {
272
+ const result = computeStackContentState({ ...baseInput, isActive: true });
273
+ expect(result.pointerEvents).toBe("auto");
274
+ });
275
+
276
+ it("sets pointerEvents to 'none' when not active", () => {
277
+ const result = computeStackContentState({ ...baseInput, isActive: false, wasActive: false });
278
+ expect(result.pointerEvents).toBe("none");
279
+ });
280
+ });
281
+ });