react-panel-layout 0.5.2 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (541) hide show
  1. package/dist/{FloatingPanelFrame-lLg-Lpg7.js → FloatingPanelFrame-3eU9AwPo.js} +11 -11
  2. package/dist/{FloatingPanelFrame-lLg-Lpg7.js.map → FloatingPanelFrame-3eU9AwPo.js.map} +1 -1
  3. package/dist/{FloatingPanelFrame-D9Cp2al1.cjs → FloatingPanelFrame-CEmXDvUA.cjs} +2 -2
  4. package/dist/{FloatingPanelFrame-D9Cp2al1.cjs.map → FloatingPanelFrame-CEmXDvUA.cjs.map} +1 -1
  5. package/dist/FloatingWindow-CUXnEtrb.js +827 -0
  6. package/dist/FloatingWindow-CUXnEtrb.js.map +1 -0
  7. package/dist/FloatingWindow-DMwyK0eK.cjs +2 -0
  8. package/dist/FloatingWindow-DMwyK0eK.cjs.map +1 -0
  9. package/dist/GridLayout-DKTg_N61.cjs +2 -0
  10. package/dist/GridLayout-DKTg_N61.cjs.map +1 -0
  11. package/dist/GridLayout-UWNxXw77.js +926 -0
  12. package/dist/GridLayout-UWNxXw77.js.map +1 -0
  13. package/dist/HorizontalDivider-DdxzfV0l.js +30 -0
  14. package/dist/HorizontalDivider-DdxzfV0l.js.map +1 -0
  15. package/dist/HorizontalDivider-_pgV4Mcv.cjs +2 -0
  16. package/dist/HorizontalDivider-_pgV4Mcv.cjs.map +1 -0
  17. package/dist/PanelSystem-BqUzNtf2.js +1946 -0
  18. package/dist/PanelSystem-BqUzNtf2.js.map +1 -0
  19. package/dist/PanelSystem-D603LKKv.cjs +3 -0
  20. package/dist/PanelSystem-D603LKKv.cjs.map +1 -0
  21. package/dist/ResizeHandle-CBcAS918.cjs +2 -0
  22. package/dist/ResizeHandle-CBcAS918.cjs.map +1 -0
  23. package/dist/ResizeHandle-CXjc1meV.js +119 -0
  24. package/dist/ResizeHandle-CXjc1meV.js.map +1 -0
  25. package/dist/SwipePivotTabBar-DWrCuwEI.js +411 -0
  26. package/dist/SwipePivotTabBar-DWrCuwEI.js.map +1 -0
  27. package/dist/SwipePivotTabBar-fjjXkpj7.cjs +2 -0
  28. package/dist/SwipePivotTabBar-fjjXkpj7.cjs.map +1 -0
  29. package/dist/components/gesture/SwipeSafeZone.d.ts +40 -0
  30. package/dist/components/window/Drawer.d.ts +3 -1
  31. package/dist/components/window/DrawerLayers.d.ts +1 -1
  32. package/dist/components/window/drawerStyles.d.ts +69 -0
  33. package/dist/components/window/drawerSwipeConfig.d.ts +29 -0
  34. package/dist/components/window/useDrawerSwipeTransform.d.ts +23 -0
  35. package/dist/config.cjs +1 -1
  36. package/dist/config.cjs.map +1 -1
  37. package/dist/config.js +11 -9
  38. package/dist/config.js.map +1 -1
  39. package/dist/constants/styles.d.ts +35 -4
  40. package/dist/dialog/index.d.ts +69 -0
  41. package/dist/floating.cjs +1 -1
  42. package/dist/floating.js +1 -1
  43. package/dist/grid/index.d.ts +58 -0
  44. package/dist/grid.cjs +2 -0
  45. package/dist/grid.cjs.map +1 -0
  46. package/dist/grid.js +13 -0
  47. package/dist/grid.js.map +1 -0
  48. package/dist/hooks/gesture/presets.d.ts +33 -0
  49. package/dist/hooks/gesture/testing/createGestureSimulator.d.ts +117 -0
  50. package/dist/hooks/gesture/thresholdValue.d.ts +44 -0
  51. package/dist/hooks/gesture/types.d.ts +297 -0
  52. package/dist/hooks/gesture/useDirectionalLock.d.ts +20 -0
  53. package/dist/hooks/gesture/useEdgeSwipeInput.d.ts +23 -0
  54. package/dist/hooks/gesture/useNativeGestureGuard.d.ts +23 -0
  55. package/dist/hooks/gesture/usePointerTracking.d.ts +22 -0
  56. package/dist/hooks/gesture/useScrollBoundary.d.ts +23 -0
  57. package/dist/hooks/gesture/useSwipeInput.d.ts +5 -0
  58. package/dist/hooks/gesture/utils.d.ts +59 -0
  59. package/dist/hooks/useAnimatedVisibility.d.ts +58 -0
  60. package/dist/hooks/useAnimationFrame.d.ts +86 -0
  61. package/dist/hooks/useOperationContinuity.d.ts +64 -0
  62. package/dist/hooks/useResizeObserver.d.ts +33 -1
  63. package/dist/hooks/useSharedElementTransition.d.ts +112 -0
  64. package/dist/hooks/useSnapAnimation.d.ts +54 -0
  65. package/dist/hooks/useSwipeContentTransform.d.ts +86 -0
  66. package/dist/index.cjs +1 -2
  67. package/dist/index.cjs.map +1 -1
  68. package/dist/index.d.ts +0 -1
  69. package/dist/index.js +25 -2006
  70. package/dist/index.js.map +1 -1
  71. package/dist/modules/dialog/AlertDialog.d.ts +9 -0
  72. package/dist/modules/dialog/DialogContainer.d.ts +37 -0
  73. package/dist/modules/dialog/Modal.d.ts +26 -0
  74. package/dist/modules/dialog/SwipeDialogContainer.d.ts +16 -0
  75. package/dist/modules/dialog/dialogAnimationUtils.d.ts +113 -0
  76. package/dist/modules/dialog/types.d.ts +183 -0
  77. package/dist/modules/dialog/useDialog.d.ts +39 -0
  78. package/dist/modules/dialog/useDialogContainer.d.ts +47 -0
  79. package/dist/modules/dialog/useDialogSwipeInput.d.ts +70 -0
  80. package/dist/modules/dialog/useDialogTransform.d.ts +82 -0
  81. package/dist/modules/drawer/types.d.ts +74 -0
  82. package/dist/modules/drawer/useDrawerSwipeInput.d.ts +24 -0
  83. package/dist/modules/pivot/PivotContent.d.ts +1 -1
  84. package/dist/modules/pivot/SwipePivotContent.d.ts +39 -0
  85. package/dist/modules/pivot/SwipePivotContent.debug.tmp.d.ts +25 -0
  86. package/dist/modules/pivot/SwipePivotContent.test.d.ts +1 -0
  87. package/dist/modules/pivot/SwipePivotTabBar.d.ts +92 -0
  88. package/dist/modules/pivot/index.d.ts +3 -0
  89. package/dist/modules/pivot/scaleInputState.d.ts +37 -0
  90. package/dist/modules/pivot/types.d.ts +67 -2
  91. package/dist/modules/pivot/usePivotSwipeInput.d.ts +68 -0
  92. package/dist/modules/stack/StackContent.d.ts +15 -0
  93. package/dist/modules/stack/SwipeStackContent.d.ts +66 -0
  94. package/dist/modules/stack/SwipeStackOutlet.d.ts +80 -0
  95. package/dist/modules/stack/computeStackContentState.d.ts +99 -0
  96. package/dist/modules/stack/computeSwipeStackTransform.d.ts +76 -0
  97. package/dist/modules/stack/types.d.ts +194 -0
  98. package/dist/modules/stack/useStackAnimationState.d.ts +32 -0
  99. package/dist/modules/stack/useStackNavigation.d.ts +23 -0
  100. package/dist/modules/stack/useStackSwipeInput.d.ts +27 -0
  101. package/dist/panels/index.d.ts +67 -0
  102. package/dist/panels.cjs +2 -0
  103. package/dist/panels.cjs.map +1 -0
  104. package/dist/panels.js +28 -0
  105. package/dist/panels.js.map +1 -0
  106. package/dist/pivot/index.d.ts +3 -0
  107. package/dist/pivot.cjs +1 -1
  108. package/dist/pivot.cjs.map +1 -1
  109. package/dist/pivot.js +20 -2
  110. package/dist/pivot.js.map +1 -1
  111. package/dist/resizer/index.d.ts +57 -0
  112. package/dist/resizer.cjs +2 -0
  113. package/dist/resizer.cjs.map +1 -0
  114. package/dist/resizer.js +8 -0
  115. package/dist/resizer.js.map +1 -0
  116. package/dist/stack/index.d.ts +72 -0
  117. package/dist/stack.cjs +2 -0
  118. package/dist/stack.cjs.map +1 -0
  119. package/dist/stack.js +721 -0
  120. package/dist/stack.js.map +1 -0
  121. package/dist/sticky-header/StickyArea.d.ts +38 -0
  122. package/dist/sticky-header/calculateStickyMetrics.d.ts +28 -0
  123. package/dist/sticky-header/index.d.ts +4 -4
  124. package/dist/sticky-header/types.d.ts +35 -22
  125. package/dist/sticky-header.cjs +1 -1
  126. package/dist/sticky-header.cjs.map +1 -1
  127. package/dist/sticky-header.js +73 -174
  128. package/dist/sticky-header.js.map +1 -1
  129. package/dist/styles-NkjuMOVS.js +57 -0
  130. package/dist/styles-NkjuMOVS.js.map +1 -0
  131. package/dist/styles-qf6ptVLD.cjs +2 -0
  132. package/dist/styles-qf6ptVLD.cjs.map +1 -0
  133. package/dist/types.d.ts +16 -0
  134. package/dist/useContentCache-CO3LYNmz.js +24 -0
  135. package/dist/useContentCache-CO3LYNmz.js.map +1 -0
  136. package/dist/useContentCache-DqXtLrLs.cjs +2 -0
  137. package/dist/useContentCache-DqXtLrLs.cjs.map +1 -0
  138. package/dist/useDocumentPointerEvents-DXxw3qWj.js +54 -0
  139. package/dist/useDocumentPointerEvents-DXxw3qWj.js.map +1 -0
  140. package/dist/useDocumentPointerEvents-DxDSOtip.cjs +2 -0
  141. package/dist/useDocumentPointerEvents-DxDSOtip.cjs.map +1 -0
  142. package/dist/useFloatingState-C4kRaW_R.cjs +2 -0
  143. package/dist/useFloatingState-C4kRaW_R.cjs.map +1 -0
  144. package/dist/useFloatingState-tEfA_wbc.js +74 -0
  145. package/dist/useFloatingState-tEfA_wbc.js.map +1 -0
  146. package/dist/useNativeGestureGuard-C7TSqEkr.cjs +2 -0
  147. package/dist/useNativeGestureGuard-C7TSqEkr.cjs.map +1 -0
  148. package/dist/useNativeGestureGuard-CGYo6O0r.js +347 -0
  149. package/dist/useNativeGestureGuard-CGYo6O0r.js.map +1 -0
  150. package/dist/window/index.d.ts +63 -0
  151. package/dist/window.cjs +2 -0
  152. package/dist/window.cjs.map +1 -0
  153. package/dist/window.js +160 -0
  154. package/dist/window.js.map +1 -0
  155. package/docs/design-tokens.md +405 -0
  156. package/package.json +34 -4
  157. package/src/PanelSystemContext.tsx +88 -0
  158. package/src/components/gesture/SwipeSafeZone.tsx +69 -0
  159. package/src/components/grid/GridLayerList.tsx +172 -0
  160. package/src/components/grid/GridLayerResizeHandles.tsx +145 -0
  161. package/src/components/grid/GridLayout.spec.tsx +743 -0
  162. package/src/components/grid/GridLayout.tsx +130 -0
  163. package/src/components/grid/GridTrackResizeHandle.tsx +87 -0
  164. package/src/components/paneling/FloatingPanelFrame.tsx +203 -0
  165. package/src/components/panels/DropSuggestOverlay.tsx +131 -0
  166. package/src/components/panels/PanelGroupView.tsx +112 -0
  167. package/src/components/pivot/PivotLayer.tsx +27 -0
  168. package/src/components/resizer/HorizontalDivider.tsx +52 -0
  169. package/src/components/resizer/ResizeHandle.tsx +118 -0
  170. package/src/components/tabs/TabBar.tsx +223 -0
  171. package/src/components/tabs/TabBarTab.tsx +133 -0
  172. package/src/components/tabs/TabDragOverlay.tsx +92 -0
  173. package/src/components/window/DialogOverlay.tsx +180 -0
  174. package/src/components/window/Drawer.tsx +369 -0
  175. package/src/components/window/DrawerLayers.tsx +68 -0
  176. package/src/components/window/FloatingWindow.tsx +95 -0
  177. package/src/components/window/PopupLayerPortal.tsx +218 -0
  178. package/src/components/window/drawerStyles.spec.ts +263 -0
  179. package/src/components/window/drawerStyles.ts +228 -0
  180. package/src/components/window/drawerSwipeConfig.spec.ts +131 -0
  181. package/src/components/window/drawerSwipeConfig.ts +112 -0
  182. package/src/components/window/useDrawerSwipeTransform.spec.ts +234 -0
  183. package/src/components/window/useDrawerSwipeTransform.ts +129 -0
  184. package/src/config/PanelContentDeclaration.tsx +427 -0
  185. package/src/config/index.tsx +52 -0
  186. package/src/config/panelJsx.spec.tsx +54 -0
  187. package/src/config/panelJsxConfig.spec.tsx +54 -0
  188. package/src/config/panelJsxDrawer.spec.tsx +33 -0
  189. package/src/config/panelRouter.spec.ts +68 -0
  190. package/src/config/panelRouter.tsx +155 -0
  191. package/src/constants/styles.ts +280 -0
  192. package/src/demo/Layout.module.css +258 -0
  193. package/src/demo/Layout.tsx +176 -0
  194. package/src/demo/components/CodeBlock.module.css +54 -0
  195. package/src/demo/components/CodeBlock.tsx +34 -0
  196. package/src/demo/components/CodePreview.module.css +37 -0
  197. package/src/demo/components/CodePreview.tsx +31 -0
  198. package/src/demo/components/DataPreview.module.css +177 -0
  199. package/src/demo/components/DataPreview.tsx +115 -0
  200. package/src/demo/components/Story.module.css +68 -0
  201. package/src/demo/components/Story.tsx +54 -0
  202. package/src/demo/components/layout/CodePanel.module.css +183 -0
  203. package/src/demo/components/layout/CodePanel.tsx +149 -0
  204. package/src/demo/components/layout/DemoPage.module.css +60 -0
  205. package/src/demo/components/layout/DemoPage.tsx +56 -0
  206. package/src/demo/components/layout/SingleSamplePage.module.css +11 -0
  207. package/src/demo/components/layout/SingleSamplePage.tsx +35 -0
  208. package/src/demo/components/layout/SplitDemoLayout.module.css +107 -0
  209. package/src/demo/components/layout/SplitDemoLayout.tsx +218 -0
  210. package/src/demo/components/layout/index.ts +11 -0
  211. package/src/demo/components/tab-styles/ChromeTabBar.module.css +75 -0
  212. package/src/demo/components/tab-styles/ChromeTabBar.tsx +111 -0
  213. package/src/demo/components/tab-styles/GitHubTabBar.module.css +81 -0
  214. package/src/demo/components/tab-styles/GitHubTabBar.tsx +109 -0
  215. package/src/demo/components/tab-styles/VSCodeTabBar.module.css +78 -0
  216. package/src/demo/components/tab-styles/VSCodeTabBar.tsx +109 -0
  217. package/src/demo/components/tab-styles/index.ts +6 -0
  218. package/src/demo/components/ui/DemoButton.module.css +63 -0
  219. package/src/demo/components/ui/DemoButton.tsx +32 -0
  220. package/src/demo/components/ui/DemoCard.module.css +15 -0
  221. package/src/demo/components/ui/DemoCard.tsx +30 -0
  222. package/src/demo/components/ui/DemoContainer.module.css +17 -0
  223. package/src/demo/components/ui/DemoContainer.tsx +30 -0
  224. package/src/demo/components/ui/DemoPanel.module.css +23 -0
  225. package/src/demo/components/ui/DemoPanel.tsx +33 -0
  226. package/src/demo/components/ui/PanelText.module.css +18 -0
  227. package/src/demo/components/ui/PanelText.tsx +29 -0
  228. package/src/demo/components/ui/PanelTitle.module.css +18 -0
  229. package/src/demo/components/ui/PanelTitle.tsx +31 -0
  230. package/src/demo/contexts/TabbarDemoConfig.tsx +218 -0
  231. package/src/demo/demo.css +172 -0
  232. package/src/demo/hooks/useMedia.ts +41 -0
  233. package/src/demo/hooks/useShikiHighlight.ts +55 -0
  234. package/src/demo/index.tsx +293 -0
  235. package/src/demo/pages/Dialog/alerts/index.tsx +22 -0
  236. package/src/demo/pages/Dialog/card/index.tsx +22 -0
  237. package/src/demo/pages/Dialog/components/AlertDialogDemo.tsx +124 -0
  238. package/src/demo/pages/Dialog/components/CardExpandDemo.module.css +243 -0
  239. package/src/demo/pages/Dialog/components/CardExpandDemo.tsx +204 -0
  240. package/src/demo/pages/Dialog/components/CustomAlertDialogDemo.tsx +219 -0
  241. package/src/demo/pages/Dialog/components/DialogDemos.module.css +77 -0
  242. package/src/demo/pages/Dialog/components/ModalBasics.tsx +45 -0
  243. package/src/demo/pages/Dialog/components/SwipeDialogDemo.module.css +77 -0
  244. package/src/demo/pages/Dialog/components/SwipeDialogDemo.tsx +181 -0
  245. package/src/demo/pages/Dialog/custom-alert/index.tsx +22 -0
  246. package/src/demo/pages/Dialog/modal/index.tsx +17 -0
  247. package/src/demo/pages/Dialog/swipe/index.tsx +22 -0
  248. package/src/demo/pages/Drawer/animations/index.tsx +22 -0
  249. package/src/demo/pages/Drawer/basics/index.tsx +17 -0
  250. package/src/demo/pages/Drawer/components/DrawerAnimations.module.css +125 -0
  251. package/src/demo/pages/Drawer/components/DrawerAnimations.tsx +118 -0
  252. package/src/demo/pages/Drawer/components/DrawerBasics.module.css +55 -0
  253. package/src/demo/pages/Drawer/components/DrawerBasics.tsx +76 -0
  254. package/src/demo/pages/Drawer/components/DrawerMenuLayout.module.css +332 -0
  255. package/src/demo/pages/Drawer/components/DrawerMenuLayout.tsx +199 -0
  256. package/src/demo/pages/Drawer/components/DrawerSwipe.module.css +316 -0
  257. package/src/demo/pages/Drawer/components/DrawerSwipe.tsx +178 -0
  258. package/src/demo/pages/Drawer/menu/index.tsx +17 -0
  259. package/src/demo/pages/Drawer/swipe/index.tsx +17 -0
  260. package/src/demo/pages/FloatingPanelFrame/ResizableFloatingPanelsPreview.module.css +163 -0
  261. package/src/demo/pages/FloatingPanelFrame/ResizableFloatingPanelsPreview.tsx +234 -0
  262. package/src/demo/pages/FloatingPanelFrame/basic/index.tsx +17 -0
  263. package/src/demo/pages/FloatingPanelFrame/complex/index.tsx +26 -0
  264. package/src/demo/pages/FloatingPanelFrame/components/BasicPanel.module.css +16 -0
  265. package/src/demo/pages/FloatingPanelFrame/components/BasicPanel.tsx +24 -0
  266. package/src/demo/pages/FloatingPanelFrame/components/ComplexPanel.module.css +54 -0
  267. package/src/demo/pages/FloatingPanelFrame/components/ComplexPanel.tsx +67 -0
  268. package/src/demo/pages/FloatingPanelFrame/components/PanelWithControls.module.css +21 -0
  269. package/src/demo/pages/FloatingPanelFrame/components/PanelWithControls.tsx +41 -0
  270. package/src/demo/pages/FloatingPanelFrame/components/PanelWithMeta.module.css +5 -0
  271. package/src/demo/pages/FloatingPanelFrame/components/PanelWithMeta.tsx +43 -0
  272. package/src/demo/pages/FloatingPanelFrame/components/ScrollablePanel.module.css +11 -0
  273. package/src/demo/pages/FloatingPanelFrame/components/ScrollablePanel.tsx +42 -0
  274. package/src/demo/pages/FloatingPanelFrame/index.tsx +80 -0
  275. package/src/demo/pages/FloatingPanelFrame/scrollable/index.tsx +30 -0
  276. package/src/demo/pages/FloatingPanelFrame/with-controls/index.tsx +30 -0
  277. package/src/demo/pages/FloatingPanelFrame/with-meta/index.tsx +17 -0
  278. package/src/demo/pages/HorizontalDivider/components/PanelsWithRichContent.module.css +112 -0
  279. package/src/demo/pages/HorizontalDivider/components/PanelsWithRichContent.tsx +56 -0
  280. package/src/demo/pages/HorizontalDivider/components/SimpleResizablePanels.module.css +46 -0
  281. package/src/demo/pages/HorizontalDivider/components/SimpleResizablePanels.tsx +29 -0
  282. package/src/demo/pages/HorizontalDivider/components/ThreePanelLayout.module.css +54 -0
  283. package/src/demo/pages/HorizontalDivider/components/ThreePanelLayout.tsx +30 -0
  284. package/src/demo/pages/HorizontalDivider/index.module.css +14 -0
  285. package/src/demo/pages/HorizontalDivider/index.tsx +64 -0
  286. package/src/demo/pages/HorizontalDivider/panels-with-rich-content/index.tsx +21 -0
  287. package/src/demo/pages/HorizontalDivider/simple-resizable-panels/index.tsx +21 -0
  288. package/src/demo/pages/HorizontalDivider/three-panel-layout/index.tsx +21 -0
  289. package/src/demo/pages/PanelLayout/PanelLayoutDemo.module.css +174 -0
  290. package/src/demo/pages/PanelLayout/PanelLayoutDemo.tsx +248 -0
  291. package/src/demo/pages/PanelLayout/components/DashboardLayout.module.css +115 -0
  292. package/src/demo/pages/PanelLayout/components/DashboardLayout.tsx +124 -0
  293. package/src/demo/pages/PanelLayout/components/DraggableOverlays.module.css +101 -0
  294. package/src/demo/pages/PanelLayout/components/DraggableOverlays.tsx +122 -0
  295. package/src/demo/pages/PanelLayout/components/IDELayout.module.css +104 -0
  296. package/src/demo/pages/PanelLayout/components/IDELayout.tsx +143 -0
  297. package/src/demo/pages/PanelLayout/components/SimpleGrid.module.css +19 -0
  298. package/src/demo/pages/PanelLayout/components/SimpleGrid.tsx +62 -0
  299. package/src/demo/pages/PanelLayout/dashboard/index.tsx +22 -0
  300. package/src/demo/pages/PanelLayout/draggable-overlays/index.tsx +22 -0
  301. package/src/demo/pages/PanelLayout/ide-layout/index.tsx +22 -0
  302. package/src/demo/pages/PanelLayout/index.tsx +94 -0
  303. package/src/demo/pages/PanelLayout/simple-grid/index.tsx +22 -0
  304. package/src/demo/pages/PanelSystem/PanelSystemPreview.module.css +20 -0
  305. package/src/demo/pages/PanelSystem/PanelSystemPreview.tsx +101 -0
  306. package/src/demo/pages/PanelSystem/preview/index.tsx +18 -0
  307. package/src/demo/pages/PanelSystem/tabbar/index.tsx +129 -0
  308. package/src/demo/pages/Pivot/basics/index.tsx +17 -0
  309. package/src/demo/pages/Pivot/components/Pivot.module.css +278 -0
  310. package/src/demo/pages/Pivot/components/PivotBasics.tsx +103 -0
  311. package/src/demo/pages/Pivot/components/PivotSidebar.tsx +168 -0
  312. package/src/demo/pages/Pivot/components/PivotTabs.tsx +129 -0
  313. package/src/demo/pages/Pivot/components/PivotTransitions.tsx +120 -0
  314. package/src/demo/pages/Pivot/components/SwipePivot.module.css +114 -0
  315. package/src/demo/pages/Pivot/components/SwipePivot.tsx +193 -0
  316. package/src/demo/pages/Pivot/components/SwipeTabsPivot.module.css +203 -0
  317. package/src/demo/pages/Pivot/components/SwipeTabsPivot.tsx +320 -0
  318. package/src/demo/pages/Pivot/sidebar/index.tsx +17 -0
  319. package/src/demo/pages/Pivot/swipe/index.tsx +16 -0
  320. package/src/demo/pages/Pivot/swipe-debug/index.tsx +287 -0
  321. package/src/demo/pages/Pivot/swipe-tabs/index.tsx +15 -0
  322. package/src/demo/pages/Pivot/tabs/index.tsx +17 -0
  323. package/src/demo/pages/Pivot/transitions/index.tsx +17 -0
  324. package/src/demo/pages/ResizeHandle/both-directions/index.tsx +17 -0
  325. package/src/demo/pages/ResizeHandle/components/BothDirectionsDemo.module.css +72 -0
  326. package/src/demo/pages/ResizeHandle/components/BothDirectionsDemo.tsx +41 -0
  327. package/src/demo/pages/ResizeHandle/components/HorizontalResizeDemo.module.css +61 -0
  328. package/src/demo/pages/ResizeHandle/components/HorizontalResizeDemo.tsx +33 -0
  329. package/src/demo/pages/ResizeHandle/components/NestedPanelsDemo.module.css +83 -0
  330. package/src/demo/pages/ResizeHandle/components/NestedPanelsDemo.tsx +53 -0
  331. package/src/demo/pages/ResizeHandle/components/VerticalResizeDemo.module.css +68 -0
  332. package/src/demo/pages/ResizeHandle/components/VerticalResizeDemo.tsx +33 -0
  333. package/src/demo/pages/ResizeHandle/horizontal/index.tsx +17 -0
  334. package/src/demo/pages/ResizeHandle/index.module.css +11 -0
  335. package/src/demo/pages/ResizeHandle/index.tsx +71 -0
  336. package/src/demo/pages/ResizeHandle/nested-panels/index.tsx +17 -0
  337. package/src/demo/pages/ResizeHandle/vertical/index.tsx +17 -0
  338. package/src/demo/pages/ResponsiveLayout/adaptive-workspace/index.tsx +22 -0
  339. package/src/demo/pages/ResponsiveLayout/components/ResponsiveWorkspace.module.css +423 -0
  340. package/src/demo/pages/ResponsiveLayout/components/ResponsiveWorkspace.tsx +398 -0
  341. package/src/demo/pages/Stack/basics/index.tsx +22 -0
  342. package/src/demo/pages/Stack/components/Stack.module.css +234 -0
  343. package/src/demo/pages/Stack/components/StackBasics.spec.tsx +152 -0
  344. package/src/demo/pages/Stack/components/StackBasics.tsx +301 -0
  345. package/src/demo/pages/Stack/components/StackTablet.module.css +299 -0
  346. package/src/demo/pages/Stack/components/StackTablet.spec.tsx +120 -0
  347. package/src/demo/pages/Stack/components/StackTablet.tsx +422 -0
  348. package/src/demo/pages/Stack/tablet/index.tsx +22 -0
  349. package/src/demo/pages/StickyHeader/basics/index.tsx +17 -0
  350. package/src/demo/pages/StickyHeader/components/StickyHeader.module.css +219 -0
  351. package/src/demo/pages/StickyHeader/components/StickyHeaderBasics.tsx +103 -0
  352. package/src/demo/routes.tsx +214 -0
  353. package/src/demo/styles/animations.css +68 -0
  354. package/src/demo/styles/stack-themes.css +35 -0
  355. package/src/demo/utils/createPanelView.tsx +58 -0
  356. package/src/dialog/index.ts +85 -0
  357. package/src/floating/index.ts +24 -0
  358. package/src/grid/index.ts +75 -0
  359. package/src/hooks/ContentCacheContext.tsx +87 -0
  360. package/src/hooks/gesture/presets.spec.ts +86 -0
  361. package/src/hooks/gesture/presets.ts +95 -0
  362. package/src/hooks/gesture/testing/createGestureSimulator.spec.ts +241 -0
  363. package/src/hooks/gesture/testing/createGestureSimulator.ts +385 -0
  364. package/src/hooks/gesture/thresholdValue.spec.ts +103 -0
  365. package/src/hooks/gesture/thresholdValue.ts +77 -0
  366. package/src/hooks/gesture/types.ts +367 -0
  367. package/src/hooks/gesture/useDirectionalLock.spec.ts +271 -0
  368. package/src/hooks/gesture/useDirectionalLock.ts +115 -0
  369. package/src/hooks/gesture/useEdgeSwipeInput.spec.ts +462 -0
  370. package/src/hooks/gesture/useEdgeSwipeInput.ts +131 -0
  371. package/src/hooks/gesture/useNativeGestureGuard.spec.ts +473 -0
  372. package/src/hooks/gesture/useNativeGestureGuard.ts +135 -0
  373. package/src/hooks/gesture/usePointerTracking.spec.ts +364 -0
  374. package/src/hooks/gesture/usePointerTracking.ts +134 -0
  375. package/src/hooks/gesture/useScrollBoundary.spec.ts +249 -0
  376. package/src/hooks/gesture/useScrollBoundary.ts +113 -0
  377. package/src/hooks/gesture/useSwipeInput.spec.ts +592 -0
  378. package/src/hooks/gesture/useSwipeInput.ts +310 -0
  379. package/src/hooks/gesture/utils.spec.ts +152 -0
  380. package/src/hooks/gesture/utils.ts +178 -0
  381. package/src/hooks/useAnimatedVisibility.spec.ts +277 -0
  382. package/src/hooks/useAnimatedVisibility.ts +172 -0
  383. package/src/hooks/useAnimationFrame.ts +208 -0
  384. package/src/hooks/useCSSMatrix.spec.ts +214 -0
  385. package/src/hooks/useCSSMatrix.ts +262 -0
  386. package/src/hooks/useClonedElementPreview.ts +28 -0
  387. package/src/hooks/useContainerScroll.ts +78 -0
  388. package/src/hooks/useContentCache.spec.tsx +232 -0
  389. package/src/hooks/useContentCache.tsx +127 -0
  390. package/src/hooks/useDocumentPointerEvents.ts +137 -0
  391. package/src/hooks/useDocumentScroll.ts +41 -0
  392. package/src/hooks/useEffectEvent.ts +40 -0
  393. package/src/hooks/useElementComponentWrapper.tsx +63 -0
  394. package/src/hooks/useIntersectionObserver.tsx +125 -0
  395. package/src/hooks/useIsomorphicLayoutEffect.ts +29 -0
  396. package/src/hooks/useOperationContinuity.spec.ts +387 -0
  397. package/src/hooks/useOperationContinuity.ts +135 -0
  398. package/src/hooks/useResizeObserver.spec.tsx +277 -0
  399. package/src/hooks/useResizeObserver.tsx +150 -0
  400. package/src/hooks/useScrollContainer.ts +73 -0
  401. package/src/hooks/useSharedElementTransition.ts +333 -0
  402. package/src/hooks/useSnapAnimation.ts +128 -0
  403. package/src/hooks/useSwipeContentTransform.spec.ts +133 -0
  404. package/src/hooks/useSwipeContentTransform.ts +373 -0
  405. package/src/hooks/useTransitionState.ts +95 -0
  406. package/src/index.tsx +88 -0
  407. package/src/modules/dialog/AlertDialog.spec.tsx +387 -0
  408. package/src/modules/dialog/AlertDialog.tsx +221 -0
  409. package/src/modules/dialog/DialogContainer.spec.tsx +228 -0
  410. package/src/modules/dialog/DialogContainer.tsx +188 -0
  411. package/src/modules/dialog/Modal.spec.tsx +220 -0
  412. package/src/modules/dialog/Modal.tsx +182 -0
  413. package/src/modules/dialog/SwipeDialogContainer.tsx +208 -0
  414. package/src/modules/dialog/dialogAnimationUtils.spec.ts +253 -0
  415. package/src/modules/dialog/dialogAnimationUtils.ts +297 -0
  416. package/src/modules/dialog/types.ts +186 -0
  417. package/src/modules/dialog/useDialog.spec.tsx +447 -0
  418. package/src/modules/dialog/useDialog.ts +214 -0
  419. package/src/modules/dialog/useDialogContainer.spec.ts +331 -0
  420. package/src/modules/dialog/useDialogContainer.ts +150 -0
  421. package/src/modules/dialog/useDialogSwipeInput.spec.ts +157 -0
  422. package/src/modules/dialog/useDialogSwipeInput.ts +319 -0
  423. package/src/modules/dialog/useDialogTransform.spec.ts +370 -0
  424. package/src/modules/dialog/useDialogTransform.ts +407 -0
  425. package/src/modules/drawer/types.ts +102 -0
  426. package/src/modules/drawer/useDrawerSwipeInput.spec.ts +566 -0
  427. package/src/modules/drawer/useDrawerSwipeInput.ts +399 -0
  428. package/src/modules/grid/GridLayoutContext.tsx +57 -0
  429. package/src/modules/grid/LayerInstanceContext.tsx +56 -0
  430. package/src/modules/grid/resizeHandles.ts +157 -0
  431. package/src/modules/grid/trackUtils.ts +146 -0
  432. package/src/modules/grid/useGridPlacements.ts +143 -0
  433. package/src/modules/grid/useGridTracks.ts +156 -0
  434. package/src/modules/grid/useLayerDragHandle.ts +16 -0
  435. package/src/modules/grid/useLayerInteractions.tsx +850 -0
  436. package/src/modules/keybindings/KeybindingsProvider.tsx +111 -0
  437. package/src/modules/panels/dom/DomRegistry.tsx +94 -0
  438. package/src/modules/panels/index.ts +45 -0
  439. package/src/modules/panels/interactions/InteractionsContext.test.tsx +330 -0
  440. package/src/modules/panels/interactions/InteractionsContext.tsx +394 -0
  441. package/src/modules/panels/interactions/dnd.ts +28 -0
  442. package/src/modules/panels/keybindings/KeybindingsInstaller.tsx +15 -0
  443. package/src/modules/panels/layout/adapter.ts +124 -0
  444. package/src/modules/panels/rendering/ContentRegistry.spec.tsx +311 -0
  445. package/src/modules/panels/rendering/ContentRegistry.tsx +205 -0
  446. package/src/modules/panels/rendering/GroupContainer.tsx +65 -0
  447. package/src/modules/panels/rendering/RenderBridge.tsx +115 -0
  448. package/src/modules/panels/rendering/RenderContext.tsx +31 -0
  449. package/src/modules/panels/state/PanelSplitHandles.tsx +147 -0
  450. package/src/modules/panels/state/PanelSystemContext.splitLimits.spec.tsx +50 -0
  451. package/src/modules/panels/state/PanelSystemContext.tsx +289 -0
  452. package/src/modules/panels/state/StateContext.tsx +12 -0
  453. package/src/modules/panels/state/cleanup.ts +37 -0
  454. package/src/modules/panels/state/commands.ts +53 -0
  455. package/src/modules/panels/state/focus/Context.tsx +25 -0
  456. package/src/modules/panels/state/focus/logic.ts +57 -0
  457. package/src/modules/panels/state/groups/Context.tsx +25 -0
  458. package/src/modules/panels/state/groups/logic.ts +105 -0
  459. package/src/modules/panels/state/splitLimits.spec.ts +46 -0
  460. package/src/modules/panels/state/splitLimits.ts +90 -0
  461. package/src/modules/panels/state/state.spec.ts +49 -0
  462. package/src/modules/panels/state/tree/Context.tsx +24 -0
  463. package/src/modules/panels/state/tree/logic.spec.ts +34 -0
  464. package/src/modules/panels/state/tree/logic.ts +138 -0
  465. package/src/modules/panels/state/types.ts +142 -0
  466. package/src/modules/panels/system/PanelSystem.empty-tabbar.spec.tsx +53 -0
  467. package/src/modules/panels/system/PanelSystem.tab-click-activates.spec.tsx +44 -0
  468. package/src/modules/panels/system/PanelSystem.tab-reorder.spec.tsx +64 -0
  469. package/src/modules/panels/system/PanelSystem.tabs-no-dup.spec.tsx +57 -0
  470. package/src/modules/panels/system/PanelSystem.tsx +206 -0
  471. package/src/modules/pivot/PivotContent.spec.tsx +179 -0
  472. package/src/modules/pivot/PivotContent.tsx +77 -0
  473. package/src/modules/pivot/SwipePivotContent.debug.tmp.tsx +237 -0
  474. package/src/modules/pivot/SwipePivotContent.position.spec.tsx +171 -0
  475. package/src/modules/pivot/SwipePivotContent.spec.tsx +494 -0
  476. package/src/modules/pivot/SwipePivotContent.test.tsx +502 -0
  477. package/src/modules/pivot/SwipePivotContent.tsx +197 -0
  478. package/src/modules/pivot/SwipePivotTabBar.spec.tsx +882 -0
  479. package/src/modules/pivot/SwipePivotTabBar.tsx +583 -0
  480. package/src/modules/pivot/index.ts +8 -0
  481. package/src/modules/pivot/scaleInputState.spec.ts +219 -0
  482. package/src/modules/pivot/scaleInputState.ts +66 -0
  483. package/src/modules/pivot/types.ts +139 -0
  484. package/src/modules/pivot/usePivot.spec.ts +635 -0
  485. package/src/modules/pivot/usePivot.spec.tsx +186 -0
  486. package/src/modules/pivot/usePivot.tsx +345 -0
  487. package/src/modules/pivot/usePivotSwipeInput.spec.ts +708 -0
  488. package/src/modules/pivot/usePivotSwipeInput.ts +136 -0
  489. package/src/modules/resizer/useResizeDrag.ts +94 -0
  490. package/src/modules/stack/StackContent.spec.tsx +264 -0
  491. package/src/modules/stack/StackContent.tsx +111 -0
  492. package/src/modules/stack/SwipeStackContent.spec.tsx +1564 -0
  493. package/src/modules/stack/SwipeStackContent.tsx +366 -0
  494. package/src/modules/stack/SwipeStackOutlet.spec.tsx +250 -0
  495. package/src/modules/stack/SwipeStackOutlet.tsx +221 -0
  496. package/src/modules/stack/computeStackContentState.spec.ts +281 -0
  497. package/src/modules/stack/computeStackContentState.ts +304 -0
  498. package/src/modules/stack/computeSwipeStackTransform.spec.ts +186 -0
  499. package/src/modules/stack/computeSwipeStackTransform.ts +145 -0
  500. package/src/modules/stack/swipeTransitionContinuity.spec.tsx +1133 -0
  501. package/src/modules/stack/types.ts +226 -0
  502. package/src/modules/stack/useStackAnimationState.spec.ts +188 -0
  503. package/src/modules/stack/useStackAnimationState.ts +143 -0
  504. package/src/modules/stack/useStackNavigation.spec.ts +672 -0
  505. package/src/modules/stack/useStackNavigation.tsx +393 -0
  506. package/src/modules/stack/useStackSwipeInput.spec.ts +309 -0
  507. package/src/modules/stack/useStackSwipeInput.ts +139 -0
  508. package/src/modules/window/useDrawerState.ts +81 -0
  509. package/src/modules/window/useFloatingState.spec.ts +252 -0
  510. package/src/modules/window/useFloatingState.ts +141 -0
  511. package/src/panels/index.ts +119 -0
  512. package/src/pivot/index.ts +19 -0
  513. package/src/resizer/index.ts +68 -0
  514. package/src/stack/index.ts +91 -0
  515. package/src/sticky-header/StickyArea.tsx +193 -0
  516. package/src/sticky-header/calculateStickyMetrics.spec.ts +105 -0
  517. package/src/sticky-header/calculateStickyMetrics.ts +50 -0
  518. package/src/sticky-header/index.ts +18 -0
  519. package/src/sticky-header/types.ts +68 -0
  520. package/src/types.ts +341 -0
  521. package/src/utils/CSSMatrix.ts +321 -0
  522. package/src/utils/css.ts +65 -0
  523. package/src/utils/dialogUtils.ts +43 -0
  524. package/src/utils/math.ts +18 -0
  525. package/src/utils/polyfills/createDialogPolyfill.ts +18 -0
  526. package/src/utils/typedActions.ts +103 -0
  527. package/src/vite-env.d.ts +6 -0
  528. package/src/window/index.ts +69 -0
  529. package/dist/GridLayout-BQQ63eA1.cjs +0 -2
  530. package/dist/GridLayout-BQQ63eA1.cjs.map +0 -1
  531. package/dist/GridLayout-CJTKq7Mp.js +0 -1465
  532. package/dist/GridLayout-CJTKq7Mp.js.map +0 -1
  533. package/dist/sticky-header/StickyHeader.d.ts +0 -53
  534. package/dist/styles-CA2_zLZt.js +0 -52
  535. package/dist/styles-CA2_zLZt.js.map +0 -1
  536. package/dist/styles-PsqGOEJP.cjs +0 -2
  537. package/dist/styles-PsqGOEJP.cjs.map +0 -1
  538. package/dist/usePivot-7ctin_P_.cjs +0 -2
  539. package/dist/usePivot-7ctin_P_.cjs.map +0 -1
  540. package/dist/usePivot-CgQxB8rc.js +0 -124
  541. package/dist/usePivot-CgQxB8rc.js.map +0 -1
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @file SwipePivotContent component for pivot items with swipe animation.
3
+ *
4
+ * Positioning model:
5
+ * - targetPx = position * containerSize (where the item should be)
6
+ * - During swipe: displayPx = targetPx + displacement (follows finger)
7
+ * - After swipe: animate currentPx from finger position to targetPx
8
+ *
9
+ * Visibility modes:
10
+ * 1. Adjacent mode (default): Active item + adjacent items during swipe/animation
11
+ * 2. Viewport mode (viewportSize specified): Items visible if within viewport bounds
12
+ *
13
+ * Uses shared useSwipeContentTransform hook for DOM manipulation.
14
+ */
15
+ import * as React from "react";
16
+ import type { SwipeInputState, GestureAxis } from "../../hooks/gesture/types.js";
17
+ export type SwipePivotContentProps = {
18
+ id: string;
19
+ isActive: boolean;
20
+ /**
21
+ * Position offset in number of items from center (0).
22
+ * Positive values are to the right/bottom, negative to the left/top.
23
+ */
24
+ position: number;
25
+ inputState: SwipeInputState;
26
+ axis?: GestureAxis;
27
+ /** Size of each item (width for horizontal, height for vertical) */
28
+ containerSize: number;
29
+ children: React.ReactNode;
30
+ canNavigate?: boolean;
31
+ animationDuration?: number;
32
+ /**
33
+ * Viewport size for viewport-based visibility mode.
34
+ * When specified, items are visible if they intersect with the viewport [0, viewportSize].
35
+ * When not specified, uses adjacent-item visibility logic (default).
36
+ */
37
+ viewportSize?: number;
38
+ };
39
+ export declare const SwipePivotContent: React.FC<SwipePivotContentProps>;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @file Debug version of SwipePivotContent to investigate iOS swipe issue
3
+ *
4
+ * Issue: On iOS, when swiping pages, the next page sticks to the current position.
5
+ *
6
+ * Hypotheses to test:
7
+ * 1. currentPxRef initialization issue when position/containerSize changes
8
+ * 2. isAnimating timing issue (setIsAnimating is async)
9
+ * 3. useLayoutEffect execution order issue
10
+ * 4. pointercancel handling on iOS
11
+ */
12
+ import * as React from "react";
13
+ import type { SwipeInputState, GestureAxis } from "../../hooks/gesture/types.js";
14
+ export type SwipePivotContentProps = {
15
+ id: string;
16
+ isActive: boolean;
17
+ position: -1 | 0 | 1;
18
+ inputState: SwipeInputState;
19
+ axis?: GestureAxis;
20
+ containerSize: number;
21
+ children: React.ReactNode;
22
+ canNavigate?: boolean;
23
+ animationDuration?: number;
24
+ };
25
+ export declare const SwipePivotContentDebug: React.FC<SwipePivotContentProps>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,92 @@
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
+ /**
90
+ * Swipeable tab bar for pivot navigation.
91
+ */
92
+ 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
  */
