react-panel-layout 0.5.2 → 0.6.1
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-lLg-Lpg7.js → FloatingPanelFrame-3eU9AwPo.js} +11 -11
- package/dist/{FloatingPanelFrame-lLg-Lpg7.js.map → FloatingPanelFrame-3eU9AwPo.js.map} +1 -1
- package/dist/{FloatingPanelFrame-D9Cp2al1.cjs → FloatingPanelFrame-CEmXDvUA.cjs} +2 -2
- package/dist/{FloatingPanelFrame-D9Cp2al1.cjs.map → FloatingPanelFrame-CEmXDvUA.cjs.map} +1 -1
- package/dist/FloatingWindow-CUXnEtrb.js +827 -0
- package/dist/FloatingWindow-CUXnEtrb.js.map +1 -0
- package/dist/FloatingWindow-DMwyK0eK.cjs +2 -0
- package/dist/FloatingWindow-DMwyK0eK.cjs.map +1 -0
- package/dist/GridLayout-DKTg_N61.cjs +2 -0
- package/dist/GridLayout-DKTg_N61.cjs.map +1 -0
- package/dist/GridLayout-UWNxXw77.js +926 -0
- package/dist/GridLayout-UWNxXw77.js.map +1 -0
- package/dist/HorizontalDivider-DdxzfV0l.js +30 -0
- package/dist/HorizontalDivider-DdxzfV0l.js.map +1 -0
- package/dist/HorizontalDivider-_pgV4Mcv.cjs +2 -0
- package/dist/HorizontalDivider-_pgV4Mcv.cjs.map +1 -0
- package/dist/PanelSystem-BqUzNtf2.js +1946 -0
- package/dist/PanelSystem-BqUzNtf2.js.map +1 -0
- package/dist/PanelSystem-D603LKKv.cjs +3 -0
- package/dist/PanelSystem-D603LKKv.cjs.map +1 -0
- package/dist/ResizeHandle-CBcAS918.cjs +2 -0
- package/dist/ResizeHandle-CBcAS918.cjs.map +1 -0
- package/dist/ResizeHandle-CXjc1meV.js +119 -0
- package/dist/ResizeHandle-CXjc1meV.js.map +1 -0
- package/dist/SwipePivotTabBar-DWrCuwEI.js +411 -0
- package/dist/SwipePivotTabBar-DWrCuwEI.js.map +1 -0
- package/dist/SwipePivotTabBar-fjjXkpj7.cjs +2 -0
- package/dist/SwipePivotTabBar-fjjXkpj7.cjs.map +1 -0
- package/dist/components/gesture/SwipeSafeZone.d.ts +40 -0
- package/dist/components/window/Drawer.d.ts +3 -1
- package/dist/components/window/DrawerLayers.d.ts +1 -1
- package/dist/components/window/drawerStyles.d.ts +69 -0
- package/dist/components/window/drawerSwipeConfig.d.ts +29 -0
- package/dist/components/window/useDrawerSwipeTransform.d.ts +23 -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 +35 -4
- package/dist/dialog/index.d.ts +69 -0
- 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 +117 -0
- package/dist/hooks/gesture/thresholdValue.d.ts +44 -0
- package/dist/hooks/gesture/types.d.ts +297 -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 +59 -0
- package/dist/hooks/useAnimatedVisibility.d.ts +58 -0
- package/dist/hooks/useAnimationFrame.d.ts +86 -0
- package/dist/hooks/useOperationContinuity.d.ts +64 -0
- package/dist/hooks/useResizeObserver.d.ts +33 -1
- package/dist/hooks/useSharedElementTransition.d.ts +112 -0
- package/dist/hooks/useSnapAnimation.d.ts +54 -0
- package/dist/hooks/useSwipeContentTransform.d.ts +86 -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/dialog/AlertDialog.d.ts +9 -0
- package/dist/modules/dialog/DialogContainer.d.ts +37 -0
- package/dist/modules/dialog/Modal.d.ts +26 -0
- package/dist/modules/dialog/SwipeDialogContainer.d.ts +16 -0
- package/dist/modules/dialog/dialogAnimationUtils.d.ts +113 -0
- package/dist/modules/dialog/types.d.ts +183 -0
- package/dist/modules/dialog/useDialog.d.ts +39 -0
- package/dist/modules/dialog/useDialogContainer.d.ts +47 -0
- package/dist/modules/dialog/useDialogSwipeInput.d.ts +70 -0
- package/dist/modules/dialog/useDialogTransform.d.ts +82 -0
- package/dist/modules/drawer/types.d.ts +74 -0
- package/dist/modules/drawer/useDrawerSwipeInput.d.ts +24 -0
- 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 +92 -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 +66 -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 +721 -0
- package/dist/stack.js.map +1 -0
- package/dist/sticky-header/StickyArea.d.ts +38 -0
- package/dist/sticky-header/calculateStickyMetrics.d.ts +28 -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 +73 -174
- package/dist/sticky-header.js.map +1 -1
- package/dist/styles-NkjuMOVS.js +57 -0
- package/dist/styles-NkjuMOVS.js.map +1 -0
- package/dist/styles-qf6ptVLD.cjs +2 -0
- package/dist/styles-qf6ptVLD.cjs.map +1 -0
- package/dist/types.d.ts +16 -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-DXxw3qWj.js +54 -0
- package/dist/useDocumentPointerEvents-DXxw3qWj.js.map +1 -0
- package/dist/useDocumentPointerEvents-DxDSOtip.cjs +2 -0
- package/dist/useDocumentPointerEvents-DxDSOtip.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/useNativeGestureGuard-C7TSqEkr.cjs +2 -0
- package/dist/useNativeGestureGuard-C7TSqEkr.cjs.map +1 -0
- package/dist/useNativeGestureGuard-CGYo6O0r.js +347 -0
- package/dist/useNativeGestureGuard-CGYo6O0r.js.map +1 -0
- package/dist/window/index.d.ts +63 -0
- package/dist/window.cjs +2 -0
- package/dist/window.cjs.map +1 -0
- package/dist/window.js +160 -0
- package/dist/window.js.map +1 -0
- package/docs/design-tokens.md +405 -0
- package/package.json +34 -4
- package/src/PanelSystemContext.tsx +88 -0
- package/src/components/gesture/SwipeSafeZone.tsx +69 -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 +369 -0
- package/src/components/window/DrawerLayers.tsx +68 -0
- package/src/components/window/FloatingWindow.tsx +95 -0
- package/src/components/window/PopupLayerPortal.tsx +218 -0
- package/src/components/window/drawerStyles.spec.ts +263 -0
- package/src/components/window/drawerStyles.ts +228 -0
- package/src/components/window/drawerSwipeConfig.spec.ts +131 -0
- package/src/components/window/drawerSwipeConfig.ts +112 -0
- package/src/components/window/useDrawerSwipeTransform.spec.ts +234 -0
- package/src/components/window/useDrawerSwipeTransform.ts +129 -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 +280 -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/Dialog/alerts/index.tsx +22 -0
- package/src/demo/pages/Dialog/card/index.tsx +22 -0
- package/src/demo/pages/Dialog/components/AlertDialogDemo.tsx +124 -0
- package/src/demo/pages/Dialog/components/CardExpandDemo.module.css +243 -0
- package/src/demo/pages/Dialog/components/CardExpandDemo.tsx +204 -0
- package/src/demo/pages/Dialog/components/CustomAlertDialogDemo.tsx +219 -0
- package/src/demo/pages/Dialog/components/DialogDemos.module.css +77 -0
- package/src/demo/pages/Dialog/components/ModalBasics.tsx +45 -0
- package/src/demo/pages/Dialog/components/SwipeDialogDemo.module.css +77 -0
- package/src/demo/pages/Dialog/components/SwipeDialogDemo.tsx +181 -0
- package/src/demo/pages/Dialog/custom-alert/index.tsx +22 -0
- package/src/demo/pages/Dialog/modal/index.tsx +17 -0
- package/src/demo/pages/Dialog/swipe/index.tsx +22 -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/components/DrawerSwipe.module.css +316 -0
- package/src/demo/pages/Drawer/components/DrawerSwipe.tsx +178 -0
- package/src/demo/pages/Drawer/menu/index.tsx +17 -0
- package/src/demo/pages/Drawer/swipe/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 +320 -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.spec.tsx +152 -0
- package/src/demo/pages/Stack/components/StackBasics.tsx +301 -0
- package/src/demo/pages/Stack/components/StackTablet.module.css +299 -0
- package/src/demo/pages/Stack/components/StackTablet.spec.tsx +120 -0
- package/src/demo/pages/Stack/components/StackTablet.tsx +422 -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 +214 -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/dialog/index.ts +85 -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 +241 -0
- package/src/hooks/gesture/testing/createGestureSimulator.ts +385 -0
- package/src/hooks/gesture/thresholdValue.spec.ts +103 -0
- package/src/hooks/gesture/thresholdValue.ts +77 -0
- package/src/hooks/gesture/types.ts +367 -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 +462 -0
- package/src/hooks/gesture/useEdgeSwipeInput.ts +131 -0
- package/src/hooks/gesture/useNativeGestureGuard.spec.ts +473 -0
- package/src/hooks/gesture/useNativeGestureGuard.ts +135 -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 +178 -0
- package/src/hooks/useAnimatedVisibility.spec.ts +277 -0
- package/src/hooks/useAnimatedVisibility.ts +172 -0
- package/src/hooks/useAnimationFrame.ts +208 -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/useOperationContinuity.spec.ts +387 -0
- package/src/hooks/useOperationContinuity.ts +135 -0
- package/src/hooks/useResizeObserver.spec.tsx +277 -0
- package/src/hooks/useResizeObserver.tsx +150 -0
- package/src/hooks/useScrollContainer.ts +73 -0
- package/src/hooks/useSharedElementTransition.ts +333 -0
- package/src/hooks/useSnapAnimation.ts +128 -0
- package/src/hooks/useSwipeContentTransform.spec.ts +133 -0
- package/src/hooks/useSwipeContentTransform.ts +373 -0
- package/src/hooks/useTransitionState.ts +95 -0
- package/src/index.tsx +88 -0
- package/src/modules/dialog/AlertDialog.spec.tsx +387 -0
- package/src/modules/dialog/AlertDialog.tsx +221 -0
- package/src/modules/dialog/DialogContainer.spec.tsx +228 -0
- package/src/modules/dialog/DialogContainer.tsx +188 -0
- package/src/modules/dialog/Modal.spec.tsx +220 -0
- package/src/modules/dialog/Modal.tsx +182 -0
- package/src/modules/dialog/SwipeDialogContainer.tsx +208 -0
- package/src/modules/dialog/dialogAnimationUtils.spec.ts +253 -0
- package/src/modules/dialog/dialogAnimationUtils.ts +297 -0
- package/src/modules/dialog/types.ts +186 -0
- package/src/modules/dialog/useDialog.spec.tsx +447 -0
- package/src/modules/dialog/useDialog.ts +214 -0
- package/src/modules/dialog/useDialogContainer.spec.ts +331 -0
- package/src/modules/dialog/useDialogContainer.ts +150 -0
- package/src/modules/dialog/useDialogSwipeInput.spec.ts +157 -0
- package/src/modules/dialog/useDialogSwipeInput.ts +319 -0
- package/src/modules/dialog/useDialogTransform.spec.ts +370 -0
- package/src/modules/dialog/useDialogTransform.ts +407 -0
- package/src/modules/drawer/types.ts +102 -0
- package/src/modules/drawer/useDrawerSwipeInput.spec.ts +566 -0
- package/src/modules/drawer/useDrawerSwipeInput.ts +399 -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 +311 -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 +171 -0
- package/src/modules/pivot/SwipePivotContent.spec.tsx +494 -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 +882 -0
- package/src/modules/pivot/SwipePivotTabBar.tsx +583 -0
- package/src/modules/pivot/index.ts +8 -0
- package/src/modules/pivot/scaleInputState.spec.ts +219 -0
- package/src/modules/pivot/scaleInputState.ts +66 -0
- package/src/modules/pivot/types.ts +139 -0
- package/src/modules/pivot/usePivot.spec.ts +635 -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 +708 -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 +1564 -0
- package/src/modules/stack/SwipeStackContent.tsx +366 -0
- package/src/modules/stack/SwipeStackOutlet.spec.tsx +250 -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/swipeTransitionContinuity.spec.tsx +1133 -0
- package/src/modules/stack/types.ts +226 -0
- package/src/modules/stack/useStackAnimationState.spec.ts +188 -0
- package/src/modules/stack/useStackAnimationState.ts +143 -0
- package/src/modules/stack/useStackNavigation.spec.ts +672 -0
- package/src/modules/stack/useStackNavigation.tsx +393 -0
- package/src/modules/stack/useStackSwipeInput.spec.ts +309 -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 +193 -0
- package/src/sticky-header/calculateStickyMetrics.spec.ts +105 -0
- package/src/sticky-header/calculateStickyMetrics.ts +50 -0
- package/src/sticky-header/index.ts +18 -0
- package/src/sticky-header/types.ts +68 -0
- package/src/types.ts +341 -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 +69 -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,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Dialog animation utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides multi-phase animation calculations and viewTransition support
|
|
5
|
+
* for dialog open/close animations with "suck in" effect.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { easings } from "../../hooks/useAnimationFrame.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Direction from which the dialog opens.
|
|
12
|
+
* The close animation uses the opposite direction.
|
|
13
|
+
*/
|
|
14
|
+
export type DialogOpenDirection = "center" | "top" | "bottom" | "left" | "right";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Phase transition point for multi-phase animation.
|
|
18
|
+
* Phase 1: 0 to PHASE_TRANSITION (translate movement)
|
|
19
|
+
* Phase 2: PHASE_TRANSITION to 1 (scale + accelerated translate)
|
|
20
|
+
*/
|
|
21
|
+
const PHASE_TRANSITION = 0.7;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Final scale value for "suck in" effect.
|
|
25
|
+
*/
|
|
26
|
+
const FINAL_SCALE = 0.85;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Transform values for dialog animation.
|
|
30
|
+
*/
|
|
31
|
+
export type DialogTransform = {
|
|
32
|
+
/** Translate value in pixels (x or y depending on direction) */
|
|
33
|
+
translate: number;
|
|
34
|
+
/** Scale value (1 = normal, 0.85 = final suck-in) */
|
|
35
|
+
scale: number;
|
|
36
|
+
/** Backdrop opacity (1 = fully visible, 0 = transparent) */
|
|
37
|
+
backdropOpacity: number;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Axis for the dialog animation based on direction.
|
|
42
|
+
*/
|
|
43
|
+
export type DialogAnimationAxis = "x" | "y";
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Get the animation axis for a given direction.
|
|
47
|
+
*/
|
|
48
|
+
export function getAnimationAxis(direction: DialogOpenDirection): DialogAnimationAxis {
|
|
49
|
+
switch (direction) {
|
|
50
|
+
case "left":
|
|
51
|
+
case "right":
|
|
52
|
+
return "x";
|
|
53
|
+
case "top":
|
|
54
|
+
case "bottom":
|
|
55
|
+
case "center":
|
|
56
|
+
return "y";
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Get the sign multiplier for translate based on direction.
|
|
62
|
+
* Positive means moving in the positive axis direction.
|
|
63
|
+
*/
|
|
64
|
+
export function getDirectionSign(direction: DialogOpenDirection): number {
|
|
65
|
+
switch (direction) {
|
|
66
|
+
case "top":
|
|
67
|
+
case "left":
|
|
68
|
+
return -1;
|
|
69
|
+
case "bottom":
|
|
70
|
+
case "right":
|
|
71
|
+
case "center":
|
|
72
|
+
return 1;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Compute the close animation transform values.
|
|
78
|
+
*
|
|
79
|
+
* The close animation has two phases:
|
|
80
|
+
* - Phase 1 (0-70%): Translate movement with easeOutExpo (natural deceleration)
|
|
81
|
+
* - Phase 2 (70-100%): Scale shrink + accelerated translate with easeInExpo ("suck in" effect)
|
|
82
|
+
*
|
|
83
|
+
* @param progress - Animation progress (0 = open, 1 = fully closed)
|
|
84
|
+
* @param containerSize - Size of the container in the animation direction (width or height)
|
|
85
|
+
* @param direction - Direction the dialog is closing towards
|
|
86
|
+
* @returns Transform values for the current progress
|
|
87
|
+
*/
|
|
88
|
+
export function computeCloseTransform(
|
|
89
|
+
progress: number,
|
|
90
|
+
containerSize: number,
|
|
91
|
+
direction: DialogOpenDirection = "bottom",
|
|
92
|
+
): DialogTransform {
|
|
93
|
+
const sign = getDirectionSign(direction);
|
|
94
|
+
const translateTarget = containerSize * 0.5; // Move 50% of container size
|
|
95
|
+
|
|
96
|
+
if (progress < PHASE_TRANSITION) {
|
|
97
|
+
// Phase 1: translate only, no scale change
|
|
98
|
+
const phase1Progress = progress / PHASE_TRANSITION;
|
|
99
|
+
const easedProgress = easings.easeOutExpo(phase1Progress);
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
translate: sign * translateTarget * easedProgress * 0.7, // 70% of translate in phase 1
|
|
103
|
+
scale: 1.0,
|
|
104
|
+
backdropOpacity: 1.0 - progress * 0.5, // Fade backdrop gradually
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Phase 2: scale + accelerated translate
|
|
109
|
+
const phase2Progress = (progress - PHASE_TRANSITION) / (1 - PHASE_TRANSITION);
|
|
110
|
+
const easedProgress = easeInExpo(phase2Progress);
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
translate: sign * translateTarget * (0.7 + 0.3 * easedProgress),
|
|
114
|
+
scale: 1.0 - (1.0 - FINAL_SCALE) * easedProgress,
|
|
115
|
+
backdropOpacity: 0.5 - 0.5 * easedProgress, // Finish fading
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Compute the open animation transform values.
|
|
121
|
+
* This is the reverse of the close animation.
|
|
122
|
+
*
|
|
123
|
+
* @param progress - Animation progress (0 = closed, 1 = fully open)
|
|
124
|
+
* @param containerSize - Size of the container in the animation direction
|
|
125
|
+
* @param direction - Direction the dialog is opening from
|
|
126
|
+
* @returns Transform values for the current progress
|
|
127
|
+
*/
|
|
128
|
+
export function computeOpenTransform(
|
|
129
|
+
progress: number,
|
|
130
|
+
containerSize: number,
|
|
131
|
+
direction: DialogOpenDirection = "bottom",
|
|
132
|
+
): DialogTransform {
|
|
133
|
+
// Reverse the close animation
|
|
134
|
+
return computeCloseTransform(1 - progress, containerSize, direction);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Compute transform values during a swipe gesture.
|
|
139
|
+
* This provides real-time feedback as the user swipes.
|
|
140
|
+
*
|
|
141
|
+
* @param displacement - Current swipe displacement in pixels
|
|
142
|
+
* @param containerSize - Size of the container in the animation direction
|
|
143
|
+
* @returns Transform values for current swipe state
|
|
144
|
+
*/
|
|
145
|
+
export function computeSwipeTransform(
|
|
146
|
+
displacement: number,
|
|
147
|
+
containerSize: number,
|
|
148
|
+
): DialogTransform {
|
|
149
|
+
const progress = Math.min(Math.abs(displacement) / containerSize, 1);
|
|
150
|
+
|
|
151
|
+
// Light scale feedback during swipe (max 2% reduction)
|
|
152
|
+
const scale = 1.0 - 0.02 * progress;
|
|
153
|
+
|
|
154
|
+
// Backdrop fades with swipe progress
|
|
155
|
+
const backdropOpacity = 1.0 - progress * 0.8;
|
|
156
|
+
|
|
157
|
+
return {
|
|
158
|
+
translate: displacement,
|
|
159
|
+
scale,
|
|
160
|
+
backdropOpacity,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Check if the swipe should trigger a dismiss action.
|
|
166
|
+
*
|
|
167
|
+
* @param displacement - Final swipe displacement in pixels
|
|
168
|
+
* @param velocity - Final swipe velocity in px/ms
|
|
169
|
+
* @param containerSize - Size of the container
|
|
170
|
+
* @param threshold - Threshold ratio (0-1) for dismiss (default: 0.3)
|
|
171
|
+
* @returns Whether the dialog should be dismissed
|
|
172
|
+
*/
|
|
173
|
+
export function shouldDismiss(
|
|
174
|
+
displacement: number,
|
|
175
|
+
velocity: number,
|
|
176
|
+
containerSize: number,
|
|
177
|
+
threshold: number = 0.3,
|
|
178
|
+
): boolean {
|
|
179
|
+
const absDisplacement = Math.abs(displacement);
|
|
180
|
+
const absVelocity = Math.abs(velocity);
|
|
181
|
+
|
|
182
|
+
// Dismiss if displacement exceeds threshold
|
|
183
|
+
if (absDisplacement >= containerSize * threshold) {
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Dismiss if velocity is high enough (quick flick)
|
|
188
|
+
if (absVelocity >= 0.5) {
|
|
189
|
+
// 0.5 px/ms = 500 px/s
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Get the close direction based on swipe displacement.
|
|
198
|
+
* The dialog closes in the direction of the swipe.
|
|
199
|
+
*
|
|
200
|
+
* @param displacementX - Horizontal displacement
|
|
201
|
+
* @param displacementY - Vertical displacement
|
|
202
|
+
* @param defaultDirection - Default direction if no clear winner
|
|
203
|
+
* @returns The determined close direction
|
|
204
|
+
*/
|
|
205
|
+
export function getCloseDirectionFromSwipe(
|
|
206
|
+
displacementX: number,
|
|
207
|
+
displacementY: number,
|
|
208
|
+
defaultDirection: DialogOpenDirection = "bottom",
|
|
209
|
+
): DialogOpenDirection {
|
|
210
|
+
const absX = Math.abs(displacementX);
|
|
211
|
+
const absY = Math.abs(displacementY);
|
|
212
|
+
|
|
213
|
+
if (absY > absX) {
|
|
214
|
+
return displacementY > 0 ? "bottom" : "top";
|
|
215
|
+
}
|
|
216
|
+
if (absX > absY) {
|
|
217
|
+
return displacementX > 0 ? "right" : "left";
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return defaultDirection;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Check if View Transitions API is supported.
|
|
225
|
+
*/
|
|
226
|
+
export function supportsViewTransitions(): boolean {
|
|
227
|
+
if (typeof document === "undefined") {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
return "startViewTransition" in document;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Execute a callback with View Transitions API, with fallback.
|
|
235
|
+
*
|
|
236
|
+
* @param callback - The DOM-changing callback to wrap
|
|
237
|
+
* @returns Promise<boolean> - true if viewTransition was used, false if fallback
|
|
238
|
+
*/
|
|
239
|
+
export async function safeViewTransition(callback: () => void): Promise<boolean> {
|
|
240
|
+
if (!supportsViewTransitions()) {
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
try {
|
|
245
|
+
const transition = (document as Document & { startViewTransition: (cb: () => void) => ViewTransition }).startViewTransition(callback);
|
|
246
|
+
await transition.finished;
|
|
247
|
+
return true;
|
|
248
|
+
} catch (error) {
|
|
249
|
+
console.warn("viewTransition failed, using JS fallback:", error);
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* ViewTransition type (for TypeScript).
|
|
256
|
+
*/
|
|
257
|
+
type ViewTransition = {
|
|
258
|
+
finished: Promise<void>;
|
|
259
|
+
ready: Promise<void>;
|
|
260
|
+
updateCallbackDone: Promise<void>;
|
|
261
|
+
skipTransition: () => void;
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Ease-in exponential function for "suck in" effect.
|
|
266
|
+
* Accelerates towards the end.
|
|
267
|
+
*/
|
|
268
|
+
function easeInExpo(t: number): number {
|
|
269
|
+
if (t === 0) {
|
|
270
|
+
return 0;
|
|
271
|
+
}
|
|
272
|
+
return Math.pow(2, 10 * t - 10);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Build CSS transform string from transform values.
|
|
277
|
+
*
|
|
278
|
+
* @param transform - Transform values
|
|
279
|
+
* @param axis - Animation axis ('x' or 'y')
|
|
280
|
+
* @returns CSS transform string
|
|
281
|
+
*/
|
|
282
|
+
export function buildTransformString(transform: DialogTransform, axis: DialogAnimationAxis): string {
|
|
283
|
+
const translateFn = axis === "x" ? "translateX" : "translateY";
|
|
284
|
+
return `${translateFn}(${transform.translate}px) scale(${transform.scale})`;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Build CSS for backdrop based on transform values.
|
|
289
|
+
*
|
|
290
|
+
* @param transform - Transform values
|
|
291
|
+
* @returns CSS properties for backdrop
|
|
292
|
+
*/
|
|
293
|
+
export function buildBackdropStyle(transform: DialogTransform): React.CSSProperties {
|
|
294
|
+
return {
|
|
295
|
+
opacity: transform.backdropOpacity,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Dialog module type definitions
|
|
3
|
+
*/
|
|
4
|
+
import type * as React from "react";
|
|
5
|
+
import type { Position } from "../../types";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Transition mode for dialog animations
|
|
9
|
+
* - "none": No animation
|
|
10
|
+
* - "css": CSS-based fade/scale animation
|
|
11
|
+
* - "swipe": Swipeable with multi-phase animation
|
|
12
|
+
*/
|
|
13
|
+
export type DialogTransitionMode = "none" | "css" | "swipe";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Direction from which the dialog opens.
|
|
17
|
+
* The close animation uses the same direction (swipe down to close if opened from bottom).
|
|
18
|
+
*/
|
|
19
|
+
export type DialogOpenDirection = "center" | "top" | "bottom" | "left" | "right";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Base props for DialogContainer component
|
|
23
|
+
*/
|
|
24
|
+
export type DialogContainerProps = {
|
|
25
|
+
/** Whether the dialog is visible */
|
|
26
|
+
visible: boolean;
|
|
27
|
+
/** Callback when dialog should close */
|
|
28
|
+
onClose: () => void;
|
|
29
|
+
/** Dialog content */
|
|
30
|
+
children: React.ReactNode;
|
|
31
|
+
/** Position: 'center' for screen center, or Position for absolute coordinates */
|
|
32
|
+
position?: "center" | Position;
|
|
33
|
+
/** Whether clicking backdrop closes the dialog */
|
|
34
|
+
dismissible?: boolean;
|
|
35
|
+
/** Whether pressing Escape closes the dialog */
|
|
36
|
+
closeOnEscape?: boolean;
|
|
37
|
+
/** Whether to prevent body scroll when open */
|
|
38
|
+
preventBodyScroll?: boolean;
|
|
39
|
+
/** Whether to return focus to previous element on close */
|
|
40
|
+
returnFocus?: boolean;
|
|
41
|
+
/** Aria label for the dialog */
|
|
42
|
+
ariaLabel?: string;
|
|
43
|
+
/** ID of element that labels the dialog */
|
|
44
|
+
ariaLabelledBy?: string;
|
|
45
|
+
/** ID of element that describes the dialog */
|
|
46
|
+
ariaDescribedBy?: string;
|
|
47
|
+
/** Transition mode */
|
|
48
|
+
transitionMode?: DialogTransitionMode;
|
|
49
|
+
/** Transition duration (CSS value, e.g. '200ms') */
|
|
50
|
+
transitionDuration?: string;
|
|
51
|
+
/** Transition easing (CSS value, e.g. 'ease-out') */
|
|
52
|
+
transitionEasing?: string;
|
|
53
|
+
/** Whether the dialog can be dismissed by swiping. @default false for "css", true for "swipe" */
|
|
54
|
+
swipeDismissible?: boolean;
|
|
55
|
+
/** Direction the dialog opens from (used for swipe mode). @default "center" */
|
|
56
|
+
openDirection?: DialogOpenDirection;
|
|
57
|
+
/** Whether to use viewTransition API for close animation (when available). @default false */
|
|
58
|
+
useViewTransition?: boolean;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Header configuration for Modal
|
|
63
|
+
*/
|
|
64
|
+
export type ModalHeader = {
|
|
65
|
+
/** Title displayed in the header */
|
|
66
|
+
title: string;
|
|
67
|
+
/** Whether to show close button (default: true) */
|
|
68
|
+
showCloseButton?: boolean;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Props for Modal component
|
|
73
|
+
*/
|
|
74
|
+
export type ModalProps = Omit<DialogContainerProps, "position"> & {
|
|
75
|
+
/** Header configuration */
|
|
76
|
+
header?: ModalHeader;
|
|
77
|
+
/** Modal width */
|
|
78
|
+
width?: string | number;
|
|
79
|
+
/** Modal height */
|
|
80
|
+
height?: string | number;
|
|
81
|
+
/** Max width (default: 90vw) */
|
|
82
|
+
maxWidth?: string | number;
|
|
83
|
+
/** Max height (default: 85vh) */
|
|
84
|
+
maxHeight?: string | number;
|
|
85
|
+
/** Whether to use FloatingPanelFrame chrome (default: true) */
|
|
86
|
+
chrome?: boolean;
|
|
87
|
+
/** Custom content style */
|
|
88
|
+
contentStyle?: React.CSSProperties;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Options for alert dialog
|
|
93
|
+
*/
|
|
94
|
+
export type AlertOptions = {
|
|
95
|
+
/** Optional title */
|
|
96
|
+
title?: string;
|
|
97
|
+
/** Message to display */
|
|
98
|
+
message: string;
|
|
99
|
+
/** OK button label (default: 'OK') */
|
|
100
|
+
okLabel?: string;
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Options for confirm dialog
|
|
105
|
+
*/
|
|
106
|
+
export type ConfirmOptions = AlertOptions & {
|
|
107
|
+
/** Confirm button label (default: 'OK') */
|
|
108
|
+
confirmLabel?: string;
|
|
109
|
+
/** Cancel button label (default: 'Cancel') */
|
|
110
|
+
cancelLabel?: string;
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Options for prompt dialog
|
|
115
|
+
*/
|
|
116
|
+
export type PromptOptions = ConfirmOptions & {
|
|
117
|
+
/** Default input value */
|
|
118
|
+
defaultValue?: string;
|
|
119
|
+
/** Placeholder text for input */
|
|
120
|
+
placeholder?: string;
|
|
121
|
+
/** Input type (default: 'text') */
|
|
122
|
+
inputType?: "text" | "password" | "email" | "number";
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Internal state for dialog queue
|
|
127
|
+
*/
|
|
128
|
+
export type DialogQueueItem =
|
|
129
|
+
| { type: "alert"; options: AlertOptions; resolve: (value: void) => void }
|
|
130
|
+
| { type: "confirm"; options: ConfirmOptions; resolve: (value: boolean) => void }
|
|
131
|
+
| { type: "prompt"; options: PromptOptions; resolve: (value: string | null) => void };
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Return type of useDialog hook
|
|
135
|
+
*/
|
|
136
|
+
export type UseDialogReturn = {
|
|
137
|
+
/** Show an alert dialog */
|
|
138
|
+
alert: (options: AlertOptions | string) => Promise<void>;
|
|
139
|
+
/** Show a confirm dialog */
|
|
140
|
+
confirm: (options: ConfirmOptions | string) => Promise<boolean>;
|
|
141
|
+
/** Show a prompt dialog */
|
|
142
|
+
prompt: (options: PromptOptions | string) => Promise<string | null>;
|
|
143
|
+
/** Outlet component to render dialogs */
|
|
144
|
+
Outlet: React.FC;
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Props for useDialog hook
|
|
149
|
+
*/
|
|
150
|
+
export type UseDialogProps = {
|
|
151
|
+
/**
|
|
152
|
+
* Custom component to render alert/confirm/prompt dialogs.
|
|
153
|
+
* When provided, replaces the default AlertDialog component.
|
|
154
|
+
*/
|
|
155
|
+
alertDialogComponent?: React.ComponentType<AlertDialogProps>;
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Props for AlertDialog component (internal)
|
|
160
|
+
*/
|
|
161
|
+
export type AlertDialogProps = {
|
|
162
|
+
/** Dialog type */
|
|
163
|
+
type: "alert" | "confirm" | "prompt";
|
|
164
|
+
/** Whether the dialog is visible */
|
|
165
|
+
visible: boolean;
|
|
166
|
+
/** Title */
|
|
167
|
+
title?: string;
|
|
168
|
+
/** Message */
|
|
169
|
+
message: string;
|
|
170
|
+
/** OK/Confirm button label */
|
|
171
|
+
confirmLabel?: string;
|
|
172
|
+
/** Cancel button label */
|
|
173
|
+
cancelLabel?: string;
|
|
174
|
+
/** Placeholder for prompt input */
|
|
175
|
+
placeholder?: string;
|
|
176
|
+
/** Default value for prompt input */
|
|
177
|
+
defaultValue?: string;
|
|
178
|
+
/** Input type for prompt */
|
|
179
|
+
inputType?: "text" | "password" | "email" | "number";
|
|
180
|
+
/** Callback for confirm/OK action */
|
|
181
|
+
onConfirm: (value?: string) => void;
|
|
182
|
+
/** Callback for cancel action */
|
|
183
|
+
onCancel: () => void;
|
|
184
|
+
/** Whether the dialog can be dismissed by swiping. @default false for alert, true for confirm/prompt */
|
|
185
|
+
swipeDismissible?: boolean;
|
|
186
|
+
};
|