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,89 @@
1
+ /**
2
+ * @file SwipePivotTabBar - Swipeable tab bar for pivot navigation with proper looping.
3
+ *
4
+ * Infinite loop model:
5
+ * - Uses continuous scroll offset (not discrete positions)
6
+ * - Renders tab slots at fixed positions, content determined by scroll offset
7
+ * - Clones tabs at boundaries for seamless looping
8
+ * - Each slot has stable key (by position), preventing remount jumps
9
+ */
10
+ import * as React from "react";
11
+ import type { SwipeInputState, GestureAxis } from "../../hooks/gesture/types.js";
12
+ /**
13
+ * Props passed to the indicator render function.
14
+ * Use these to position a sliding indicator (iOS-style).
15
+ */
16
+ export type IndicatorRenderProps = {
17
+ /** Current offset in pixels (includes swipe displacement and animation) */
18
+ offsetPx: number;
19
+ /** Width of each tab */
20
+ tabWidth: number;
21
+ /** Center X position where active tab is located */
22
+ centerX: number;
23
+ /** Whether currently swiping */
24
+ isSwiping: boolean;
25
+ /** Whether animation is in progress */
26
+ isAnimating: boolean;
27
+ };
28
+ export type SwipePivotTabBarProps<TId extends string = string> = {
29
+ /** Tab items to render */
30
+ items: ReadonlyArray<{
31
+ id: TId;
32
+ label?: string;
33
+ }>;
34
+ /** Currently active tab ID */
35
+ activeId: TId;
36
+ /** Index of active tab */
37
+ activeIndex: number;
38
+ /** Total number of items */
39
+ itemCount: number;
40
+ /** Current swipe input state */
41
+ inputState: SwipeInputState;
42
+ /** Width of each tab */
43
+ tabWidth: number;
44
+ /** Width of the visible viewport */
45
+ viewportWidth: number;
46
+ /** Navigation mode */
47
+ navigationMode?: "linear" | "loop";
48
+ /** Axis for swipe (horizontal or vertical) */
49
+ axis?: GestureAxis;
50
+ /** Render function for each tab */
51
+ renderTab: (item: {
52
+ id: TId;
53
+ label?: string;
54
+ }, isActive: boolean, index: number) => React.ReactNode;
55
+ /** Animation duration in ms */
56
+ animationDuration?: number;
57
+ /**
58
+ * When true, tabs stay at fixed positions and only the indicator moves.
59
+ * Use this for iOS segmented control style where the "window" slides over fixed tabs.
60
+ * @default false
61
+ */
62
+ fixedTabs?: boolean;
63
+ /**
64
+ * Optional render function for a sliding indicator (iOS-style).
65
+ * The indicator follows the active tab position during swipe and animation.
66
+ * Rendered behind the tabs.
67
+ *
68
+ * When used with fixedTabs=true, only the indicator moves while tabs stay fixed.
69
+ *
70
+ * @example
71
+ * ```tsx
72
+ * renderIndicator={({ offsetPx, tabWidth, centerX }) => (
73
+ * <div
74
+ * style={{
75
+ * position: 'absolute',
76
+ * left: centerX,
77
+ * bottom: 0,
78
+ * width: tabWidth,
79
+ * height: 3,
80
+ * backgroundColor: '#007AFF',
81
+ * transform: `translateX(${offsetPx}px)`,
82
+ * }}
83
+ * />
84
+ * )}
85
+ * ```
86
+ */
87
+ renderIndicator?: (props: IndicatorRenderProps) => React.ReactNode;
88
+ };
89
+ export declare function SwipePivotTabBar<TId extends string = string>({ items, activeId, activeIndex, itemCount, inputState, tabWidth, viewportWidth, navigationMode, axis, renderTab, animationDuration, fixedTabs, renderIndicator, }: SwipePivotTabBarProps<TId>): React.ReactElement;
@@ -2,4 +2,7 @@
2
2
  * @file Pivot - Headless content switching system