@@ -40,6 +46,12 @@ export type UsePivotOptions<TId extends string = string> = {
40
46
  * - "none" disables transitions (uses React.Activity for memory optimization).
41
47
  */
42
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;
43
55
  };
44
56
  /**
45
57
  * Props object returned by getItemProps for navigation elements.
@@ -51,18 +63,71 @@ export type PivotItemProps = {
51
63
  tabIndex: number;
52
64
  onClick: () => void;
53
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
+ };
54
78
  /**
55
79
  * Result from usePivot hook.
56
80
  */
57
81
  export type UsePivotResult<TId extends string = string> = {
58
82
  /** Current active item ID */
59
83
  activeId: TId;
60
- /** Function to change the active item */
61
- 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;
62
90
  /** Helper to check if an item is active */
63
91
  isActive: (id: TId) => boolean;
64
92
  /** Function to get props for navigation items (buttons, links, etc.) */
65
93
  getItemProps: (id: TId) => PivotItemProps;
66
94
  /** Outlet component that renders the active content (react-router style) */
67
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;
68
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,66 @@
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 { ContinuousOperationState, GestureAxis } from "../../hooks/gesture/types.js";
12
+ import type { StackDisplayMode } from "./types.js";
13
+ /**
14
+ * Props for SwipeStackContent component.
15
+ *
16
+ * This component accepts ContinuousOperationState, meaning it responds uniformly
17
+ * to any continuous operation (whether human gesture or system animation).
18
+ */
19
+ export type SwipeStackContentProps = {
20
+ /** Panel ID */
21
+ id: string;
22
+ /** Panel depth in the stack */
23
+ depth: number;
24
+ /** Current navigation depth (active panel) */
25
+ navigationDepth: number;
26
+ /** Whether this panel is currently active */
27
+ isActive: boolean;
28
+ /** Continuous operation state (from gesture input or animation system) */
29
+ operationState: ContinuousOperationState;
30
+ /** Container size in pixels (width for horizontal, height for vertical) */
31
+ containerSize: number;
32
+ /** Gesture axis. @default "horizontal" */
33
+ axis?: GestureAxis;
34
+ /** Behind panel offset ratio. @default -0.3 */
35
+ behindOffset?: number;
36
+ /** Animation duration in ms. @default 300 */
37
+ animationDuration?: number;
38
+ /**
39
+ * Whether to animate when first mounted as active.
40
+ * Set to true for push navigation animations.
41
+ * @default false
42
+ */
43
+ animateOnMount?: boolean;
44
+ /**
45
+ * Whether to show iOS-style edge shadow on active panel.
46
+ * @default true
47
+ */
48
+ showShadow?: boolean;
49
+ /**
50
+ * Display mode for visual styling.
51
+ * - "overlay": panels overlay, no scale (iOS style)
52
+ * - "slide": panels slide with parallax
53
+ * - "stack": panels scale down and offset (stacked cards style)
54
+ * @default "overlay"
55
+ */
56
+ displayMode?: StackDisplayMode;
57
+ /**
58
+ * Whether to show dimming overlay on behind panels.
59
+ * Creates iOS-style darkening effect that fades during swipe.
60
+ * @default true
61
+ */
62
+ showDimming?: boolean;
63
+ /** Content to render */
64
+ children: React.ReactNode;
65
+ };
66
+ 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 { ContinuousOperationState } 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
+ /** Continuous operation state (from gesture input or animation system) */
19
+ operationState: ContinuousOperationState;
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
+ * operationState={toContinuousOperationState(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;