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.
- package/dist/{FloatingPanelFrame-D9Cp2al1.cjs → FloatingPanelFrame-CEmXDvUA.cjs} +2 -2
- package/dist/FloatingPanelFrame-CEmXDvUA.cjs.map +1 -0
- package/dist/{FloatingPanelFrame-6W5OexYe.js → FloatingPanelFrame-SgYLc6Ud.js} +12 -15
- package/dist/FloatingPanelFrame-SgYLc6Ud.js.map +1 -0
- package/dist/FloatingWindow-BpdOpg_L.js +400 -0
- package/dist/FloatingWindow-BpdOpg_L.js.map +1 -0
- package/dist/FloatingWindow-TCDNY5gE.cjs +2 -0
- package/dist/FloatingWindow-TCDNY5gE.cjs.map +1 -0
- package/dist/GridLayout-B4VRsC0r.cjs +2 -0
- package/dist/GridLayout-B4VRsC0r.cjs.map +1 -0
- package/dist/GridLayout-BltqeCPK.js +927 -0
- package/dist/GridLayout-BltqeCPK.js.map +1 -0
- package/dist/HorizontalDivider-B5Z-KZLk.cjs +2 -0
- package/dist/HorizontalDivider-B5Z-KZLk.cjs.map +1 -0
- package/dist/HorizontalDivider-WF1k_qND.js +30 -0
- package/dist/HorizontalDivider-WF1k_qND.js.map +1 -0
- package/dist/PanelSystem-Bs8bQwQF.cjs +3 -0
- package/dist/PanelSystem-Bs8bQwQF.cjs.map +1 -0
- package/dist/PanelSystem-Dr1TBhxM.js +1946 -0
- package/dist/PanelSystem-Dr1TBhxM.js.map +1 -0
- package/dist/ResizeHandle-CScipO5l.cjs +2 -0
- package/dist/ResizeHandle-CScipO5l.cjs.map +1 -0
- package/dist/ResizeHandle-CdA_JYfN.js +120 -0
- package/dist/ResizeHandle-CdA_JYfN.js.map +1 -0
- package/dist/SwipePivotTabBar-BGO9X94m.js +407 -0
- package/dist/SwipePivotTabBar-BGO9X94m.js.map +1 -0
- package/dist/SwipePivotTabBar-BrQismcZ.cjs +2 -0
- package/dist/SwipePivotTabBar-BrQismcZ.cjs.map +1 -0
- package/dist/config.cjs +1 -1
- package/dist/config.cjs.map +1 -1
- package/dist/config.js +11 -9
- package/dist/config.js.map +1 -1
- package/dist/constants/styles.d.ts +18 -4
- package/dist/floating.cjs +1 -1
- package/dist/floating.js +1 -1
- package/dist/grid/index.d.ts +58 -0
- package/dist/grid.cjs +2 -0
- package/dist/grid.cjs.map +1 -0
- package/dist/grid.js +13 -0
- package/dist/grid.js.map +1 -0
- package/dist/hooks/gesture/presets.d.ts +33 -0
- package/dist/hooks/gesture/testing/createGestureSimulator.d.ts +110 -0
- package/dist/hooks/gesture/thresholdValue.d.ts +44 -0
- package/dist/hooks/gesture/types.d.ts +254 -0
- package/dist/hooks/gesture/useDirectionalLock.d.ts +20 -0
- package/dist/hooks/gesture/useEdgeSwipeInput.d.ts +23 -0
- package/dist/hooks/gesture/useNativeGestureGuard.d.ts +23 -0
- package/dist/hooks/gesture/usePointerTracking.d.ts +22 -0
- package/dist/hooks/gesture/useScrollBoundary.d.ts +23 -0
- package/dist/hooks/gesture/useSwipeInput.d.ts +5 -0
- package/dist/hooks/gesture/utils.d.ts +40 -0
- package/dist/hooks/useAnimatedVisibility.d.ts +58 -0
- package/dist/hooks/useAnimationFrame.d.ts +84 -0
- package/dist/hooks/useSnapAnimation.d.ts +54 -0
- package/dist/hooks/useSwipeContentTransform.d.ts +79 -0
- package/dist/index.cjs +1 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +25 -2006
- package/dist/index.js.map +1 -1
- package/dist/modules/pivot/PivotContent.d.ts +1 -1
- package/dist/modules/pivot/SwipePivotContent.d.ts +39 -0
- package/dist/modules/pivot/SwipePivotContent.debug.tmp.d.ts +25 -0
- package/dist/modules/pivot/SwipePivotContent.test.d.ts +1 -0
- package/dist/modules/pivot/SwipePivotTabBar.d.ts +89 -0
- package/dist/modules/pivot/index.d.ts +3 -0
- package/dist/modules/pivot/scaleInputState.d.ts +37 -0
- package/dist/modules/pivot/types.d.ts +73 -2
- package/dist/modules/pivot/usePivotSwipeInput.d.ts +68 -0
- package/dist/modules/stack/StackContent.d.ts +15 -0
- package/dist/modules/stack/SwipeStackContent.d.ts +63 -0
- package/dist/modules/stack/SwipeStackOutlet.d.ts +80 -0
- package/dist/modules/stack/computeStackContentState.d.ts +99 -0
- package/dist/modules/stack/computeSwipeStackTransform.d.ts +76 -0
- package/dist/modules/stack/types.d.ts +194 -0
- package/dist/modules/stack/useStackAnimationState.d.ts +32 -0
- package/dist/modules/stack/useStackNavigation.d.ts +23 -0
- package/dist/modules/stack/useStackSwipeInput.d.ts +27 -0
- package/dist/panels/index.d.ts +67 -0
- package/dist/panels.cjs +2 -0
- package/dist/panels.cjs.map +1 -0
- package/dist/panels.js +28 -0
- package/dist/panels.js.map +1 -0
- package/dist/pivot/index.d.ts +3 -0
- package/dist/pivot.cjs +1 -1
- package/dist/pivot.cjs.map +1 -1
- package/dist/pivot.js +20 -2
- package/dist/pivot.js.map +1 -1
- package/dist/resizer/index.d.ts +57 -0
- package/dist/resizer.cjs +2 -0
- package/dist/resizer.cjs.map +1 -0
- package/dist/resizer.js +8 -0
- package/dist/resizer.js.map +1 -0
- package/dist/stack/index.d.ts +72 -0
- package/dist/stack.cjs +2 -0
- package/dist/stack.cjs.map +1 -0
- package/dist/stack.js +980 -0
- package/dist/stack.js.map +1 -0
- package/dist/sticky-header/StickyArea.d.ts +38 -0
- package/dist/sticky-header/index.d.ts +4 -4
- package/dist/sticky-header/types.d.ts +35 -22
- package/dist/sticky-header.cjs +1 -1
- package/dist/sticky-header.cjs.map +1 -1
- package/dist/sticky-header.js +65 -174
- package/dist/sticky-header.js.map +1 -1
- package/dist/styles-DPPuJ0sf.js +57 -0
- package/dist/styles-DPPuJ0sf.js.map +1 -0
- package/dist/styles-qf6ptVLD.cjs +2 -0
- package/dist/styles-qf6ptVLD.cjs.map +1 -0
- package/dist/types.d.ts +12 -0
- package/dist/useContentCache-CO3LYNmz.js +24 -0
- package/dist/useContentCache-CO3LYNmz.js.map +1 -0
- package/dist/useContentCache-DqXtLrLs.cjs +2 -0
- package/dist/useContentCache-DqXtLrLs.cjs.map +1 -0
- package/dist/useDocumentPointerEvents-CKdhGXd0.js +46 -0
- package/dist/useDocumentPointerEvents-CKdhGXd0.js.map +1 -0
- package/dist/useDocumentPointerEvents-ChqrKXDk.cjs +2 -0
- package/dist/useDocumentPointerEvents-ChqrKXDk.cjs.map +1 -0
- package/dist/useEffectEvent-Dp7HLCf0.js +13 -0
- package/dist/useEffectEvent-Dp7HLCf0.js.map +1 -0
- package/dist/useEffectEvent-huSsGUnl.cjs +2 -0
- package/dist/useEffectEvent-huSsGUnl.cjs.map +1 -0
- package/dist/useFloatingState-C4kRaW_R.cjs +2 -0
- package/dist/useFloatingState-C4kRaW_R.cjs.map +1 -0
- package/dist/useFloatingState-tEfA_wbc.js +74 -0
- package/dist/useFloatingState-tEfA_wbc.js.map +1 -0
- package/dist/window/index.d.ts +61 -0
- package/dist/window.cjs +2 -0
- package/dist/window.cjs.map +1 -0
- package/dist/window.js +149 -0
- package/dist/window.js.map +1 -0
- package/docs/design-tokens.md +405 -0
- package/package.json +29 -4
- package/src/PanelSystemContext.tsx +88 -0
- package/src/components/grid/GridLayerList.tsx +172 -0
- package/src/components/grid/GridLayerResizeHandles.tsx +145 -0
- package/src/components/grid/GridLayout.spec.tsx +743 -0
- package/src/components/grid/GridLayout.tsx +130 -0
- package/src/components/grid/GridTrackResizeHandle.tsx +87 -0
- package/src/components/paneling/FloatingPanelFrame.tsx +203 -0
- package/src/components/panels/DropSuggestOverlay.tsx +131 -0
- package/src/components/panels/PanelGroupView.tsx +112 -0
- package/src/components/pivot/PivotLayer.tsx +27 -0
- package/src/components/resizer/HorizontalDivider.tsx +52 -0
- package/src/components/resizer/ResizeHandle.tsx +118 -0
- package/src/components/tabs/TabBar.tsx +223 -0
- package/src/components/tabs/TabBarTab.tsx +133 -0
- package/src/components/tabs/TabDragOverlay.tsx +92 -0
- package/src/components/window/DialogOverlay.tsx +180 -0
- package/src/components/window/Drawer.tsx +282 -0
- package/src/components/window/DrawerLayers.tsx +58 -0
- package/src/components/window/FloatingWindow.tsx +95 -0
- package/src/components/window/PopupLayerPortal.tsx +218 -0
- package/src/config/PanelContentDeclaration.tsx +427 -0
- package/src/config/index.tsx +52 -0
- package/src/config/panelJsx.spec.tsx +54 -0
- package/src/config/panelJsxConfig.spec.tsx +54 -0
- package/src/config/panelJsxDrawer.spec.tsx +33 -0
- package/src/config/panelRouter.spec.ts +68 -0
- package/src/config/panelRouter.tsx +155 -0
- package/src/constants/styles.ts +261 -0
- package/src/demo/Layout.module.css +258 -0
- package/src/demo/Layout.tsx +176 -0
- package/src/demo/components/CodeBlock.module.css +54 -0
- package/src/demo/components/CodeBlock.tsx +34 -0
- package/src/demo/components/CodePreview.module.css +37 -0
- package/src/demo/components/CodePreview.tsx +31 -0
- package/src/demo/components/DataPreview.module.css +177 -0
- package/src/demo/components/DataPreview.tsx +115 -0
- package/src/demo/components/Story.module.css +68 -0
- package/src/demo/components/Story.tsx +54 -0
- package/src/demo/components/layout/CodePanel.module.css +183 -0
- package/src/demo/components/layout/CodePanel.tsx +149 -0
- package/src/demo/components/layout/DemoPage.module.css +60 -0
- package/src/demo/components/layout/DemoPage.tsx +56 -0
- package/src/demo/components/layout/SingleSamplePage.module.css +11 -0
- package/src/demo/components/layout/SingleSamplePage.tsx +35 -0
- package/src/demo/components/layout/SplitDemoLayout.module.css +107 -0
- package/src/demo/components/layout/SplitDemoLayout.tsx +218 -0
- package/src/demo/components/layout/index.ts +11 -0
- package/src/demo/components/tab-styles/ChromeTabBar.module.css +75 -0
- package/src/demo/components/tab-styles/ChromeTabBar.tsx +111 -0
- package/src/demo/components/tab-styles/GitHubTabBar.module.css +81 -0
- package/src/demo/components/tab-styles/GitHubTabBar.tsx +109 -0
- package/src/demo/components/tab-styles/VSCodeTabBar.module.css +78 -0
- package/src/demo/components/tab-styles/VSCodeTabBar.tsx +109 -0
- package/src/demo/components/tab-styles/index.ts +6 -0
- package/src/demo/components/ui/DemoButton.module.css +63 -0
- package/src/demo/components/ui/DemoButton.tsx +32 -0
- package/src/demo/components/ui/DemoCard.module.css +15 -0
- package/src/demo/components/ui/DemoCard.tsx +30 -0
- package/src/demo/components/ui/DemoContainer.module.css +17 -0
- package/src/demo/components/ui/DemoContainer.tsx +30 -0
- package/src/demo/components/ui/DemoPanel.module.css +23 -0
- package/src/demo/components/ui/DemoPanel.tsx +33 -0
- package/src/demo/components/ui/PanelText.module.css +18 -0
- package/src/demo/components/ui/PanelText.tsx +29 -0
- package/src/demo/components/ui/PanelTitle.module.css +18 -0
- package/src/demo/components/ui/PanelTitle.tsx +31 -0
- package/src/demo/contexts/TabbarDemoConfig.tsx +218 -0
- package/src/demo/demo.css +172 -0
- package/src/demo/hooks/useMedia.ts +41 -0
- package/src/demo/hooks/useShikiHighlight.ts +55 -0
- package/src/demo/index.tsx +293 -0
- package/src/demo/pages/Drawer/animations/index.tsx +22 -0
- package/src/demo/pages/Drawer/basics/index.tsx +17 -0
- package/src/demo/pages/Drawer/components/DrawerAnimations.module.css +125 -0
- package/src/demo/pages/Drawer/components/DrawerAnimations.tsx +118 -0
- package/src/demo/pages/Drawer/components/DrawerBasics.module.css +55 -0
- package/src/demo/pages/Drawer/components/DrawerBasics.tsx +76 -0
- package/src/demo/pages/Drawer/components/DrawerMenuLayout.module.css +332 -0
- package/src/demo/pages/Drawer/components/DrawerMenuLayout.tsx +199 -0
- package/src/demo/pages/Drawer/menu/index.tsx +17 -0
- package/src/demo/pages/FloatingPanelFrame/ResizableFloatingPanelsPreview.module.css +163 -0
- package/src/demo/pages/FloatingPanelFrame/ResizableFloatingPanelsPreview.tsx +234 -0
- package/src/demo/pages/FloatingPanelFrame/basic/index.tsx +17 -0
- package/src/demo/pages/FloatingPanelFrame/complex/index.tsx +26 -0
- package/src/demo/pages/FloatingPanelFrame/components/BasicPanel.module.css +16 -0
- package/src/demo/pages/FloatingPanelFrame/components/BasicPanel.tsx +24 -0
- package/src/demo/pages/FloatingPanelFrame/components/ComplexPanel.module.css +54 -0
- package/src/demo/pages/FloatingPanelFrame/components/ComplexPanel.tsx +67 -0
- package/src/demo/pages/FloatingPanelFrame/components/PanelWithControls.module.css +21 -0
- package/src/demo/pages/FloatingPanelFrame/components/PanelWithControls.tsx +41 -0
- package/src/demo/pages/FloatingPanelFrame/components/PanelWithMeta.module.css +5 -0
- package/src/demo/pages/FloatingPanelFrame/components/PanelWithMeta.tsx +43 -0
- package/src/demo/pages/FloatingPanelFrame/components/ScrollablePanel.module.css +11 -0
- package/src/demo/pages/FloatingPanelFrame/components/ScrollablePanel.tsx +42 -0
- package/src/demo/pages/FloatingPanelFrame/index.tsx +80 -0
- package/src/demo/pages/FloatingPanelFrame/scrollable/index.tsx +30 -0
- package/src/demo/pages/FloatingPanelFrame/with-controls/index.tsx +30 -0
- package/src/demo/pages/FloatingPanelFrame/with-meta/index.tsx +17 -0
- package/src/demo/pages/HorizontalDivider/components/PanelsWithRichContent.module.css +112 -0
- package/src/demo/pages/HorizontalDivider/components/PanelsWithRichContent.tsx +56 -0
- package/src/demo/pages/HorizontalDivider/components/SimpleResizablePanels.module.css +46 -0
- package/src/demo/pages/HorizontalDivider/components/SimpleResizablePanels.tsx +29 -0
- package/src/demo/pages/HorizontalDivider/components/ThreePanelLayout.module.css +54 -0
- package/src/demo/pages/HorizontalDivider/components/ThreePanelLayout.tsx +30 -0
- package/src/demo/pages/HorizontalDivider/index.module.css +14 -0
- package/src/demo/pages/HorizontalDivider/index.tsx +64 -0
- package/src/demo/pages/HorizontalDivider/panels-with-rich-content/index.tsx +21 -0
- package/src/demo/pages/HorizontalDivider/simple-resizable-panels/index.tsx +21 -0
- package/src/demo/pages/HorizontalDivider/three-panel-layout/index.tsx +21 -0
- package/src/demo/pages/PanelLayout/PanelLayoutDemo.module.css +174 -0
- package/src/demo/pages/PanelLayout/PanelLayoutDemo.tsx +248 -0
- package/src/demo/pages/PanelLayout/components/DashboardLayout.module.css +115 -0
- package/src/demo/pages/PanelLayout/components/DashboardLayout.tsx +124 -0
- package/src/demo/pages/PanelLayout/components/DraggableOverlays.module.css +101 -0
- package/src/demo/pages/PanelLayout/components/DraggableOverlays.tsx +122 -0
- package/src/demo/pages/PanelLayout/components/IDELayout.module.css +104 -0
- package/src/demo/pages/PanelLayout/components/IDELayout.tsx +143 -0
- package/src/demo/pages/PanelLayout/components/SimpleGrid.module.css +19 -0
- package/src/demo/pages/PanelLayout/components/SimpleGrid.tsx +62 -0
- package/src/demo/pages/PanelLayout/dashboard/index.tsx +22 -0
- package/src/demo/pages/PanelLayout/draggable-overlays/index.tsx +22 -0
- package/src/demo/pages/PanelLayout/ide-layout/index.tsx +22 -0
- package/src/demo/pages/PanelLayout/index.tsx +94 -0
- package/src/demo/pages/PanelLayout/simple-grid/index.tsx +22 -0
- package/src/demo/pages/PanelSystem/PanelSystemPreview.module.css +20 -0
- package/src/demo/pages/PanelSystem/PanelSystemPreview.tsx +101 -0
- package/src/demo/pages/PanelSystem/preview/index.tsx +18 -0
- package/src/demo/pages/PanelSystem/tabbar/index.tsx +129 -0
- package/src/demo/pages/Pivot/basics/index.tsx +17 -0
- package/src/demo/pages/Pivot/components/Pivot.module.css +278 -0
- package/src/demo/pages/Pivot/components/PivotBasics.tsx +103 -0
- package/src/demo/pages/Pivot/components/PivotSidebar.tsx +168 -0
- package/src/demo/pages/Pivot/components/PivotTabs.tsx +129 -0
- package/src/demo/pages/Pivot/components/PivotTransitions.tsx +120 -0
- package/src/demo/pages/Pivot/components/SwipePivot.module.css +114 -0
- package/src/demo/pages/Pivot/components/SwipePivot.tsx +193 -0
- package/src/demo/pages/Pivot/components/SwipeTabsPivot.module.css +203 -0
- package/src/demo/pages/Pivot/components/SwipeTabsPivot.tsx +289 -0
- package/src/demo/pages/Pivot/sidebar/index.tsx +17 -0
- package/src/demo/pages/Pivot/swipe/index.tsx +16 -0
- package/src/demo/pages/Pivot/swipe-debug/index.tsx +287 -0
- package/src/demo/pages/Pivot/swipe-tabs/index.tsx +15 -0
- package/src/demo/pages/Pivot/tabs/index.tsx +17 -0
- package/src/demo/pages/Pivot/transitions/index.tsx +17 -0
- package/src/demo/pages/ResizeHandle/both-directions/index.tsx +17 -0
- package/src/demo/pages/ResizeHandle/components/BothDirectionsDemo.module.css +72 -0
- package/src/demo/pages/ResizeHandle/components/BothDirectionsDemo.tsx +41 -0
- package/src/demo/pages/ResizeHandle/components/HorizontalResizeDemo.module.css +61 -0
- package/src/demo/pages/ResizeHandle/components/HorizontalResizeDemo.tsx +33 -0
- package/src/demo/pages/ResizeHandle/components/NestedPanelsDemo.module.css +83 -0
- package/src/demo/pages/ResizeHandle/components/NestedPanelsDemo.tsx +53 -0
- package/src/demo/pages/ResizeHandle/components/VerticalResizeDemo.module.css +68 -0
- package/src/demo/pages/ResizeHandle/components/VerticalResizeDemo.tsx +33 -0
- package/src/demo/pages/ResizeHandle/horizontal/index.tsx +17 -0
- package/src/demo/pages/ResizeHandle/index.module.css +11 -0
- package/src/demo/pages/ResizeHandle/index.tsx +71 -0
- package/src/demo/pages/ResizeHandle/nested-panels/index.tsx +17 -0
- package/src/demo/pages/ResizeHandle/vertical/index.tsx +17 -0
- package/src/demo/pages/ResponsiveLayout/adaptive-workspace/index.tsx +22 -0
- package/src/demo/pages/ResponsiveLayout/components/ResponsiveWorkspace.module.css +423 -0
- package/src/demo/pages/ResponsiveLayout/components/ResponsiveWorkspace.tsx +398 -0
- package/src/demo/pages/Stack/basics/index.tsx +22 -0
- package/src/demo/pages/Stack/components/Stack.module.css +234 -0
- package/src/demo/pages/Stack/components/StackBasics.tsx +217 -0
- package/src/demo/pages/Stack/components/StackTablet.module.css +299 -0
- package/src/demo/pages/Stack/components/StackTablet.tsx +401 -0
- package/src/demo/pages/Stack/tablet/index.tsx +22 -0
- package/src/demo/pages/StickyHeader/basics/index.tsx +17 -0
- package/src/demo/pages/StickyHeader/components/StickyHeader.module.css +219 -0
- package/src/demo/pages/StickyHeader/components/StickyHeaderBasics.tsx +103 -0
- package/src/demo/routes.tsx +193 -0
- package/src/demo/styles/animations.css +68 -0
- package/src/demo/styles/stack-themes.css +35 -0
- package/src/demo/utils/createPanelView.tsx +58 -0
- package/src/floating/index.ts +24 -0
- package/src/grid/index.ts +75 -0
- package/src/hooks/ContentCacheContext.tsx +87 -0
- package/src/hooks/gesture/presets.spec.ts +86 -0
- package/src/hooks/gesture/presets.ts +95 -0
- package/src/hooks/gesture/testing/createGestureSimulator.spec.ts +237 -0
- package/src/hooks/gesture/testing/createGestureSimulator.ts +310 -0
- package/src/hooks/gesture/thresholdValue.spec.ts +103 -0
- package/src/hooks/gesture/thresholdValue.ts +77 -0
- package/src/hooks/gesture/types.ts +290 -0
- package/src/hooks/gesture/useDirectionalLock.spec.ts +271 -0
- package/src/hooks/gesture/useDirectionalLock.ts +115 -0
- package/src/hooks/gesture/useEdgeSwipeInput.spec.ts +454 -0
- package/src/hooks/gesture/useEdgeSwipeInput.ts +131 -0
- package/src/hooks/gesture/useNativeGestureGuard.spec.ts +413 -0
- package/src/hooks/gesture/useNativeGestureGuard.ts +133 -0
- package/src/hooks/gesture/usePointerTracking.spec.ts +364 -0
- package/src/hooks/gesture/usePointerTracking.ts +134 -0
- package/src/hooks/gesture/useScrollBoundary.spec.ts +249 -0
- package/src/hooks/gesture/useScrollBoundary.ts +113 -0
- package/src/hooks/gesture/useSwipeInput.spec.ts +592 -0
- package/src/hooks/gesture/useSwipeInput.ts +310 -0
- package/src/hooks/gesture/utils.spec.ts +152 -0
- package/src/hooks/gesture/utils.ts +87 -0
- package/src/hooks/useAnimatedVisibility.spec.ts +257 -0
- package/src/hooks/useAnimatedVisibility.ts +146 -0
- package/src/hooks/useAnimationFrame.ts +200 -0
- package/src/hooks/useCSSMatrix.spec.ts +214 -0
- package/src/hooks/useCSSMatrix.ts +262 -0
- package/src/hooks/useClonedElementPreview.ts +28 -0
- package/src/hooks/useContainerScroll.ts +78 -0
- package/src/hooks/useContentCache.spec.tsx +232 -0
- package/src/hooks/useContentCache.tsx +127 -0
- package/src/hooks/useDocumentPointerEvents.ts +137 -0
- package/src/hooks/useDocumentScroll.ts +41 -0
- package/src/hooks/useEffectEvent.ts +40 -0
- package/src/hooks/useElementComponentWrapper.tsx +63 -0
- package/src/hooks/useIntersectionObserver.tsx +125 -0
- package/src/hooks/useIsomorphicLayoutEffect.ts +29 -0
- package/src/hooks/useResizeObserver.tsx +81 -0
- package/src/hooks/useScrollContainer.ts +79 -0
- package/src/hooks/useSnapAnimation.ts +128 -0
- package/src/hooks/useSwipeContentTransform.spec.ts +133 -0
- package/src/hooks/useSwipeContentTransform.ts +235 -0
- package/src/hooks/useTransitionState.ts +95 -0
- package/src/index.tsx +88 -0
- package/src/modules/grid/GridLayoutContext.tsx +57 -0
- package/src/modules/grid/LayerInstanceContext.tsx +56 -0
- package/src/modules/grid/resizeHandles.ts +157 -0
- package/src/modules/grid/trackUtils.ts +146 -0
- package/src/modules/grid/useGridPlacements.ts +143 -0
- package/src/modules/grid/useGridTracks.ts +156 -0
- package/src/modules/grid/useLayerDragHandle.ts +16 -0
- package/src/modules/grid/useLayerInteractions.tsx +850 -0
- package/src/modules/keybindings/KeybindingsProvider.tsx +111 -0
- package/src/modules/panels/dom/DomRegistry.tsx +94 -0
- package/src/modules/panels/index.ts +45 -0
- package/src/modules/panels/interactions/InteractionsContext.test.tsx +330 -0
- package/src/modules/panels/interactions/InteractionsContext.tsx +394 -0
- package/src/modules/panels/interactions/dnd.ts +28 -0
- package/src/modules/panels/keybindings/KeybindingsInstaller.tsx +15 -0
- package/src/modules/panels/layout/adapter.ts +124 -0
- package/src/modules/panels/rendering/ContentRegistry.spec.tsx +304 -0
- package/src/modules/panels/rendering/ContentRegistry.tsx +205 -0
- package/src/modules/panels/rendering/GroupContainer.tsx +65 -0
- package/src/modules/panels/rendering/RenderBridge.tsx +115 -0
- package/src/modules/panels/rendering/RenderContext.tsx +31 -0
- package/src/modules/panels/state/PanelSplitHandles.tsx +147 -0
- package/src/modules/panels/state/PanelSystemContext.splitLimits.spec.tsx +50 -0
- package/src/modules/panels/state/PanelSystemContext.tsx +289 -0
- package/src/modules/panels/state/StateContext.tsx +12 -0
- package/src/modules/panels/state/cleanup.ts +37 -0
- package/src/modules/panels/state/commands.ts +53 -0
- package/src/modules/panels/state/focus/Context.tsx +25 -0
- package/src/modules/panels/state/focus/logic.ts +57 -0
- package/src/modules/panels/state/groups/Context.tsx +25 -0
- package/src/modules/panels/state/groups/logic.ts +105 -0
- package/src/modules/panels/state/splitLimits.spec.ts +46 -0
- package/src/modules/panels/state/splitLimits.ts +90 -0
- package/src/modules/panels/state/state.spec.ts +49 -0
- package/src/modules/panels/state/tree/Context.tsx +24 -0
- package/src/modules/panels/state/tree/logic.spec.ts +34 -0
- package/src/modules/panels/state/tree/logic.ts +138 -0
- package/src/modules/panels/state/types.ts +142 -0
- package/src/modules/panels/system/PanelSystem.empty-tabbar.spec.tsx +53 -0
- package/src/modules/panels/system/PanelSystem.tab-click-activates.spec.tsx +44 -0
- package/src/modules/panels/system/PanelSystem.tab-reorder.spec.tsx +64 -0
- package/src/modules/panels/system/PanelSystem.tabs-no-dup.spec.tsx +57 -0
- package/src/modules/panels/system/PanelSystem.tsx +206 -0
- package/src/modules/pivot/PivotContent.spec.tsx +179 -0
- package/src/modules/pivot/PivotContent.tsx +77 -0
- package/src/modules/pivot/SwipePivotContent.debug.tmp.tsx +237 -0
- package/src/modules/pivot/SwipePivotContent.position.spec.tsx +167 -0
- package/src/modules/pivot/SwipePivotContent.spec.tsx +464 -0
- package/src/modules/pivot/SwipePivotContent.test.tsx +502 -0
- package/src/modules/pivot/SwipePivotContent.tsx +197 -0
- package/src/modules/pivot/SwipePivotTabBar.spec.tsx +865 -0
- package/src/modules/pivot/SwipePivotTabBar.tsx +523 -0
- package/src/modules/pivot/index.ts +8 -0
- package/src/modules/pivot/scaleInputState.spec.ts +210 -0
- package/src/modules/pivot/scaleInputState.ts +66 -0
- package/src/modules/pivot/types.ts +139 -0
- package/src/modules/pivot/usePivot.spec.ts +621 -0
- package/src/modules/pivot/usePivot.spec.tsx +186 -0
- package/src/modules/pivot/usePivot.tsx +345 -0
- package/src/modules/pivot/usePivotSwipeInput.spec.ts +649 -0
- package/src/modules/pivot/usePivotSwipeInput.ts +136 -0
- package/src/modules/resizer/useResizeDrag.ts +94 -0
- package/src/modules/stack/StackContent.spec.tsx +264 -0
- package/src/modules/stack/StackContent.tsx +111 -0
- package/src/modules/stack/SwipeStackContent.spec.tsx +1277 -0
- package/src/modules/stack/SwipeStackContent.tsx +356 -0
- package/src/modules/stack/SwipeStackOutlet.spec.tsx +252 -0
- package/src/modules/stack/SwipeStackOutlet.tsx +221 -0
- package/src/modules/stack/computeStackContentState.spec.ts +281 -0
- package/src/modules/stack/computeStackContentState.ts +304 -0
- package/src/modules/stack/computeSwipeStackTransform.spec.ts +186 -0
- package/src/modules/stack/computeSwipeStackTransform.ts +145 -0
- package/src/modules/stack/types.ts +226 -0
- package/src/modules/stack/useStackAnimationState.spec.ts +186 -0
- package/src/modules/stack/useStackAnimationState.ts +138 -0
- package/src/modules/stack/useStackNavigation.spec.ts +477 -0
- package/src/modules/stack/useStackNavigation.tsx +336 -0
- package/src/modules/stack/useStackSwipeInput.spec.ts +276 -0
- package/src/modules/stack/useStackSwipeInput.ts +139 -0
- package/src/modules/window/useDrawerState.ts +81 -0
- package/src/modules/window/useFloatingState.spec.ts +252 -0
- package/src/modules/window/useFloatingState.ts +141 -0
- package/src/panels/index.ts +119 -0
- package/src/pivot/index.ts +19 -0
- package/src/resizer/index.ts +68 -0
- package/src/stack/index.ts +91 -0
- package/src/sticky-header/StickyArea.tsx +221 -0
- package/src/sticky-header/index.ts +18 -0
- package/src/sticky-header/types.ts +68 -0
- package/src/types.ts +323 -0
- package/src/utils/CSSMatrix.ts +321 -0
- package/src/utils/css.ts +65 -0
- package/src/utils/dialogUtils.ts +43 -0
- package/src/utils/math.ts +18 -0
- package/src/utils/polyfills/createDialogPolyfill.ts +18 -0
- package/src/utils/typedActions.ts +103 -0
- package/src/vite-env.d.ts +6 -0
- package/src/window/index.ts +67 -0
- package/dist/FloatingPanelFrame-6W5OexYe.js.map +0 -1
- package/dist/FloatingPanelFrame-D9Cp2al1.cjs.map +0 -1
- package/dist/GridLayout-BzrIDrC9.js +0 -1465
- package/dist/GridLayout-BzrIDrC9.js.map +0 -1
- package/dist/GridLayout-ZrOhoLLB.cjs +0 -2
- package/dist/GridLayout-ZrOhoLLB.cjs.map +0 -1
- package/dist/sticky-header/StickyHeader.d.ts +0 -53
- package/dist/styles-CA2_zLZt.js +0 -52
- package/dist/styles-CA2_zLZt.js.map +0 -1
- package/dist/styles-PsqGOEJP.cjs +0 -2
- package/dist/styles-PsqGOEJP.cjs.map +0 -1
- package/dist/usePivot-BS-DGfwd.cjs +0 -2
- package/dist/usePivot-BS-DGfwd.cjs.map +0 -1
- package/dist/usePivot-BvOGxLQQ.js +0 -124
- 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
|
-
/**
|
|
55
|
-
|
|
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;
|