3
3
  */
4
4
  export { usePivot } from "./usePivot";
5
+ export { scaleInputState } from "./scaleInputState";
6
+ export { SwipePivotTabBar } from "./SwipePivotTabBar";
7
+ export type { SwipePivotTabBarProps, IndicatorRenderProps } from "./SwipePivotTabBar";
5
8
  export type { PivotItem, UsePivotOptions, UsePivotResult, PivotItemProps } from "./types";
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @file Utility for scaling SwipeInputState between containers of different sizes.
3
+ *
4
+ * This enables synchronized swipe behavior between containers with different widths,
5
+ * such as a narrow tab bar and a wide content area moving together proportionally.
6
+ */
7
+ import type { SwipeInputState } from "../../hooks/gesture/types.js";
8
+ /**
9
+ * Scale SwipeInputState displacement and velocity proportionally for different container sizes.
10
+ *
11
+ * When swiping in a container of one size, this function transforms the input state
12
+ * to appear as if the swipe occurred in a container of a different size.
13
+ * This allows tabs and content to move in sync despite different widths.
14
+ *
15
+ * @param inputState - The original swipe input state
16
+ * @param sourceWidth - Width of the source container (where the swipe originated)
17
+ * @param targetWidth - Width of the target container (where the scaled state will be applied)
18
+ * @returns Scaled SwipeInputState with proportionally adjusted displacement and velocity
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * // Content area is 400px wide, each tab is 80px wide (5 tabs)
23
+ * const contentWidth = 400;
24
+ * const tabWidth = 80;
25
+ *
26
+ * // Swipe happens on content area
27
+ * const { inputState } = usePivotSwipeInput({ containerRef, pivot, axis: "horizontal" });
28
+ *
29
+ * // Scale for tabs: 100px content swipe → 20px tab movement
30
+ * const tabInputState = scaleInputState(inputState, contentWidth, tabWidth);
31
+ *
32
+ * // Apply to tabs and content respectively
33
+ * <SwipePivotContent inputState={tabInputState} containerSize={tabWidth} />
34
+ * <SwipePivotContent inputState={inputState} containerSize={contentWidth} />
35
+ * ```
36
+ */
37
+ export declare const scaleInputState: (inputState: SwipeInputState, sourceWidth: number, targetWidth: number) => SwipeInputState;
@@ -3,6 +3,12 @@
3
3
  * Pivot manages content switching within a scope without providing UI.
4
4
  */
5
5
  import type * as React from "react";
6
+ /**
7
+ * Navigation mode for pivot.
8
+ * - "linear": Default. Stops at first/last item.
9
+ * - "loop": Infinite loop. Navigation wraps around.
10
+ */
11
+ export type PivotNavigationMode = "linear" | "loop";
6
12
  /**
7
13
  * A single content item that can be displayed in a Pivot.
8
14
  */
@@ -15,6 +21,12 @@ export type PivotItem<TId extends string = string> = {
15
21
  content: React.ReactNode;
16
22
  /** Whether this item can be selected (defaults to true) */
17
23
  disabled?: boolean;
24
+ /**
25
+ * Enable content caching to preserve React component state across re-renders.
26
+ * When disabled (default), content is re-created on each render.
27
+ * @default false
28
+ */
29
+ cache?: boolean;
18
30
  };
19
31
  /**
20
32
  * Props for the usePivot hook.
@@ -34,6 +46,12 @@ export type UsePivotOptions<TId extends string = string> = {
34
46
  * - "none" disables transitions (uses React.Activity for memory optimization).
35
47
  */
36
48
  transitionMode?: "css" | "none";
49
+ /**
50
+ * Navigation mode for pivot.
51
+ * - "linear" (default): Stops at first/last item.
52
+ * - "loop": Navigation wraps around (last→first, first→last).
53
+ */
54
+ navigationMode?: PivotNavigationMode;
37
55
  };
