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,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Grid entry point - Grid layout components and hooks
|
|
3
|
+
* @packageDocumentation
|
|
4
|
+
*
|
|
5
|
+
* This is a subpath export entry point for `react-panel-layout/grid`.
|
|
6
|
+
*
|
|
7
|
+
* ## Overview
|
|
8
|
+
* Grid provides CSS Grid-based layout components for arranging panels in rows
|
|
9
|
+
* and columns. Supports resizable tracks, draggable layers, and floating windows.
|
|
10
|
+
*
|
|
11
|
+
* ## Installation
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { GridLayout } from "react-panel-layout/grid";
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* ## Basic Usage
|
|
17
|
+
* ```tsx
|
|
18
|
+
* const config = {
|
|
19
|
+
* areas: [
|
|
20
|
+
* ['sidebar', 'main', 'main'],
|
|
21
|
+
* ['sidebar', 'main', 'main'],
|
|
22
|
+
* ],
|
|
23
|
+
* columns: [{ size: '200px' }, { size: '1fr' }, { size: '1fr' }],
|
|
24
|
+
* rows: [{ size: '1fr' }, { size: '1fr' }],
|
|
25
|
+
* gap: '8px',
|
|
26
|
+
* };
|
|
27
|
+
*
|
|
28
|
+
* const layers = [
|
|
29
|
+
* { id: 'sidebar', component: <Sidebar /> },
|
|
30
|
+
* { id: 'main', component: <MainContent /> },
|
|
31
|
+
* ];
|
|
32
|
+
*
|
|
33
|
+
* function App() {
|
|
34
|
+
* return <GridLayout config={config} layers={layers} />;
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* ## Resizable Tracks
|
|
39
|
+
* ```tsx
|
|
40
|
+
* const config = {
|
|
41
|
+
* columns: [
|
|
42
|
+
* { size: '200px', resizable: true, minSize: 100, maxSize: 400 },
|
|
43
|
+
* { size: '1fr' },
|
|
44
|
+
* ],
|
|
45
|
+
* // ...
|
|
46
|
+
* };
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export { GridLayout } from "../components/grid/GridLayout.js";
|
|
50
|
+
export { GridLayerList } from "../components/grid/GridLayerList.js";
|
|
51
|
+
export { GridLayerResizeHandles } from "../components/grid/GridLayerResizeHandles.js";
|
|
52
|
+
export { GridTrackResizeHandle } from "../components/grid/GridTrackResizeHandle.js";
|
|
53
|
+
export { GridLayoutProvider, useGridLayoutContext, } from "../modules/grid/GridLayoutContext.js";
|
|
54
|
+
export { useGridPlacements } from "../modules/grid/useGridPlacements.js";
|
|
55
|
+
export { useGridTracks } from "../modules/grid/useGridTracks.js";
|
|
56
|
+
export type { GridLayerHandleProps, ResizeHandleConfig, GridLayerRenderState, GridLayoutContextValue, } from "../modules/grid/GridLayoutContext.js";
|
|
57
|
+
export type { GridLayoutProps } from "../components/grid/GridLayout.js";
|
|
58
|
+
export type { TrackHandleConfig, TrackDirection } from "../modules/grid/useGridTracks.js";
|
package/dist/grid.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./GridLayout-B4VRsC0r.cjs"),r=require("./FloatingWindow-TCDNY5gE.cjs");exports.GridLayerList=e.GridLayerList;exports.GridLayerResizeHandles=e.GridLayerResizeHandles;exports.GridLayout=e.GridLayout;exports.GridTrackResizeHandle=e.GridTrackResizeHandle;exports.useGridPlacements=e.useGridPlacements;exports.useGridTracks=e.useGridTracks;exports.GridLayoutProvider=r.GridLayoutProvider;exports.useGridLayoutContext=r.useGridLayoutContext;
|
|
2
|
+
//# sourceMappingURL=grid.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/grid.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { a as e, b as s, G as d, c as i, u as G, d as o } from "./GridLayout-BltqeCPK.js";
|
|
2
|
+
import { G as u, u as L } from "./FloatingWindow-BpdOpg_L.js";
|
|
3
|
+
export {
|
|
4
|
+
e as GridLayerList,
|
|
5
|
+
s as GridLayerResizeHandles,
|
|
6
|
+
d as GridLayout,
|
|
7
|
+
u as GridLayoutProvider,
|
|
8
|
+
i as GridTrackResizeHandle,
|
|
9
|
+
L as useGridLayoutContext,
|
|
10
|
+
G as useGridPlacements,
|
|
11
|
+
o as useGridTracks
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=grid.js.map
|
package/dist/grid.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Platform-specific swipe gesture presets.
|
|
3
|
+
*
|
|
4
|
+
* Provides pre-configured threshold values for different platforms
|
|
5
|
+
* to match their native gesture behaviors.
|
|
6
|
+
*/
|
|
7
|
+
import type { SwipeInputThresholds } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Platform-specific swipe gesture presets.
|
|
10
|
+
*
|
|
11
|
+
* - ios: Matches iOS native swipe behavior (responsive, smooth)
|
|
12
|
+
* - android: Matches Android gesture behavior (slightly more tolerant)
|
|
13
|
+
* - desktop: For mouse-based interactions (larger thresholds)
|
|
14
|
+
* - relaxed: For contexts where accidental swipes should be avoided
|
|
15
|
+
*/
|
|
16
|
+
export declare const SWIPE_PRESETS: Record<string, SwipeInputThresholds>;
|
|
17
|
+
/**
|
|
18
|
+
* Detect platform from user agent string and return appropriate preset.
|
|
19
|
+
*
|
|
20
|
+
* @param userAgent - Navigator userAgent string
|
|
21
|
+
* @returns Appropriate SwipeInputThresholds for the detected platform
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* const thresholds = getSwipePreset(navigator.userAgent);
|
|
26
|
+
* const { state, containerProps } = useSwipeInput({
|
|
27
|
+
* containerRef,
|
|
28
|
+
* axis: "horizontal",
|
|
29
|
+
* thresholds,
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare function getSwipePreset(userAgent: string): SwipeInputThresholds;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 2D point for gesture coordinates.
|
|
3
|
+
*/
|
|
4
|
+
export type Point = {
|
|
5
|
+
x: number;
|
|
6
|
+
y: number;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Options for creating a gesture simulator.
|
|
10
|
+
*/
|
|
11
|
+
export type GestureSimulatorOptions = {
|
|
12
|
+
/** Container element or ref for coordinate calculations */
|
|
13
|
+
container?: HTMLElement | null;
|
|
14
|
+
/** Default pointer type. @default "touch" */
|
|
15
|
+
pointerType?: "touch" | "mouse" | "pen";
|
|
16
|
+
/** Default pointer ID. @default 1 */
|
|
17
|
+
pointerId?: number;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Gesture simulator for testing swipe and drag interactions.
|
|
21
|
+
*/
|
|
22
|
+
export type GestureSimulator = {
|
|
23
|
+
/**
|
|
24
|
+
* Simulate pointer down event.
|
|
25
|
+
* @param x - X coordinate
|
|
26
|
+
* @param y - Y coordinate
|
|
27
|
+
*/
|
|
28
|
+
pointerDown: (x: number, y: number) => void;
|
|
29
|
+
/**
|
|
30
|
+
* Simulate pointer move event.
|
|
31
|
+
* @param x - X coordinate
|
|
32
|
+
* @param y - Y coordinate
|
|
33
|
+
*/
|
|
34
|
+
pointerMove: (x: number, y: number) => void;
|
|
35
|
+
/**
|
|
36
|
+
* Simulate pointer up event.
|
|
37
|
+
*/
|
|
38
|
+
pointerUp: () => void;
|
|
39
|
+
/**
|
|
40
|
+
* Simulate a complete swipe gesture.
|
|
41
|
+
* @param from - Starting point
|
|
42
|
+
* @param to - Ending point
|
|
43
|
+
* @param steps - Number of intermediate move events. @default 10
|
|
44
|
+
*/
|
|
45
|
+
swipe: (from: Point, to: Point, steps?: number) => void;
|
|
46
|
+
/**
|
|
47
|
+
* Simulate an edge swipe gesture.
|
|
48
|
+
* @param edge - Edge to swipe from ("left" | "right" | "top" | "bottom")
|
|
49
|
+
* @param distance - Distance to swipe in pixels
|
|
50
|
+
* @param containerSize - Size of the container (width for left/right, height for top/bottom). @default 300
|
|
51
|
+
*/
|
|
52
|
+
edgeSwipe: (edge: "left" | "right" | "top" | "bottom", distance: number, containerSize?: number) => void;
|
|
53
|
+
/**
|
|
54
|
+
* Create a React pointer event object for use with component handlers.
|
|
55
|
+
* @param type - Event type (pointerdown, pointermove, pointerup)
|
|
56
|
+
* @param x - X coordinate
|
|
57
|
+
* @param y - Y coordinate
|
|
58
|
+
*/
|
|
59
|
+
createReactPointerEvent: (type: "pointerdown" | "pointermove" | "pointerup", x: number, y: number) => React.PointerEvent;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Creates a gesture simulator for testing.
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```tsx
|
|
66
|
+
* const simulator = createGestureSimulator();
|
|
67
|
+
*
|
|
68
|
+
* // Simple pointer events
|
|
69
|
+
* simulator.pointerDown(100, 100);
|
|
70
|
+
* simulator.pointerMove(150, 100);
|
|
71
|
+
* simulator.pointerUp();
|
|
72
|
+
*
|
|
73
|
+
* // Complete swipe
|
|
74
|
+
* simulator.swipe({ x: 100, y: 100 }, { x: 200, y: 100 });
|
|
75
|
+
*
|
|
76
|
+
* // Edge swipe (iOS-style back gesture)
|
|
77
|
+
* simulator.edgeSwipe("left", 100);
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export declare function createGestureSimulator(options?: GestureSimulatorOptions): GestureSimulator;
|
|
81
|
+
/**
|
|
82
|
+
* Creates a mock container element with specified dimensions.
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```tsx
|
|
86
|
+
* const container = createMockContainer({ width: 300, height: 500 });
|
|
87
|
+
* const ref = { current: container };
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
export declare function createMockContainer(options?: {
|
|
91
|
+
width?: number;
|
|
92
|
+
height?: number;
|
|
93
|
+
left?: number;
|
|
94
|
+
top?: number;
|
|
95
|
+
}): HTMLDivElement;
|
|
96
|
+
/**
|
|
97
|
+
* Creates a ref object with a mock container element.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```tsx
|
|
101
|
+
* const containerRef = createMockContainerRef({ width: 300, height: 500 });
|
|
102
|
+
* const { result } = renderHook(() => useSwipeInput({ containerRef, axis: "horizontal" }));
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
export declare function createMockContainerRef(options?: {
|
|
106
|
+
width?: number;
|
|
107
|
+
height?: number;
|
|
108
|
+
left?: number;
|
|
109
|
+
top?: number;
|
|
110
|
+
}): React.RefObject<HTMLDivElement>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file ThresholdValue type and parsing utilities.
|
|
3
|
+
*
|
|
4
|
+
* Provides a flexible way to specify threshold values in either:
|
|
5
|
+
* - Absolute pixels: { value: 50, unit: "px" } or "50px"
|
|
6
|
+
* - Ratio of container: { value: 0.25, unit: "ratio" } or "25%"
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Parsed threshold value with explicit unit.
|
|
10
|
+
*/
|
|
11
|
+
export type ParsedThresholdValue = {
|
|
12
|
+
value: number;
|
|
13
|
+
unit: "px" | "ratio";
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Threshold value input format.
|
|
17
|
+
* Accepts either an object with explicit unit or a string shorthand.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* // Object format
|
|
21
|
+
* { value: 50, unit: "px" }
|
|
22
|
+
* { value: 0.25, unit: "ratio" }
|
|
23
|
+
*
|
|
24
|
+
* // String shorthand
|
|
25
|
+
* "50px" // 50 pixels
|
|
26
|
+
* "25%" // 25% of container (ratio 0.25)
|
|
27
|
+
*/
|
|
28
|
+
export type ThresholdValue = ParsedThresholdValue | string;
|
|
29
|
+
/**
|
|
30
|
+
* Parse a ThresholdValue input into a normalized ParsedThresholdValue.
|
|
31
|
+
*
|
|
32
|
+
* @param input - The threshold value to parse
|
|
33
|
+
* @returns Normalized threshold value object
|
|
34
|
+
* @throws Error if string format is invalid
|
|
35
|
+
*/
|
|
36
|
+
export declare function parseThresholdValue(input: ThresholdValue): ParsedThresholdValue;
|
|
37
|
+
/**
|
|
38
|
+
* Resolve a threshold value to pixels given a container size.
|
|
39
|
+
*
|
|
40
|
+
* @param input - The threshold value (object or string)
|
|
41
|
+
* @param containerSize - The container size in pixels for ratio calculation
|
|
42
|
+
* @returns The threshold in pixels
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveThreshold(input: ThresholdValue, containerSize: number): number;
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Type definitions for gesture input detection hooks.
|
|
3
|
+
*
|
|
4
|
+
* These types support the separation of concerns:
|
|
5
|
+
* - Operation: what to do (navigate, push, pop)
|
|
6
|
+
* - Input: how to command (swipe, click, keyboard)
|
|
7
|
+
* - Presentation: how to show (animation, transition)
|
|
8
|
+
*
|
|
9
|
+
* This file defines types for the Input layer.
|
|
10
|
+
*/
|
|
11
|
+
import type * as React from "react";
|
|
12
|
+
/**
|
|
13
|
+
* Axis for gesture detection.
|
|
14
|
+
*/
|
|
15
|
+
export type GestureAxis = "horizontal" | "vertical";
|
|
16
|
+
/**
|
|
17
|
+
* Phase of swipe input lifecycle.
|
|
18
|
+
*/
|
|
19
|
+
export type SwipeInputPhase = "idle" | "tracking" | "swiping" | "ended";
|
|
20
|
+
/**
|
|
21
|
+
* 2D vector for displacement and velocity.
|
|
22
|
+
*/
|
|
23
|
+
export type Vector2 = {
|
|
24
|
+
x: number;
|
|
25
|
+
y: number;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Point with timestamp for velocity calculation.
|
|
29
|
+
*/
|
|
30
|
+
export type TimestampedPoint = {
|
|
31
|
+
x: number;
|
|
32
|
+
y: number;
|
|
33
|
+
timestamp: number;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Swipe input state during gesture.
|
|
37
|
+
*/
|
|
38
|
+
export type SwipeInputState = {
|
|
39
|
+
/** Current phase of the swipe input */
|
|
40
|
+
phase: SwipeInputPhase;
|
|
41
|
+
/** Displacement from start position in pixels */
|
|
42
|
+
displacement: Vector2;
|
|
43
|
+
/** Current velocity in pixels per millisecond */
|
|
44
|
+
velocity: Vector2;
|
|
45
|
+
/**
|
|
46
|
+
* Direction of movement as a number.
|
|
47
|
+
* -1 = backward (left/up), 0 = no movement, 1 = forward (right/down)
|
|
48
|
+
*/
|
|
49
|
+
direction: -1 | 0 | 1;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Thresholds for swipe input recognition.
|
|
53
|
+
*/
|
|
54
|
+
export type SwipeInputThresholds = {
|
|
55
|
+
/** Minimum distance in pixels to trigger swipe. @default 50 */
|
|
56
|
+
distanceThreshold: number;
|
|
57
|
+
/** Minimum velocity in px/ms to trigger swipe. @default 0.3 */
|
|
58
|
+
velocityThreshold: number;
|
|
59
|
+
/** Distance threshold before direction is locked. @default 10 */
|
|
60
|
+
lockThreshold: number;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Options for usePointerTracking hook.
|
|
64
|
+
*/
|
|
65
|
+
export type UsePointerTrackingOptions = {
|
|
66
|
+
/** Whether tracking is enabled */
|
|
67
|
+
enabled: boolean;
|
|
68
|
+
/** Restrict to primary pointer only (ignore multitouch). @default true */
|
|
69
|
+
primaryOnly?: boolean;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Result from usePointerTracking hook.
|
|
73
|
+
*/
|
|
74
|
+
export type UsePointerTrackingResult = {
|
|
75
|
+
/** Current tracking state */
|
|
76
|
+
state: PointerTrackingState;
|
|
77
|
+
/** Handler to attach to onPointerDown */
|
|
78
|
+
onPointerDown: (event: React.PointerEvent) => void;
|
|
79
|
+
/** Reset tracking state */
|
|
80
|
+
reset: () => void;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Internal pointer tracking state.
|
|
84
|
+
*/
|
|
85
|
+
export type PointerTrackingState = {
|
|
86
|
+
/** Whether pointer is currently down */
|
|
87
|
+
isDown: boolean;
|
|
88
|
+
/** Start position and timestamp */
|
|
89
|
+
start: TimestampedPoint | null;
|
|
90
|
+
/** Current position and timestamp */
|
|
91
|
+
current: TimestampedPoint | null;
|
|
92
|
+
/** Active pointer ID */
|
|
93
|
+
pointerId: number | null;
|
|
94
|
+
/** Whether tracking ended via pointercancel (not pointerup) */
|
|
95
|
+
wasCanceled: boolean;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Options for useDirectionalLock hook.
|
|
99
|
+
*/
|
|
100
|
+
export type UseDirectionalLockOptions = {
|
|
101
|
+
/** Pointer tracking state from usePointerTracking */
|
|
102
|
+
tracking: PointerTrackingState;
|
|
103
|
+
/** Lock threshold in pixels. @default 10 */
|
|
104
|
+
lockThreshold?: number;
|
|
105
|
+
};
|
|
106
|
+
/**
|
|
107
|
+
* Result from useDirectionalLock hook.
|
|
108
|
+
*/
|
|
109
|
+
export type UseDirectionalLockResult = {
|
|
110
|
+
/** Locked axis, or null if not yet locked */
|
|
111
|
+
lockedAxis: GestureAxis | null;
|
|
112
|
+
/** Whether lock has been determined */
|
|
113
|
+
isLocked: boolean;
|
|
114
|
+
/** Reset the lock state */
|
|
115
|
+
reset: () => void;
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Options for useScrollBoundary hook.
|
|
119
|
+
*/
|
|
120
|
+
export type UseScrollBoundaryOptions = {
|
|
121
|
+
/** Scroll container ref. If null, checks document scroll. */
|
|
122
|
+
containerRef: React.RefObject<HTMLElement | null>;
|
|
123
|
+
/** Axis to monitor */
|
|
124
|
+
axis: GestureAxis;
|
|
125
|
+
/** Tolerance in pixels for "at boundary" detection. @default 1 */
|
|
126
|
+
tolerance?: number;
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Result from useScrollBoundary hook.
|
|
130
|
+
*/
|
|
131
|
+
export type UseScrollBoundaryResult = {
|
|
132
|
+
/** Whether at the start boundary (top/left) */
|
|
133
|
+
atStart: boolean;
|
|
134
|
+
/** Whether at the end boundary (bottom/right) */
|
|
135
|
+
atEnd: boolean;
|
|
136
|
+
/** Current scroll position */
|
|
137
|
+
scrollPosition: number;
|
|
138
|
+
/** Maximum scroll position */
|
|
139
|
+
maxScrollPosition: number;
|
|
140
|
+
};
|
|
141
|
+
/**
|
|
142
|
+
* Filter function to determine if a pointer event should start tracking.
|
|
143
|
+
* Receives the pointer event and container element.
|
|
144
|
+
* Return true to allow tracking, false to ignore the event.
|
|
145
|
+
*/
|
|
146
|
+
export type PointerStartFilter = (event: React.PointerEvent, container: HTMLElement) => boolean;
|
|
147
|
+
/**
|
|
148
|
+
* Options for useSwipeInput hook.
|
|
149
|
+
*/
|
|
150
|
+
export type UseSwipeInputOptions = {
|
|
151
|
+
/** Ref to the container element */
|
|
152
|
+
containerRef: React.RefObject<HTMLElement | null>;
|
|
153
|
+
/** Axis to detect swipes on */
|
|
154
|
+
axis: GestureAxis;
|
|
155
|
+
/** Whether swipe detection is enabled. @default true */
|
|
156
|
+
enabled?: boolean;
|
|
157
|
+
/** Swipe thresholds configuration */
|
|
158
|
+
thresholds?: Partial<SwipeInputThresholds>;
|
|
159
|
+
/** Callback when swipe is completed */
|
|
160
|
+
onSwipeEnd?: (state: SwipeInputState) => void;
|
|
161
|
+
/** Whether to enable trackpad two-finger swipe (wheel events). @default true */
|
|
162
|
+
enableWheel?: boolean;
|
|
163
|
+
/**
|
|
164
|
+
* Optional filter to determine if a pointer event should start tracking.
|
|
165
|
+
* If provided, only events that pass this filter will be tracked.
|
|
166
|
+
* Useful for edge-based swipe detection.
|
|
167
|
+
*/
|
|
168
|
+
pointerStartFilter?: PointerStartFilter;
|
|
169
|
+
};
|
|
170
|
+
/**
|
|
171
|
+
* Result from useSwipeInput hook.
|
|
172
|
+
*/
|
|
173
|
+
export type UseSwipeInputResult = {
|
|
174
|
+
/** Current swipe input state */
|
|
175
|
+
state: SwipeInputState;
|
|
176
|
+
/** Props to spread on the container element */
|
|
177
|
+
containerProps: React.HTMLAttributes<HTMLElement> & {
|
|
178
|
+
style: React.CSSProperties;
|
|
179
|
+
};
|
|
180
|
+
};
|
|
181
|
+
/**
|
|
182
|
+
* Edge for edge-originated gestures.
|
|
183
|
+
*/
|
|
184
|
+
export type GestureEdge = "left" | "right" | "top" | "bottom";
|
|
185
|
+
/**
|
|
186
|
+
* Options for useEdgeSwipeInput hook.
|
|
187
|
+
*/
|
|
188
|
+
export type UseEdgeSwipeInputOptions = {
|
|
189
|
+
/** Ref to the container element */
|
|
190
|
+
containerRef: React.RefObject<HTMLElement | null>;
|
|
191
|
+
/** Which edge to detect swipes from */
|
|
192
|
+
edge: GestureEdge;
|
|
193
|
+
/** Width of the edge detection zone in pixels. @default 20 */
|
|
194
|
+
edgeWidth?: number;
|
|
195
|
+
/** Whether edge swipe detection is enabled. @default true */
|
|
196
|
+
enabled?: boolean;
|
|
197
|
+
/** Swipe thresholds configuration */
|
|
198
|
+
thresholds?: Partial<SwipeInputThresholds>;
|
|
199
|
+
/** Callback when edge swipe is completed */
|
|
200
|
+
onSwipeEnd?: (state: SwipeInputState) => void;
|
|
201
|
+
};
|
|
202
|
+
/**
|
|
203
|
+
* Result from useEdgeSwipeInput hook.
|
|
204
|
+
*/
|
|
205
|
+
export type UseEdgeSwipeInputResult = {
|
|
206
|
+
/** Whether the current gesture started from the edge */
|
|
207
|
+
isEdgeGesture: boolean;
|
|
208
|
+
/** Current swipe input state */
|
|
209
|
+
state: SwipeInputState;
|
|
210
|
+
/** Props to spread on the container element */
|
|
211
|
+
containerProps: React.HTMLAttributes<HTMLElement> & {
|
|
212
|
+
style: React.CSSProperties;
|
|
213
|
+
};
|
|
214
|
+
};
|
|
215
|
+
/**
|
|
216
|
+
* Options for useNativeGestureGuard hook.
|
|
217
|
+
*/
|
|
218
|
+
export type UseNativeGestureGuardOptions = {
|
|
219
|
+
/** Ref to the container element */
|
|
220
|
+
containerRef: React.RefObject<HTMLElement | null>;
|
|
221
|
+
/** Whether the guard is active */
|
|
222
|
+
active: boolean;
|
|
223
|
+
/** Prevent iOS/macOS edge back gesture. @default true */
|
|
224
|
+
preventEdgeBack?: boolean;
|
|
225
|
+
/** Prevent overscroll bounce effect. @default true */
|
|
226
|
+
preventOverscroll?: boolean;
|
|
227
|
+
/** Width of edge zone where back gesture is prevented. @default 20 */
|
|
228
|
+
edgeWidth?: number;
|
|
229
|
+
};
|
|
230
|
+
/**
|
|
231
|
+
* Result from useNativeGestureGuard hook.
|
|
232
|
+
*/
|
|
233
|
+
export type UseNativeGestureGuardResult = {
|
|
234
|
+
/** Props to spread on the container element */
|
|
235
|
+
containerProps: React.HTMLAttributes<HTMLElement> & {
|
|
236
|
+
style: React.CSSProperties;
|
|
237
|
+
};
|
|
238
|
+
};
|
|
239
|
+
/**
|
|
240
|
+
* Default swipe input thresholds.
|
|
241
|
+
*
|
|
242
|
+
* - distanceThreshold: 100px is ~27% of a 375px mobile screen
|
|
243
|
+
* - velocityThreshold: 0.5px/ms = 500px/s, a moderate flick speed
|
|
244
|
+
* - lockThreshold: 10px before direction is locked
|
|
245
|
+
*/
|
|
246
|
+
export declare const DEFAULT_SWIPE_THRESHOLDS: SwipeInputThresholds;
|
|
247
|
+
/**
|
|
248
|
+
* Default edge width for edge gesture detection.
|
|
249
|
+
*/
|
|
250
|
+
export declare const DEFAULT_EDGE_WIDTH = 20;
|
|
251
|
+
/**
|
|
252
|
+
* Initial idle state for SwipeInputState.
|
|
253
|
+
*/
|
|
254
|
+
export declare const IDLE_SWIPE_INPUT_STATE: SwipeInputState;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { UseDirectionalLockOptions, UseDirectionalLockResult } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Hook for locking gesture direction after threshold is exceeded.
|
|
4
|
+
*
|
|
5
|
+
* This hook tracks pointer movement and locks to horizontal or vertical
|
|
6
|
+
* direction once the movement exceeds the configured threshold. This
|
|
7
|
+
* prevents diagonal gestures from triggering both scroll and swipe behaviors.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* const { state: tracking, onPointerDown } = usePointerTracking({ enabled: true });
|
|
12
|
+
* const { lockedAxis, isLocked } = useDirectionalLock({
|
|
13
|
+
* tracking,
|
|
14
|
+
* lockThreshold: 10,
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* // lockedAxis will be "horizontal" or "vertical" once determined
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function useDirectionalLock(options: UseDirectionalLockOptions): UseDirectionalLockResult;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { UseEdgeSwipeInputOptions, UseEdgeSwipeInputResult } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Hook for detecting swipe gestures that originate from the edge of a container.
|
|
4
|
+
*
|
|
5
|
+
* This is useful for implementing "swipe back" navigation patterns where
|
|
6
|
+
* the user must start their swipe from the edge of the screen.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```tsx
|
|
10
|
+
* const containerRef = useRef<HTMLDivElement>(null);
|
|
11
|
+
* const { isEdgeGesture, state, containerProps } = useEdgeSwipeInput({
|
|
12
|
+
* containerRef,
|
|
13
|
+
* edge: "left",
|
|
14
|
+
* edgeWidth: 20,
|
|
15
|
+
* onSwipeEnd: (state) => {
|
|
16
|
+
* if (state.direction === 1) goBack();
|
|
17
|
+
* },
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* return <div ref={containerRef} {...containerProps}>{children}</div>;
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function useEdgeSwipeInput(options: UseEdgeSwipeInputOptions): UseEdgeSwipeInputResult;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { UseNativeGestureGuardOptions, UseNativeGestureGuardResult } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Hook for preventing conflicts with native OS gestures.
|
|
4
|
+
*
|
|
5
|
+
* When active, this hook:
|
|
6
|
+
* - Prevents iOS/macOS edge back gesture by capturing pointerdown events in the edge zone
|
|
7
|
+
* - Prevents overscroll bounce effect using CSS overscroll-behavior
|
|
8
|
+
* - Dynamically applies overscroll-behavior: none to html element during gesture
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* const containerRef = useRef<HTMLDivElement>(null);
|
|
13
|
+
* const { containerProps } = useNativeGestureGuard({
|
|
14
|
+
* containerRef,
|
|
15
|
+
* active: isSwipeActive,
|
|
16
|
+
* preventEdgeBack: true,
|
|
17
|
+
* preventOverscroll: true,
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* return <div ref={containerRef} {...containerProps}>{children}</div>;
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function useNativeGestureGuard(options: UseNativeGestureGuardOptions): UseNativeGestureGuardResult;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { UsePointerTrackingOptions, UsePointerTrackingResult } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Hook for tracking pointer state during gestures.
|
|
4
|
+
*
|
|
5
|
+
* Tracks pointer down/move/up events and provides position and timing data
|
|
6
|
+
* that can be used by higher-level gesture detection hooks.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```tsx
|
|
10
|
+
* const { state, onPointerDown, reset } = usePointerTracking({
|
|
11
|
+
* enabled: true,
|
|
12
|
+
* primaryOnly: true,
|
|
13
|
+
* });
|
|
14
|
+
*
|
|
15
|
+
* return (
|
|
16
|
+
* <div onPointerDown={onPointerDown}>
|
|
17
|
+
* {state.isDown && <span>Tracking...</span>}
|
|
18
|
+
* </div>
|
|
19
|
+
* );
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare function usePointerTracking(options: UsePointerTrackingOptions): UsePointerTrackingResult;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { UseScrollBoundaryOptions, UseScrollBoundaryResult } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Hook for detecting scroll position relative to boundaries.
|
|
4
|
+
*
|
|
5
|
+
* Monitors the scroll position of an element and reports whether it is
|
|
6
|
+
* at the start boundary (top/left) or end boundary (bottom/right).
|
|
7
|
+
* This is useful for enabling swipe gestures when content is scrolled to an edge.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* const containerRef = useRef<HTMLDivElement>(null);
|
|
12
|
+
* const { atStart, atEnd } = useScrollBoundary({
|
|
13
|
+
* containerRef,
|
|
14
|
+
* axis: "horizontal",
|
|
15
|
+
* tolerance: 5,
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* // Enable swipe when at edge
|
|
19
|
+
* const canSwipeLeft = atStart;
|
|
20
|
+
* const canSwipeRight = atEnd;
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function useScrollBoundary(options: UseScrollBoundaryOptions): UseScrollBoundaryResult;
|