react-panel-layout 0.5.2 → 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-D9Cp2al1.cjs.map → FloatingPanelFrame-CEmXDvUA.cjs.map} +1 -1
- package/dist/{FloatingPanelFrame-lLg-Lpg7.js → FloatingPanelFrame-SgYLc6Ud.js} +11 -11
- package/dist/{FloatingPanelFrame-lLg-Lpg7.js.map → FloatingPanelFrame-SgYLc6Ud.js.map} +1 -1
- 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 +67 -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/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/GridLayout-BQQ63eA1.cjs +0 -2
- package/dist/GridLayout-BQQ63eA1.cjs.map +0 -1
- package/dist/GridLayout-CJTKq7Mp.js +0 -1465
- package/dist/GridLayout-CJTKq7Mp.js.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-7ctin_P_.cjs +0 -2
- package/dist/usePivot-7ctin_P_.cjs.map +0 -1
- package/dist/usePivot-CgQxB8rc.js +0 -124
- package/dist/usePivot-CgQxB8rc.js.map +0 -1
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Tests for scaleInputState utility
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from "vitest";
|
|
5
|
+
import { scaleInputState } from "./scaleInputState";
|
|
6
|
+
import type { SwipeInputState } from "../../hooks/gesture/types";
|
|
7
|
+
|
|
8
|
+
describe("scaleInputState", () => {
|
|
9
|
+
const createSwipingState = (x: number, vx: number): SwipeInputState => ({
|
|
10
|
+
phase: "swiping",
|
|
11
|
+
displacement: { x, y: 0 },
|
|
12
|
+
velocity: { x: vx, y: 0 },
|
|
13
|
+
direction: x > 0 ? 1 : x < 0 ? -1 : 0,
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
describe("scaling factor calculation", () => {
|
|
17
|
+
it("scales displacement proportionally (source larger than target)", () => {
|
|
18
|
+
const inputState = createSwipingState(100, 0.5);
|
|
19
|
+
const result = scaleInputState(inputState, 400, 80);
|
|
20
|
+
|
|
21
|
+
// 80/400 = 0.2, so 100 * 0.2 = 20
|
|
22
|
+
expect(result.displacement.x).toBe(20);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("scales displacement proportionally (source smaller than target)", () => {
|
|
26
|
+
const inputState = createSwipingState(20, 0.1);
|
|
27
|
+
const result = scaleInputState(inputState, 80, 400);
|
|
28
|
+
|
|
29
|
+
// 400/80 = 5, so 20 * 5 = 100
|
|
30
|
+
expect(result.displacement.x).toBe(100);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("scales velocity proportionally", () => {
|
|
34
|
+
const inputState = createSwipingState(100, 1.0);
|
|
35
|
+
const result = scaleInputState(inputState, 400, 80);
|
|
36
|
+
|
|
37
|
+
// 80/400 = 0.2, so 1.0 * 0.2 = 0.2
|
|
38
|
+
expect(result.velocity.x).toBe(0.2);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("scales both x and y components", () => {
|
|
42
|
+
const inputState: SwipeInputState = {
|
|
43
|
+
phase: "swiping",
|
|
44
|
+
displacement: { x: 100, y: 50 },
|
|
45
|
+
velocity: { x: 1.0, y: 0.5 },
|
|
46
|
+
direction: 1,
|
|
47
|
+
};
|
|
48
|
+
const result = scaleInputState(inputState, 400, 200);
|
|
49
|
+
|
|
50
|
+
// 200/400 = 0.5
|
|
51
|
+
expect(result.displacement.x).toBe(50);
|
|
52
|
+
expect(result.displacement.y).toBe(25);
|
|
53
|
+
expect(result.velocity.x).toBe(0.5);
|
|
54
|
+
expect(result.velocity.y).toBe(0.25);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe("same-size containers", () => {
|
|
59
|
+
it("returns identical values when source and target are same size", () => {
|
|
60
|
+
const inputState = createSwipingState(100, 0.5);
|
|
61
|
+
const result = scaleInputState(inputState, 400, 400);
|
|
62
|
+
|
|
63
|
+
expect(result.displacement.x).toBe(100);
|
|
64
|
+
expect(result.velocity.x).toBe(0.5);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
describe("idle state handling", () => {
|
|
69
|
+
it("returns unchanged state for idle phase", () => {
|
|
70
|
+
const inputState: SwipeInputState = {
|
|
71
|
+
phase: "idle",
|
|
72
|
+
displacement: { x: 0, y: 0 },
|
|
73
|
+
velocity: { x: 0, y: 0 },
|
|
74
|
+
direction: 0,
|
|
75
|
+
};
|
|
76
|
+
const result = scaleInputState(inputState, 400, 80);
|
|
77
|
+
|
|
78
|
+
expect(result).toBe(inputState); // Same reference
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
describe("invalid dimension handling", () => {
|
|
83
|
+
it("returns unchanged state when sourceWidth is 0", () => {
|
|
84
|
+
const inputState = createSwipingState(100, 0.5);
|
|
85
|
+
const result = scaleInputState(inputState, 0, 80);
|
|
86
|
+
|
|
87
|
+
expect(result).toBe(inputState);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it("returns unchanged state when targetWidth is 0", () => {
|
|
91
|
+
const inputState = createSwipingState(100, 0.5);
|
|
92
|
+
const result = scaleInputState(inputState, 400, 0);
|
|
93
|
+
|
|
94
|
+
expect(result).toBe(inputState);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("returns unchanged state when sourceWidth is negative", () => {
|
|
98
|
+
const inputState = createSwipingState(100, 0.5);
|
|
99
|
+
const result = scaleInputState(inputState, -100, 80);
|
|
100
|
+
|
|
101
|
+
expect(result).toBe(inputState);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it("returns unchanged state when targetWidth is negative", () => {
|
|
105
|
+
const inputState = createSwipingState(100, 0.5);
|
|
106
|
+
const result = scaleInputState(inputState, 400, -80);
|
|
107
|
+
|
|
108
|
+
expect(result).toBe(inputState);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
describe("phase preservation", () => {
|
|
113
|
+
it("preserves tracking phase", () => {
|
|
114
|
+
const inputState: SwipeInputState = {
|
|
115
|
+
phase: "tracking",
|
|
116
|
+
displacement: { x: 5, y: 0 },
|
|
117
|
+
velocity: { x: 0.1, y: 0 },
|
|
118
|
+
direction: 1,
|
|
119
|
+
};
|
|
120
|
+
const result = scaleInputState(inputState, 400, 80);
|
|
121
|
+
|
|
122
|
+
expect(result.phase).toBe("tracking");
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it("preserves swiping phase", () => {
|
|
126
|
+
const inputState = createSwipingState(100, 0.5);
|
|
127
|
+
const result = scaleInputState(inputState, 400, 80);
|
|
128
|
+
|
|
129
|
+
expect(result.phase).toBe("swiping");
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it("preserves ended phase", () => {
|
|
133
|
+
const inputState: SwipeInputState = {
|
|
134
|
+
phase: "ended",
|
|
135
|
+
displacement: { x: 150, y: 0 },
|
|
136
|
+
velocity: { x: 0.8, y: 0 },
|
|
137
|
+
direction: 1,
|
|
138
|
+
};
|
|
139
|
+
const result = scaleInputState(inputState, 400, 80);
|
|
140
|
+
|
|
141
|
+
expect(result.phase).toBe("ended");
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
describe("direction preservation", () => {
|
|
146
|
+
it("preserves positive direction", () => {
|
|
147
|
+
const inputState = createSwipingState(100, 0.5);
|
|
148
|
+
const result = scaleInputState(inputState, 400, 80);
|
|
149
|
+
|
|
150
|
+
expect(result.direction).toBe(1);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it("preserves negative direction", () => {
|
|
154
|
+
const inputState = createSwipingState(-100, -0.5);
|
|
155
|
+
const result = scaleInputState(inputState, 400, 80);
|
|
156
|
+
|
|
157
|
+
expect(result.direction).toBe(-1);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
it("preserves zero direction", () => {
|
|
161
|
+
const inputState: SwipeInputState = {
|
|
162
|
+
phase: "swiping",
|
|
163
|
+
displacement: { x: 0, y: 50 },
|
|
164
|
+
velocity: { x: 0, y: 0.5 },
|
|
165
|
+
direction: 0,
|
|
166
|
+
};
|
|
167
|
+
const result = scaleInputState(inputState, 400, 80);
|
|
168
|
+
|
|
169
|
+
expect(result.direction).toBe(0);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
describe("negative displacement scaling", () => {
|
|
174
|
+
it("correctly scales negative displacement", () => {
|
|
175
|
+
const inputState = createSwipingState(-100, -0.5);
|
|
176
|
+
const result = scaleInputState(inputState, 400, 80);
|
|
177
|
+
|
|
178
|
+
expect(result.displacement.x).toBe(-20);
|
|
179
|
+
expect(result.velocity.x).toBe(-0.1);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
describe("real-world use cases", () => {
|
|
184
|
+
it("synchronizes 5-tab bar with content (content swipe → tabs)", () => {
|
|
185
|
+
// 5 tabs in a 400px content area, each tab is 80px
|
|
186
|
+
const contentWidth = 400;
|
|
187
|
+
const tabWidth = 80;
|
|
188
|
+
|
|
189
|
+
// User swipes 200px on content (half the content width)
|
|
190
|
+
const inputState = createSwipingState(200, 1.0);
|
|
191
|
+
const result = scaleInputState(inputState, contentWidth, tabWidth);
|
|
192
|
+
|
|
193
|
+
// Tabs should move 40px (half of tab width)
|
|
194
|
+
expect(result.displacement.x).toBe(40);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it("synchronizes 5-tab bar with content (tabs swipe → content)", () => {
|
|
198
|
+
// Inverse: if swipe started on tabs
|
|
199
|
+
const contentWidth = 400;
|
|
200
|
+
const tabWidth = 80;
|
|
201
|
+
|
|
202
|
+
// User swipes 40px on tabs (half the tab width)
|
|
203
|
+
const inputState = createSwipingState(40, 0.2);
|
|
204
|
+
const result = scaleInputState(inputState, tabWidth, contentWidth);
|
|
205
|
+
|
|
206
|
+
// Content should move 200px (half of content width)
|
|
207
|
+
expect(result.displacement.x).toBe(200);
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
});
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
/**
|
|
10
|
+
* Scale SwipeInputState displacement and velocity proportionally for different container sizes.
|
|
11
|
+
*
|
|
12
|
+
* When swiping in a container of one size, this function transforms the input state
|
|
13
|
+
* to appear as if the swipe occurred in a container of a different size.
|
|
14
|
+
* This allows tabs and content to move in sync despite different widths.
|
|
15
|
+
*
|
|
16
|
+
* @param inputState - The original swipe input state
|
|
17
|
+
* @param sourceWidth - Width of the source container (where the swipe originated)
|
|
18
|
+
* @param targetWidth - Width of the target container (where the scaled state will be applied)
|
|
19
|
+
* @returns Scaled SwipeInputState with proportionally adjusted displacement and velocity
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```tsx
|
|
23
|
+
* // Content area is 400px wide, each tab is 80px wide (5 tabs)
|
|
24
|
+
* const contentWidth = 400;
|
|
25
|
+
* const tabWidth = 80;
|
|
26
|
+
*
|
|
27
|
+
* // Swipe happens on content area
|
|
28
|
+
* const { inputState } = usePivotSwipeInput({ containerRef, pivot, axis: "horizontal" });
|
|
29
|
+
*
|
|
30
|
+
* // Scale for tabs: 100px content swipe → 20px tab movement
|
|
31
|
+
* const tabInputState = scaleInputState(inputState, contentWidth, tabWidth);
|
|
32
|
+
*
|
|
33
|
+
* // Apply to tabs and content respectively
|
|
34
|
+
* <SwipePivotContent inputState={tabInputState} containerSize={tabWidth} />
|
|
35
|
+
* <SwipePivotContent inputState={inputState} containerSize={contentWidth} />
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export const scaleInputState = (
|
|
39
|
+
inputState: SwipeInputState,
|
|
40
|
+
sourceWidth: number,
|
|
41
|
+
targetWidth: number,
|
|
42
|
+
): SwipeInputState => {
|
|
43
|
+
// Guard against invalid dimensions
|
|
44
|
+
if (sourceWidth <= 0 || targetWidth <= 0) {
|
|
45
|
+
return inputState;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Idle state needs no scaling
|
|
49
|
+
if (inputState.phase === "idle") {
|
|
50
|
+
return inputState;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const scale = targetWidth / sourceWidth;
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
...inputState,
|
|
57
|
+
displacement: {
|
|
58
|
+
x: inputState.displacement.x * scale,
|
|
59
|
+
y: inputState.displacement.y * scale,
|
|
60
|
+
},
|
|
61
|
+
velocity: {
|
|
62
|
+
x: inputState.velocity.x * scale,
|
|
63
|
+
y: inputState.velocity.y * scale,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
};
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Type definitions for the Pivot headless component system.
|
|
3
|
+
* Pivot manages content switching within a scope without providing UI.
|
|
4
|
+
*/
|
|
5
|
+
import type * as React from "react";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Navigation mode for pivot.
|
|
9
|
+
* - "linear": Default. Stops at first/last item.
|
|
10
|
+
* - "loop": Infinite loop. Navigation wraps around.
|
|
11
|
+
*/
|
|
12
|
+
export type PivotNavigationMode = "linear" | "loop";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* A single content item that can be displayed in a Pivot.
|
|
16
|
+
*/
|
|
17
|
+
export type PivotItem<TId extends string = string> = {
|
|
18
|
+
/** Unique identifier for this content item */
|
|
19
|
+
id: TId;
|
|
20
|
+
/** Human-readable label (optional - for tab titles, menu items, etc.) */
|
|
21
|
+
label?: string;
|
|
22
|
+
/** The actual content to render when this item is active */
|
|
23
|
+
content: React.ReactNode;
|
|
24
|
+
/** Whether this item can be selected (defaults to true) */
|
|
25
|
+
disabled?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Enable content caching to preserve React component state across re-renders.
|
|
28
|
+
* When disabled (default), content is re-created on each render.
|
|
29
|
+
* @default false
|
|
30
|
+
*/
|
|
31
|
+
cache?: boolean;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Props for the usePivot hook.
|
|
36
|
+
*/
|
|
37
|
+
export type UsePivotOptions<TId extends string = string> = {
|
|
38
|
+
/** Array of content items to manage */
|
|
39
|
+
items: ReadonlyArray<PivotItem<TId>>;
|
|
40
|
+
/** Currently active item ID (controlled mode) */
|
|
41
|
+
activeId?: TId;
|
|
42
|
+
/** Default active item ID (uncontrolled mode) */
|
|
43
|
+
defaultActiveId?: TId;
|
|
44
|
+
/** Callback when active item changes */
|
|
45
|
+
onActiveChange?: (id: TId) => void;
|
|
46
|
+
/**
|
|
47
|
+
* Transition mode for content switching.
|
|
48
|
+
* - "css" (default) uses CSS transitions with design tokens.
|
|
49
|
+
* - "none" disables transitions (uses React.Activity for memory optimization).
|
|
50
|
+
*/
|
|
51
|
+
transitionMode?: "css" | "none";
|
|
52
|
+
/**
|
|
53
|
+
* Navigation mode for pivot.
|
|
54
|
+
* - "linear" (default): Stops at first/last item.
|
|
55
|
+
* - "loop": Navigation wraps around (last→first, first→last).
|
|
56
|
+
*/
|
|
57
|
+
navigationMode?: PivotNavigationMode;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Props object returned by getItemProps for navigation elements.
|
|
62
|
+
*/
|
|
63
|
+
export type PivotItemProps = {
|
|
64
|
+
"data-pivot-item": string;
|
|
65
|
+
"data-active": "true" | "false";
|
|
66
|
+
"aria-selected": boolean;
|
|
67
|
+
tabIndex: number;
|
|
68
|
+
onClick: () => void;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Options for navigation methods (go, setActiveId).
|
|
73
|
+
*/
|
|
74
|
+
export type PivotNavigationOptions = {
|
|
75
|
+
/**
|
|
76
|
+
* Whether to animate the transition.
|
|
77
|
+
* - undefined: use transitionMode setting (default)
|
|
78
|
+
* - true: force animation
|
|
79
|
+
* - false: instant transition without animation
|
|
80
|
+
*/
|
|
81
|
+
animated?: boolean;
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Result from usePivot hook.
|
|
86
|
+
*/
|
|
87
|
+
export type UsePivotResult<TId extends string = string> = {
|
|
88
|
+
/** Current active item ID */
|
|
89
|
+
activeId: TId;
|
|
90
|
+
/**
|
|
91
|
+
* Function to change the active item.
|
|
92
|
+
* @param id - Target item ID
|
|
93
|
+
* @param options - Navigation options (animated, etc.)
|
|
94
|
+
*/
|
|
95
|
+
setActiveId: (id: TId, options?: PivotNavigationOptions) => void;
|
|
96
|
+
/** Helper to check if an item is active */
|
|
97
|
+
isActive: (id: TId) => boolean;
|
|
98
|
+
/** Function to get props for navigation items (buttons, links, etc.) */
|
|
99
|
+
getItemProps: (id: TId) => PivotItemProps;
|
|
100
|
+
/** Outlet component that renders the active content (react-router style) */
|
|
101
|
+
Outlet: React.FC;
|
|
102
|
+
/**
|
|
103
|
+
* Navigate in a direction relative to the current item.
|
|
104
|
+
* @param direction - Number of items to move: -1=prev, 1=next, -2=skip2Back, etc.
|
|
105
|
+
* @param options - Navigation options (animated, etc.)
|
|
106
|
+
*/
|
|
107
|
+
go: (direction: number, options?: PivotNavigationOptions) => void;
|
|
108
|
+
/**
|
|
109
|
+
* Check if navigation in a direction is possible.
|
|
110
|
+
* @param direction - Direction to check
|
|
111
|
+
* @returns true if navigation is possible
|
|
112
|
+
*/
|
|
113
|
+
canGo: (direction: number) => boolean;
|
|
114
|
+
/** Current index of active item in the items array */
|
|
115
|
+
activeIndex: number;
|
|
116
|
+
/** Total number of enabled items */
|
|
117
|
+
itemCount: number;
|
|
118
|
+
/** Whether a transition animation is currently in progress */
|
|
119
|
+
isAnimating: boolean;
|
|
120
|
+
/** Call to signal that animation has completed */
|
|
121
|
+
endAnimation: () => void;
|
|
122
|
+
/** Current navigation mode */
|
|
123
|
+
navigationMode: PivotNavigationMode;
|
|
124
|
+
/**
|
|
125
|
+
* Get the virtual position for an item relative to active.
|
|
126
|
+
* In loop mode, this wraps: item at index 0 can have position 1 if active is last.
|
|
127
|
+
* @param id - Item ID to check
|
|
128
|
+
* @returns -1 (prev), 0 (active), 1 (next), or null if not adjacent
|
|
129
|
+
*/
|
|
130
|
+
getVirtualPosition: (id: TId) => -1 | 0 | 1 | null;
|
|
131
|
+
/**
|
|
132
|
+
* Get the position for any item relative to active.
|
|
133
|
+
* Unlike getVirtualPosition, returns positions for all items (not just adjacent).
|
|
134
|
+
* In loop mode, returns the shortest path position (e.g., last→first is +1, not -(count-1)).
|
|
135
|
+
* @param id - Item ID to check
|
|
136
|
+
* @returns Position offset from active, or null if item not found
|
|
137
|
+
*/
|
|
138
|
+
getItemPosition: (id: TId) => number | null;
|
|
139
|
+
};
|