38
56
  /**
39
57
  * Props object returned by getItemProps for navigation elements.
@@ -45,18 +63,71 @@ export type PivotItemProps = {
45
63
  tabIndex: number;
46
64
  onClick: () => void;
47
65
  };
66
+ /**
67
+ * Options for navigation methods (go, setActiveId).
68
+ */
69
+ export type PivotNavigationOptions = {
70
+ /**
71
+ * Whether to animate the transition.
72
+ * - undefined: use transitionMode setting (default)
73
+ * - true: force animation
74
+ * - false: instant transition without animation
75
+ */
76
+ animated?: boolean;
77
+ };
48
78
  /**
49
79
  * Result from usePivot hook.
50
80
  */
51
81
  export type UsePivotResult<TId extends string = string> = {
52
82
  /** Current active item ID */
53
83
  activeId: TId;
54
- /** Function to change the active item */
55
- setActiveId: (id: TId) => void;
84
+ /**
85
+ * Function to change the active item.
86
+ * @param id - Target item ID
87
+ * @param options - Navigation options (animated, etc.)
88
+ */
89
+ setActiveId: (id: TId, options?: PivotNavigationOptions) => void;
56
90
  /** Helper to check if an item is active */
57
91
  isActive: (id: TId) => boolean;
58
92
  /** Function to get props for navigation items (buttons, links, etc.) */
59
93
  getItemProps: (id: TId) => PivotItemProps;
60
94
  /** Outlet component that renders the active content (react-router style) */
61
95
  Outlet: React.FC;
96
+ /**
97
+ * Navigate in a direction relative to the current item.
98
+ * @param direction - Number of items to move: -1=prev, 1=next, -2=skip2Back, etc.
99
+ * @param options - Navigation options (animated, etc.)
100
+ */
101
+ go: (direction: number, options?: PivotNavigationOptions) => void;
102
+ /**
103
+ * Check if navigation in a direction is possible.
104
+ * @param direction - Direction to check
105
+ * @returns true if navigation is possible
106
+ */
107
+ canGo: (direction: number) => boolean;
108
+ /** Current index of active item in the items array */
109
+ activeIndex: number;
110
+ /** Total number of enabled items */
111
+ itemCount: number;
112
+ /** Whether a transition animation is currently in progress */
113
+ isAnimating: boolean;
114
+ /** Call to signal that animation has completed */
115
+ endAnimation: () => void;
116
+ /** Current navigation mode */
117
+ navigationMode: PivotNavigationMode;
118
+ /**
119
+ * Get the virtual position for an item relative to active.
120
+ * In loop mode, this wraps: item at index 0 can have position 1 if active is last.
121
+ * @param id - Item ID to check
122
+ * @returns -1 (prev), 0 (active), 1 (next), or null if not adjacent
123
+ */
124
+ getVirtualPosition: (id: TId) => -1 | 0 | 1 | null;
125
+ /**
126
+ * Get the position for any item relative to active.
127
+ * Unlike getVirtualPosition, returns positions for all items (not just adjacent).
128
+ * In loop mode, returns the shortest path position (e.g., last→first is +1, not -(count-1)).
129
+ * @param id - Item ID to check
130
+ * @returns Position offset from active, or null if item not found
131
+ */
132
+ getItemPosition: (id: TId) => number | null;
62
133
  };
