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
package/src/types.ts
ADDED
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Unified public type definitions for the panel layout system.
|
|
3
|
+
* Single source of truth for grid, window, and drawer related types.
|
|
4
|
+
*/
|
|
5
|
+
import * as React from "react";
|
|
6
|
+
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Window / Popup / Drawer types (formerly src/modules/types.ts)
|
|
9
|
+
// ============================================================================
|
|
10
|
+
|
|
11
|
+
// Basic coordinates used by overlays and anchors
|
|
12
|
+
export type Position = {
|
|
13
|
+
x: number;
|
|
14
|
+
y: number;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// Offset value used when positioning floating windows
|
|
18
|
+
export type WindowOffset = number | string;
|
|
19
|
+
|
|
20
|
+
// CSS-like position offsets for floating windows
|
|
21
|
+
export type WindowPosition = {
|
|
22
|
+
top?: WindowOffset;
|
|
23
|
+
right?: WindowOffset;
|
|
24
|
+
bottom?: WindowOffset;
|
|
25
|
+
left?: WindowOffset;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// Explicit dimensions for floating windows
|
|
29
|
+
export type WindowSize = {
|
|
30
|
+
width: number;
|
|
31
|
+
height: number;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// Complete bounds definition for floating windows
|
|
35
|
+
export type WindowBounds = {
|
|
36
|
+
position?: WindowPosition;
|
|
37
|
+
size: WindowSize;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
// Size constraints that can be applied to floating/drawer surfaces
|
|
41
|
+
export type WindowConstraints = {
|
|
42
|
+
minWidth?: number;
|
|
43
|
+
maxWidth?: number;
|
|
44
|
+
minHeight?: number;
|
|
45
|
+
maxHeight?: number;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// Browser popup window features
|
|
49
|
+
export type PopupWindowFeatures = {
|
|
50
|
+
toolbar?: boolean;
|
|
51
|
+
menubar?: boolean;
|
|
52
|
+
location?: boolean;
|
|
53
|
+
status?: boolean;
|
|
54
|
+
resizable?: boolean;
|
|
55
|
+
scrollbars?: boolean;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// Extra configuration for browser popup windows
|
|
59
|
+
export type PopupWindowOptions = {
|
|
60
|
+
name?: string;
|
|
61
|
+
features?: PopupWindowFeatures;
|
|
62
|
+
focus?: boolean;
|
|
63
|
+
closeOnUnmount?: boolean;
|
|
64
|
+
createWindow?: (config: PopupWindowFactoryConfig) => Window | null;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// Parameters for creating popup windows via a custom factory
|
|
68
|
+
export type PopupWindowFactoryConfig = {
|
|
69
|
+
name: string;
|
|
70
|
+
features: string;
|
|
71
|
+
bounds: WindowBounds;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
// Display mode for floating windows
|
|
75
|
+
export type FloatingWindowMode = "embedded" | "popup";
|
|
76
|
+
|
|
77
|
+
// Floating window header configuration
|
|
78
|
+
export type FloatingHeaderConfig = {
|
|
79
|
+
/** Header title text */
|
|
80
|
+
title?: string;
|
|
81
|
+
/** Show close button (requires onClose callback) */
|
|
82
|
+
showCloseButton?: boolean;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// Unified configuration for floating windows with controlled/uncontrolled support
|
|
86
|
+
export type FloatingBehavior = {
|
|
87
|
+
// === Position (controlled/uncontrolled) ===
|
|
88
|
+
/** Controlled position - when defined, component uses this value directly */
|
|
89
|
+
position?: WindowPosition;
|
|
90
|
+
/** Initial position for uncontrolled mode */
|
|
91
|
+
defaultPosition?: WindowPosition;
|
|
92
|
+
|
|
93
|
+
// === Size (controlled/uncontrolled) ===
|
|
94
|
+
/** Controlled size - when defined, component uses this value directly */
|
|
95
|
+
size?: WindowSize;
|
|
96
|
+
/** Initial size for uncontrolled mode */
|
|
97
|
+
defaultSize?: WindowSize;
|
|
98
|
+
|
|
99
|
+
// === Stacking ===
|
|
100
|
+
/** Z-index for stacking order */
|
|
101
|
+
zIndex?: number;
|
|
102
|
+
|
|
103
|
+
// === Interaction ===
|
|
104
|
+
/** Enable drag-to-move functionality */
|
|
105
|
+
draggable?: boolean;
|
|
106
|
+
/** Enable resize handles */
|
|
107
|
+
resizable?: boolean;
|
|
108
|
+
/** Size constraints for resizing */
|
|
109
|
+
constraints?: WindowConstraints;
|
|
110
|
+
|
|
111
|
+
// === Callbacks ===
|
|
112
|
+
/** Called when position changes (drag/move) */
|
|
113
|
+
onMove?: (position: WindowPosition) => void;
|
|
114
|
+
/** Called when size changes (resize) */
|
|
115
|
+
onResize?: (size: WindowSize) => void;
|
|
116
|
+
/** Called when close button is clicked */
|
|
117
|
+
onClose?: () => void;
|
|
118
|
+
|
|
119
|
+
// === Chrome (like DrawerBehavior) ===
|
|
120
|
+
/**
|
|
121
|
+
* Use built-in chrome (FloatingPanelFrame with border, shadow, background).
|
|
122
|
+
* When true and header is provided, header auto-enables drag handle.
|
|
123
|
+
* Defaults to false.
|
|
124
|
+
*/
|
|
125
|
+
chrome?: boolean;
|
|
126
|
+
/**
|
|
127
|
+
* Header configuration (renders header when provided).
|
|
128
|
+
* When chrome is true and header is provided, header becomes the drag handle.
|
|
129
|
+
*/
|
|
130
|
+
header?: FloatingHeaderConfig;
|
|
131
|
+
/** Accessible label when header.title is not provided */
|
|
132
|
+
ariaLabel?: string;
|
|
133
|
+
|
|
134
|
+
// === Transitions ===
|
|
135
|
+
/**
|
|
136
|
+
* Transition mode for position/size changes.
|
|
137
|
+
* - "css" uses CSS transitions.
|
|
138
|
+
* - "none" disables transitions.
|
|
139
|
+
*/
|
|
140
|
+
transitionMode?: "css" | "none";
|
|
141
|
+
/** Override transition duration (e.g., "200ms") */
|
|
142
|
+
transitionDuration?: string;
|
|
143
|
+
/** Override transition easing (e.g., "ease-out") */
|
|
144
|
+
transitionEasing?: string;
|
|
145
|
+
|
|
146
|
+
// === Display mode ===
|
|
147
|
+
/** Display mode: "embedded" (default) or "popup" (browser window) */
|
|
148
|
+
mode?: FloatingWindowMode;
|
|
149
|
+
/** Popup-specific options when mode is "popup" */
|
|
150
|
+
popup?: PopupWindowOptions;
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
// Pivot item definition for content switching
|
|
154
|
+
export type PivotBehaviorItem = {
|
|
155
|
+
/** Unique identifier for this content item */
|
|
156
|
+
id: string;
|
|
157
|
+
/** Human-readable label (optional) */
|
|
158
|
+
label?: string;
|
|
159
|
+
/** The actual content to render when this item is active */
|
|
160
|
+
content: React.ReactNode;
|
|
161
|
+
/** Whether this item can be selected */
|
|
162
|
+
disabled?: boolean;
|
|
163
|
+
/**
|
|
164
|
+
* Enable content caching to preserve React component state across re-renders.
|
|
165
|
+
* When disabled (default), content is re-created on each render.
|
|
166
|
+
* @default false
|
|
167
|
+
*/
|
|
168
|
+
cache?: boolean;
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
// Pivot behavior configuration for content switching
|
|
172
|
+
export type PivotBehavior = {
|
|
173
|
+
/** Array of content items to switch between */
|
|
174
|
+
items: PivotBehaviorItem[];
|
|
175
|
+
/** Currently active item ID (controlled mode) */
|
|
176
|
+
activeId?: string;
|
|
177
|
+
/** Default active item ID (uncontrolled mode) */
|
|
178
|
+
defaultActiveId?: string;
|
|
179
|
+
/** Callback when active item changes */
|
|
180
|
+
onActiveChange?: (id: string) => void;
|
|
181
|
+
/**
|
|
182
|
+
* Transition mode for content switching.
|
|
183
|
+
* - "css" (default) uses CSS transitions via design tokens.
|
|
184
|
+
* - "none" disables transitions (uses React.Activity for memory optimization).
|
|
185
|
+
*/
|
|
186
|
+
transitionMode?: "css" | "none";
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
// Drawer behavior configuration for mobile-friendly slide-in panels
|
|
190
|
+
export type DrawerBehavior = {
|
|
191
|
+
/** Optional controlled state */
|
|
192
|
+
defaultOpen?: boolean;
|
|
193
|
+
open?: boolean;
|
|
194
|
+
/** Whether clicking backdrop dismisses the drawer */
|
|
195
|
+
dismissible?: boolean;
|
|
196
|
+
/**
|
|
197
|
+
* Anchor edge for the drawer.
|
|
198
|
+
* - "left", "right", "top", "bottom"
|
|
199
|
+
* - When not specified, inferred from position prop
|
|
200
|
+
*/
|
|
201
|
+
anchor?: "left" | "right" | "top" | "bottom";
|
|
202
|
+
/**
|
|
203
|
+
* Transition mode for drawer visibility.
|
|
204
|
+
* - "css" (default) uses CSS transform transitions.
|
|
205
|
+
* - "none" disables transitions.
|
|
206
|
+
*/
|
|
207
|
+
transitionMode?: "css" | "none";
|
|
208
|
+
/** Override transform transition duration (e.g., "240ms"). */
|
|
209
|
+
transitionDuration?: string;
|
|
210
|
+
/** Override transform transition easing (e.g., "cubic-bezier(0.22,1,0.36,1)"). */
|
|
211
|
+
transitionEasing?: string;
|
|
212
|
+
onStateChange?: (open: boolean) => void;
|
|
213
|
+
/** Use the built-in chrome (background, header padding). Defaults to true. */
|
|
214
|
+
chrome?: boolean;
|
|
215
|
+
/**
|
|
216
|
+
* Render the drawer relative to its parent container instead of the viewport.
|
|
217
|
+
* Defaults to false (fixed to viewport).
|
|
218
|
+
*/
|
|
219
|
+
inline?: boolean;
|
|
220
|
+
/**
|
|
221
|
+
* Accessible label when header.title is not provided or when rendering without a header.
|
|
222
|
+
*/
|
|
223
|
+
ariaLabel?: string;
|
|
224
|
+
header?: {
|
|
225
|
+
title?: string;
|
|
226
|
+
showCloseButton?: boolean;
|
|
227
|
+
};
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
// ============================================================================
|
|
231
|
+
// Grid / Panel layout types (formerly src/panel-system/types.ts)
|
|
232
|
+
// ============================================================================
|
|
233
|
+
|
|
234
|
+
// Grid track definition with optional resize capability
|
|
235
|
+
export type GridTrack = {
|
|
236
|
+
size: string;
|
|
237
|
+
resizable?: boolean;
|
|
238
|
+
minSize?: number;
|
|
239
|
+
maxSize?: number;
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
// Grid-based layout configuration for the editor
|
|
243
|
+
export type PanelLayoutConfig = {
|
|
244
|
+
areas: string[][];
|
|
245
|
+
rows: GridTrack[];
|
|
246
|
+
columns: GridTrack[];
|
|
247
|
+
gap?: string;
|
|
248
|
+
style?: React.CSSProperties;
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
// Layer positioning mode
|
|
252
|
+
export type LayerPositionMode = "grid" | "absolute" | "relative" | "fixed";
|
|
253
|
+
|
|
254
|
+
// Layer definition for panel system
|
|
255
|
+
export type LayerDefinition = {
|
|
256
|
+
id: string;
|
|
257
|
+
component: React.ReactNode;
|
|
258
|
+
visible?: boolean;
|
|
259
|
+
|
|
260
|
+
// Grid positioning
|
|
261
|
+
gridArea?: string;
|
|
262
|
+
gridRow?: string;
|
|
263
|
+
gridColumn?: string;
|
|
264
|
+
|
|
265
|
+
// Absolute/Fixed/Relative positioning
|
|
266
|
+
/**
|
|
267
|
+
* Positioning mode: when omitted, derived automatically.
|
|
268
|
+
* If `floating` is present, behaves as absolute (embedded) or relative (popup).
|
|
269
|
+
*/
|
|
270
|
+
positionMode?: LayerPositionMode;
|
|
271
|
+
/**
|
|
272
|
+
* Position offsets for non-floating layers (drawer, absolute positioned).
|
|
273
|
+
* For floating layers, use `floating.position` or `floating.defaultPosition` instead.
|
|
274
|
+
*/
|
|
275
|
+
position?: WindowPosition;
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Stacking order for non-floating layers.
|
|
279
|
+
* For floating layers, use `floating.zIndex` instead.
|
|
280
|
+
*/
|
|
281
|
+
zIndex?: number;
|
|
282
|
+
/**
|
|
283
|
+
* Width for non-floating layers.
|
|
284
|
+
* For floating layers, use `floating.size` or `floating.defaultSize` instead.
|
|
285
|
+
*/
|
|
286
|
+
width?: string | number;
|
|
287
|
+
/**
|
|
288
|
+
* Height for non-floating layers.
|
|
289
|
+
* For floating layers, use `floating.size` or `floating.defaultSize` instead.
|
|
290
|
+
*/
|
|
291
|
+
height?: string | number;
|
|
292
|
+
pointerEvents?: boolean | "auto" | "none";
|
|
293
|
+
/** Optional backdrop style (used by DrawerBehaviour) */
|
|
294
|
+
backdropStyle?: React.CSSProperties;
|
|
295
|
+
|
|
296
|
+
// Behaviors
|
|
297
|
+
drawer?: DrawerBehavior;
|
|
298
|
+
/** Floating window behavior configuration */
|
|
299
|
+
floating?: FloatingBehavior;
|
|
300
|
+
pivot?: PivotBehavior;
|
|
301
|
+
|
|
302
|
+
// Styling
|
|
303
|
+
style?: React.CSSProperties;
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* When true, enables scrolling within this panel (overflow: auto).
|
|
307
|
+
* When false or omitted, content overflow is hidden (default behavior).
|
|
308
|
+
*/
|
|
309
|
+
scrollable?: boolean;
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Enable content caching to preserve React component state across re-renders.
|
|
313
|
+
* When disabled (default), content is re-created on each render.
|
|
314
|
+
* @default false
|
|
315
|
+
*/
|
|
316
|
+
cache?: boolean;
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
// Props for top-level layout components
|
|
320
|
+
export type PanelLayoutProps = {
|
|
321
|
+
config: PanelLayoutConfig;
|
|
322
|
+
layers: LayerDefinition[];
|
|
323
|
+
};
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file CSSMatrix - Immutable 4x4 matrix for CSS 3D transforms
|
|
3
|
+
*
|
|
4
|
+
* Each operation returns a new instance, preserving the original matrix.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* const mtrx = matrix().translate(0, 10);
|
|
8
|
+
* const a = mtrx.rotateX(Math.PI / 2);
|
|
9
|
+
* const b = mtrx.rotateY(Math.PI);
|
|
10
|
+
* // a and b are independent transformations from mtrx
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Matrix type with transformation methods
|
|
15
|
+
*/
|
|
16
|
+
export type CSSMatrix = {
|
|
17
|
+
readonly translate: (x?: number, y?: number, z?: number) => CSSMatrix;
|
|
18
|
+
readonly translate3d: (x: number, y: number, z: number) => CSSMatrix;
|
|
19
|
+
readonly translateX: (x: number) => CSSMatrix;
|
|
20
|
+
readonly translateY: (y: number) => CSSMatrix;
|
|
21
|
+
readonly translateZ: (z: number) => CSSMatrix;
|
|
22
|
+
readonly scale: (x?: number, y?: number, z?: number) => CSSMatrix;
|
|
23
|
+
readonly scale3d: (x: number, y: number, z: number) => CSSMatrix;
|
|
24
|
+
readonly scaleX: (x: number) => CSSMatrix;
|
|
25
|
+
readonly scaleY: (y: number) => CSSMatrix;
|
|
26
|
+
readonly scaleZ: (z: number) => CSSMatrix;
|
|
27
|
+
readonly rotateX: (angle: number) => CSSMatrix;
|
|
28
|
+
readonly rotateY: (angle: number) => CSSMatrix;
|
|
29
|
+
readonly rotateZ: (angle: number) => CSSMatrix;
|
|
30
|
+
readonly rotate: (angle: number, x: number, y: number, z: number) => CSSMatrix;
|
|
31
|
+
readonly rotate3d: (x: number, y: number, z: number, angle: number) => CSSMatrix;
|
|
32
|
+
readonly skew: (angleX?: number, angleY?: number) => CSSMatrix;
|
|
33
|
+
readonly skewX: (angle: number) => CSSMatrix;
|
|
34
|
+
readonly skewY: (angle: number) => CSSMatrix;
|
|
35
|
+
readonly perspective: (distance: number) => CSSMatrix;
|
|
36
|
+
readonly toCSS: () => string;
|
|
37
|
+
readonly toArray: () => readonly number[];
|
|
38
|
+
readonly toString: () => string;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Multiply two 4x4 matrices (a * b)
|
|
43
|
+
* Matrices are in column-major order
|
|
44
|
+
*/
|
|
45
|
+
const multiplyMatrices = (a: readonly number[], b: readonly number[]): number[] => {
|
|
46
|
+
const result = new Array(16);
|
|
47
|
+
|
|
48
|
+
for (let col = 0; col < 4; col++) {
|
|
49
|
+
for (let row = 0; row < 4; row++) {
|
|
50
|
+
result[col * 4 + row] =
|
|
51
|
+
a[0 * 4 + row] * b[col * 4 + 0] +
|
|
52
|
+
a[1 * 4 + row] * b[col * 4 + 1] +
|
|
53
|
+
a[2 * 4 + row] * b[col * 4 + 2] +
|
|
54
|
+
a[3 * 4 + row] * b[col * 4 + 3];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return result;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Create a CSSMatrix object from raw values
|
|
63
|
+
* Values are stored in column-major order (OpenGL/CSS convention)
|
|
64
|
+
*/
|
|
65
|
+
const createMatrix = (values: readonly number[]): CSSMatrix => {
|
|
66
|
+
if (values.length !== 16) {
|
|
67
|
+
throw new Error('Matrix must have exactly 16 values');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Freeze the values to ensure immutability
|
|
71
|
+
const m = Object.freeze([...values]);
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Helper to create a new matrix by multiplying with a transform matrix
|
|
75
|
+
*/
|
|
76
|
+
const applyTransform = (transformValues: number[]): CSSMatrix => {
|
|
77
|
+
const result = multiplyMatrices(m, transformValues);
|
|
78
|
+
return createMatrix(result);
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
return Object.freeze({
|
|
82
|
+
translate: (x = 0, y = 0, z = 0) => {
|
|
83
|
+
return applyTransform([
|
|
84
|
+
1, 0, 0, 0,
|
|
85
|
+
0, 1, 0, 0,
|
|
86
|
+
0, 0, 1, 0,
|
|
87
|
+
x, y, z, 1,
|
|
88
|
+
]);
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
translate3d: (x, y, z) => {
|
|
92
|
+
return applyTransform([
|
|
93
|
+
1, 0, 0, 0,
|
|
94
|
+
0, 1, 0, 0,
|
|
95
|
+
0, 0, 1, 0,
|
|
96
|
+
x, y, z, 1,
|
|
97
|
+
]);
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
translateX: (x) => {
|
|
101
|
+
return applyTransform([
|
|
102
|
+
1, 0, 0, 0,
|
|
103
|
+
0, 1, 0, 0,
|
|
104
|
+
0, 0, 1, 0,
|
|
105
|
+
x, 0, 0, 1,
|
|
106
|
+
]);
|
|
107
|
+
},
|
|
108
|
+
|
|
109
|
+
translateY: (y) => {
|
|
110
|
+
return applyTransform([
|
|
111
|
+
1, 0, 0, 0,
|
|
112
|
+
0, 1, 0, 0,
|
|
113
|
+
0, 0, 1, 0,
|
|
114
|
+
0, y, 0, 1,
|
|
115
|
+
]);
|
|
116
|
+
},
|
|
117
|
+
|
|
118
|
+
translateZ: (z) => {
|
|
119
|
+
return applyTransform([
|
|
120
|
+
1, 0, 0, 0,
|
|
121
|
+
0, 1, 0, 0,
|
|
122
|
+
0, 0, 1, 0,
|
|
123
|
+
0, 0, z, 1,
|
|
124
|
+
]);
|
|
125
|
+
},
|
|
126
|
+
|
|
127
|
+
scale: (x = 1, y = 1, z = 1) => {
|
|
128
|
+
return applyTransform([
|
|
129
|
+
x, 0, 0, 0,
|
|
130
|
+
0, y, 0, 0,
|
|
131
|
+
0, 0, z, 0,
|
|
132
|
+
0, 0, 0, 1,
|
|
133
|
+
]);
|
|
134
|
+
},
|
|
135
|
+
|
|
136
|
+
scale3d: (x, y, z) => {
|
|
137
|
+
return applyTransform([
|
|
138
|
+
x, 0, 0, 0,
|
|
139
|
+
0, y, 0, 0,
|
|
140
|
+
0, 0, z, 0,
|
|
141
|
+
0, 0, 0, 1,
|
|
142
|
+
]);
|
|
143
|
+
},
|
|
144
|
+
|
|
145
|
+
scaleX: (x) => {
|
|
146
|
+
return applyTransform([
|
|
147
|
+
x, 0, 0, 0,
|
|
148
|
+
0, 1, 0, 0,
|
|
149
|
+
0, 0, 1, 0,
|
|
150
|
+
0, 0, 0, 1,
|
|
151
|
+
]);
|
|
152
|
+
},
|
|
153
|
+
|
|
154
|
+
scaleY: (y) => {
|
|
155
|
+
return applyTransform([
|
|
156
|
+
1, 0, 0, 0,
|
|
157
|
+
0, y, 0, 0,
|
|
158
|
+
0, 0, 1, 0,
|
|
159
|
+
0, 0, 0, 1,
|
|
160
|
+
]);
|
|
161
|
+
},
|
|
162
|
+
|
|
163
|
+
scaleZ: (z) => {
|
|
164
|
+
return applyTransform([
|
|
165
|
+
1, 0, 0, 0,
|
|
166
|
+
0, 1, 0, 0,
|
|
167
|
+
0, 0, z, 0,
|
|
168
|
+
0, 0, 0, 1,
|
|
169
|
+
]);
|
|
170
|
+
},
|
|
171
|
+
|
|
172
|
+
rotateX: (angle) => {
|
|
173
|
+
const c = Math.cos(angle);
|
|
174
|
+
const s = Math.sin(angle);
|
|
175
|
+
return applyTransform([
|
|
176
|
+
1, 0, 0, 0,
|
|
177
|
+
0, c, s, 0,
|
|
178
|
+
0, -s, c, 0,
|
|
179
|
+
0, 0, 0, 1,
|
|
180
|
+
]);
|
|
181
|
+
},
|
|
182
|
+
|
|
183
|
+
rotateY: (angle) => {
|
|
184
|
+
const c = Math.cos(angle);
|
|
185
|
+
const s = Math.sin(angle);
|
|
186
|
+
return applyTransform([
|
|
187
|
+
c, 0, -s, 0,
|
|
188
|
+
0, 1, 0, 0,
|
|
189
|
+
s, 0, c, 0,
|
|
190
|
+
0, 0, 0, 1,
|
|
191
|
+
]);
|
|
192
|
+
},
|
|
193
|
+
|
|
194
|
+
rotateZ: (angle) => {
|
|
195
|
+
const c = Math.cos(angle);
|
|
196
|
+
const s = Math.sin(angle);
|
|
197
|
+
return applyTransform([
|
|
198
|
+
c, s, 0, 0,
|
|
199
|
+
-s, c, 0, 0,
|
|
200
|
+
0, 0, 1, 0,
|
|
201
|
+
0, 0, 0, 1,
|
|
202
|
+
]);
|
|
203
|
+
},
|
|
204
|
+
|
|
205
|
+
rotate: (angle, x, y, z) => {
|
|
206
|
+
// Normalize the axis
|
|
207
|
+
const len = Math.sqrt(x * x + y * y + z * z);
|
|
208
|
+
if (len === 0) {
|
|
209
|
+
return createMatrix(m);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
x /= len;
|
|
213
|
+
y /= len;
|
|
214
|
+
z /= len;
|
|
215
|
+
|
|
216
|
+
const c = Math.cos(angle);
|
|
217
|
+
const s = Math.sin(angle);
|
|
218
|
+
const t = 1 - c;
|
|
219
|
+
|
|
220
|
+
return applyTransform([
|
|
221
|
+
t * x * x + c, t * x * y + s * z, t * x * z - s * y, 0,
|
|
222
|
+
t * x * y - s * z, t * y * y + c, t * y * z + s * x, 0,
|
|
223
|
+
t * x * z + s * y, t * y * z - s * x, t * z * z + c, 0,
|
|
224
|
+
0, 0, 0, 1,
|
|
225
|
+
]);
|
|
226
|
+
},
|
|
227
|
+
|
|
228
|
+
rotate3d: (x, y, z, angle) => {
|
|
229
|
+
// Normalize the axis
|
|
230
|
+
const len = Math.sqrt(x * x + y * y + z * z);
|
|
231
|
+
if (len === 0) {
|
|
232
|
+
return createMatrix(m);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
x /= len;
|
|
236
|
+
y /= len;
|
|
237
|
+
z /= len;
|
|
238
|
+
|
|
239
|
+
const c = Math.cos(angle);
|
|
240
|
+
const s = Math.sin(angle);
|
|
241
|
+
const t = 1 - c;
|
|
242
|
+
|
|
243
|
+
return applyTransform([
|
|
244
|
+
t * x * x + c, t * x * y + s * z, t * x * z - s * y, 0,
|
|
245
|
+
t * x * y - s * z, t * y * y + c, t * y * z + s * x, 0,
|
|
246
|
+
t * x * z + s * y, t * y * z - s * x, t * z * z + c, 0,
|
|
247
|
+
0, 0, 0, 1,
|
|
248
|
+
]);
|
|
249
|
+
},
|
|
250
|
+
|
|
251
|
+
skew: (angleX = 0, angleY = 0) => {
|
|
252
|
+
const tanX = Math.tan(angleX);
|
|
253
|
+
const tanY = Math.tan(angleY);
|
|
254
|
+
return applyTransform([
|
|
255
|
+
1, tanY, 0, 0,
|
|
256
|
+
tanX, 1, 0, 0,
|
|
257
|
+
0, 0, 1, 0,
|
|
258
|
+
0, 0, 0, 1,
|
|
259
|
+
]);
|
|
260
|
+
},
|
|
261
|
+
|
|
262
|
+
skewX: (angle) => {
|
|
263
|
+
const tanX = Math.tan(angle);
|
|
264
|
+
return applyTransform([
|
|
265
|
+
1, 0, 0, 0,
|
|
266
|
+
tanX, 1, 0, 0,
|
|
267
|
+
0, 0, 1, 0,
|
|
268
|
+
0, 0, 0, 1,
|
|
269
|
+
]);
|
|
270
|
+
},
|
|
271
|
+
|
|
272
|
+
skewY: (angle) => {
|
|
273
|
+
const tanY = Math.tan(angle);
|
|
274
|
+
return applyTransform([
|
|
275
|
+
1, tanY, 0, 0,
|
|
276
|
+
0, 1, 0, 0,
|
|
277
|
+
0, 0, 1, 0,
|
|
278
|
+
0, 0, 0, 1,
|
|
279
|
+
]);
|
|
280
|
+
},
|
|
281
|
+
|
|
282
|
+
perspective: (distance) => {
|
|
283
|
+
if (distance === 0) {
|
|
284
|
+
throw new Error('Perspective distance cannot be zero');
|
|
285
|
+
}
|
|
286
|
+
return applyTransform([
|
|
287
|
+
1, 0, 0, 0,
|
|
288
|
+
0, 1, 0, 0,
|
|
289
|
+
0, 0, 1, -1 / distance,
|
|
290
|
+
0, 0, 0, 1,
|
|
291
|
+
]);
|
|
292
|
+
},
|
|
293
|
+
|
|
294
|
+
toCSS: () => {
|
|
295
|
+
return `matrix3d(${m.join(', ')})`;
|
|
296
|
+
},
|
|
297
|
+
|
|
298
|
+
toArray: () => m,
|
|
299
|
+
|
|
300
|
+
toString: () => {
|
|
301
|
+
return [
|
|
302
|
+
`[${m[0]}, ${m[4]}, ${m[8]}, ${m[12]}]`,
|
|
303
|
+
`[${m[1]}, ${m[5]}, ${m[9]}, ${m[13]}]`,
|
|
304
|
+
`[${m[2]}, ${m[6]}, ${m[10]}, ${m[14]}]`,
|
|
305
|
+
`[${m[3]}, ${m[7]}, ${m[11]}, ${m[15]}]`,
|
|
306
|
+
].join('\n');
|
|
307
|
+
},
|
|
308
|
+
});
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Factory function to create a new identity matrix
|
|
313
|
+
*/
|
|
314
|
+
export const matrix = (): CSSMatrix => {
|
|
315
|
+
return createMatrix([
|
|
316
|
+
1, 0, 0, 0,
|
|
317
|
+
0, 1, 0, 0,
|
|
318
|
+
0, 0, 1, 0,
|
|
319
|
+
0, 0, 0, 1,
|
|
320
|
+
]);
|
|
321
|
+
};
|
package/src/utils/css.ts
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Generic CSS parsing and measurement utilities.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export type ParsedGap = {
|
|
6
|
+
rowGap: number;
|
|
7
|
+
columnGap: number;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Parses a CSS gap value string into row and column gap numbers.
|
|
12
|
+
* Supports single value (applied to both) or two values (row column).
|
|
13
|
+
* Only handles px units; other units return 0.
|
|
14
|
+
*/
|
|
15
|
+
export const parseGapValue = (gapValue?: string): ParsedGap => {
|
|
16
|
+
if (!gapValue) {
|
|
17
|
+
return { rowGap: 0, columnGap: 0 };
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const tokens = gapValue
|
|
21
|
+
.split(/\s+/)
|
|
22
|
+
.map((token) => token.trim())
|
|
23
|
+
.filter(Boolean);
|
|
24
|
+
|
|
25
|
+
const parseToken = (token: string): number => {
|
|
26
|
+
const match = token.match(/^(-?\d+(?:\.\d+)?)px$/);
|
|
27
|
+
if (!match) {
|
|
28
|
+
return 0;
|
|
29
|
+
}
|
|
30
|
+
return Number.parseFloat(match[1]);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
if (tokens.length === 1) {
|
|
34
|
+
const parsed = parseToken(tokens[0]);
|
|
35
|
+
return { rowGap: parsed, columnGap: parsed };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
rowGap: parseToken(tokens[0]),
|
|
40
|
+
columnGap: parseToken(tokens[1]),
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export type GridDirection = "col" | "row";
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Measures actual rendered grid track sizes from computed style.
|
|
48
|
+
* Returns pixel values parsed from gridTemplateColumns or gridTemplateRows.
|
|
49
|
+
*/
|
|
50
|
+
export const measureGridTrackSizes = (
|
|
51
|
+
containerEl: HTMLElement | null,
|
|
52
|
+
direction: GridDirection,
|
|
53
|
+
): number[] => {
|
|
54
|
+
if (!containerEl) {
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
const style = getComputedStyle(containerEl);
|
|
58
|
+
const template = direction === "col" ? style.gridTemplateColumns : style.gridTemplateRows;
|
|
59
|
+
|
|
60
|
+
// Computed style returns resolved pixel values like "370px 500px"
|
|
61
|
+
return template
|
|
62
|
+
.split(/\s+/)
|
|
63
|
+
.map((s) => parseFloat(s))
|
|
64
|
+
.filter((n) => !Number.isNaN(n));
|
|
65
|
+
};
|