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,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Basic StickyArea demo - native app-like overscroll experience
|
|
3
|
+
*/
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { StickyArea } from "../../../../sticky-header/index";
|
|
6
|
+
import type { StickyAreaPosition, StickyAreaState } from "../../../../sticky-header/index";
|
|
7
|
+
import styles from "./StickyHeader.module.css";
|
|
8
|
+
|
|
9
|
+
const HeaderCover: React.FC = () => (
|
|
10
|
+
<div className={`${styles.coverPlaceholder} ${styles.coverGradient1}`}>Header Cover</div>
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
const FooterCover: React.FC = () => (
|
|
14
|
+
<div className={`${styles.coverPlaceholder} ${styles.coverGradient2}`}>Footer Cover</div>
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
export const StickyHeaderBasics: React.FC = () => {
|
|
18
|
+
const [headerState, setHeaderState] = React.useState<StickyAreaState>({
|
|
19
|
+
isStuck: false,
|
|
20
|
+
scrollOffset: 0,
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const [footerState, setFooterState] = React.useState<StickyAreaState>({
|
|
24
|
+
isStuck: false,
|
|
25
|
+
scrollOffset: 0,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const [position, setPosition] = React.useState<StickyAreaPosition>("top");
|
|
29
|
+
|
|
30
|
+
const state = position === "top" ? headerState : footerState;
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<div className={styles.container}>
|
|
34
|
+
<div className={styles.stateIndicator}>
|
|
35
|
+
<div className={styles.stateRow}>
|
|
36
|
+
<span className={styles.stateLabel}>position:</span>
|
|
37
|
+
<select
|
|
38
|
+
value={position}
|
|
39
|
+
onChange={(e) => setPosition(e.target.value as StickyAreaPosition)}
|
|
40
|
+
className={styles.stateValue}
|
|
41
|
+
>
|
|
42
|
+
<option value="top">top (header)</option>
|
|
43
|
+
<option value="bottom">bottom (footer)</option>
|
|
44
|
+
</select>
|
|
45
|
+
</div>
|
|
46
|
+
<div className={styles.stateRow}>
|
|
47
|
+
<span className={styles.stateLabel}>isStuck:</span>
|
|
48
|
+
<span className={`${styles.stateValue} ${state.isStuck ? styles.stuck : ""}`}>
|
|
49
|
+
{state.isStuck ? "true" : "false"}
|
|
50
|
+
</span>
|
|
51
|
+
</div>
|
|
52
|
+
<div className={styles.stateRow}>
|
|
53
|
+
<span className={styles.stateLabel}>scrollOffset:</span>
|
|
54
|
+
<span className={styles.stateValue}>{state.scrollOffset.toFixed(0)}px</span>
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
<div className={styles.scrollArea}>
|
|
59
|
+
<StickyArea position="top" cover={<HeaderCover />} onStateChange={setHeaderState}>
|
|
60
|
+
<div className={styles.header}>
|
|
61
|
+
<h1>StickyArea Demo</h1>
|
|
62
|
+
<p>Pull down to see the overscroll effect (works best in PWA/WebApp mode)</p>
|
|
63
|
+
</div>
|
|
64
|
+
</StickyArea>
|
|
65
|
+
|
|
66
|
+
<div className={styles.content}>
|
|
67
|
+
<h2>About StickyArea</h2>
|
|
68
|
+
<p>
|
|
69
|
+
StickyArea provides a native app-like experience for SPAs and PWAs. It supports both header (top) and
|
|
70
|
+
footer (bottom) positions. When the user overscrolls, the cover content expands to fill the visible area.
|
|
71
|
+
</p>
|
|
72
|
+
|
|
73
|
+
<h2>Features</h2>
|
|
74
|
+
<ul>
|
|
75
|
+
<li>
|
|
76
|
+
<strong>Header & Footer</strong> - Use position="top" or position="bottom"
|
|
77
|
+
</li>
|
|
78
|
+
<li>
|
|
79
|
+
<strong>Overscroll Effect</strong> - Cover expands during bounce
|
|
80
|
+
</li>
|
|
81
|
+
<li>
|
|
82
|
+
<strong>State Tracking</strong> - Know when area is "stuck" at edge
|
|
83
|
+
</li>
|
|
84
|
+
</ul>
|
|
85
|
+
|
|
86
|
+
<h2>Usage</h2>
|
|
87
|
+
<p>Use position prop to control header or footer behavior:</p>
|
|
88
|
+
|
|
89
|
+
<h2>Scroll to Bottom</h2>
|
|
90
|
+
<p>Keep scrolling to see the footer with its own cover that expands on pull-up overscroll...</p>
|
|
91
|
+
<p>The footer area works the same as the header, but anchored to the bottom.</p>
|
|
92
|
+
<p>Try changing the position selector above to see the state for header or footer.</p>
|
|
93
|
+
</div>
|
|
94
|
+
|
|
95
|
+
<StickyArea position="bottom" cover={<FooterCover />} onStateChange={setFooterState}>
|
|
96
|
+
<div className={styles.footer}>
|
|
97
|
+
<p>Footer Area - Pull up to see the overscroll effect</p>
|
|
98
|
+
</div>
|
|
99
|
+
</StickyArea>
|
|
100
|
+
</div>
|
|
101
|
+
</div>
|
|
102
|
+
);
|
|
103
|
+
};
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Demo route configuration for Sidebar and Router
|
|
3
|
+
*/
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
|
|
6
|
+
// Page components (static imports to satisfy lint rules)
|
|
7
|
+
import FP_Basic from "./pages/FloatingPanelFrame/basic";
|
|
8
|
+
import FP_WithMeta from "./pages/FloatingPanelFrame/with-meta";
|
|
9
|
+
import FP_WithControls from "./pages/FloatingPanelFrame/with-controls";
|
|
10
|
+
import FP_Complex from "./pages/FloatingPanelFrame/complex";
|
|
11
|
+
import FP_Scrollable from "./pages/FloatingPanelFrame/scrollable";
|
|
12
|
+
|
|
13
|
+
import HD_Simple from "./pages/HorizontalDivider/simple-resizable-panels";
|
|
14
|
+
import HD_Rich from "./pages/HorizontalDivider/panels-with-rich-content";
|
|
15
|
+
import HD_Three from "./pages/HorizontalDivider/three-panel-layout";
|
|
16
|
+
|
|
17
|
+
import RH_Vertical from "./pages/ResizeHandle/vertical";
|
|
18
|
+
import RH_Horizontal from "./pages/ResizeHandle/horizontal";
|
|
19
|
+
import RH_Both from "./pages/ResizeHandle/both-directions";
|
|
20
|
+
import RH_Nested from "./pages/ResizeHandle/nested-panels";
|
|
21
|
+
|
|
22
|
+
import PL_SimpleGrid from "./pages/PanelLayout/simple-grid";
|
|
23
|
+
import PL_IDE from "./pages/PanelLayout/ide-layout";
|
|
24
|
+
import PL_Dashboard from "./pages/PanelLayout/dashboard";
|
|
25
|
+
import PL_Overlays from "./pages/PanelLayout/draggable-overlays";
|
|
26
|
+
|
|
27
|
+
import DR_Basics from "./pages/Drawer/basics";
|
|
28
|
+
import DR_Menu from "./pages/Drawer/menu";
|
|
29
|
+
import DR_Animations from "./pages/Drawer/animations";
|
|
30
|
+
|
|
31
|
+
import PS_Preview from "./pages/PanelSystem/preview";
|
|
32
|
+
import PS_Tabbar from "./pages/PanelSystem/tabbar";
|
|
33
|
+
import { ResizableFloatingPanelsPreview } from "./pages/FloatingPanelFrame/ResizableFloatingPanelsPreview";
|
|
34
|
+
import RL_AdaptiveWorkspace from "./pages/ResponsiveLayout/adaptive-workspace";
|
|
35
|
+
|
|
36
|
+
import PV_Basics from "./pages/Pivot/basics";
|
|
37
|
+
import PV_Tabs from "./pages/Pivot/tabs";
|
|
38
|
+
import PV_Sidebar from "./pages/Pivot/sidebar";
|
|
39
|
+
import PV_Transitions from "./pages/Pivot/transitions";
|
|
40
|
+
import PV_Swipe from "./pages/Pivot/swipe";
|
|
41
|
+
import PV_SwipeDebug from "./pages/Pivot/swipe-debug";
|
|
42
|
+
import PV_SwipeTabs from "./pages/Pivot/swipe-tabs";
|
|
43
|
+
|
|
44
|
+
import ST_Basics from "./pages/Stack/basics";
|
|
45
|
+
import ST_Tablet from "./pages/Stack/tablet";
|
|
46
|
+
|
|
47
|
+
import SH_Basics from "./pages/StickyHeader/basics";
|
|
48
|
+
|
|
49
|
+
import { FiGrid, FiLayers, FiColumns, FiMaximize2, FiBox, FiCpu, FiSmartphone, FiSidebar, FiNavigation, FiImage } from "react-icons/fi";
|
|
50
|
+
|
|
51
|
+
export type DemoPage = {
|
|
52
|
+
id: string;
|
|
53
|
+
label: string;
|
|
54
|
+
path: string; // path relative to the category base
|
|
55
|
+
element: React.ReactNode;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export type DemoCategory = {
|
|
59
|
+
id: string;
|
|
60
|
+
label: string;
|
|
61
|
+
icon: React.ReactNode;
|
|
62
|
+
base: string; // base route path
|
|
63
|
+
pages: DemoPage[];
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export const demoCategories: DemoCategory[] = [
|
|
67
|
+
{
|
|
68
|
+
id: "panel-layout",
|
|
69
|
+
label: "PanelLayout",
|
|
70
|
+
icon: <FiGrid />,
|
|
71
|
+
base: "/components/panel-layout",
|
|
72
|
+
pages: [
|
|
73
|
+
{ id: "simple-grid", label: "Simple Grid", path: "simple-grid", element: <PL_SimpleGrid /> },
|
|
74
|
+
{ id: "ide-layout", label: "IDE Layout", path: "ide-layout", element: <PL_IDE /> },
|
|
75
|
+
{ id: "dashboard", label: "Dashboard", path: "dashboard", element: <PL_Dashboard /> },
|
|
76
|
+
{ id: "draggable-overlays", label: "Draggable Overlays", path: "draggable-overlays", element: <PL_Overlays /> },
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
id: "drawer",
|
|
81
|
+
label: "Drawer",
|
|
82
|
+
icon: <FiSidebar />,
|
|
83
|
+
base: "/components/drawer",
|
|
84
|
+
pages: [
|
|
85
|
+
{ id: "basics", label: "Basics", path: "basics", element: <DR_Basics /> },
|
|
86
|
+
{ id: "menu", label: "Menu", path: "menu", element: <DR_Menu /> },
|
|
87
|
+
{ id: "animations", label: "Animations", path: "animations", element: <DR_Animations /> },
|
|
88
|
+
],
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
id: "responsive-layout",
|
|
92
|
+
label: "Responsive Layout",
|
|
93
|
+
icon: <FiSmartphone />,
|
|
94
|
+
base: "/components/responsive-layout",
|
|
95
|
+
pages: [
|
|
96
|
+
{
|
|
97
|
+
id: "adaptive-workspace",
|
|
98
|
+
label: "Adaptive Workspace",
|
|
99
|
+
path: "adaptive-workspace",
|
|
100
|
+
element: <RL_AdaptiveWorkspace />,
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
id: "floating-panel-frame",
|
|
106
|
+
label: "FloatingPanelFrame",
|
|
107
|
+
icon: <FiLayers />,
|
|
108
|
+
base: "/components/floating-panel-frame",
|
|
109
|
+
pages: [
|
|
110
|
+
{ id: "basic", label: "Basic", path: "basic", element: <FP_Basic /> },
|
|
111
|
+
{ id: "with-meta", label: "With Meta", path: "with-meta", element: <FP_WithMeta /> },
|
|
112
|
+
{ id: "with-controls", label: "With Controls", path: "with-controls", element: <FP_WithControls /> },
|
|
113
|
+
{ id: "complex", label: "Complex", path: "complex", element: <FP_Complex /> },
|
|
114
|
+
{ id: "scrollable", label: "Scrollable", path: "scrollable", element: <FP_Scrollable /> },
|
|
115
|
+
],
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
id: "horizontal-divider",
|
|
119
|
+
label: "HorizontalDivider",
|
|
120
|
+
icon: <FiColumns />,
|
|
121
|
+
base: "/components/horizontal-divider",
|
|
122
|
+
pages: [
|
|
123
|
+
{ id: "simple", label: "Simple", path: "simple-resizable-panels", element: <HD_Simple /> },
|
|
124
|
+
{ id: "rich-content", label: "Rich Content", path: "panels-with-rich-content", element: <HD_Rich /> },
|
|
125
|
+
{ id: "three-panel", label: "Three Panel", path: "three-panel-layout", element: <HD_Three /> },
|
|
126
|
+
],
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
id: "resize-handle",
|
|
130
|
+
label: "ResizeHandle",
|
|
131
|
+
icon: <FiMaximize2 />,
|
|
132
|
+
base: "/components/resize-handle",
|
|
133
|
+
pages: [
|
|
134
|
+
{ id: "vertical", label: "Vertical", path: "vertical", element: <RH_Vertical /> },
|
|
135
|
+
{ id: "horizontal", label: "Horizontal", path: "horizontal", element: <RH_Horizontal /> },
|
|
136
|
+
{ id: "both", label: "Both Directions", path: "both-directions", element: <RH_Both /> },
|
|
137
|
+
{ id: "nested", label: "Nested Panels", path: "nested-panels", element: <RH_Nested /> },
|
|
138
|
+
],
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
id: "resizable-floating-panels",
|
|
142
|
+
label: "Resizable Floating Panels",
|
|
143
|
+
icon: <FiBox />,
|
|
144
|
+
base: "/components/resizable-floating-panels",
|
|
145
|
+
pages: [
|
|
146
|
+
{ id: "edge-resize", label: "Edge Resize", path: "edge-resize", element: <ResizableFloatingPanelsPreview /> },
|
|
147
|
+
],
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
id: "panel-system",
|
|
151
|
+
label: "PanelSystem",
|
|
152
|
+
icon: <FiCpu />,
|
|
153
|
+
base: "/components/panel-system",
|
|
154
|
+
pages: [
|
|
155
|
+
{ id: "preview", label: "Preview", path: "preview", element: <PS_Preview /> },
|
|
156
|
+
{ id: "tabbar", label: "TabBar", path: "tabbar", element: <PS_Tabbar /> },
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
id: "pivot",
|
|
161
|
+
label: "Pivot",
|
|
162
|
+
icon: <FiNavigation />,
|
|
163
|
+
base: "/components/pivot",
|
|
164
|
+
pages: [
|
|
165
|
+
{ id: "basics", label: "Basics", path: "basics", element: <PV_Basics /> },
|
|
166
|
+
{ id: "tabs", label: "Tab Navigation", path: "tabs", element: <PV_Tabs /> },
|
|
167
|
+
{ id: "sidebar", label: "Sidebar Navigation", path: "sidebar", element: <PV_Sidebar /> },
|
|
168
|
+
{ id: "transitions", label: "Transitions", path: "transitions", element: <PV_Transitions /> },
|
|
169
|
+
{ id: "swipe", label: "Swipe Navigation", path: "swipe", element: <PV_Swipe /> },
|
|
170
|
+
{ id: "swipe-tabs", label: "Swipe Tabs", path: "swipe-tabs", element: <PV_SwipeTabs /> },
|
|
171
|
+
{ id: "swipe-debug", label: "Swipe Debug (iOS)", path: "swipe-debug", element: <PV_SwipeDebug /> },
|
|
172
|
+
],
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
id: "stack",
|
|
176
|
+
label: "Stack",
|
|
177
|
+
icon: <FiLayers />,
|
|
178
|
+
base: "/components/stack",
|
|
179
|
+
pages: [
|
|
180
|
+
{ id: "basics", label: "Basics", path: "basics", element: <ST_Basics /> },
|
|
181
|
+
{ id: "tablet", label: "Tablet Layout", path: "tablet", element: <ST_Tablet /> },
|
|
182
|
+
],
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
id: "sticky-header",
|
|
186
|
+
label: "StickyHeader",
|
|
187
|
+
icon: <FiImage />,
|
|
188
|
+
base: "/components/sticky-header",
|
|
189
|
+
pages: [
|
|
190
|
+
{ id: "basics", label: "Basics", path: "basics", element: <SH_Basics /> },
|
|
191
|
+
],
|
|
192
|
+
},
|
|
193
|
+
];
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Demo animation definitions (global CSS, not scoped by CSS modules)
|
|
3
|
+
*
|
|
4
|
+
* Users should define their own keyframes and CSS variables in their global CSS.
|
|
5
|
+
* This file demonstrates the pattern.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/* ===============================
|
|
9
|
+
* Pivot Animations
|
|
10
|
+
* =============================== */
|
|
11
|
+
|
|
12
|
+
@keyframes pivotEnter {
|
|
13
|
+
from {
|
|
14
|
+
opacity: 0;
|
|
15
|
+
transform: translateY(8px);
|
|
16
|
+
}
|
|
17
|
+
to {
|
|
18
|
+
opacity: 1;
|
|
19
|
+
transform: translateY(0);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@keyframes pivotLeave {
|
|
24
|
+
from {
|
|
25
|
+
opacity: 1;
|
|
26
|
+
transform: translateY(0);
|
|
27
|
+
}
|
|
28
|
+
to {
|
|
29
|
+
opacity: 0;
|
|
30
|
+
transform: translateY(-8px);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* ===============================
|
|
35
|
+
* Stack Animations
|
|
36
|
+
* =============================== */
|
|
37
|
+
|
|
38
|
+
@keyframes stackPush {
|
|
39
|
+
from {
|
|
40
|
+
transform: translateX(100%);
|
|
41
|
+
}
|
|
42
|
+
to {
|
|
43
|
+
transform: translateX(0);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@keyframes stackPop {
|
|
48
|
+
from {
|
|
49
|
+
transform: translateX(0);
|
|
50
|
+
}
|
|
51
|
+
to {
|
|
52
|
+
transform: translateX(100%);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/* ===============================
|
|
57
|
+
* CSS Variable Registration
|
|
58
|
+
* =============================== */
|
|
59
|
+
|
|
60
|
+
:root {
|
|
61
|
+
/* Pivot animations */
|
|
62
|
+
--rpl-pivot-animation-enter: pivotEnter 200ms ease-out forwards;
|
|
63
|
+
--rpl-pivot-animation-leave: pivotLeave 150ms ease-in forwards;
|
|
64
|
+
|
|
65
|
+
/* Stack animations */
|
|
66
|
+
--rpl-stack-animation-push: stackPush 350ms cubic-bezier(0.32, 0.72, 0, 1) forwards;
|
|
67
|
+
--rpl-stack-animation-pop: stackPop 350ms cubic-bezier(0.32, 0.72, 0, 1) forwards;
|
|
68
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stack navigation theme presets
|
|
3
|
+
* Apply to a container element to customize stack animations
|
|
4
|
+
*
|
|
5
|
+
* CSS custom properties:
|
|
6
|
+
* - --stack-duration: Animation duration
|
|
7
|
+
* - --stack-easing: Animation timing function
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/* iOS Theme (Default) - Accurate iOS 17 navigation timing */
|
|
11
|
+
.stack-theme-ios {
|
|
12
|
+
/* iOS uses ~350ms with a custom spring-like curve */
|
|
13
|
+
--stack-duration: 350ms;
|
|
14
|
+
--stack-easing: cubic-bezier(0.32, 0.72, 0, 1);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* Android Material 3 Theme */
|
|
18
|
+
.stack-theme-android {
|
|
19
|
+
/* Material 3 uses emphasized easing for spatial transitions */
|
|
20
|
+
--stack-duration: 400ms;
|
|
21
|
+
--stack-easing: cubic-bezier(0.05, 0.7, 0.1, 1);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* Windows/Fluent Theme */
|
|
25
|
+
.stack-theme-fluent {
|
|
26
|
+
/* Fluent uses faster, snappier animations */
|
|
27
|
+
--stack-duration: 250ms;
|
|
28
|
+
--stack-easing: cubic-bezier(0.1, 0.9, 0.2, 1);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* Instant (No animation) */
|
|
32
|
+
.stack-theme-instant {
|
|
33
|
+
--stack-duration: 0ms;
|
|
34
|
+
--stack-easing: linear;
|
|
35
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Demo-only connected PanelView factory that wires contexts to a presentational group view.
|
|
3
|
+
*/
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import type { GroupId, PanelGroupRenderProps, TabBarRenderProps } from "../../modules/panels/state/types";
|
|
6
|
+
import { usePanelRenderContext } from "../../modules/panels/rendering/RenderContext";
|
|
7
|
+
import { useDomRegistry } from "../../modules/panels/dom/DomRegistry";
|
|
8
|
+
import { PanelGroupView } from "../../components/panels/PanelGroupView";
|
|
9
|
+
import { TabBar as DefaultTabBar } from "../../components/tabs/TabBar";
|
|
10
|
+
|
|
11
|
+
export type PanelViewComponent = React.FC<{ groupId: GroupId }>;
|
|
12
|
+
|
|
13
|
+
export const createPanelView = (
|
|
14
|
+
TabBarImpl?: React.ComponentType<TabBarRenderProps>,
|
|
15
|
+
PanelGroupImpl?: React.ComponentType<PanelGroupRenderProps>,
|
|
16
|
+
): PanelViewComponent => {
|
|
17
|
+
const TabBarComp = TabBarImpl ?? DefaultTabBar;
|
|
18
|
+
const PanelGroupComp: React.ComponentType<PanelGroupRenderProps> = PanelGroupImpl ?? ((p) => <PanelGroupView {...p} />);
|
|
19
|
+
const View: PanelViewComponent = ({ groupId }) => {
|
|
20
|
+
const { getGroup, getGroupContent, onClickTab, onAddTab, onCloseTab, onStartTabDrag, doubleClickToAdd, registerContentContainer } = usePanelRenderContext();
|
|
21
|
+
const { setGroupEl, setTabbarEl, setContentEl } = useDomRegistry();
|
|
22
|
+
|
|
23
|
+
const group = getGroup(groupId);
|
|
24
|
+
if (!group) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
const content = getGroupContent(groupId);
|
|
28
|
+
const groupRef = React.useCallback((el: HTMLDivElement | null) => setGroupEl(groupId, el), [groupId, setGroupEl]);
|
|
29
|
+
const contentRef = React.useCallback((el: HTMLDivElement | null) => {
|
|
30
|
+
setContentEl(groupId, el);
|
|
31
|
+
registerContentContainer(groupId, el);
|
|
32
|
+
}, [groupId, setContentEl, registerContentContainer]);
|
|
33
|
+
const tabbarRef = React.useCallback((el: HTMLDivElement | null) => setTabbarEl(groupId, el), [groupId, setTabbarEl]);
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<PanelGroupComp
|
|
37
|
+
group={group}
|
|
38
|
+
tabbar={
|
|
39
|
+
<TabBarComp
|
|
40
|
+
rootRef={tabbarRef}
|
|
41
|
+
group={group}
|
|
42
|
+
onClickTab={(tabId) => onClickTab(groupId, tabId)}
|
|
43
|
+
onAddTab={onAddTab}
|
|
44
|
+
onCloseTab={onCloseTab}
|
|
45
|
+
onStartDrag={(tabId, gid, e) => onStartTabDrag(tabId, gid, e)}
|
|
46
|
+
doubleClickToAdd={doubleClickToAdd}
|
|
47
|
+
/>
|
|
48
|
+
}
|
|
49
|
+
content={content}
|
|
50
|
+
groupRef={groupRef}
|
|
51
|
+
contentRef={contentRef}
|
|
52
|
+
/>
|
|
53
|
+
);
|
|
54
|
+
};
|
|
55
|
+
View.displayName = "DemoConnectedPanelView";
|
|
56
|
+
return View;
|
|
57
|
+
};
|
|
58
|
+
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Entry point for floating panel frame components.
|
|
3
|
+
*
|
|
4
|
+
* Consumers should import from 'react-panel-layout/floating' to keep these
|
|
5
|
+
* decorative helpers separate from the core layout system.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export {
|
|
9
|
+
FloatingPanelFrame,
|
|
10
|
+
FloatingPanelHeader,
|
|
11
|
+
FloatingPanelTitle,
|
|
12
|
+
FloatingPanelMeta,
|
|
13
|
+
FloatingPanelControls,
|
|
14
|
+
FloatingPanelContent,
|
|
15
|
+
} from "../components/paneling/FloatingPanelFrame";
|
|
16
|
+
|
|
17
|
+
export type {
|
|
18
|
+
FloatingPanelFrameProps,
|
|
19
|
+
FloatingPanelHeaderProps,
|
|
20
|
+
FloatingPanelTitleProps,
|
|
21
|
+
FloatingPanelMetaProps,
|
|
22
|
+
FloatingPanelControlsProps,
|
|
23
|
+
FloatingPanelContentProps,
|
|
24
|
+
} from "../components/paneling/FloatingPanelFrame";
|
|
@@ -0,0 +1,75 @@
|
|
|
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
|
+
|
|
50
|
+
// Components
|
|
51
|
+
export { GridLayout } from "../components/grid/GridLayout.js";
|
|
52
|
+
export { GridLayerList } from "../components/grid/GridLayerList.js";
|
|
53
|
+
export { GridLayerResizeHandles } from "../components/grid/GridLayerResizeHandles.js";
|
|
54
|
+
export { GridTrackResizeHandle } from "../components/grid/GridTrackResizeHandle.js";
|
|
55
|
+
|
|
56
|
+
// Context
|
|
57
|
+
export {
|
|
58
|
+
GridLayoutProvider,
|
|
59
|
+
useGridLayoutContext,
|
|
60
|
+
} from "../modules/grid/GridLayoutContext.js";
|
|
61
|
+
|
|
62
|
+
// Hooks
|
|
63
|
+
export { useGridPlacements } from "../modules/grid/useGridPlacements.js";
|
|
64
|
+
export { useGridTracks } from "../modules/grid/useGridTracks.js";
|
|
65
|
+
|
|
66
|
+
// Types
|
|
67
|
+
export type {
|
|
68
|
+
GridLayerHandleProps,
|
|
69
|
+
ResizeHandleConfig,
|
|
70
|
+
GridLayerRenderState,
|
|
71
|
+
GridLayoutContextValue,
|
|
72
|
+
} from "../modules/grid/GridLayoutContext.js";
|
|
73
|
+
|
|
74
|
+
export type { GridLayoutProps } from "../components/grid/GridLayout.js";
|
|
75
|
+
export type { TrackHandleConfig, TrackDirection } from "../modules/grid/useGridTracks.js";
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Context + Provider pattern for shared content caching.
|
|
3
|
+
*
|
|
4
|
+
* Use this when you need to share content caching across a component tree,
|
|
5
|
+
* such as when multiple child components need access to cached content.
|
|
6
|
+
*
|
|
7
|
+
* For local caching within a single component, use useContentCache directly.
|
|
8
|
+
*/
|
|
9
|
+
import * as React from "react";
|
|
10
|
+
import { useContentCache, type ContentResolver, type UseContentCacheResult } from "./useContentCache";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Context value type for content cache.
|
|
14
|
+
*/
|
|
15
|
+
export type ContentCacheContextValue<TId extends string = string> = UseContentCacheResult<TId>;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Creates a content cache context and associated hooks/providers.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```tsx
|
|
22
|
+
* // Create context for a specific use case
|
|
23
|
+
* const { Provider, useCache } = createContentCacheContext<LayerId>('LayerContent');
|
|
24
|
+
*
|
|
25
|
+
* // In provider component
|
|
26
|
+
* <Provider resolveContent={getLayerContent} validIds={layerIds}>
|
|
27
|
+
* {children}
|
|
28
|
+
* </Provider>
|
|
29
|
+
*
|
|
30
|
+
* // In consumer component
|
|
31
|
+
* const { getCachedContent } = useCache();
|
|
32
|
+
* return <div>{getCachedContent(layerId)}</div>;
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export function createContentCacheContext<TId extends string = string>(displayName: string): {
|
|
36
|
+
/**
|
|
37
|
+
* Provider component that manages content caching for its children.
|
|
38
|
+
*/
|
|
39
|
+
Provider: React.FC<ContentCacheProviderProps<TId>>;
|
|
40
|
+
/**
|
|
41
|
+
* Hook to access the content cache from a child component.
|
|
42
|
+
*/
|
|
43
|
+
useCache: () => ContentCacheContextValue<TId>;
|
|
44
|
+
/**
|
|
45
|
+
* The raw React context (for advanced use cases).
|
|
46
|
+
*/
|
|
47
|
+
Context: React.Context<ContentCacheContextValue<TId> | null>;
|
|
48
|
+
} {
|
|
49
|
+
const Context = React.createContext<ContentCacheContextValue<TId> | null>(null);
|
|
50
|
+
Context.displayName = `${displayName}CacheContext`;
|
|
51
|
+
|
|
52
|
+
const useCache = (): ContentCacheContextValue<TId> => {
|
|
53
|
+
const ctx = React.useContext(Context);
|
|
54
|
+
if (!ctx) {
|
|
55
|
+
throw new Error(`use${displayName}Cache must be used within ${displayName}CacheProvider`);
|
|
56
|
+
}
|
|
57
|
+
return ctx;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const Provider: React.FC<ContentCacheProviderProps<TId>> = ({ resolveContent, validIds, children }) => {
|
|
61
|
+
const cacheResult = useContentCache({ resolveContent, validIds });
|
|
62
|
+
|
|
63
|
+
const value = React.useMemo<ContentCacheContextValue<TId>>(
|
|
64
|
+
() => cacheResult,
|
|
65
|
+
[cacheResult],
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
return <Context.Provider value={value}>{children}</Context.Provider>;
|
|
69
|
+
};
|
|
70
|
+
Provider.displayName = `${displayName}CacheProvider`;
|
|
71
|
+
|
|
72
|
+
return { Provider, useCache, Context };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Props for content cache provider components.
|
|
77
|
+
*/
|
|
78
|
+
export type ContentCacheProviderProps<TId extends string = string> = React.PropsWithChildren<{
|
|
79
|
+
/**
|
|
80
|
+
* Function to resolve content by ID.
|
|
81
|
+
*/
|
|
82
|
+
resolveContent: ContentResolver<TId>;
|
|
83
|
+
/**
|
|
84
|
+
* Current valid IDs for cache cleanup.
|
|
85
|
+
*/
|
|
86
|
+
validIds: readonly TId[];
|
|
87
|
+
}>;
|