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,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Unit tests for JSX-based panel declarations
|
|
3
|
+
*/
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { buildRoutesFromChildren, Panel } from "./PanelContentDeclaration";
|
|
6
|
+
import { buildLayersFromRoutes } from "./panelRouter";
|
|
7
|
+
|
|
8
|
+
// layout config is not required for this unit test; routes are converted independently
|
|
9
|
+
|
|
10
|
+
describe("panelJsx", () => {
|
|
11
|
+
it("collects grid and floating routes", () => {
|
|
12
|
+
const tree = (
|
|
13
|
+
<>
|
|
14
|
+
<Panel type="grid" id="toolbar" area="toolbar"><div>TB</div></Panel>
|
|
15
|
+
<Panel type="grid" id="sidebar" area="sidebar"><div>SB</div></Panel>
|
|
16
|
+
<Panel type="grid" id="canvas" area="canvas"><div>CV</div></Panel>
|
|
17
|
+
<Panel type="floating" id="preview" position={{ left: 10, top: 20 }} width={200} height={100} draggable>
|
|
18
|
+
<div>PV</div>
|
|
19
|
+
</Panel>
|
|
20
|
+
</>
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
const routes = buildRoutesFromChildren(tree);
|
|
24
|
+
expect(routes).toHaveLength(4);
|
|
25
|
+
const layers = buildLayersFromRoutes(routes);
|
|
26
|
+
expect(layers).toHaveLength(4);
|
|
27
|
+
expect(layers.find((l) => l.id === "toolbar")?.gridArea).toBe("toolbar");
|
|
28
|
+
expect(layers.find((l) => l.id === "preview")?.floating?.draggable).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("throws on missing area for grid", () => {
|
|
32
|
+
const tree = (
|
|
33
|
+
<>
|
|
34
|
+
{/* @ts-expect-error intentional missing area */}
|
|
35
|
+
<Panel type="grid" id="x">x</Panel>
|
|
36
|
+
</>
|
|
37
|
+
);
|
|
38
|
+
expect(() => buildRoutesFromChildren(tree)).toThrow(/requires an explicit 'area'/i);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("throws when floating missing size/position", () => {
|
|
42
|
+
const noSize = (
|
|
43
|
+
// @ts-expect-error intentionally missing width/height
|
|
44
|
+
<Panel type="floating" id="f" position={{ left: 0, top: 0 }}>x</Panel>
|
|
45
|
+
);
|
|
46
|
+
expect(() => buildRoutesFromChildren(noSize)).toThrow(/requires 'width' and 'height'/i);
|
|
47
|
+
|
|
48
|
+
const noPos = (
|
|
49
|
+
// @ts-expect-error intentionally missing position
|
|
50
|
+
<Panel type="floating" id="f" width={100} height={100}>x</Panel>
|
|
51
|
+
);
|
|
52
|
+
expect(() => buildRoutesFromChildren(noPos)).toThrow(/requires a 'position'/i);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Unit tests for JSX config builder
|
|
3
|
+
*/
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { Areas, Col, Config, Row, Rows, Columns, buildConfigFromChildren } from "./PanelContentDeclaration";
|
|
6
|
+
|
|
7
|
+
describe("panelJsx config", () => {
|
|
8
|
+
it("builds config from JSX children", () => {
|
|
9
|
+
const tree = (
|
|
10
|
+
<Config gap="0">
|
|
11
|
+
<Rows>
|
|
12
|
+
<Row size="60px" />
|
|
13
|
+
<Row size="1fr" />
|
|
14
|
+
<Row size="30px" />
|
|
15
|
+
</Rows>
|
|
16
|
+
<Columns>
|
|
17
|
+
<Col size="250px" resizable minSize={200} maxSize={400} />
|
|
18
|
+
<Col size="1fr" />
|
|
19
|
+
<Col size="300px" resizable minSize={250} maxSize={500} />
|
|
20
|
+
</Columns>
|
|
21
|
+
<Areas
|
|
22
|
+
matrix={[
|
|
23
|
+
["toolbar", "toolbar", "toolbar"],
|
|
24
|
+
["sidebar", "canvas", "inspector"],
|
|
25
|
+
["statusbar", "statusbar", "statusbar"],
|
|
26
|
+
]}
|
|
27
|
+
/>
|
|
28
|
+
</Config>
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
const cfg = buildConfigFromChildren(tree);
|
|
32
|
+
expect(cfg).toBeTruthy();
|
|
33
|
+
expect(cfg?.rows.length).toBe(3);
|
|
34
|
+
expect(cfg?.columns.length).toBe(3);
|
|
35
|
+
expect(cfg?.areas[0][0]).toBe("toolbar");
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("throws when areas/rows/cols counts mismatch", () => {
|
|
39
|
+
const bad = (
|
|
40
|
+
<Config>
|
|
41
|
+
<Rows>
|
|
42
|
+
<Row size="60px" />
|
|
43
|
+
<Row size="1fr" />
|
|
44
|
+
</Rows>
|
|
45
|
+
<Columns>
|
|
46
|
+
<Col size="1fr" />
|
|
47
|
+
</Columns>
|
|
48
|
+
<Areas matrix={[["a", "b"], ["c", "d"], ["e", "f"]]} />
|
|
49
|
+
</Config>
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
expect(() => buildConfigFromChildren(bad)).toThrow(/row count/i);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Unit tests for JSX Panel type="drawer"
|
|
3
|
+
*/
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { buildRoutesFromChildren, Panel } from "./PanelContentDeclaration";
|
|
6
|
+
import { buildLayersFromRoutes } from "./panelRouter";
|
|
7
|
+
|
|
8
|
+
describe("panelJsx drawer", () => {
|
|
9
|
+
it("collects drawer panels with config and options", () => {
|
|
10
|
+
const tree = (
|
|
11
|
+
<>
|
|
12
|
+
<Panel
|
|
13
|
+
type="drawer"
|
|
14
|
+
id="nav"
|
|
15
|
+
drawer={{ defaultOpen: true, dismissible: true, header: { title: "Nav" } }}
|
|
16
|
+
position={{ left: 0 }}
|
|
17
|
+
width={280}
|
|
18
|
+
backdropStyle={{ backgroundColor: "rgba(0,0,0,0.2)" }}
|
|
19
|
+
>
|
|
20
|
+
<div>drawer</div>
|
|
21
|
+
</Panel>
|
|
22
|
+
</>
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
const routes = buildRoutesFromChildren(tree);
|
|
26
|
+
const layers = buildLayersFromRoutes(routes);
|
|
27
|
+
const layer = layers[0];
|
|
28
|
+
expect(layer.drawer?.header?.title).toBe("Nav");
|
|
29
|
+
expect(layer.width).toBe(280);
|
|
30
|
+
expect(layer.position?.left).toBe(0);
|
|
31
|
+
expect(layer.backdropStyle).toBeTruthy();
|
|
32
|
+
});
|
|
33
|
+
});
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Unit tests for router-like builder
|
|
3
|
+
*/
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import type { PanelLayoutConfig } from "../types";
|
|
6
|
+
import { buildLayersFromRoutes, createPanelLayoutFromRoutes, type PanelRoute } from "./panelRouter";
|
|
7
|
+
|
|
8
|
+
const baseConfig: PanelLayoutConfig = {
|
|
9
|
+
areas: [
|
|
10
|
+
["toolbar", "toolbar"],
|
|
11
|
+
["main", "side"],
|
|
12
|
+
],
|
|
13
|
+
rows: [{ size: "40px" }, { size: "1fr" }],
|
|
14
|
+
columns: [{ size: "1fr" }, { size: "300px" }],
|
|
15
|
+
gap: "0",
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
describe("panelRouter", () => {
|
|
19
|
+
it("builds a single grid layer from routes", () => {
|
|
20
|
+
const routes: PanelRoute[] = [
|
|
21
|
+
{ id: "toolbar", area: "toolbar", element: React.createElement("div", null, "TB") },
|
|
22
|
+
];
|
|
23
|
+
const layers = buildLayersFromRoutes(routes);
|
|
24
|
+
expect(layers).toHaveLength(1);
|
|
25
|
+
expect(layers[0].id).toBe("toolbar");
|
|
26
|
+
expect(layers[0].gridArea).toBe("toolbar");
|
|
27
|
+
expect(layers[0].component).toBeDefined();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("flattens nested routes", () => {
|
|
31
|
+
const routes: PanelRoute[] = [
|
|
32
|
+
{
|
|
33
|
+
id: "main",
|
|
34
|
+
area: "main",
|
|
35
|
+
element: React.createElement("div", null, "Main"),
|
|
36
|
+
children: [
|
|
37
|
+
{ id: "side", area: "side", element: React.createElement("div", null, "Side") },
|
|
38
|
+
],
|
|
39
|
+
},
|
|
40
|
+
];
|
|
41
|
+
const layers = buildLayersFromRoutes(routes);
|
|
42
|
+
expect(layers.map((l) => l.id)).toEqual(["main", "side"]);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("throws if grid route is missing area", () => {
|
|
46
|
+
const routes: PanelRoute[] = [{ id: "x", element: React.createElement("div") }];
|
|
47
|
+
expect(() => buildLayersFromRoutes(routes)).toThrow(/must specify 'area'/i);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("throws on duplicate ids", () => {
|
|
51
|
+
const routes: PanelRoute[] = [
|
|
52
|
+
{ id: "dup", area: "main", element: React.createElement("div") },
|
|
53
|
+
{ id: "dup", area: "side", element: React.createElement("div") },
|
|
54
|
+
];
|
|
55
|
+
expect(() => buildLayersFromRoutes(routes)).toThrow(/duplicate panelroute id/i);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("builds out a full PanelLayoutProps from routes", () => {
|
|
59
|
+
const routes: PanelRoute[] = [
|
|
60
|
+
{ id: "toolbar", area: "toolbar", element: React.createElement("div") },
|
|
61
|
+
{ id: "main", area: "main", element: React.createElement("div") },
|
|
62
|
+
{ id: "side", area: "side", element: React.createElement("div") },
|
|
63
|
+
];
|
|
64
|
+
const props = createPanelLayoutFromRoutes({ config: baseConfig, routes });
|
|
65
|
+
expect(props.config).toBe(baseConfig);
|
|
66
|
+
expect(props.layers).toHaveLength(3);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Router-like builder for GridLayout
|
|
3
|
+
*
|
|
4
|
+
* Provides a React Router–style configuration API to declare panel layers.
|
|
5
|
+
* Converts route objects to the existing GridLayout props without magic.
|
|
6
|
+
*/
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
import type {
|
|
9
|
+
DrawerBehavior,
|
|
10
|
+
FloatingBehavior,
|
|
11
|
+
LayerDefinition,
|
|
12
|
+
LayerPositionMode,
|
|
13
|
+
PanelLayoutConfig,
|
|
14
|
+
PanelLayoutProps,
|
|
15
|
+
PivotBehavior,
|
|
16
|
+
WindowPosition,
|
|
17
|
+
} from "../types";
|
|
18
|
+
import { GridLayout } from "../components/grid/GridLayout";
|
|
19
|
+
|
|
20
|
+
export type PanelRoute = {
|
|
21
|
+
/** Unique id for the layer. Required. */
|
|
22
|
+
id: string;
|
|
23
|
+
/** React node to render for this layer. Required. */
|
|
24
|
+
element: React.ReactNode;
|
|
25
|
+
/** Visibility flag. Defaults to visible. */
|
|
26
|
+
visible?: boolean;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Grid placement key. When using `positionMode: 'grid'` (default), this must be provided.
|
|
30
|
+
* Using `area` mirrors React Router's route path intent but for grid cells.
|
|
31
|
+
*/
|
|
32
|
+
area?: string;
|
|
33
|
+
|
|
34
|
+
/** Explicit positioning mode; defaults to 'grid' unless floating/drawer implies otherwise. */
|
|
35
|
+
positionMode?: LayerPositionMode;
|
|
36
|
+
/** Offsets when using non-grid modes. */
|
|
37
|
+
position?: WindowPosition;
|
|
38
|
+
/** Optional stacking order. */
|
|
39
|
+
zIndex?: number;
|
|
40
|
+
/** Optional dimensions; required for resizable/draggable floating layers. */
|
|
41
|
+
width?: number | string;
|
|
42
|
+
height?: number | string;
|
|
43
|
+
/** Pointer events control. */
|
|
44
|
+
pointerEvents?: boolean | "auto" | "none";
|
|
45
|
+
/** Optional style overrides. */
|
|
46
|
+
style?: React.CSSProperties;
|
|
47
|
+
/** Optional backdrop style (drawer). */
|
|
48
|
+
backdropStyle?: React.CSSProperties;
|
|
49
|
+
|
|
50
|
+
/** Drawer behavior for mobile-friendly panels. */
|
|
51
|
+
drawer?: DrawerBehavior;
|
|
52
|
+
/** Floating window configuration. */
|
|
53
|
+
floating?: FloatingBehavior;
|
|
54
|
+
/** Pivot behavior for content switching. */
|
|
55
|
+
pivot?: PivotBehavior;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Optional child declarations; purely a grouping convenience.
|
|
59
|
+
* Children are flattened; no implicit inheritance.
|
|
60
|
+
*/
|
|
61
|
+
children?: PanelRoute[];
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const toLayer = (route: PanelRoute): LayerDefinition => {
|
|
65
|
+
const inferredMode: LayerPositionMode = resolveRoutePositionMode(route);
|
|
66
|
+
|
|
67
|
+
if (inferredMode === "grid") {
|
|
68
|
+
if (!route.area) {
|
|
69
|
+
throw new Error(`PanelRoute ${route.id} must specify 'area' for grid placement.`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
id: route.id,
|
|
75
|
+
component: route.element,
|
|
76
|
+
visible: route.visible,
|
|
77
|
+
gridArea: route.area,
|
|
78
|
+
positionMode: inferredMode,
|
|
79
|
+
position: route.position,
|
|
80
|
+
zIndex: route.zIndex,
|
|
81
|
+
width: route.width,
|
|
82
|
+
height: route.height,
|
|
83
|
+
pointerEvents: route.pointerEvents,
|
|
84
|
+
style: route.style,
|
|
85
|
+
drawer: route.drawer,
|
|
86
|
+
floating: route.floating,
|
|
87
|
+
pivot: route.pivot,
|
|
88
|
+
backdropStyle: route.backdropStyle,
|
|
89
|
+
} satisfies LayerDefinition;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
const resolveRoutePositionMode = (route: PanelRoute): LayerPositionMode => {
|
|
93
|
+
if (route.positionMode) {
|
|
94
|
+
return route.positionMode;
|
|
95
|
+
}
|
|
96
|
+
if (route.floating) {
|
|
97
|
+
// Embedded => absolute, Popup => relative (handled by renderer); keep explicitness here.
|
|
98
|
+
return "absolute";
|
|
99
|
+
}
|
|
100
|
+
if (route.drawer) {
|
|
101
|
+
return "grid";
|
|
102
|
+
}
|
|
103
|
+
return "grid";
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const flattenRoutes = (routes: PanelRoute[]): PanelRoute[] => {
|
|
107
|
+
const result: PanelRoute[] = [];
|
|
108
|
+
const walk = (node: PanelRoute): void => {
|
|
109
|
+
result.push(node);
|
|
110
|
+
if (node.children) {
|
|
111
|
+
node.children.forEach((child) => walk(child));
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
routes.forEach((r) => walk(r));
|
|
115
|
+
return result;
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const validateUniqueIds = (routes: PanelRoute[]): void => {
|
|
119
|
+
const seen = new Set<string>();
|
|
120
|
+
routes.forEach((r) => {
|
|
121
|
+
if (seen.has(r.id)) {
|
|
122
|
+
throw new Error(`Duplicate PanelRoute id detected: ${r.id}`);
|
|
123
|
+
}
|
|
124
|
+
seen.add(r.id);
|
|
125
|
+
});
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
export const buildLayersFromRoutes = (routes: PanelRoute[]): LayerDefinition[] => {
|
|
129
|
+
const flat = flattenRoutes(routes);
|
|
130
|
+
validateUniqueIds(flat);
|
|
131
|
+
return flat.map((r) => toLayer(r));
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
export const createPanelLayoutFromRoutes = (input: {
|
|
135
|
+
config: PanelLayoutConfig;
|
|
136
|
+
routes: PanelRoute[];
|
|
137
|
+
style?: React.CSSProperties;
|
|
138
|
+
}): PanelLayoutProps => {
|
|
139
|
+
const layers = buildLayersFromRoutes(input.routes);
|
|
140
|
+
return {
|
|
141
|
+
config: input.config,
|
|
142
|
+
layers,
|
|
143
|
+
};
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
export type PanelLayoutRouterProps = {
|
|
147
|
+
config: PanelLayoutConfig;
|
|
148
|
+
routes: PanelRoute[];
|
|
149
|
+
style?: React.CSSProperties;
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
export const PanelLayoutRouter: React.FC<PanelLayoutRouterProps> = ({ config, routes, style }) => {
|
|
153
|
+
const layers = React.useMemo(() => buildLayersFromRoutes(routes), [routes]);
|
|
154
|
+
return <GridLayout config={config} layers={layers} style={style} />;
|
|
155
|
+
};
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Style constants for library components
|
|
3
|
+
*
|
|
4
|
+
* All style values are defined here with CSS variable fallbacks.
|
|
5
|
+
* Users can override these via CSS variables (--rpl-*).
|
|
6
|
+
*
|
|
7
|
+
* All CSS variables use the unified prefix: --rpl- (react-panel-layout)
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* // In your CSS:
|
|
11
|
+
* :root {
|
|
12
|
+
* --rpl-color-primary: #ff0000;
|
|
13
|
+
* }
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
// ========================================
|
|
17
|
+
// CSS VARIABLE PREFIX
|
|
18
|
+
// ========================================
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Unified CSS variable prefix for all react-panel-layout variables
|
|
22
|
+
* All theme variables use this prefix: --rpl-*
|
|
23
|
+
*/
|
|
24
|
+
export const CSS_VAR_PREFIX = "rpl";
|
|
25
|
+
|
|
26
|
+
// ========================================
|
|
27
|
+
// COLORS
|
|
28
|
+
// ========================================
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Tab colors - used in TabBar component
|
|
32
|
+
*/
|
|
33
|
+
export const COLOR_TAB_FG = "var(--rpl-color-tab-fg, #d5d7de)";
|
|
34
|
+
export const COLOR_TAB_ACTIVE_BG = "var(--rpl-color-tab-active-bg, #2b2d35)";
|
|
35
|
+
export const COLOR_TABBAR_BG = "var(--rpl-color-tabbar-bg, #1e1f24)";
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Panel colors - used in panel layouts
|
|
39
|
+
*/
|
|
40
|
+
export const COLOR_PANEL_BORDER = "var(--rpl-color-panel-border, rgba(0, 0, 0, 0.3))";
|
|
41
|
+
export const COLOR_PANEL_BG = "var(--rpl-color-panel-bg, #0b0b0c)";
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Primary color - used for resize handles, highlights
|
|
45
|
+
*/
|
|
46
|
+
export const COLOR_PRIMARY = "var(--rpl-color-primary, #2196f3)";
|
|
47
|
+
export const COLOR_RESIZE_HANDLE_IDLE = "var(--rpl-color-resize-handle-idle, rgba(255, 255, 255, 0.0))";
|
|
48
|
+
export const COLOR_RESIZE_HANDLE_HOVER = "var(--rpl-color-resize-handle-hover, rgba(33, 150, 243, 0.35))";
|
|
49
|
+
export const COLOR_RESIZE_HANDLE_ACTIVE = "var(--rpl-color-resize-handle-active, rgba(33, 150, 243, 0.55))";
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Drop suggestion overlay colors
|
|
53
|
+
*/
|
|
54
|
+
export const COLOR_DROP_SUGGEST_BORDER = "var(--rpl-color-drop-suggest-border, rgba(90, 150, 255, 0.9))";
|
|
55
|
+
export const COLOR_DROP_SUGGEST_BG = "var(--rpl-color-drop-suggest-bg, rgba(90, 150, 255, 0.15))";
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Tab drag overlay colors
|
|
59
|
+
*/
|
|
60
|
+
export const COLOR_TABDRAG_BG = "var(--rpl-color-tabdrag-bg, rgba(34, 36, 42, 0.95))";
|
|
61
|
+
export const COLOR_TABDRAG_FG = "var(--rpl-color-tabdrag-fg, #e9ebf0)";
|
|
62
|
+
export const COLOR_TABDRAG_BORDER = "var(--rpl-color-tabdrag-border, rgba(120, 160, 255, 0.6))";
|
|
63
|
+
export const COLOR_TABDRAG_SHADOW = "var(--rpl-color-tabdrag-shadow, 0 6px 20px rgba(0, 0, 0, 0.35))";
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Insert guide colors
|
|
67
|
+
*/
|
|
68
|
+
export const COLOR_INSERT_GUIDE = "var(--rpl-color-insert-guide, rgba(120, 160, 255, 0.95))";
|
|
69
|
+
export const COLOR_INSERT_GUIDE_SHADOW = "var(--rpl-color-insert-guide-shadow, 0 0 0 2px rgba(120, 160, 255, 0.2))";
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Node editor / floating panel colors
|
|
73
|
+
* These are used by Drawer and FloatingPanelFrame components
|
|
74
|
+
*/
|
|
75
|
+
export const COLOR_NODE_EDITOR_SURFACE = "var(--rpl-color-surface, #fff)";
|
|
76
|
+
export const COLOR_NODE_EDITOR_SURFACE_2 = "var(--rpl-color-surface-2, #fafafa)";
|
|
77
|
+
export const COLOR_NODE_EDITOR_BORDER = "var(--rpl-color-border, #e5e7eb)";
|
|
78
|
+
export const COLOR_NODE_EDITOR_MUTED_FG = "var(--rpl-color-muted-fg, #6b7280)";
|
|
79
|
+
export const COLOR_NODE_EDITOR_CARD_SHADOW = "var(--rpl-shadow-card, 0 2px 10px rgba(0, 0, 0, 0.08))";
|
|
80
|
+
export const COLOR_DRAWER_BACKDROP = "var(--rpl-color-drawer-backdrop, rgba(0, 0, 0, 0.5))";
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Drawer transitions
|
|
84
|
+
*/
|
|
85
|
+
export const DRAWER_TRANSITION_DURATION = "var(--rpl-drawer-transition-duration, 220ms)";
|
|
86
|
+
export const DRAWER_TRANSITION_EASING = "var(--rpl-drawer-transition-easing, cubic-bezier(0.22, 1, 0.36, 1))";
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Pivot animations
|
|
90
|
+
* User defines @keyframes in their CSS and references via these tokens.
|
|
91
|
+
* - Enter: Applied when content becomes active
|
|
92
|
+
* - Leave: Applied when content becomes inactive
|
|
93
|
+
*/
|
|
94
|
+
export const PIVOT_ANIMATION_ENTER = "var(--rpl-pivot-animation-enter, none)";
|
|
95
|
+
export const PIVOT_ANIMATION_LEAVE = "var(--rpl-pivot-animation-leave, none)";
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Pivot swipe animations
|
|
99
|
+
* Used by SwipePivotContent for snap-back animation after swipe ends.
|
|
100
|
+
*/
|
|
101
|
+
export const PIVOT_SWIPE_SNAP_DURATION = "var(--rpl-pivot-swipe-snap-duration, 300ms)";
|
|
102
|
+
export const PIVOT_SWIPE_SNAP_EASING = "var(--rpl-pivot-swipe-snap-easing, cubic-bezier(0.22, 1, 0.36, 1))";
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Stack animations
|
|
106
|
+
* User defines @keyframes in their CSS and references via these tokens.
|
|
107
|
+
* - Push: Applied when a new panel is pushed onto the stack
|
|
108
|
+
* - Pop: Applied when a panel is popped from the stack
|
|
109
|
+
*/
|
|
110
|
+
export const STACK_ANIMATION_PUSH = "var(--rpl-stack-animation-push, none)";
|
|
111
|
+
export const STACK_ANIMATION_POP = "var(--rpl-stack-animation-pop, none)";
|
|
112
|
+
export const STACK_TRANSITION_DURATION = "var(--rpl-stack-transition-duration, 350ms)";
|
|
113
|
+
export const STACK_TRANSITION_EASING = "var(--rpl-stack-transition-easing, cubic-bezier(0.32, 0.72, 0, 1))";
|
|
114
|
+
|
|
115
|
+
// ========================================
|
|
116
|
+
// SIZING & SPACING
|
|
117
|
+
// ========================================
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Tab sizing
|
|
121
|
+
*/
|
|
122
|
+
export const SIZE_TAB_FONT = "var(--rpl-size-tab-font, 12px)";
|
|
123
|
+
export const SPACE_TAB_PADDING_Y = "var(--rpl-space-tab-padding-y, 4px)";
|
|
124
|
+
export const SPACE_TAB_PADDING_X = "var(--rpl-space-tab-padding-x, 8px)";
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Tabbar spacing
|
|
128
|
+
*/
|
|
129
|
+
export const SPACE_TABBAR_GAP = "var(--rpl-space-tabbar-gap, 6px)";
|
|
130
|
+
export const SPACE_TABBAR_PADDING_Y = "var(--rpl-space-tabbar-padding-y, 4px)";
|
|
131
|
+
export const SPACE_TABBAR_PADDING_X = "var(--rpl-space-tabbar-padding-x, 6px)";
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Border radius (decorative, using CSS variables)
|
|
135
|
+
*/
|
|
136
|
+
export const RADIUS_TAB = "var(--rpl-radius-tab, 4px)";
|
|
137
|
+
export const RADIUS_SUGGEST = "var(--rpl-radius-suggest, 6px)";
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Border widths
|
|
141
|
+
*/
|
|
142
|
+
export const SIZE_SUGGEST_BORDER = "var(--rpl-size-suggest-border, 2px)";
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Handle thicknesses
|
|
146
|
+
* Note: SIZE_GRID_HANDLE_THICKNESS is kept as number for JavaScript calculations
|
|
147
|
+
*/
|
|
148
|
+
export const SIZE_GRID_HANDLE_THICKNESS = 4; // Used in GridTrackResizeHandle.tsx for offset calculation
|
|
149
|
+
export const SIZE_RESIZE_HANDLE_THICKNESS = "var(--rpl-size-resize-handle-thickness, 4px)";
|
|
150
|
+
export const SIZE_SPLIT_HANDLE_THICKNESS = "var(--rpl-size-split-handle-thickness, 6px)";
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Drop suggest padding
|
|
154
|
+
*/
|
|
155
|
+
export const SPACE_DROP_SUGGEST_PADDING = "var(--rpl-space-drop-suggest-padding, 6px)";
|
|
156
|
+
|
|
157
|
+
// ========================================
|
|
158
|
+
// Z-INDEXES
|
|
159
|
+
// ========================================
|
|
160
|
+
|
|
161
|
+
export const Z_OVERLAY = "var(--rpl-z-overlay, 9998)";
|
|
162
|
+
export const Z_TABDRAG_OVERLAY = "var(--rpl-z-tabdrag-overlay, 9999)";
|
|
163
|
+
export const Z_DIALOG_OVERLAY = "var(--rpl-z-dialog-overlay, 10000)";
|
|
164
|
+
|
|
165
|
+
// ========================================
|
|
166
|
+
// COMPONENT-SPECIFIC CONSTANTS
|
|
167
|
+
// ========================================
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Resize Handle
|
|
171
|
+
*/
|
|
172
|
+
export const RESIZE_HANDLE_THICKNESS = SIZE_RESIZE_HANDLE_THICKNESS;
|
|
173
|
+
export const RESIZE_HANDLE_Z_INDEX = "var(--rpl-z-resize-handle, 1000)";
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Grid Track Resize Handle
|
|
177
|
+
*/
|
|
178
|
+
export const GRID_HANDLE_THICKNESS = SIZE_GRID_HANDLE_THICKNESS;
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Grid Layer Resize Handles
|
|
182
|
+
*/
|
|
183
|
+
export const GRID_LAYER_CORNER_HIT_SIZE = "var(--rpl-size-grid-layer-corner-hit, 14px)";
|
|
184
|
+
export const GRID_LAYER_EDGE_HIT_THICKNESS = "var(--rpl-size-grid-layer-edge-hit-thickness, 12px)";
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Drop Suggest Overlay
|
|
188
|
+
*/
|
|
189
|
+
export const DROP_SUGGEST_Z_INDEX = Z_OVERLAY;
|
|
190
|
+
export const DROP_SUGGEST_BORDER_WIDTH = SIZE_SUGGEST_BORDER;
|
|
191
|
+
export const DROP_SUGGEST_BORDER_RADIUS = RADIUS_SUGGEST;
|
|
192
|
+
export const DROP_SUGGEST_BORDER_COLOR = COLOR_DROP_SUGGEST_BORDER;
|
|
193
|
+
export const DROP_SUGGEST_BG_COLOR = COLOR_DROP_SUGGEST_BG;
|
|
194
|
+
export const DROP_SUGGEST_PADDING = SPACE_DROP_SUGGEST_PADDING;
|
|
195
|
+
export const DROP_SUGGEST_PADDING_PX = 6;
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Tab Drag Overlay
|
|
199
|
+
*/
|
|
200
|
+
export const TAB_DRAG_OVERLAY_Z_INDEX = Z_TABDRAG_OVERLAY;
|
|
201
|
+
export const TAB_DRAG_PREVIEW_OFFSET_X = "var(--rpl-space-tab-drag-preview-offset-x, 12px)";
|
|
202
|
+
export const TAB_DRAG_PREVIEW_OFFSET_Y = "var(--rpl-space-tab-drag-preview-offset-y, 12px)";
|
|
203
|
+
export const TAB_DRAG_PREVIEW_BORDER_RADIUS = "var(--rpl-radius-tab-drag-preview, 6px)";
|
|
204
|
+
export const TAB_DRAG_PREVIEW_PADDING_Y = "var(--rpl-space-tab-drag-preview-padding-y, 4px)";
|
|
205
|
+
export const TAB_DRAG_PREVIEW_PADDING_X = "var(--rpl-space-tab-drag-preview-padding-x, 8px)";
|
|
206
|
+
export const TAB_DRAG_PREVIEW_FONT_SIZE = "var(--rpl-size-tab-drag-preview-font, 12px)";
|
|
207
|
+
export const TAB_DRAG_INSERT_GUIDE_WIDTH = "var(--rpl-size-tab-drag-insert-guide-width, 2px)";
|
|
208
|
+
export const TAB_DRAG_INSERT_GUIDE_BORDER_RADIUS = "var(--rpl-radius-tab-drag-insert-guide, 1px)";
|
|
209
|
+
export const TAB_DRAG_PREVIEW_BG_COLOR = COLOR_TABDRAG_BG;
|
|
210
|
+
export const TAB_DRAG_PREVIEW_FG_COLOR = COLOR_TABDRAG_FG;
|
|
211
|
+
export const TAB_DRAG_PREVIEW_BORDER_COLOR = COLOR_TABDRAG_BORDER;
|
|
212
|
+
export const TAB_DRAG_PREVIEW_SHADOW = COLOR_TABDRAG_SHADOW;
|
|
213
|
+
export const TAB_DRAG_INSERT_GUIDE_COLOR = COLOR_INSERT_GUIDE;
|
|
214
|
+
export const TAB_DRAG_INSERT_GUIDE_SHADOW = COLOR_INSERT_GUIDE_SHADOW;
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Dialog Overlay
|
|
218
|
+
*/
|
|
219
|
+
export const DIALOG_OVERLAY_Z_INDEX = Z_DIALOG_OVERLAY;
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Floating Panel Frame
|
|
223
|
+
*/
|
|
224
|
+
export const FLOATING_PANEL_BORDER_RADIUS = "var(--rpl-radius-floating-panel, 8px)";
|
|
225
|
+
export const FLOATING_PANEL_GAP = "var(--rpl-space-floating-panel-gap, 8px)";
|
|
226
|
+
export const FLOATING_PANEL_HEADER_PADDING_Y = "var(--rpl-space-floating-panel-header-padding-y, 8px)";
|
|
227
|
+
export const FLOATING_PANEL_HEADER_PADDING_X = "var(--rpl-space-floating-panel-header-padding-x, 12px)";
|
|
228
|
+
export const FLOATING_PANEL_CONTENT_PADDING = "var(--rpl-space-floating-panel-content-padding, 12px)";
|
|
229
|
+
export const FLOATING_PANEL_META_FONT_SIZE = "var(--rpl-size-floating-panel-meta-font, 12px)";
|
|
230
|
+
export const FLOATING_PANEL_CONTROLS_GAP = "var(--rpl-space-floating-panel-controls-gap, 6px)";
|
|
231
|
+
export const FLOATING_PANEL_CLOSE_BUTTON_FONT_SIZE = "var(--rpl-size-floating-panel-close-button-font, 1.25rem)";
|
|
232
|
+
export const FLOATING_PANEL_CLOSE_BUTTON_PADDING =
|
|
233
|
+
"var(--rpl-space-floating-panel-close-button-padding, 0.25rem 0.5rem)";
|
|
234
|
+
export const FLOATING_PANEL_SURFACE_COLOR = COLOR_NODE_EDITOR_SURFACE;
|
|
235
|
+
export const FLOATING_PANEL_SURFACE_2_COLOR = COLOR_NODE_EDITOR_SURFACE_2;
|
|
236
|
+
export const FLOATING_PANEL_BORDER_COLOR = COLOR_NODE_EDITOR_BORDER;
|
|
237
|
+
export const FLOATING_PANEL_MUTED_FG_COLOR = COLOR_NODE_EDITOR_MUTED_FG;
|
|
238
|
+
export const FLOATING_PANEL_SHADOW = COLOR_NODE_EDITOR_CARD_SHADOW;
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Drawer
|
|
242
|
+
*/
|
|
243
|
+
export const DRAWER_HEADER_PADDING_Y = "var(--rpl-space-drawer-header-padding-y, 10px)";
|
|
244
|
+
export const DRAWER_HEADER_PADDING_X = "var(--rpl-space-drawer-header-padding-x, 12px)";
|
|
245
|
+
export const DRAWER_HEADER_GAP = "var(--rpl-space-drawer-header-gap, 8px)";
|
|
246
|
+
export const DRAWER_CONTENT_PADDING = "var(--rpl-space-drawer-content-padding, 12px)";
|
|
247
|
+
export const DRAWER_CLOSE_BUTTON_FONT_SIZE = "var(--rpl-size-drawer-close-button-font, 18px)";
|
|
248
|
+
export const DRAWER_SURFACE_COLOR = COLOR_NODE_EDITOR_SURFACE;
|
|
249
|
+
export const DRAWER_BORDER_COLOR = COLOR_NODE_EDITOR_BORDER;
|
|
250
|
+
export const DRAWER_SHADOW = COLOR_NODE_EDITOR_CARD_SHADOW;
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Split Handles
|
|
254
|
+
*/
|
|
255
|
+
export const SPLIT_HANDLE_THICKNESS = SIZE_SPLIT_HANDLE_THICKNESS;
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* HorizontalDivider
|
|
259
|
+
*/
|
|
260
|
+
export const HORIZONTAL_DIVIDER_WIDTH = "var(--rpl-size-horizontal-divider-width, 4px)";
|
|
261
|
+
export const HORIZONTAL_DIVIDER_HIT_AREA_OFFSET = "var(--rpl-space-horizontal-divider-hit-area-offset, 4px)";
|