@@ -0,0 +1,68 @@
1
+ /**
2
+ * @file Hook for binding swipe input to Pivot navigation.
3
+ *
4
+ * This hook connects swipe gesture detection to Pivot's navigation API,
5
+ * translating swipe gestures into go(-1) and go(1) calls.
6
+ *
7
+ * Supports both:
8
+ * - Touch/pointer swipe gestures
9
+ * - Trackpad two-finger swipe (wheel events)
10
+ */
11
+ import * as React from "react";
12
+ import type { SwipeInputState, SwipeInputThresholds, GestureAxis } from "../../hooks/gesture/types.js";
13
+ import type { UsePivotResult } from "./types.js";
14
+ /**
15
+ * Options for usePivotSwipeInput hook.
16
+ */
17
+ export type UsePivotSwipeInputOptions = {
18
+ /** Reference to the swipe container element */
19
+ containerRef: React.RefObject<HTMLElement | null>;
20
+ /** Pivot navigation result from usePivot */
21
+ pivot: Pick<UsePivotResult, "go" | "canGo">;
22
+ /** Axis for swipe detection. @default "horizontal" */
23
+ axis?: GestureAxis;
24
+ /** Whether swipe input is enabled. @default true */
25
+ enabled?: boolean;
26
+ /** Custom swipe thresholds */
27
+ thresholds?: Partial<SwipeInputThresholds>;
28
+ /** Whether to enable trackpad wheel swipe. @default true */
29
+ enableWheelSwipe?: boolean;
30
+ };
31
+ /**
32
+ * Result from usePivotSwipeInput hook.
33
+ */
34
+ export type UsePivotSwipeInputResult = {
35
+ /** Current swipe input state */
36
+ inputState: SwipeInputState;
37
+ /** Props to spread on the container element */
38
+ containerProps: React.HTMLAttributes<HTMLElement> & {
39
+ style: React.CSSProperties;
40
+ };
41
+ };
42
+ /**
43
+ * Hook for binding swipe input to Pivot navigation.
44
+ *
45
+ * Detects horizontal swipe gestures and triggers navigation:
46
+ * - Swipe left (direction -1) → go(1) (next)
47
+ * - Swipe right (direction 1) → go(-1) (prev)
48
+ *
49
+ * Note: The direction mapping is inverted because swiping left reveals the next item,
50
+ * similar to how carousel/swipe navigation works in iOS.
51
+ *
52
+ * @example
53
+ * ```tsx
54
+ * const containerRef = useRef<HTMLDivElement>(null);
55
+ * const pivot = usePivot({ items });
56
+ * const { inputState, containerProps } = usePivotSwipeInput({
57
+ * containerRef,
58
+ * pivot,
59
+ * });
60
+ *
61
+ * return (
62
+ * <div ref={containerRef} {...containerProps}>
63
+ * <pivot.Outlet />
64
+ * </div>
65
+ * );
66
+ * ```
67
+ */
68
+ export declare function usePivotSwipeInput(options: UsePivotSwipeInputOptions): UsePivotSwipeInputResult;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @file StackContent component for rendering stack panels with animations.
3
+ *
4
+ * Override via CSS custom properties:
5
+ * - --rpl-stack-animation-push: Animation when panel is pushed
6
+ * - --rpl-stack-animation-pop: Animation when panel is popped
7
+ * - --rpl-stack-transition-duration: Duration of transitions
8
+ * - --rpl-stack-transition-easing: Easing for transitions
9
+ */
10
+ import * as React from "react";
11
+ import type { StackContentProps } from "./types.js";
12
+ /**
13
+ * Renders a stack panel with appropriate animation based on display mode.
14
+ */
15
+ export declare const StackContent: React.FC<StackContentProps>;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @file SwipeStackContent component for Stack panels with direct DOM manipulation.
3
+ *
4
+ * Provides iOS-style swipe-to-go-back behavior:
5
+ * - Active panel follows the finger directly
6
+ * - Behind panel reveals from -30% with parallax effect
7
+ *
8
+ * Uses useSwipeContentTransform for immediate DOM updates.
9
+ */
10
+ import * as React from "react";
11
+ import type { SwipeInputState, GestureAxis } from "../../hooks/gesture/types.js";
12
+ import type { StackDisplayMode } from "./types.js";
13
+ /**
14
+ * Props for SwipeStackContent component.
15
+ */
16
+ export type SwipeStackContentProps = {
17
+ /** Panel ID */
18
+ id: string;
19
+ /** Panel depth in the stack */
20
+ depth: number;
21
+ /** Current navigation depth (active panel) */
22
+ navigationDepth: number;
23
+ /** Whether this panel is currently active */
24
+ isActive: boolean;
25
+ /** Swipe input state from useStackSwipeInput */
26
+ inputState: SwipeInputState;
27
+ /** Container size in pixels (width for horizontal, height for vertical) */
28
+ containerSize: number;
29
+ /** Gesture axis. @default "horizontal" */
30
+ axis?: GestureAxis;
31
+ /** Behind panel offset ratio. @default -0.3 */
32
+ behindOffset?: number;
33
+ /** Animation duration in ms. @default 300 */
34
+ animationDuration?: number;
35
+ /**
36
+ * Whether to animate when first mounted as active.
37
+ * Set to true for push navigation animations.
38
+ * @default false
39
+ */
40
+ animateOnMount?: boolean;
41
+ /**
42
+ * Whether to show iOS-style edge shadow on active panel.
43
+ * @default true
44
+ */
45
+ showShadow?: boolean;
46
+ /**
47
+ * Display mode for visual styling.
48
+ * - "overlay": panels overlay, no scale (iOS style)
49
+ * - "slide": panels slide with parallax
50
+ * - "stack": panels scale down and offset (stacked cards style)
51
+ * @default "overlay"
52
+ */
53
+ displayMode?: StackDisplayMode;
54
+ /**
55
+ * Whether to show dimming overlay on behind panels.
56
+ * Creates iOS-style darkening effect that fades during swipe.
57
+ * @default true
58
+ */
59
+ showDimming?: boolean;
60
+ /** Content to render */
61
+ children: React.ReactNode;
62
+ };
63
+ export declare const SwipeStackContent: React.FC<SwipeStackContentProps>;
@@ -0,0 +1,80 @@
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 type { SwipeInputState } from "../../hooks/gesture/types.js";
9
+ import type { StackPanel, StackNavigationState } from "./types.js";
10
+ /**
11
+ * Props for SwipeStackOutlet component.
12
+ */
13
+ export type SwipeStackOutletProps = {
14
+ /** Array of panel definitions */
15
+ panels: ReadonlyArray<StackPanel>;
16
+ /** Current navigation state */
17
+ navigationState: StackNavigationState;
18
+ /** Swipe input state from useStackSwipeInput */
19
+ inputState: SwipeInputState;
20
+ /** Container size in pixels (width for horizontal swipe) */
21
+ containerSize: number;
22
+ /** Function to get cached content for a panel */
23
+ getCachedContent?: (panelId: string) => React.ReactNode | null;
24
+ /** Behind panel offset ratio. @default -0.3 */
25
+ behindOffset?: number;
26
+ /**
27
+ * Whether to animate new panels on mount.
28
+ * @default false
29
+ */
30
+ animateOnMount?: boolean;
31
+ /**
32
+ * Animation duration in ms.
33
+ * @default 300
34
+ */
35
+ animationDuration?: number;
36
+ /**
37
+ * Whether to show iOS-style edge shadow on active panels.
38
+ * @default true
39
+ */
40
+ showShadow?: boolean;
41
+ /**
42
+ * Display mode for visual styling.
43
+ * - "overlay": panels overlay, no scale (iOS style)
44
+ * - "slide": panels slide with parallax
45
+ * - "stack": panels scale down and offset (stacked cards style)
46
+ * @default "overlay"
47
+ */
48
+ displayMode?: "overlay" | "slide" | "stack";
49
+ /**
50
+ * Whether to show dimming overlay on behind panels.
51
+ * @default true
52
+ */
53
+ showDimming?: boolean;
54
+ };
55
+ /**
56
+ * SwipeStackOutlet renders stack panels with swipe gesture support.
57
+ *
58
+ * Unlike the default StackOutlet, this component:
59
+ * - Uses SwipeStackContent for direct DOM manipulation
60
+ * - Only renders active and behind panels for performance
61
+ * - Supports iOS-style parallax reveal animation
62
+ *
63
+ * @example
64
+ * ```tsx
65
+ * const navigation = useStackNavigation({ panels, displayMode: 'overlay' });
66
+ * const swipeInput = useStackSwipeInput({ containerRef, navigation });
67
+ *
68
+ * return (
69
+ * <div ref={containerRef} {...swipeInput.containerProps}>
70
+ * <SwipeStackOutlet
71
+ * panels={navigation.panels}
72
+ * navigationState={navigation.state}
73
+ * inputState={swipeInput.inputState}
74
+ * containerSize={containerWidth}
75
+ * />
76
+ * </div>
77
+ * );
78
+ * ```
79
+ */
80
+ export declare const SwipeStackOutlet: React.FC<SwipeStackOutletProps>;
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Animation type for stack panel transitions.
3
+ */
4
+ export type StackAnimationType = "push" | "pop" | null;
5
+ /**
6
+ * Display mode for stack panels.
7
+ */
8
+ export type StackDisplayMode = "overlay" | "slide" | "stack";
9
+ /**
10
+ * Transition mode for animations.
11
+ */
12
+ export type StackTransitionMode = "css" | "none";
13
+ /**
14
+ * Input for computing animation type.
15
+ */
16
+ export type ComputeAnimationTypeInput = {
17
+ wasActive: boolean;
18
+ isActive: boolean;
19
+ transitionMode: StackTransitionMode;
20
+ };
21
+ /**
22
+ * Compute the animation type based on active state change.
23
+ *
24
+ * @returns The animation type to apply, or null if no animation needed.
25
+ */
26
+ export declare function computeAnimationType(input: ComputeAnimationTypeInput): StackAnimationType;
27
+ /**
28
+ * Input for computing visibility.
29
+ */
30
+ export type ComputeVisibilityInput = {
31
+ displayMode: StackDisplayMode;
32
+ depth: number;
33
+ navigationDepth: number;
34
+ isActive: boolean;
35
+ isAnimatingOut: boolean;
36
+ isRevealing: boolean;
37
+ revealDepth: number | null;
38
+ };
39
+ /**
40
+ * Compute panel visibility based on display mode and state.
41
+ *
42
+ * @returns "visible" or "hidden"
43
+ */
44
+ export declare function computeVisibility(input: ComputeVisibilityInput): "visible" | "hidden";
45
+ /**
46
+ * Input for computing transform.
47
+ */
48
+ export type ComputeTransformInput = {
49
+ depth: number;
50
+ activeDepth: number;
51
+ displayMode: StackDisplayMode;
52
+ isRevealing: boolean;
53
+ revealDepth: number | null;
54
+ };
55
+ /**
56
+ * Compute the transform value for a stack panel.
57
+ *
58
+ * @returns CSS transform string
59
+ */
60
+ export declare function computeTransform(input: ComputeTransformInput): string;
61
+ /**
62
+ * Full input for computing stack content state.
63
+ */
64
+ export type StackContentStateInput = {
65
+ depth: number;
66
+ isActive: boolean;
67
+ wasActive: boolean;
68
+ currentAnimationType: StackAnimationType;
69
+ displayMode: StackDisplayMode;
70
+ transitionMode: StackTransitionMode;
71
+ navigationState: {
72
+ depth: number;
73
+ isRevealing: boolean;
74
+ revealDepth: number | null;
75
+ };
76
+ swipeProgress: number | undefined;
77
+ };
78
+ /**
79
+ * Computed state output for stack content.
80
+ */
81
+ export type StackContentStateOutput = {
82
+ nextAnimationType: StackAnimationType;
83
+ visibility: "visible" | "hidden";
84
+ transform: string;
85
+ animation: string | undefined;
86
+ transition: string | undefined;
87
+ zIndex: number;
88
+ pointerEvents: "auto" | "none";
89
+ };
90
+ /**
91
+ * Compute the complete state for a stack content panel.
92
+ *
93
+ * This is the main entry point that combines all state computation.
94
+ * Pure function with no side effects.
95
+ *
96
+ * @param input - All inputs needed to compute state
97
+ * @returns Computed state for rendering
98
+ */
99
+ export declare function computeStackContentState(input: StackContentStateInput): StackContentStateOutput;
@@ -0,0 +1,76 @@
1
+ /**
2
+ * @file Pure functions for computing Stack panel transforms during swipe.
3
+ *
4
+ * These functions calculate positions for iOS-style "swipe to go back" behavior
5
+ * where the active panel follows the finger and the behind panel reveals from -30%.
6
+ */
7
+ /**
8
+ * Default offset for behind panel (-30% of container width).
9
+ */
10
+ export declare const DEFAULT_BEHIND_OFFSET = -0.3;
11
+ /**
12
+ * Compute the target position for the active panel.
13
+ *
14
+ * Active panel starts at 0 and moves right as the user swipes.
15
+ *
16
+ * @param displacement - Current swipe displacement in pixels
17
+ * @returns Target position in pixels
18
+ */
19
+ export declare function computeActiveTargetPx(displacement: number): number;
20
+ /**
21
+ * Compute the target position for the behind panel.
22
+ *
23
+ * Behind panel starts at -30% and moves to 0% as swipe progresses.
24
+ * Uses parallax effect: moves slower than the active panel.
25
+ *
26
+ * @param displacement - Current swipe displacement in pixels
27
+ * @param containerSize - Container width/height in pixels
28
+ * @param behindOffset - Starting offset ratio (default -0.3 for -30%)
29
+ * @returns Target position in pixels
30
+ */
31
+ export declare function computeBehindTargetPx(displacement: number, containerSize: number, behindOffset?: number): number;
32
+ /**
33
+ * Compute swipe progress as a ratio (0 to 1).
34
+ *
35
+ * @param displacement - Current swipe displacement in pixels
36
+ * @param containerSize - Container width/height in pixels
37
+ * @returns Progress ratio from 0 to 1
38
+ */
39
+ export declare function computeSwipeProgress(displacement: number, containerSize: number): number;
40
+ /**
41
+ * Input for computing swipe visibility.
42
+ */
43
+ export type ComputeSwipeVisibilityInput = {
44
+ /** Panel depth in the stack */
45
+ depth: number;
46
+ /** Current navigation depth (active panel) */
47
+ navigationDepth: number;
48
+ /** Whether this panel is currently active */
49
+ isActive: boolean;
50
+ /** Whether swipe gesture is active */
51
+ isSwiping: boolean;
52
+ /** Whether snap-back animation is running */
53
+ isAnimating: boolean;
54
+ };
55
+ /**
56
+ * Compute whether a panel should be visible during swipe.
57
+ *
58
+ * During swipe:
59
+ * - Active panel is always visible
60
+ * - Behind panel (depth = navigationDepth - 1) is visible when swiping/animating
61
+ *
62
+ * @returns true if panel should be visible
63
+ */
64
+ export declare function computeSwipeVisibility(input: ComputeSwipeVisibilityInput): boolean;
65
+ /**
66
+ * Determine the role of a panel during swipe gesture.
67
+ */
68
+ export type SwipePanelRole = "active" | "behind" | "hidden";
69
+ /**
70
+ * Determine the role of a panel during swipe.
71
+ *
72
+ * @param depth - Panel depth in the stack
73
+ * @param navigationDepth - Current navigation depth (active panel)
74
+ * @returns Panel role for swipe handling
75
+ */
76
+ export declare function determineSwipePanelRole(depth: number, navigationDepth: number): SwipePanelRole;