react-panel-layout 0.6.0 → 0.7.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-SgYLc6Ud.js → FloatingPanelFrame-3eU9AwPo.js} +2 -2
- package/dist/{FloatingPanelFrame-SgYLc6Ud.js.map → FloatingPanelFrame-3eU9AwPo.js.map} +1 -1
- package/dist/FloatingWindow-Bw2djgpz.js +1542 -0
- package/dist/FloatingWindow-Bw2djgpz.js.map +1 -0
- package/dist/FloatingWindow-Cvyokf0m.cjs +2 -0
- package/dist/FloatingWindow-Cvyokf0m.cjs.map +1 -0
- package/dist/GridLayout-B4aCqSyd.js +947 -0
- package/dist/{GridLayout-BltqeCPK.js.map → GridLayout-B4aCqSyd.js.map} +1 -1
- package/dist/GridLayout-DNOClFzz.cjs +2 -0
- package/dist/{GridLayout-B4VRsC0r.cjs.map → GridLayout-DNOClFzz.cjs.map} +1 -1
- package/dist/{HorizontalDivider-WF1k_qND.js → HorizontalDivider-DdxzfV0l.js} +3 -3
- package/dist/{HorizontalDivider-WF1k_qND.js.map → HorizontalDivider-DdxzfV0l.js.map} +1 -1
- package/dist/{HorizontalDivider-B5Z-KZLk.cjs → HorizontalDivider-_pgV4Mcv.cjs} +2 -2
- package/dist/{HorizontalDivider-B5Z-KZLk.cjs.map → HorizontalDivider-_pgV4Mcv.cjs.map} +1 -1
- package/dist/PanelSystem-B8Igvnb2.cjs +3 -0
- package/dist/PanelSystem-B8Igvnb2.cjs.map +1 -0
- package/dist/{PanelSystem-Dr1TBhxM.js → PanelSystem-DDUSFjXD.js} +209 -248
- package/dist/PanelSystem-DDUSFjXD.js.map +1 -0
- package/dist/ResizeHandle-CBcAS918.cjs +2 -0
- package/dist/{ResizeHandle-CScipO5l.cjs.map → ResizeHandle-CBcAS918.cjs.map} +1 -1
- package/dist/{ResizeHandle-CdA_JYfN.js → ResizeHandle-CXjc1meV.js} +28 -29
- package/dist/{ResizeHandle-CdA_JYfN.js.map → ResizeHandle-CXjc1meV.js.map} +1 -1
- 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 +4 -1
- package/dist/components/window/DrawerLayers.d.ts +1 -1
- package/dist/components/window/DrawerRevealContext.d.ts +61 -0
- package/dist/components/window/drawerRevealAnimationUtils.d.ts +212 -0
- package/dist/components/window/drawerStyles.d.ts +74 -0
- package/dist/components/window/drawerSwipeConfig.d.ts +29 -0
- package/dist/components/window/useDrawerSwipeTransform.d.ts +29 -0
- package/dist/components/window/useDrawerTransform.d.ts +68 -0
- package/dist/components/window/useRevealDrawerTransform.d.ts +56 -0
- package/dist/config.cjs +1 -1
- package/dist/config.cjs.map +1 -1
- package/dist/config.js +9 -8
- package/dist/config.js.map +1 -1
- package/dist/constants/styles.d.ts +17 -0
- package/dist/dialog/index.d.ts +69 -0
- package/dist/floating.js +1 -1
- package/dist/grid.cjs +1 -1
- package/dist/grid.js +2 -2
- package/dist/hooks/gesture/testing/createGestureSimulator.d.ts +7 -0
- package/dist/hooks/gesture/types.d.ts +48 -5
- package/dist/hooks/gesture/utils.d.ts +19 -0
- package/dist/hooks/useAnimationFrame.d.ts +2 -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/useSwipeContentTransform.d.ts +9 -2
- package/dist/index.cjs +1 -1
- package/dist/index.js +7 -7
- 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/drawerStateMachine.d.ts +168 -0
- package/dist/modules/drawer/revealDrawerConstants.d.ts +33 -0
- package/dist/modules/drawer/revealDrawerStateMachine.d.ts +146 -0
- package/dist/modules/drawer/strategies/index.d.ts +8 -0
- package/dist/modules/drawer/strategies/overlayStrategy.d.ts +12 -0
- package/dist/modules/drawer/strategies/revealStrategy.d.ts +12 -0
- package/dist/modules/drawer/strategies/types.d.ts +116 -0
- package/dist/modules/drawer/types.d.ts +74 -0
- package/dist/modules/drawer/useDrawerSwipeInput.d.ts +24 -0
- package/dist/modules/pivot/SwipePivotTabBar.d.ts +3 -0
- package/dist/modules/stack/SwipeStackContent.d.ts +6 -3
- package/dist/modules/stack/SwipeStackOutlet.d.ts +4 -4
- package/dist/modules/stack/computeSwipeStackTransform.d.ts +1 -1
- package/dist/panels.cjs +1 -1
- package/dist/panels.js +1 -1
- package/dist/pivot.cjs +1 -1
- package/dist/pivot.js +1 -1
- package/dist/resizer.cjs +1 -1
- package/dist/resizer.js +2 -2
- package/dist/stack.cjs +1 -1
- package/dist/stack.cjs.map +1 -1
- package/dist/stack.js +480 -780
- package/dist/stack.js.map +1 -1
- package/dist/sticky-header/calculateStickyMetrics.d.ts +28 -0
- package/dist/sticky-header.cjs +1 -1
- package/dist/sticky-header.cjs.map +1 -1
- package/dist/sticky-header.js +59 -51
- package/dist/sticky-header.js.map +1 -1
- package/dist/{styles-DPPuJ0sf.js → styles-NkjuMOVS.js} +13 -13
- package/dist/{styles-DPPuJ0sf.js.map → styles-NkjuMOVS.js.map} +1 -1
- package/dist/styles-qf6ptVLD.cjs.map +1 -1
- package/dist/types.d.ts +30 -0
- package/dist/useAnimationFrame-BZ6D2lMq.cjs +2 -0
- package/dist/useAnimationFrame-BZ6D2lMq.cjs.map +1 -0
- package/dist/useAnimationFrame-Bg4e-H8O.js +394 -0
- package/dist/useAnimationFrame-Bg4e-H8O.js.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/window/index.d.ts +2 -0
- package/dist/window.cjs +1 -1
- package/dist/window.cjs.map +1 -1
- package/dist/window.js +114 -103
- package/dist/window.js.map +1 -1
- package/package.json +6 -1
- package/src/components/gesture/SwipeSafeZone.tsx +70 -0
- package/src/components/grid/GridLayout.tsx +110 -38
- package/src/components/window/Drawer.tsx +353 -162
- package/src/components/window/DrawerLayers.tsx +54 -11
- package/src/components/window/DrawerRevealContext.spec.ts +20 -0
- package/src/components/window/DrawerRevealContext.tsx +99 -0
- package/src/components/window/drawerRevealAnimationUtils.spec.ts +375 -0
- package/src/components/window/drawerRevealAnimationUtils.ts +415 -0
- package/src/components/window/drawerStyles.spec.ts +302 -0
- package/src/components/window/drawerStyles.ts +252 -0
- package/src/components/window/drawerSwipeConfig.spec.ts +131 -0
- package/src/components/window/drawerSwipeConfig.ts +112 -0
- package/src/components/window/useDrawerSwipeTransform.ts +67 -0
- package/src/components/window/useDrawerTransform.ts +505 -0
- package/src/components/window/useRevealDrawerTransform.spec.ts +1936 -0
- package/src/components/window/useRevealDrawerTransform.ts +105 -0
- package/src/constants/styles.ts +19 -0
- package/src/demo/components/FullscreenDemoPage.tsx +47 -0
- package/src/demo/fullscreenRoutes.tsx +32 -0
- package/src/demo/index.tsx +5 -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 +219 -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/components/DrawerBasics.module.css +6 -1
- package/src/demo/pages/Drawer/components/DrawerBasics.tsx +14 -4
- package/src/demo/pages/Drawer/components/DrawerReveal.module.css +157 -0
- package/src/demo/pages/Drawer/components/DrawerReveal.tsx +128 -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/reveal/index.tsx +17 -0
- package/src/demo/pages/Drawer/reveal-fullscreen/index.tsx +135 -0
- package/src/demo/pages/Drawer/reveal-fullscreen/styles.module.css +233 -0
- package/src/demo/pages/Drawer/swipe/index.tsx +17 -0
- package/src/demo/pages/Pivot/components/SwipeTabsPivot.tsx +54 -23
- package/src/demo/pages/Pivot/swipe-debug/index.tsx +1 -1
- package/src/demo/pages/Stack/components/StackBasics.spec.tsx +156 -0
- package/src/demo/pages/Stack/components/StackBasics.tsx +179 -95
- package/src/demo/pages/Stack/components/StackTablet.spec.tsx +110 -0
- package/src/demo/pages/Stack/components/StackTablet.tsx +42 -21
- package/src/demo/routes.tsx +24 -1
- package/src/dialog/index.ts +85 -0
- package/src/hooks/gesture/testing/createGestureSimulator.spec.ts +68 -64
- package/src/hooks/gesture/testing/createGestureSimulator.ts +113 -37
- package/src/hooks/gesture/types.ts +83 -6
- package/src/hooks/gesture/useEdgeSwipeInput.spec.ts +22 -14
- package/src/hooks/gesture/useNativeGestureGuard.spec.ts +99 -31
- package/src/hooks/gesture/useNativeGestureGuard.ts +3 -1
- package/src/hooks/gesture/utils.ts +102 -0
- package/src/hooks/useAnimatedVisibility.spec.ts +44 -24
- package/src/hooks/useAnimatedVisibility.ts +28 -2
- package/src/hooks/useAnimationFrame.ts +8 -0
- package/src/hooks/useOperationContinuity.spec.ts +394 -0
- package/src/hooks/useOperationContinuity.ts +135 -0
- package/src/hooks/useResizeObserver.spec.tsx +277 -0
- package/src/hooks/useResizeObserver.tsx +108 -39
- package/src/hooks/useScrollContainer.ts +4 -10
- package/src/hooks/useSharedElementTransition.ts +354 -0
- package/src/hooks/useSwipeContentTransform.spec.ts +18 -18
- package/src/hooks/useSwipeContentTransform.ts +166 -28
- 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 +252 -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 +339 -0
- package/src/modules/dialog/useDialogContainer.ts +150 -0
- package/src/modules/dialog/useDialogSwipeInput.spec.ts +178 -0
- package/src/modules/dialog/useDialogSwipeInput.ts +350 -0
- package/src/modules/dialog/useDialogTransform.spec.ts +403 -0
- package/src/modules/dialog/useDialogTransform.ts +407 -0
- package/src/modules/drawer/drawerStateMachine.ts +500 -0
- package/src/modules/drawer/revealDrawerConstants.ts +38 -0
- package/src/modules/drawer/revealDrawerStateMachine.spec.ts +558 -0
- package/src/modules/drawer/revealDrawerStateMachine.ts +197 -0
- package/src/modules/drawer/strategies/index.ts +9 -0
- package/src/modules/drawer/strategies/overlayStrategy.ts +133 -0
- package/src/modules/drawer/strategies/revealStrategy.ts +111 -0
- package/src/modules/drawer/strategies/types.ts +160 -0
- package/src/modules/drawer/types.ts +102 -0
- package/src/modules/drawer/useDrawerSwipeInput.spec.ts +566 -0
- package/src/modules/drawer/useDrawerSwipeInput.ts +402 -0
- package/src/modules/panels/rendering/ContentRegistry.spec.tsx +21 -14
- package/src/modules/pivot/SwipePivotContent.position.spec.tsx +12 -8
- package/src/modules/pivot/SwipePivotContent.spec.tsx +66 -25
- package/src/modules/pivot/SwipePivotContent.tsx +2 -2
- package/src/modules/pivot/SwipePivotTabBar.spec.tsx +85 -68
- package/src/modules/pivot/SwipePivotTabBar.tsx +75 -15
- package/src/modules/pivot/scaleInputState.spec.ts +11 -2
- package/src/modules/pivot/usePivot.spec.ts +17 -3
- package/src/modules/pivot/usePivotSwipeInput.spec.ts +182 -123
- package/src/modules/stack/SwipeStackContent.spec.tsx +387 -100
- package/src/modules/stack/SwipeStackContent.tsx +43 -33
- package/src/modules/stack/SwipeStackOutlet.spec.tsx +14 -16
- package/src/modules/stack/SwipeStackOutlet.tsx +6 -6
- package/src/modules/stack/computeSwipeStackTransform.spec.ts +5 -5
- package/src/modules/stack/computeSwipeStackTransform.ts +3 -3
- package/src/modules/stack/swipeTransitionContinuity.spec.tsx +1133 -0
- package/src/modules/stack/useStackAnimationState.spec.ts +3 -1
- package/src/modules/stack/useStackAnimationState.ts +18 -13
- package/src/modules/stack/useStackNavigation.spec.ts +198 -3
- package/src/modules/stack/useStackNavigation.tsx +113 -56
- package/src/modules/stack/useStackSwipeInput.spec.ts +65 -32
- package/src/modules/stack/useStackSwipeInput.ts +1 -1
- package/src/sticky-header/StickyArea.tsx +29 -57
- package/src/sticky-header/calculateStickyMetrics.spec.ts +105 -0
- package/src/sticky-header/calculateStickyMetrics.ts +50 -0
- package/src/types.ts +33 -0
- package/src/window/index.ts +2 -0
- package/dist/FloatingWindow-BpdOpg_L.js +0 -400
- package/dist/FloatingWindow-BpdOpg_L.js.map +0 -1
- package/dist/FloatingWindow-TCDNY5gE.cjs +0 -2
- package/dist/FloatingWindow-TCDNY5gE.cjs.map +0 -1
- package/dist/GridLayout-B4VRsC0r.cjs +0 -2
- package/dist/GridLayout-BltqeCPK.js +0 -927
- package/dist/PanelSystem-Bs8bQwQF.cjs +0 -3
- package/dist/PanelSystem-Bs8bQwQF.cjs.map +0 -1
- package/dist/PanelSystem-Dr1TBhxM.js.map +0 -1
- package/dist/ResizeHandle-CScipO5l.cjs +0 -2
- package/dist/SwipePivotTabBar-BGO9X94m.js +0 -407
- package/dist/SwipePivotTabBar-BGO9X94m.js.map +0 -1
- package/dist/SwipePivotTabBar-BrQismcZ.cjs +0 -2
- package/dist/SwipePivotTabBar-BrQismcZ.cjs.map +0 -1
- package/dist/useDocumentPointerEvents-CKdhGXd0.js +0 -46
- package/dist/useDocumentPointerEvents-CKdhGXd0.js.map +0 -1
- package/dist/useDocumentPointerEvents-ChqrKXDk.cjs +0 -2
- package/dist/useDocumentPointerEvents-ChqrKXDk.cjs.map +0 -1
- package/dist/useEffectEvent-Dp7HLCf0.js +0 -13
- package/dist/useEffectEvent-Dp7HLCf0.js.map +0 -1
- package/dist/useEffectEvent-huSsGUnl.cjs +0 -2
- package/dist/useEffectEvent-huSsGUnl.cjs.map +0 -1
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Drawer style computation utilities.
|
|
3
|
+
*
|
|
4
|
+
* Provides pure functions for computing drawer styles based on configuration.
|
|
5
|
+
*/
|
|
6
|
+
import type * as React from "react";
|
|
7
|
+
import type { DrawerBehavior } from "../../types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Base backdrop style shared by backdrop and edge zone.
|
|
10
|
+
*/
|
|
11
|
+
export declare const DRAWER_BACKDROP_BASE_STYLE: React.CSSProperties;
|
|
12
|
+
/**
|
|
13
|
+
* Base drawer panel style.
|
|
14
|
+
*/
|
|
15
|
+
export declare const DRAWER_PANEL_BASE_STYLE: React.CSSProperties;
|
|
16
|
+
/**
|
|
17
|
+
* Placement-specific styles for drawer positioning.
|
|
18
|
+
*/
|
|
19
|
+
export type DrawerPlacement = "left" | "right" | "top" | "bottom";
|
|
20
|
+
/**
|
|
21
|
+
* Get placement-specific style.
|
|
22
|
+
*/
|
|
23
|
+
export declare function getPlacementStyle(placement: DrawerPlacement): React.CSSProperties;
|
|
24
|
+
/**
|
|
25
|
+
* Get transform value for open state.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getOpenTransform(placement: DrawerPlacement): string;
|
|
28
|
+
/**
|
|
29
|
+
* Get closed transform value.
|
|
30
|
+
*/
|
|
31
|
+
export declare function getClosedTransform(placement: DrawerPlacement): string;
|
|
32
|
+
/**
|
|
33
|
+
* Get reveal mode transform based on open state.
|
|
34
|
+
* When closed, drawer is partially hidden. When open, fully visible.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getRevealTransform(placement: DrawerPlacement, isOpen: boolean): string;
|
|
37
|
+
/**
|
|
38
|
+
* Compute CSS transition value.
|
|
39
|
+
*/
|
|
40
|
+
export declare function computeTransitionValue(mode: DrawerBehavior["transitionMode"] | undefined, duration: DrawerBehavior["transitionDuration"], easing: DrawerBehavior["transitionEasing"]): string | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Compute backdrop transition value.
|
|
43
|
+
*/
|
|
44
|
+
export declare function computeBackdropTransition(mode: DrawerBehavior["transitionMode"] | undefined, duration: DrawerBehavior["transitionDuration"]): string | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Check if placement is horizontal (left/right).
|
|
47
|
+
*/
|
|
48
|
+
export declare function isHorizontalPlacement(placement: DrawerPlacement): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Format dimension value to CSS string.
|
|
51
|
+
*/
|
|
52
|
+
export declare function formatDimension(value: string | number | undefined): string | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Options for computing edge zone style.
|
|
55
|
+
*/
|
|
56
|
+
export type EdgeZoneStyleOptions = {
|
|
57
|
+
placement: DrawerPlacement;
|
|
58
|
+
inline: boolean;
|
|
59
|
+
edgeWidth: number;
|
|
60
|
+
zIndex: number | undefined;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Compute edge zone style based on placement and positioning context.
|
|
64
|
+
*
|
|
65
|
+
* The edge zone is positioned at the edge where the drawer appears from:
|
|
66
|
+
* - left drawer: left edge of the container
|
|
67
|
+
* - right drawer: right edge of the container
|
|
68
|
+
* - top drawer: top edge of the container
|
|
69
|
+
* - bottom drawer: bottom edge of the container
|
|
70
|
+
*
|
|
71
|
+
* When inline=true, uses absolute positioning (relative to parent container).
|
|
72
|
+
* When inline=false, uses fixed positioning (relative to viewport).
|
|
73
|
+
*/
|
|
74
|
+
export declare function computeEdgeZoneStyle(options: EdgeZoneStyleOptions): React.CSSProperties;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Drawer swipe gesture configuration parsing.
|
|
3
|
+
*
|
|
4
|
+
* Normalizes swipeGestures config from DrawerBehavior into a consistent shape.
|
|
5
|
+
*/
|
|
6
|
+
import type { DrawerBehavior, WindowPosition } from "../../types.js";
|
|
7
|
+
import type { DrawerPlacement } from "./drawerStyles.js";
|
|
8
|
+
/**
|
|
9
|
+
* Normalized swipe gesture configuration.
|
|
10
|
+
*/
|
|
11
|
+
export type NormalizedSwipeConfig = {
|
|
12
|
+
enabled: boolean;
|
|
13
|
+
edgeSwipeOpen: boolean;
|
|
14
|
+
swipeClose: boolean;
|
|
15
|
+
edgeWidth: number;
|
|
16
|
+
dismissThreshold: number;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Parse swipeGestures config into normalized options.
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseSwipeGesturesConfig(swipeGestures: DrawerBehavior["swipeGestures"]): NormalizedSwipeConfig;
|
|
22
|
+
/**
|
|
23
|
+
* Resolve drawer placement from anchor and position.
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolvePlacement(anchor: DrawerBehavior["anchor"], position: WindowPosition | undefined): DrawerPlacement;
|
|
26
|
+
/**
|
|
27
|
+
* Determine if edge zone should be visible.
|
|
28
|
+
*/
|
|
29
|
+
export declare function shouldShowEdgeZone(config: NormalizedSwipeConfig, isOpen: boolean, isOpening: boolean): boolean;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Hook for applying real-time transform during drawer swipe gestures (backward-compatible wrapper).
|
|
3
|
+
*
|
|
4
|
+
* This hook is a thin wrapper around useDrawerTransform with mode="overlay".
|
|
5
|
+
* For new code, prefer using useDrawerTransform directly.
|
|
6
|
+
*
|
|
7
|
+
* @deprecated Use useDrawerTransform with mode="overlay" instead.
|
|
8
|
+
*/
|
|
9
|
+
import * as React from "react";
|
|
10
|
+
import type { ContinuousOperationState } from "../../hooks/gesture/types.js";
|
|
11
|
+
import type { DrawerSwipeDirection } from "../../modules/drawer/types.js";
|
|
12
|
+
type UseDrawerSwipeTransformOptions = {
|
|
13
|
+
drawerRef: React.RefObject<HTMLDivElement | null>;
|
|
14
|
+
backdropRef: React.RefObject<HTMLDivElement | null>;
|
|
15
|
+
placement: DrawerSwipeDirection;
|
|
16
|
+
swipeState: ContinuousOperationState;
|
|
17
|
+
displacement: number;
|
|
18
|
+
isOpening: boolean;
|
|
19
|
+
isClosing: boolean;
|
|
20
|
+
isOpen: boolean;
|
|
21
|
+
enabled: boolean;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Apply real-time transform to drawer and backdrop during swipe.
|
|
25
|
+
*
|
|
26
|
+
* @deprecated Use useDrawerTransform with mode="overlay" instead.
|
|
27
|
+
*/
|
|
28
|
+
export declare function useDrawerSwipeTransform(options: UseDrawerSwipeTransformOptions): void;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Unified hook for drawer transform animations.
|
|
3
|
+
*
|
|
4
|
+
* This hook provides a single interface for both reveal and overlay drawer modes.
|
|
5
|
+
* It uses a strategy pattern internally to handle mode-specific position calculations
|
|
6
|
+
* and DOM operations while sharing the common state machine logic.
|
|
7
|
+
*/
|
|
8
|
+
import * as React from "react";
|
|
9
|
+
import type { ContinuousOperationState } from "../../hooks/gesture/types.js";
|
|
10
|
+
import type { DrawerPlacement } from "./drawerStyles.js";
|
|
11
|
+
/**
|
|
12
|
+
* Drawer animation mode.
|
|
13
|
+
*/
|
|
14
|
+
export type DrawerMode = "reveal" | "overlay";
|
|
15
|
+
/**
|
|
16
|
+
* Phase of drawer animation lifecycle.
|
|
17
|
+
*/
|
|
18
|
+
export type DrawerAnimationPhase = "idle" | "opening" | "open" | "closing" | "closed";
|
|
19
|
+
/**
|
|
20
|
+
* Options for useDrawerTransform hook.
|
|
21
|
+
*/
|
|
22
|
+
export type UseDrawerTransformOptions = {
|
|
23
|
+
/** Animation mode */
|
|
24
|
+
mode: DrawerMode;
|
|
25
|
+
/** Ref to the drawer element */
|
|
26
|
+
drawerRef: React.RefObject<HTMLElement | null>;
|
|
27
|
+
/** Ref to the content element (reveal mode) */
|
|
28
|
+
contentRef?: React.RefObject<HTMLElement | null>;
|
|
29
|
+
/** Ref to the backdrop element (overlay mode) */
|
|
30
|
+
backdropRef?: React.RefObject<HTMLElement | null>;
|
|
31
|
+
/** Drawer placement */
|
|
32
|
+
placement: DrawerPlacement;
|
|
33
|
+
/** Drawer size in pixels */
|
|
34
|
+
drawerSize: number;
|
|
35
|
+
/** Whether the drawer is open */
|
|
36
|
+
isOpen: boolean;
|
|
37
|
+
/** Current swipe state */
|
|
38
|
+
swipeState: ContinuousOperationState;
|
|
39
|
+
/** Current swipe displacement */
|
|
40
|
+
displacement: number;
|
|
41
|
+
/** Whether opening via swipe */
|
|
42
|
+
isOpening: boolean;
|
|
43
|
+
/** Whether closing via swipe */
|
|
44
|
+
isClosing: boolean;
|
|
45
|
+
/** Whether this hook is enabled */
|
|
46
|
+
enabled: boolean;
|
|
47
|
+
/** Whether drawer is inline (affects content element for reveal mode) */
|
|
48
|
+
inline?: boolean;
|
|
49
|
+
/** Grid container ref for inline mode (reveal mode) */
|
|
50
|
+
gridRef?: React.RefObject<HTMLElement | null>;
|
|
51
|
+
/** Content background color (reveal mode) */
|
|
52
|
+
contentBackground?: string;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Result from useDrawerTransform hook.
|
|
56
|
+
*/
|
|
57
|
+
export type UseDrawerTransformResult = {
|
|
58
|
+
/** Current animation phase */
|
|
59
|
+
phase: DrawerAnimationPhase;
|
|
60
|
+
/** Whether any animation is running */
|
|
61
|
+
isAnimating: boolean;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Unified hook for drawer transform animations.
|
|
65
|
+
*
|
|
66
|
+
* Supports both reveal and overlay modes through a strategy pattern.
|
|
67
|
+
*/
|
|
68
|
+
export declare function useDrawerTransform(options: UseDrawerTransformOptions): UseDrawerTransformResult;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Hook for managing reveal-mode drawer transform (backward-compatible wrapper).
|
|
3
|
+
*
|
|
4
|
+
* This hook is a thin wrapper around useDrawerTransform with mode="reveal".
|
|
5
|
+
* For new code, prefer using useDrawerTransform directly.
|
|
6
|
+
*
|
|
7
|
+
* @deprecated Use useDrawerTransform with mode="reveal" instead.
|
|
8
|
+
*/
|
|
9
|
+
import * as React from "react";
|
|
10
|
+
import type { ContinuousOperationState } from "../../hooks/gesture/types.js";
|
|
11
|
+
import type { DrawerPlacement } from "./drawerStyles.js";
|
|
12
|
+
import { type DrawerAnimationPhase, type UseDrawerTransformResult } from "./useDrawerTransform.js";
|
|
13
|
+
/**
|
|
14
|
+
* Phase of reveal drawer animation lifecycle.
|
|
15
|
+
* @deprecated Use DrawerAnimationPhase from useDrawerTransform.ts
|
|
16
|
+
*/
|
|
17
|
+
export type RevealDrawerAnimationPhase = DrawerAnimationPhase;
|
|
18
|
+
/**
|
|
19
|
+
* Options for useRevealDrawerTransform hook.
|
|
20
|
+
*/
|
|
21
|
+
export type UseRevealDrawerTransformOptions = {
|
|
22
|
+
/** Ref to the drawer element */
|
|
23
|
+
drawerRef: React.RefObject<HTMLElement | null>;
|
|
24
|
+
/** Drawer placement */
|
|
25
|
+
placement: DrawerPlacement;
|
|
26
|
+
/** Drawer size in pixels */
|
|
27
|
+
drawerSize: number;
|
|
28
|
+
/** Whether the drawer is open */
|
|
29
|
+
isOpen: boolean;
|
|
30
|
+
/** Current swipe state */
|
|
31
|
+
swipeState: ContinuousOperationState;
|
|
32
|
+
/** Current swipe displacement */
|
|
33
|
+
displacement: number;
|
|
34
|
+
/** Whether opening via swipe */
|
|
35
|
+
isOpening: boolean;
|
|
36
|
+
/** Whether closing via swipe */
|
|
37
|
+
isClosing: boolean;
|
|
38
|
+
/** Whether this hook is enabled */
|
|
39
|
+
enabled: boolean;
|
|
40
|
+
/** Whether drawer is inline (affects target element) */
|
|
41
|
+
inline: boolean;
|
|
42
|
+
/** Grid container ref for inline mode */
|
|
43
|
+
gridRef?: React.RefObject<HTMLElement | null>;
|
|
44
|
+
/** Content background color for stacking context */
|
|
45
|
+
contentBackground?: string;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Result from useRevealDrawerTransform hook.
|
|
49
|
+
*/
|
|
50
|
+
export type UseRevealDrawerTransformResult = UseDrawerTransformResult;
|
|
51
|
+
/**
|
|
52
|
+
* Hook for managing reveal-mode drawer transform.
|
|
53
|
+
*
|
|
54
|
+
* @deprecated Use useDrawerTransform with mode="reveal" instead.
|
|
55
|
+
*/
|
|
56
|
+
export declare function useRevealDrawerTransform(options: UseRevealDrawerTransformOptions): UseRevealDrawerTransformResult;
|
package/dist/config.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const y=require("react/jsx-runtime"),v=require("react"),b=require("./GridLayout-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const y=require("react/jsx-runtime"),v=require("react"),b=require("./GridLayout-DNOClFzz.cjs");require("react-dom");require("./FloatingPanelFrame-CEmXDvUA.cjs");require("./FloatingWindow-Cvyokf0m.cjs");function E(t){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const n in t)if(n!=="default"){const i=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(r,n,i.get?i:{enumerable:!0,get:()=>t[n]})}}return r.default=t,Object.freeze(r)}const s=E(v),C=t=>{const r=z(t);if(r==="grid"&&!t.area)throw new Error(`PanelRoute ${t.id} must specify 'area' for grid placement.`);return{id:t.id,component:t.element,visible:t.visible,gridArea:t.area,positionMode:r,position:t.position,zIndex:t.zIndex,width:t.width,height:t.height,pointerEvents:t.pointerEvents,style:t.style,drawer:t.drawer,floating:t.floating,pivot:t.pivot,backdropStyle:t.backdropStyle}},z=t=>t.positionMode?t.positionMode:t.floating?"absolute":(t.drawer,"grid"),P=t=>{const r=[],n=i=>{r.push(i),i.children&&i.children.forEach(e=>n(e))};return t.forEach(i=>n(i)),r},I=t=>{const r=new Set;t.forEach(n=>{if(r.has(n.id))throw new Error(`Duplicate PanelRoute id detected: ${n.id}`);r.add(n.id)})},A=t=>{const r=P(t);return I(r),r.map(n=>C(n))},p=()=>null,x=()=>null,a=(t,r)=>s.isValidElement(t)?t.type===r:!1,d=t=>{const r=[],n=i=>{if(!(i==null||typeof i=="boolean")){if(Array.isArray(i)){i.forEach(n);return}if(a(i,p)){const e=i.props;if(!e.id)throw new Error("<Panel> requires an 'id' prop.");if(e.type==="grid"){if(!e.area)throw new Error(`<Panel id="${e.id}"> requires an explicit 'area' prop when type="grid".`);r.push({id:e.id,area:e.area,element:e.children??null,visible:e.visible,zIndex:e.zIndex,width:e.width,height:e.height,pointerEvents:e.pointerEvents,style:e.style});return}if(e.type==="floating"){if(!e.position)throw new Error(`<Panel id="${e.id}"> requires a 'position' prop when type="floating".`);if(e.width===void 0||e.height===void 0)throw new Error(`<Panel id="${e.id}"> requires 'width' and 'height' when type="floating".`);r.push({id:e.id,element:e.children??null,visible:e.visible??!0,positionMode:"absolute",position:e.position,zIndex:e.zIndex,width:e.width,height:e.height,pointerEvents:e.pointerEvents,style:e.style,floating:{mode:"embedded",draggable:e.draggable,resizable:e.resizable}});return}if(e.type==="drawer"){r.push({id:e.id,element:e.children??null,visible:e.visible??!0,positionMode:"relative",position:e.position,zIndex:e.zIndex,width:e.width,height:e.height,pointerEvents:e.pointerEvents,style:e.style,drawer:e.drawer,backdropStyle:e.backdropStyle});return}if(e.type==="pivot"){if(!e.area)throw new Error(`<Panel id="${e.id}"> requires an explicit 'area' prop when type="pivot".`);const o=$(e.children);if(o.length===0)throw new Error(`<Panel id="${e.id}"> requires at least one <PivotItem> child when type="pivot".`);r.push({id:e.id,area:e.area,element:null,visible:e.visible,zIndex:e.zIndex,width:e.width,height:e.height,pointerEvents:e.pointerEvents,style:e.style,pivot:{items:o,activeId:e.activeId,defaultActiveId:e.defaultActiveId,onActiveChange:e.onActiveChange}});return}throw new Error("<Panel> has unsupported type.")}if(s.isValidElement(i)){if(i.type===s.Fragment){n(i.props.children);return}return}}};return n(t),r},R=({config:t,style:r,children:n})=>{const i=s.useMemo(()=>d(n),[n]),e=s.useMemo(()=>A(i),[i]),o=s.useMemo(()=>{if(t)return t;const l=m(n);if(!l)throw new Error("Panel requires either 'config' prop or a JSX config (<Config><Rows/><Columns/><Areas/></Config>). ");return l},[n,t]);return y.jsx(b.GridLayout,{config:o,layers:e,style:r})},h=()=>null,q=()=>null,S=()=>null,f=()=>null,w=()=>null,g=()=>null,u=(t,r)=>{const n=[],i=e=>{if(!(e==null||typeof e=="boolean")){if(Array.isArray(e)){e.forEach(i);return}if(a(e,r)){const o=e.props;if(!o.size)throw new Error("Row/Col requires 'size' property.");n.push({size:o.size,resizable:o.resizable,minSize:o.minSize,maxSize:o.maxSize});return}s.isValidElement(e)&&i(e.props.children)}};return i(t),n},M=t=>{const r=c(t,h);if(!r)return null;const n=r.props,i=u(r.props.children,f),e=u(r.props.children,w),o=c(r.props.children,g),l=o?o.props.matrix:void 0;return{gap:n.gap,style:n.style,rows:i,columns:e,areas:l}},c=(t,r)=>{const n=i=>{if(i==null||typeof i=="boolean")return null;if(Array.isArray(i)){for(const e of i){const o=n(e);if(o)return o}return null}return a(i,r)?i:s.isValidElement(i)?n(i.props.children):null};return n(t)},$=t=>{const r=[],n=i=>{if(!(i==null||typeof i=="boolean")){if(Array.isArray(i)){i.forEach(n);return}if(a(i,x)){const e=i.props;if(!e.id)throw new Error("<PivotItem> requires an 'id' prop.");r.push({id:e.id,label:e.label,content:e.children??null,disabled:e.disabled});return}s.isValidElement(i)&&i.type===s.Fragment&&n(i.props.children)}};return n(t),r},m=t=>{const r=M(t);if(!r)return null;if(!r.rows||r.rows.length===0)throw new Error("Config must include at least one <Row size=...> inside <Config>.");if(!r.columns||r.columns.length===0)throw new Error("Config must include at least one <Col size=...> inside <Config>.");if(!r.areas||r.areas.length===0)throw new Error("Config must include <Areas matrix={...}> inside <Config>.");const n=r.areas.length,i=r.areas[0]?.length??0;if(n!==r.rows.length)throw new Error(`Areas row count (${n}) must match Rows count (${r.rows.length}).`);if(i!==r.columns.length)throw new Error(`Areas column count (${i}) must match Columns count (${r.columns.length}).`);return{areas:r.areas,rows:r.rows,columns:r.columns,gap:r.gap,style:r.style}};exports.Areas=g;exports.Col=w;exports.Columns=S;exports.Config=h;exports.Panel=p;exports.PanelLayout=R;exports.Row=f;exports.Rows=q;exports.buildConfigFromChildren=m;exports.buildRoutesFromChildren=d;
|
|
2
2
|
//# sourceMappingURL=config.cjs.map
|
package/dist/config.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.cjs","sources":["../src/config/panelRouter.tsx","../src/config/PanelContentDeclaration.tsx"],"sourcesContent":["/**\n * @file Router-like builder for GridLayout\n *\n * Provides a React Router–style configuration API to declare panel layers.\n * Converts route objects to the existing GridLayout props without magic.\n */\nimport * as React from \"react\";\nimport type {\n DrawerBehavior,\n FloatingBehavior,\n LayerDefinition,\n LayerPositionMode,\n PanelLayoutConfig,\n PanelLayoutProps,\n PivotBehavior,\n WindowPosition,\n} from \"../types\";\nimport { GridLayout } from \"../components/grid/GridLayout\";\n\nexport type PanelRoute = {\n /** Unique id for the layer. Required. */\n id: string;\n /** React node to render for this layer. Required. */\n element: React.ReactNode;\n /** Visibility flag. Defaults to visible. */\n visible?: boolean;\n\n /**\n * Grid placement key. When using `positionMode: 'grid'` (default), this must be provided.\n * Using `area` mirrors React Router's route path intent but for grid cells.\n */\n area?: string;\n\n /** Explicit positioning mode; defaults to 'grid' unless floating/drawer implies otherwise. */\n positionMode?: LayerPositionMode;\n /** Offsets when using non-grid modes. */\n position?: WindowPosition;\n /** Optional stacking order. */\n zIndex?: number;\n /** Optional dimensions; required for resizable/draggable floating layers. */\n width?: number | string;\n height?: number | string;\n /** Pointer events control. */\n pointerEvents?: boolean | \"auto\" | \"none\";\n /** Optional style overrides. */\n style?: React.CSSProperties;\n /** Optional backdrop style (drawer). */\n backdropStyle?: React.CSSProperties;\n\n /** Drawer behavior for mobile-friendly panels. */\n drawer?: DrawerBehavior;\n /** Floating window configuration. */\n floating?: FloatingBehavior;\n /** Pivot behavior for content switching. */\n pivot?: PivotBehavior;\n\n /**\n * Optional child declarations; purely a grouping convenience.\n * Children are flattened; no implicit inheritance.\n */\n children?: PanelRoute[];\n};\n\nconst toLayer = (route: PanelRoute): LayerDefinition => {\n const inferredMode: LayerPositionMode = resolveRoutePositionMode(route);\n\n if (inferredMode === \"grid\") {\n if (!route.area) {\n throw new Error(`PanelRoute ${route.id} must specify 'area' for grid placement.`);\n }\n }\n\n return {\n id: route.id,\n component: route.element,\n visible: route.visible,\n gridArea: route.area,\n positionMode: inferredMode,\n position: route.position,\n zIndex: route.zIndex,\n width: route.width,\n height: route.height,\n pointerEvents: route.pointerEvents,\n style: route.style,\n drawer: route.drawer,\n floating: route.floating,\n pivot: route.pivot,\n backdropStyle: route.backdropStyle,\n } satisfies LayerDefinition;\n};\n\nconst resolveRoutePositionMode = (route: PanelRoute): LayerPositionMode => {\n if (route.positionMode) {\n return route.positionMode;\n }\n if (route.floating) {\n // Embedded => absolute, Popup => relative (handled by renderer); keep explicitness here.\n return \"absolute\";\n }\n if (route.drawer) {\n return \"grid\";\n }\n return \"grid\";\n};\n\nconst flattenRoutes = (routes: PanelRoute[]): PanelRoute[] => {\n const result: PanelRoute[] = [];\n const walk = (node: PanelRoute): void => {\n result.push(node);\n if (node.children) {\n node.children.forEach((child) => walk(child));\n }\n };\n routes.forEach((r) => walk(r));\n return result;\n};\n\nconst validateUniqueIds = (routes: PanelRoute[]): void => {\n const seen = new Set<string>();\n routes.forEach((r) => {\n if (seen.has(r.id)) {\n throw new Error(`Duplicate PanelRoute id detected: ${r.id}`);\n }\n seen.add(r.id);\n });\n};\n\nexport const buildLayersFromRoutes = (routes: PanelRoute[]): LayerDefinition[] => {\n const flat = flattenRoutes(routes);\n validateUniqueIds(flat);\n return flat.map((r) => toLayer(r));\n};\n\nexport const createPanelLayoutFromRoutes = (input: {\n config: PanelLayoutConfig;\n routes: PanelRoute[];\n style?: React.CSSProperties;\n}): PanelLayoutProps => {\n const layers = buildLayersFromRoutes(input.routes);\n return {\n config: input.config,\n layers,\n };\n};\n\nexport type PanelLayoutRouterProps = {\n config: PanelLayoutConfig;\n routes: PanelRoute[];\n style?: React.CSSProperties;\n};\n\nexport const PanelLayoutRouter: React.FC<PanelLayoutRouterProps> = ({ config, routes, style }) => {\n const layers = React.useMemo(() => buildLayersFromRoutes(routes), [routes]);\n return <GridLayout config={config} layers={layers} style={style} />;\n};\n","/**\n * @file PanelContentDeclaration (JSX DSL for content configuration ONLY)\n *\n * IMPORTANT: This file declares a JSX DSL to configure panel \"content\" and layout\n * tracks. It does NOT implement grid rendering, resizing, dragging, or drawers.\n * Those behaviors live in the existing layout/rendering modules. Keep this file\n * limited to declaration and conversion into GridLayout props.\n *\n * Usage (content declaration):\n * <PanelLayout>\n * <Config>\n * <Rows>...</Rows>\n * <Columns>...</Columns>\n * <Areas matrix={...}/>\n * </Config>\n * <Panel type=\"grid\" id=\"main\" area=\"main\">...</Panel>\n * <Panel type=\"floating\" id=\"preview\" position={{ left: 0, top: 0 }} width={300} height={200} />\n * <Panel type=\"drawer\" id=\"nav\" drawer={{ defaultOpen: true }} position={{ left: 0 }} />\n * </PanelLayout>\n */\nimport * as React from \"react\";\nimport { GridLayout } from \"../components/grid/GridLayout\";\nimport type { DrawerBehavior, GridTrack, PanelLayoutConfig, WindowPosition } from \"../types\";\nimport type { PanelRoute } from \"./panelRouter\";\nimport { buildLayersFromRoutes } from \"./panelRouter\";\n\nexport type PanelRootProps = {\n config?: PanelLayoutConfig;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n};\n\n// Unified child declaration: <Panel type=\"grid\" .../> or <Panel type=\"floating\" .../>...\ntype PanelCommonProps = {\n id: string;\n visible?: boolean;\n zIndex?: number;\n width?: number | string;\n height?: number | string;\n pointerEvents?: boolean | \"auto\" | \"none\";\n style?: React.CSSProperties;\n children?: React.ReactNode;\n};\n\nexport type PanelProps =\n | (PanelCommonProps & { type: \"grid\"; area: string })\n | (PanelCommonProps & {\n type: \"floating\";\n position: WindowPosition;\n width: number | string;\n height: number | string;\n draggable?: boolean;\n resizable?: boolean;\n })\n | (PanelCommonProps & {\n type: \"drawer\";\n drawer: DrawerBehavior;\n position?: WindowPosition;\n backdropStyle?: React.CSSProperties;\n })\n | (Omit<PanelCommonProps, \"children\"> & {\n type: \"pivot\";\n area: string;\n /** Currently active item ID (controlled mode) */\n activeId?: string;\n /** Default active item ID (uncontrolled mode) */\n defaultActiveId?: string;\n /** Callback when active item changes */\n onActiveChange?: (id: string) => void;\n children?: React.ReactNode;\n });\n\nexport const Panel: React.FC<PanelProps> = () => null;\n\n/**\n * PivotItem declaration for use inside <Panel type=\"pivot\">\n */\nexport type PivotItemDeclProps = {\n id: string;\n label?: string;\n disabled?: boolean;\n children?: React.ReactNode;\n};\n\nexport const PivotItem: React.FC<PivotItemDeclProps> = () => null;\n\nconst isElementOf = <P,>(element: unknown, component: React.FC<P>): element is React.ReactElement<P> => {\n if (!React.isValidElement<P>(element)) {\n return false;\n }\n return element.type === component;\n};\n\nexport const buildRoutesFromChildren = (children: React.ReactNode): PanelRoute[] => {\n const routes: PanelRoute[] = [];\n\n const visit = (node: React.ReactNode): void => {\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return;\n }\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n // Unified <Panel type=\"...\" />\n if (isElementOf(node, Panel)) {\n const props = node.props as PanelProps;\n if (!props.id) {\n throw new Error(\"<Panel> requires an 'id' prop.\");\n }\n if (props.type === \"grid\") {\n if (!props.area) {\n throw new Error(`<Panel id=\"${props.id}\"> requires an explicit 'area' prop when type=\"grid\".`);\n }\n routes.push({\n id: props.id,\n area: props.area,\n element: props.children ?? null,\n visible: props.visible,\n zIndex: props.zIndex,\n width: props.width,\n height: props.height,\n pointerEvents: props.pointerEvents,\n style: props.style,\n });\n return;\n }\n if (props.type === \"floating\") {\n if (!props.position) {\n throw new Error(`<Panel id=\"${props.id}\"> requires a 'position' prop when type=\"floating\".`);\n }\n if (props.width === undefined || props.height === undefined) {\n throw new Error(`<Panel id=\"${props.id}\"> requires 'width' and 'height' when type=\"floating\".`);\n }\n routes.push({\n id: props.id,\n element: props.children ?? null,\n visible: props.visible ?? true,\n positionMode: \"absolute\",\n position: props.position,\n zIndex: props.zIndex,\n width: props.width,\n height: props.height,\n pointerEvents: props.pointerEvents,\n style: props.style,\n floating: { mode: \"embedded\", draggable: props.draggable, resizable: props.resizable },\n });\n return;\n }\n if (props.type === \"drawer\") {\n routes.push({\n id: props.id,\n element: props.children ?? null,\n visible: props.visible ?? true,\n positionMode: \"relative\",\n position: props.position,\n zIndex: props.zIndex,\n width: props.width,\n height: props.height,\n pointerEvents: props.pointerEvents,\n style: props.style,\n drawer: props.drawer,\n backdropStyle: props.backdropStyle,\n });\n return;\n }\n if (props.type === \"pivot\") {\n if (!props.area) {\n throw new Error(`<Panel id=\"${props.id}\"> requires an explicit 'area' prop when type=\"pivot\".`);\n }\n const pivotItems = collectPivotItems(props.children);\n if (pivotItems.length === 0) {\n throw new Error(`<Panel id=\"${props.id}\"> requires at least one <PivotItem> child when type=\"pivot\".`);\n }\n routes.push({\n id: props.id,\n area: props.area,\n element: null,\n visible: props.visible,\n zIndex: props.zIndex,\n width: props.width,\n height: props.height,\n pointerEvents: props.pointerEvents,\n style: props.style,\n pivot: {\n items: pivotItems,\n activeId: props.activeId,\n defaultActiveId: props.defaultActiveId,\n onActiveChange: props.onActiveChange,\n },\n });\n return;\n }\n // unknown type -> error for explicitness\n throw new Error(\"<Panel> has unsupported type.\");\n }\n\n if (React.isValidElement(node)) {\n if (node.type === React.Fragment) {\n const el = node as React.ReactElement<{ children?: React.ReactNode }>;\n visit(el.props.children);\n return;\n }\n // Unknown element: ignore quietly to allow comments/wrappers.\n return;\n }\n // Primitive nodes (string/number) are ignored.\n };\n\n visit(children);\n return routes;\n};\n\n// Root container renamed to PanelLayout to avoid name collision with child <Panel/>\nexport const PanelLayout: React.FC<PanelRootProps> = ({ config, style, children }) => {\n const routes = React.useMemo(() => buildRoutesFromChildren(children), [children]);\n const layers = React.useMemo(() => buildLayersFromRoutes(routes), [routes]);\n const derivedConfig = React.useMemo(() => {\n if (config) {\n return config;\n }\n const built = buildConfigFromChildren(children);\n if (!built) {\n throw new Error(\"Panel requires either 'config' prop or a JSX config (<Config><Rows/><Columns/><Areas/></Config>). \");\n }\n return built;\n }, [children, config]);\n return <GridLayout config={derivedConfig} layers={layers} style={style} />;\n};\n\n// =============================\n// JSX Config Declarations\n// =============================\n\nexport type ConfigProps = {\n gap?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n};\n\nexport const Config: React.FC<ConfigProps> = () => {\n return null;\n};\n\nexport const Rows: React.FC<{ children?: React.ReactNode }> = () => {\n return null;\n};\n\nexport const Columns: React.FC<{ children?: React.ReactNode }> = () => {\n return null;\n};\n\nexport type RowProps = GridTrack;\nexport const Row: React.FC<RowProps> = () => {\n return null;\n};\n\nexport type ColumnProps = GridTrack;\nexport const Col: React.FC<ColumnProps> = () => {\n return null;\n};\n\nexport type AreasProps = {\n matrix: string[][];\n};\nexport const Areas: React.FC<AreasProps> = () => {\n return null;\n};\n\ntype CollectedConfig = {\n gap?: string;\n style?: React.CSSProperties;\n rows?: GridTrack[];\n columns?: GridTrack[];\n areas?: string[][];\n};\n\nconst collectTracks = <P extends GridTrack>(children: React.ReactNode, marker: React.FC<P>): GridTrack[] => {\n const result: GridTrack[] = [];\n const visit = (node: React.ReactNode): void => {\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return;\n }\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n if (isElementOf(node, marker)) {\n const props = node.props as P;\n if (!props.size) {\n throw new Error(\"Row/Col requires 'size' property.\");\n }\n result.push({\n size: props.size,\n resizable: props.resizable,\n minSize: props.minSize,\n maxSize: props.maxSize,\n });\n return;\n }\n if (React.isValidElement(node)) {\n const el = node as React.ReactElement<{ children?: React.ReactNode }>;\n visit(el.props.children);\n }\n };\n visit(children);\n return result;\n};\n\nconst collectConfigBlock = (children: React.ReactNode): CollectedConfig | null => {\n const node = findFirst(children, Config);\n if (!node) {\n return null;\n }\n const props = node.props as ConfigProps;\n const rows = collectTracks(node.props.children, Row);\n const columns = collectTracks(node.props.children, Col);\n const areasNode = findFirst(node.props.children, Areas);\n const areas = areasNode ? (areasNode.props as AreasProps).matrix : undefined;\n return {\n gap: props.gap,\n style: props.style,\n rows,\n columns,\n areas,\n };\n};\n\nconst findFirst = <P,>(children: React.ReactNode, marker: React.FC<P>): React.ReactElement<P> | null => {\n const visit = (node: React.ReactNode): React.ReactElement<P> | null => {\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return null;\n }\n if (Array.isArray(node)) {\n for (const item of node) {\n const found = visit(item);\n if (found) {\n return found;\n }\n }\n return null;\n }\n if (isElementOf(node, marker)) {\n return node as React.ReactElement<P>;\n }\n if (React.isValidElement(node)) {\n const el = node as React.ReactElement<{ children?: React.ReactNode }>;\n return visit(el.props.children);\n }\n return null;\n };\n return visit(children);\n};\n\ntype CollectedPivotItem = {\n id: string;\n label?: string;\n content: React.ReactNode;\n disabled?: boolean;\n};\n\nconst collectPivotItems = (children: React.ReactNode): CollectedPivotItem[] => {\n const items: CollectedPivotItem[] = [];\n const visit = (node: React.ReactNode): void => {\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return;\n }\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n if (isElementOf(node, PivotItem)) {\n const props = node.props as PivotItemDeclProps;\n if (!props.id) {\n throw new Error(\"<PivotItem> requires an 'id' prop.\");\n }\n items.push({\n id: props.id,\n label: props.label,\n content: props.children ?? null,\n disabled: props.disabled,\n });\n return;\n }\n if (React.isValidElement(node)) {\n if (node.type === React.Fragment) {\n const el = node as React.ReactElement<{ children?: React.ReactNode }>;\n visit(el.props.children);\n }\n }\n };\n visit(children);\n return items;\n};\n\nexport const buildConfigFromChildren = (children: React.ReactNode): PanelLayoutConfig | null => {\n const collected = collectConfigBlock(children);\n if (!collected) {\n return null;\n }\n if (!collected.rows || collected.rows.length === 0) {\n throw new Error(\"Config must include at least one <Row size=...> inside <Config>.\");\n }\n if (!collected.columns || collected.columns.length === 0) {\n throw new Error(\"Config must include at least one <Col size=...> inside <Config>.\");\n }\n if (!collected.areas || collected.areas.length === 0) {\n throw new Error(\"Config must include <Areas matrix={...}> inside <Config>.\");\n }\n\n const rowCount = collected.areas.length;\n const colCount = collected.areas[0]?.length ?? 0;\n if (rowCount !== collected.rows.length) {\n throw new Error(`Areas row count (${rowCount}) must match Rows count (${collected.rows.length}).`);\n }\n if (colCount !== collected.columns.length) {\n throw new Error(`Areas column count (${colCount}) must match Columns count (${collected.columns.length}).`);\n }\n\n return {\n areas: collected.areas,\n rows: collected.rows,\n columns: collected.columns,\n gap: collected.gap,\n style: collected.style,\n } satisfies PanelLayoutConfig;\n};\n"],"names":["toLayer","route","inferredMode","resolveRoutePositionMode","flattenRoutes","routes","result","walk","node","child","r","validateUniqueIds","seen","buildLayersFromRoutes","flat","Panel","PivotItem","isElementOf","element","component","React","buildRoutesFromChildren","children","visit","props","pivotItems","collectPivotItems","PanelLayout","config","style","layers","derivedConfig","built","buildConfigFromChildren","jsx","GridLayout","Config","Rows","Columns","Row","Col","Areas","collectTracks","marker","collectConfigBlock","findFirst","rows","columns","areasNode","areas","item","found","items","collected","rowCount","colCount"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.cjs","sources":["../src/config/panelRouter.tsx","../src/config/PanelContentDeclaration.tsx"],"sourcesContent":["/**\n * @file Router-like builder for GridLayout\n *\n * Provides a React Router–style configuration API to declare panel layers.\n * Converts route objects to the existing GridLayout props without magic.\n */\nimport * as React from \"react\";\nimport type {\n DrawerBehavior,\n FloatingBehavior,\n LayerDefinition,\n LayerPositionMode,\n PanelLayoutConfig,\n PanelLayoutProps,\n PivotBehavior,\n WindowPosition,\n} from \"../types\";\nimport { GridLayout } from \"../components/grid/GridLayout\";\n\nexport type PanelRoute = {\n /** Unique id for the layer. Required. */\n id: string;\n /** React node to render for this layer. Required. */\n element: React.ReactNode;\n /** Visibility flag. Defaults to visible. */\n visible?: boolean;\n\n /**\n * Grid placement key. When using `positionMode: 'grid'` (default), this must be provided.\n * Using `area` mirrors React Router's route path intent but for grid cells.\n */\n area?: string;\n\n /** Explicit positioning mode; defaults to 'grid' unless floating/drawer implies otherwise. */\n positionMode?: LayerPositionMode;\n /** Offsets when using non-grid modes. */\n position?: WindowPosition;\n /** Optional stacking order. */\n zIndex?: number;\n /** Optional dimensions; required for resizable/draggable floating layers. */\n width?: number | string;\n height?: number | string;\n /** Pointer events control. */\n pointerEvents?: boolean | \"auto\" | \"none\";\n /** Optional style overrides. */\n style?: React.CSSProperties;\n /** Optional backdrop style (drawer). */\n backdropStyle?: React.CSSProperties;\n\n /** Drawer behavior for mobile-friendly panels. */\n drawer?: DrawerBehavior;\n /** Floating window configuration. */\n floating?: FloatingBehavior;\n /** Pivot behavior for content switching. */\n pivot?: PivotBehavior;\n\n /**\n * Optional child declarations; purely a grouping convenience.\n * Children are flattened; no implicit inheritance.\n */\n children?: PanelRoute[];\n};\n\nconst toLayer = (route: PanelRoute): LayerDefinition => {\n const inferredMode: LayerPositionMode = resolveRoutePositionMode(route);\n\n if (inferredMode === \"grid\") {\n if (!route.area) {\n throw new Error(`PanelRoute ${route.id} must specify 'area' for grid placement.`);\n }\n }\n\n return {\n id: route.id,\n component: route.element,\n visible: route.visible,\n gridArea: route.area,\n positionMode: inferredMode,\n position: route.position,\n zIndex: route.zIndex,\n width: route.width,\n height: route.height,\n pointerEvents: route.pointerEvents,\n style: route.style,\n drawer: route.drawer,\n floating: route.floating,\n pivot: route.pivot,\n backdropStyle: route.backdropStyle,\n } satisfies LayerDefinition;\n};\n\nconst resolveRoutePositionMode = (route: PanelRoute): LayerPositionMode => {\n if (route.positionMode) {\n return route.positionMode;\n }\n if (route.floating) {\n // Embedded => absolute, Popup => relative (handled by renderer); keep explicitness here.\n return \"absolute\";\n }\n if (route.drawer) {\n return \"grid\";\n }\n return \"grid\";\n};\n\nconst flattenRoutes = (routes: PanelRoute[]): PanelRoute[] => {\n const result: PanelRoute[] = [];\n const walk = (node: PanelRoute): void => {\n result.push(node);\n if (node.children) {\n node.children.forEach((child) => walk(child));\n }\n };\n routes.forEach((r) => walk(r));\n return result;\n};\n\nconst validateUniqueIds = (routes: PanelRoute[]): void => {\n const seen = new Set<string>();\n routes.forEach((r) => {\n if (seen.has(r.id)) {\n throw new Error(`Duplicate PanelRoute id detected: ${r.id}`);\n }\n seen.add(r.id);\n });\n};\n\nexport const buildLayersFromRoutes = (routes: PanelRoute[]): LayerDefinition[] => {\n const flat = flattenRoutes(routes);\n validateUniqueIds(flat);\n return flat.map((r) => toLayer(r));\n};\n\nexport const createPanelLayoutFromRoutes = (input: {\n config: PanelLayoutConfig;\n routes: PanelRoute[];\n style?: React.CSSProperties;\n}): PanelLayoutProps => {\n const layers = buildLayersFromRoutes(input.routes);\n return {\n config: input.config,\n layers,\n };\n};\n\nexport type PanelLayoutRouterProps = {\n config: PanelLayoutConfig;\n routes: PanelRoute[];\n style?: React.CSSProperties;\n};\n\nexport const PanelLayoutRouter: React.FC<PanelLayoutRouterProps> = ({ config, routes, style }) => {\n const layers = React.useMemo(() => buildLayersFromRoutes(routes), [routes]);\n return <GridLayout config={config} layers={layers} style={style} />;\n};\n","/**\n * @file PanelContentDeclaration (JSX DSL for content configuration ONLY)\n *\n * IMPORTANT: This file declares a JSX DSL to configure panel \"content\" and layout\n * tracks. It does NOT implement grid rendering, resizing, dragging, or drawers.\n * Those behaviors live in the existing layout/rendering modules. Keep this file\n * limited to declaration and conversion into GridLayout props.\n *\n * Usage (content declaration):\n * <PanelLayout>\n * <Config>\n * <Rows>...</Rows>\n * <Columns>...</Columns>\n * <Areas matrix={...}/>\n * </Config>\n * <Panel type=\"grid\" id=\"main\" area=\"main\">...</Panel>\n * <Panel type=\"floating\" id=\"preview\" position={{ left: 0, top: 0 }} width={300} height={200} />\n * <Panel type=\"drawer\" id=\"nav\" drawer={{ defaultOpen: true }} position={{ left: 0 }} />\n * </PanelLayout>\n */\nimport * as React from \"react\";\nimport { GridLayout } from \"../components/grid/GridLayout\";\nimport type { DrawerBehavior, GridTrack, PanelLayoutConfig, WindowPosition } from \"../types\";\nimport type { PanelRoute } from \"./panelRouter\";\nimport { buildLayersFromRoutes } from \"./panelRouter\";\n\nexport type PanelRootProps = {\n config?: PanelLayoutConfig;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n};\n\n// Unified child declaration: <Panel type=\"grid\" .../> or <Panel type=\"floating\" .../>...\ntype PanelCommonProps = {\n id: string;\n visible?: boolean;\n zIndex?: number;\n width?: number | string;\n height?: number | string;\n pointerEvents?: boolean | \"auto\" | \"none\";\n style?: React.CSSProperties;\n children?: React.ReactNode;\n};\n\nexport type PanelProps =\n | (PanelCommonProps & { type: \"grid\"; area: string })\n | (PanelCommonProps & {\n type: \"floating\";\n position: WindowPosition;\n width: number | string;\n height: number | string;\n draggable?: boolean;\n resizable?: boolean;\n })\n | (PanelCommonProps & {\n type: \"drawer\";\n drawer: DrawerBehavior;\n position?: WindowPosition;\n backdropStyle?: React.CSSProperties;\n })\n | (Omit<PanelCommonProps, \"children\"> & {\n type: \"pivot\";\n area: string;\n /** Currently active item ID (controlled mode) */\n activeId?: string;\n /** Default active item ID (uncontrolled mode) */\n defaultActiveId?: string;\n /** Callback when active item changes */\n onActiveChange?: (id: string) => void;\n children?: React.ReactNode;\n });\n\nexport const Panel: React.FC<PanelProps> = () => null;\n\n/**\n * PivotItem declaration for use inside <Panel type=\"pivot\">\n */\nexport type PivotItemDeclProps = {\n id: string;\n label?: string;\n disabled?: boolean;\n children?: React.ReactNode;\n};\n\nexport const PivotItem: React.FC<PivotItemDeclProps> = () => null;\n\nconst isElementOf = <P,>(element: unknown, component: React.FC<P>): element is React.ReactElement<P> => {\n if (!React.isValidElement<P>(element)) {\n return false;\n }\n return element.type === component;\n};\n\nexport const buildRoutesFromChildren = (children: React.ReactNode): PanelRoute[] => {\n const routes: PanelRoute[] = [];\n\n const visit = (node: React.ReactNode): void => {\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return;\n }\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n // Unified <Panel type=\"...\" />\n if (isElementOf(node, Panel)) {\n const props = node.props as PanelProps;\n if (!props.id) {\n throw new Error(\"<Panel> requires an 'id' prop.\");\n }\n if (props.type === \"grid\") {\n if (!props.area) {\n throw new Error(`<Panel id=\"${props.id}\"> requires an explicit 'area' prop when type=\"grid\".`);\n }\n routes.push({\n id: props.id,\n area: props.area,\n element: props.children ?? null,\n visible: props.visible,\n zIndex: props.zIndex,\n width: props.width,\n height: props.height,\n pointerEvents: props.pointerEvents,\n style: props.style,\n });\n return;\n }\n if (props.type === \"floating\") {\n if (!props.position) {\n throw new Error(`<Panel id=\"${props.id}\"> requires a 'position' prop when type=\"floating\".`);\n }\n if (props.width === undefined || props.height === undefined) {\n throw new Error(`<Panel id=\"${props.id}\"> requires 'width' and 'height' when type=\"floating\".`);\n }\n routes.push({\n id: props.id,\n element: props.children ?? null,\n visible: props.visible ?? true,\n positionMode: \"absolute\",\n position: props.position,\n zIndex: props.zIndex,\n width: props.width,\n height: props.height,\n pointerEvents: props.pointerEvents,\n style: props.style,\n floating: { mode: \"embedded\", draggable: props.draggable, resizable: props.resizable },\n });\n return;\n }\n if (props.type === \"drawer\") {\n routes.push({\n id: props.id,\n element: props.children ?? null,\n visible: props.visible ?? true,\n positionMode: \"relative\",\n position: props.position,\n zIndex: props.zIndex,\n width: props.width,\n height: props.height,\n pointerEvents: props.pointerEvents,\n style: props.style,\n drawer: props.drawer,\n backdropStyle: props.backdropStyle,\n });\n return;\n }\n if (props.type === \"pivot\") {\n if (!props.area) {\n throw new Error(`<Panel id=\"${props.id}\"> requires an explicit 'area' prop when type=\"pivot\".`);\n }\n const pivotItems = collectPivotItems(props.children);\n if (pivotItems.length === 0) {\n throw new Error(`<Panel id=\"${props.id}\"> requires at least one <PivotItem> child when type=\"pivot\".`);\n }\n routes.push({\n id: props.id,\n area: props.area,\n element: null,\n visible: props.visible,\n zIndex: props.zIndex,\n width: props.width,\n height: props.height,\n pointerEvents: props.pointerEvents,\n style: props.style,\n pivot: {\n items: pivotItems,\n activeId: props.activeId,\n defaultActiveId: props.defaultActiveId,\n onActiveChange: props.onActiveChange,\n },\n });\n return;\n }\n // unknown type -> error for explicitness\n throw new Error(\"<Panel> has unsupported type.\");\n }\n\n if (React.isValidElement(node)) {\n if (node.type === React.Fragment) {\n const el = node as React.ReactElement<{ children?: React.ReactNode }>;\n visit(el.props.children);\n return;\n }\n // Unknown element: ignore quietly to allow comments/wrappers.\n return;\n }\n // Primitive nodes (string/number) are ignored.\n };\n\n visit(children);\n return routes;\n};\n\n// Root container renamed to PanelLayout to avoid name collision with child <Panel/>\nexport const PanelLayout: React.FC<PanelRootProps> = ({ config, style, children }) => {\n const routes = React.useMemo(() => buildRoutesFromChildren(children), [children]);\n const layers = React.useMemo(() => buildLayersFromRoutes(routes), [routes]);\n const derivedConfig = React.useMemo(() => {\n if (config) {\n return config;\n }\n const built = buildConfigFromChildren(children);\n if (!built) {\n throw new Error(\"Panel requires either 'config' prop or a JSX config (<Config><Rows/><Columns/><Areas/></Config>). \");\n }\n return built;\n }, [children, config]);\n return <GridLayout config={derivedConfig} layers={layers} style={style} />;\n};\n\n// =============================\n// JSX Config Declarations\n// =============================\n\nexport type ConfigProps = {\n gap?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n};\n\nexport const Config: React.FC<ConfigProps> = () => {\n return null;\n};\n\nexport const Rows: React.FC<{ children?: React.ReactNode }> = () => {\n return null;\n};\n\nexport const Columns: React.FC<{ children?: React.ReactNode }> = () => {\n return null;\n};\n\nexport type RowProps = GridTrack;\nexport const Row: React.FC<RowProps> = () => {\n return null;\n};\n\nexport type ColumnProps = GridTrack;\nexport const Col: React.FC<ColumnProps> = () => {\n return null;\n};\n\nexport type AreasProps = {\n matrix: string[][];\n};\nexport const Areas: React.FC<AreasProps> = () => {\n return null;\n};\n\ntype CollectedConfig = {\n gap?: string;\n style?: React.CSSProperties;\n rows?: GridTrack[];\n columns?: GridTrack[];\n areas?: string[][];\n};\n\nconst collectTracks = <P extends GridTrack>(children: React.ReactNode, marker: React.FC<P>): GridTrack[] => {\n const result: GridTrack[] = [];\n const visit = (node: React.ReactNode): void => {\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return;\n }\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n if (isElementOf(node, marker)) {\n const props = node.props as P;\n if (!props.size) {\n throw new Error(\"Row/Col requires 'size' property.\");\n }\n result.push({\n size: props.size,\n resizable: props.resizable,\n minSize: props.minSize,\n maxSize: props.maxSize,\n });\n return;\n }\n if (React.isValidElement(node)) {\n const el = node as React.ReactElement<{ children?: React.ReactNode }>;\n visit(el.props.children);\n }\n };\n visit(children);\n return result;\n};\n\nconst collectConfigBlock = (children: React.ReactNode): CollectedConfig | null => {\n const node = findFirst(children, Config);\n if (!node) {\n return null;\n }\n const props = node.props as ConfigProps;\n const rows = collectTracks(node.props.children, Row);\n const columns = collectTracks(node.props.children, Col);\n const areasNode = findFirst(node.props.children, Areas);\n const areas = areasNode ? (areasNode.props as AreasProps).matrix : undefined;\n return {\n gap: props.gap,\n style: props.style,\n rows,\n columns,\n areas,\n };\n};\n\nconst findFirst = <P,>(children: React.ReactNode, marker: React.FC<P>): React.ReactElement<P> | null => {\n const visit = (node: React.ReactNode): React.ReactElement<P> | null => {\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return null;\n }\n if (Array.isArray(node)) {\n for (const item of node) {\n const found = visit(item);\n if (found) {\n return found;\n }\n }\n return null;\n }\n if (isElementOf(node, marker)) {\n return node as React.ReactElement<P>;\n }\n if (React.isValidElement(node)) {\n const el = node as React.ReactElement<{ children?: React.ReactNode }>;\n return visit(el.props.children);\n }\n return null;\n };\n return visit(children);\n};\n\ntype CollectedPivotItem = {\n id: string;\n label?: string;\n content: React.ReactNode;\n disabled?: boolean;\n};\n\nconst collectPivotItems = (children: React.ReactNode): CollectedPivotItem[] => {\n const items: CollectedPivotItem[] = [];\n const visit = (node: React.ReactNode): void => {\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return;\n }\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n if (isElementOf(node, PivotItem)) {\n const props = node.props as PivotItemDeclProps;\n if (!props.id) {\n throw new Error(\"<PivotItem> requires an 'id' prop.\");\n }\n items.push({\n id: props.id,\n label: props.label,\n content: props.children ?? null,\n disabled: props.disabled,\n });\n return;\n }\n if (React.isValidElement(node)) {\n if (node.type === React.Fragment) {\n const el = node as React.ReactElement<{ children?: React.ReactNode }>;\n visit(el.props.children);\n }\n }\n };\n visit(children);\n return items;\n};\n\nexport const buildConfigFromChildren = (children: React.ReactNode): PanelLayoutConfig | null => {\n const collected = collectConfigBlock(children);\n if (!collected) {\n return null;\n }\n if (!collected.rows || collected.rows.length === 0) {\n throw new Error(\"Config must include at least one <Row size=...> inside <Config>.\");\n }\n if (!collected.columns || collected.columns.length === 0) {\n throw new Error(\"Config must include at least one <Col size=...> inside <Config>.\");\n }\n if (!collected.areas || collected.areas.length === 0) {\n throw new Error(\"Config must include <Areas matrix={...}> inside <Config>.\");\n }\n\n const rowCount = collected.areas.length;\n const colCount = collected.areas[0]?.length ?? 0;\n if (rowCount !== collected.rows.length) {\n throw new Error(`Areas row count (${rowCount}) must match Rows count (${collected.rows.length}).`);\n }\n if (colCount !== collected.columns.length) {\n throw new Error(`Areas column count (${colCount}) must match Columns count (${collected.columns.length}).`);\n }\n\n return {\n areas: collected.areas,\n rows: collected.rows,\n columns: collected.columns,\n gap: collected.gap,\n style: collected.style,\n } satisfies PanelLayoutConfig;\n};\n"],"names":["toLayer","route","inferredMode","resolveRoutePositionMode","flattenRoutes","routes","result","walk","node","child","r","validateUniqueIds","seen","buildLayersFromRoutes","flat","Panel","PivotItem","isElementOf","element","component","React","buildRoutesFromChildren","children","visit","props","pivotItems","collectPivotItems","PanelLayout","config","style","layers","derivedConfig","built","buildConfigFromChildren","jsx","GridLayout","Config","Rows","Columns","Row","Col","Areas","collectTracks","marker","collectConfigBlock","findFirst","rows","columns","areasNode","areas","item","found","items","collected","rowCount","colCount"],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { jsx as u } from "react/jsx-runtime";
|
|
2
2
|
import * as s from "react";
|
|
3
|
-
import { G as d } from "./GridLayout-
|
|
4
|
-
import "
|
|
5
|
-
import "./
|
|
3
|
+
import { G as d } from "./GridLayout-B4aCqSyd.js";
|
|
4
|
+
import "react-dom";
|
|
5
|
+
import "./FloatingPanelFrame-3eU9AwPo.js";
|
|
6
|
+
import "./FloatingWindow-Bw2djgpz.js";
|
|
6
7
|
const h = (i) => {
|
|
7
8
|
const r = f(i);
|
|
8
9
|
if (r === "grid" && !i.area)
|
|
@@ -140,7 +141,7 @@ const h = (i) => {
|
|
|
140
141
|
}
|
|
141
142
|
};
|
|
142
143
|
return n(i), r;
|
|
143
|
-
},
|
|
144
|
+
}, k = ({ config: i, style: r, children: n }) => {
|
|
144
145
|
const t = s.useMemo(() => E(n), [n]), e = s.useMemo(() => g(t), [t]), o = s.useMemo(() => {
|
|
145
146
|
if (i)
|
|
146
147
|
return i;
|
|
@@ -150,7 +151,7 @@ const h = (i) => {
|
|
|
150
151
|
return l;
|
|
151
152
|
}, [n, i]);
|
|
152
153
|
return /* @__PURE__ */ u(d, { config: o, layers: e, style: r });
|
|
153
|
-
}, b = () => null,
|
|
154
|
+
}, b = () => null, F = () => null, V = () => null, z = () => null, C = () => null, I = () => null, p = (i, r) => {
|
|
154
155
|
const n = [], t = (e) => {
|
|
155
156
|
if (!(e == null || typeof e == "boolean")) {
|
|
156
157
|
if (Array.isArray(e)) {
|
|
@@ -249,12 +250,12 @@ const h = (i) => {
|
|
|
249
250
|
export {
|
|
250
251
|
I as Areas,
|
|
251
252
|
C as Col,
|
|
252
|
-
|
|
253
|
+
V as Columns,
|
|
253
254
|
b as Config,
|
|
254
255
|
v as Panel,
|
|
255
|
-
|
|
256
|
+
k as PanelLayout,
|
|
256
257
|
z as Row,
|
|
257
|
-
|
|
258
|
+
F as Rows,
|
|
258
259
|
P as buildConfigFromChildren,
|
|
259
260
|
E as buildRoutesFromChildren
|
|
260
261
|
};
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sources":["../src/config/panelRouter.tsx","../src/config/PanelContentDeclaration.tsx"],"sourcesContent":["/**\n * @file Router-like builder for GridLayout\n *\n * Provides a React Router–style configuration API to declare panel layers.\n * Converts route objects to the existing GridLayout props without magic.\n */\nimport * as React from \"react\";\nimport type {\n DrawerBehavior,\n FloatingBehavior,\n LayerDefinition,\n LayerPositionMode,\n PanelLayoutConfig,\n PanelLayoutProps,\n PivotBehavior,\n WindowPosition,\n} from \"../types\";\nimport { GridLayout } from \"../components/grid/GridLayout\";\n\nexport type PanelRoute = {\n /** Unique id for the layer. Required. */\n id: string;\n /** React node to render for this layer. Required. */\n element: React.ReactNode;\n /** Visibility flag. Defaults to visible. */\n visible?: boolean;\n\n /**\n * Grid placement key. When using `positionMode: 'grid'` (default), this must be provided.\n * Using `area` mirrors React Router's route path intent but for grid cells.\n */\n area?: string;\n\n /** Explicit positioning mode; defaults to 'grid' unless floating/drawer implies otherwise. */\n positionMode?: LayerPositionMode;\n /** Offsets when using non-grid modes. */\n position?: WindowPosition;\n /** Optional stacking order. */\n zIndex?: number;\n /** Optional dimensions; required for resizable/draggable floating layers. */\n width?: number | string;\n height?: number | string;\n /** Pointer events control. */\n pointerEvents?: boolean | \"auto\" | \"none\";\n /** Optional style overrides. */\n style?: React.CSSProperties;\n /** Optional backdrop style (drawer). */\n backdropStyle?: React.CSSProperties;\n\n /** Drawer behavior for mobile-friendly panels. */\n drawer?: DrawerBehavior;\n /** Floating window configuration. */\n floating?: FloatingBehavior;\n /** Pivot behavior for content switching. */\n pivot?: PivotBehavior;\n\n /**\n * Optional child declarations; purely a grouping convenience.\n * Children are flattened; no implicit inheritance.\n */\n children?: PanelRoute[];\n};\n\nconst toLayer = (route: PanelRoute): LayerDefinition => {\n const inferredMode: LayerPositionMode = resolveRoutePositionMode(route);\n\n if (inferredMode === \"grid\") {\n if (!route.area) {\n throw new Error(`PanelRoute ${route.id} must specify 'area' for grid placement.`);\n }\n }\n\n return {\n id: route.id,\n component: route.element,\n visible: route.visible,\n gridArea: route.area,\n positionMode: inferredMode,\n position: route.position,\n zIndex: route.zIndex,\n width: route.width,\n height: route.height,\n pointerEvents: route.pointerEvents,\n style: route.style,\n drawer: route.drawer,\n floating: route.floating,\n pivot: route.pivot,\n backdropStyle: route.backdropStyle,\n } satisfies LayerDefinition;\n};\n\nconst resolveRoutePositionMode = (route: PanelRoute): LayerPositionMode => {\n if (route.positionMode) {\n return route.positionMode;\n }\n if (route.floating) {\n // Embedded => absolute, Popup => relative (handled by renderer); keep explicitness here.\n return \"absolute\";\n }\n if (route.drawer) {\n return \"grid\";\n }\n return \"grid\";\n};\n\nconst flattenRoutes = (routes: PanelRoute[]): PanelRoute[] => {\n const result: PanelRoute[] = [];\n const walk = (node: PanelRoute): void => {\n result.push(node);\n if (node.children) {\n node.children.forEach((child) => walk(child));\n }\n };\n routes.forEach((r) => walk(r));\n return result;\n};\n\nconst validateUniqueIds = (routes: PanelRoute[]): void => {\n const seen = new Set<string>();\n routes.forEach((r) => {\n if (seen.has(r.id)) {\n throw new Error(`Duplicate PanelRoute id detected: ${r.id}`);\n }\n seen.add(r.id);\n });\n};\n\nexport const buildLayersFromRoutes = (routes: PanelRoute[]): LayerDefinition[] => {\n const flat = flattenRoutes(routes);\n validateUniqueIds(flat);\n return flat.map((r) => toLayer(r));\n};\n\nexport const createPanelLayoutFromRoutes = (input: {\n config: PanelLayoutConfig;\n routes: PanelRoute[];\n style?: React.CSSProperties;\n}): PanelLayoutProps => {\n const layers = buildLayersFromRoutes(input.routes);\n return {\n config: input.config,\n layers,\n };\n};\n\nexport type PanelLayoutRouterProps = {\n config: PanelLayoutConfig;\n routes: PanelRoute[];\n style?: React.CSSProperties;\n};\n\nexport const PanelLayoutRouter: React.FC<PanelLayoutRouterProps> = ({ config, routes, style }) => {\n const layers = React.useMemo(() => buildLayersFromRoutes(routes), [routes]);\n return <GridLayout config={config} layers={layers} style={style} />;\n};\n","/**\n * @file PanelContentDeclaration (JSX DSL for content configuration ONLY)\n *\n * IMPORTANT: This file declares a JSX DSL to configure panel \"content\" and layout\n * tracks. It does NOT implement grid rendering, resizing, dragging, or drawers.\n * Those behaviors live in the existing layout/rendering modules. Keep this file\n * limited to declaration and conversion into GridLayout props.\n *\n * Usage (content declaration):\n * <PanelLayout>\n * <Config>\n * <Rows>...</Rows>\n * <Columns>...</Columns>\n * <Areas matrix={...}/>\n * </Config>\n * <Panel type=\"grid\" id=\"main\" area=\"main\">...</Panel>\n * <Panel type=\"floating\" id=\"preview\" position={{ left: 0, top: 0 }} width={300} height={200} />\n * <Panel type=\"drawer\" id=\"nav\" drawer={{ defaultOpen: true }} position={{ left: 0 }} />\n * </PanelLayout>\n */\nimport * as React from \"react\";\nimport { GridLayout } from \"../components/grid/GridLayout\";\nimport type { DrawerBehavior, GridTrack, PanelLayoutConfig, WindowPosition } from \"../types\";\nimport type { PanelRoute } from \"./panelRouter\";\nimport { buildLayersFromRoutes } from \"./panelRouter\";\n\nexport type PanelRootProps = {\n config?: PanelLayoutConfig;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n};\n\n// Unified child declaration: <Panel type=\"grid\" .../> or <Panel type=\"floating\" .../>...\ntype PanelCommonProps = {\n id: string;\n visible?: boolean;\n zIndex?: number;\n width?: number | string;\n height?: number | string;\n pointerEvents?: boolean | \"auto\" | \"none\";\n style?: React.CSSProperties;\n children?: React.ReactNode;\n};\n\nexport type PanelProps =\n | (PanelCommonProps & { type: \"grid\"; area: string })\n | (PanelCommonProps & {\n type: \"floating\";\n position: WindowPosition;\n width: number | string;\n height: number | string;\n draggable?: boolean;\n resizable?: boolean;\n })\n | (PanelCommonProps & {\n type: \"drawer\";\n drawer: DrawerBehavior;\n position?: WindowPosition;\n backdropStyle?: React.CSSProperties;\n })\n | (Omit<PanelCommonProps, \"children\"> & {\n type: \"pivot\";\n area: string;\n /** Currently active item ID (controlled mode) */\n activeId?: string;\n /** Default active item ID (uncontrolled mode) */\n defaultActiveId?: string;\n /** Callback when active item changes */\n onActiveChange?: (id: string) => void;\n children?: React.ReactNode;\n });\n\nexport const Panel: React.FC<PanelProps> = () => null;\n\n/**\n * PivotItem declaration for use inside <Panel type=\"pivot\">\n */\nexport type PivotItemDeclProps = {\n id: string;\n label?: string;\n disabled?: boolean;\n children?: React.ReactNode;\n};\n\nexport const PivotItem: React.FC<PivotItemDeclProps> = () => null;\n\nconst isElementOf = <P,>(element: unknown, component: React.FC<P>): element is React.ReactElement<P> => {\n if (!React.isValidElement<P>(element)) {\n return false;\n }\n return element.type === component;\n};\n\nexport const buildRoutesFromChildren = (children: React.ReactNode): PanelRoute[] => {\n const routes: PanelRoute[] = [];\n\n const visit = (node: React.ReactNode): void => {\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return;\n }\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n // Unified <Panel type=\"...\" />\n if (isElementOf(node, Panel)) {\n const props = node.props as PanelProps;\n if (!props.id) {\n throw new Error(\"<Panel> requires an 'id' prop.\");\n }\n if (props.type === \"grid\") {\n if (!props.area) {\n throw new Error(`<Panel id=\"${props.id}\"> requires an explicit 'area' prop when type=\"grid\".`);\n }\n routes.push({\n id: props.id,\n area: props.area,\n element: props.children ?? null,\n visible: props.visible,\n zIndex: props.zIndex,\n width: props.width,\n height: props.height,\n pointerEvents: props.pointerEvents,\n style: props.style,\n });\n return;\n }\n if (props.type === \"floating\") {\n if (!props.position) {\n throw new Error(`<Panel id=\"${props.id}\"> requires a 'position' prop when type=\"floating\".`);\n }\n if (props.width === undefined || props.height === undefined) {\n throw new Error(`<Panel id=\"${props.id}\"> requires 'width' and 'height' when type=\"floating\".`);\n }\n routes.push({\n id: props.id,\n element: props.children ?? null,\n visible: props.visible ?? true,\n positionMode: \"absolute\",\n position: props.position,\n zIndex: props.zIndex,\n width: props.width,\n height: props.height,\n pointerEvents: props.pointerEvents,\n style: props.style,\n floating: { mode: \"embedded\", draggable: props.draggable, resizable: props.resizable },\n });\n return;\n }\n if (props.type === \"drawer\") {\n routes.push({\n id: props.id,\n element: props.children ?? null,\n visible: props.visible ?? true,\n positionMode: \"relative\",\n position: props.position,\n zIndex: props.zIndex,\n width: props.width,\n height: props.height,\n pointerEvents: props.pointerEvents,\n style: props.style,\n drawer: props.drawer,\n backdropStyle: props.backdropStyle,\n });\n return;\n }\n if (props.type === \"pivot\") {\n if (!props.area) {\n throw new Error(`<Panel id=\"${props.id}\"> requires an explicit 'area' prop when type=\"pivot\".`);\n }\n const pivotItems = collectPivotItems(props.children);\n if (pivotItems.length === 0) {\n throw new Error(`<Panel id=\"${props.id}\"> requires at least one <PivotItem> child when type=\"pivot\".`);\n }\n routes.push({\n id: props.id,\n area: props.area,\n element: null,\n visible: props.visible,\n zIndex: props.zIndex,\n width: props.width,\n height: props.height,\n pointerEvents: props.pointerEvents,\n style: props.style,\n pivot: {\n items: pivotItems,\n activeId: props.activeId,\n defaultActiveId: props.defaultActiveId,\n onActiveChange: props.onActiveChange,\n },\n });\n return;\n }\n // unknown type -> error for explicitness\n throw new Error(\"<Panel> has unsupported type.\");\n }\n\n if (React.isValidElement(node)) {\n if (node.type === React.Fragment) {\n const el = node as React.ReactElement<{ children?: React.ReactNode }>;\n visit(el.props.children);\n return;\n }\n // Unknown element: ignore quietly to allow comments/wrappers.\n return;\n }\n // Primitive nodes (string/number) are ignored.\n };\n\n visit(children);\n return routes;\n};\n\n// Root container renamed to PanelLayout to avoid name collision with child <Panel/>\nexport const PanelLayout: React.FC<PanelRootProps> = ({ config, style, children }) => {\n const routes = React.useMemo(() => buildRoutesFromChildren(children), [children]);\n const layers = React.useMemo(() => buildLayersFromRoutes(routes), [routes]);\n const derivedConfig = React.useMemo(() => {\n if (config) {\n return config;\n }\n const built = buildConfigFromChildren(children);\n if (!built) {\n throw new Error(\"Panel requires either 'config' prop or a JSX config (<Config><Rows/><Columns/><Areas/></Config>). \");\n }\n return built;\n }, [children, config]);\n return <GridLayout config={derivedConfig} layers={layers} style={style} />;\n};\n\n// =============================\n// JSX Config Declarations\n// =============================\n\nexport type ConfigProps = {\n gap?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n};\n\nexport const Config: React.FC<ConfigProps> = () => {\n return null;\n};\n\nexport const Rows: React.FC<{ children?: React.ReactNode }> = () => {\n return null;\n};\n\nexport const Columns: React.FC<{ children?: React.ReactNode }> = () => {\n return null;\n};\n\nexport type RowProps = GridTrack;\nexport const Row: React.FC<RowProps> = () => {\n return null;\n};\n\nexport type ColumnProps = GridTrack;\nexport const Col: React.FC<ColumnProps> = () => {\n return null;\n};\n\nexport type AreasProps = {\n matrix: string[][];\n};\nexport const Areas: React.FC<AreasProps> = () => {\n return null;\n};\n\ntype CollectedConfig = {\n gap?: string;\n style?: React.CSSProperties;\n rows?: GridTrack[];\n columns?: GridTrack[];\n areas?: string[][];\n};\n\nconst collectTracks = <P extends GridTrack>(children: React.ReactNode, marker: React.FC<P>): GridTrack[] => {\n const result: GridTrack[] = [];\n const visit = (node: React.ReactNode): void => {\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return;\n }\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n if (isElementOf(node, marker)) {\n const props = node.props as P;\n if (!props.size) {\n throw new Error(\"Row/Col requires 'size' property.\");\n }\n result.push({\n size: props.size,\n resizable: props.resizable,\n minSize: props.minSize,\n maxSize: props.maxSize,\n });\n return;\n }\n if (React.isValidElement(node)) {\n const el = node as React.ReactElement<{ children?: React.ReactNode }>;\n visit(el.props.children);\n }\n };\n visit(children);\n return result;\n};\n\nconst collectConfigBlock = (children: React.ReactNode): CollectedConfig | null => {\n const node = findFirst(children, Config);\n if (!node) {\n return null;\n }\n const props = node.props as ConfigProps;\n const rows = collectTracks(node.props.children, Row);\n const columns = collectTracks(node.props.children, Col);\n const areasNode = findFirst(node.props.children, Areas);\n const areas = areasNode ? (areasNode.props as AreasProps).matrix : undefined;\n return {\n gap: props.gap,\n style: props.style,\n rows,\n columns,\n areas,\n };\n};\n\nconst findFirst = <P,>(children: React.ReactNode, marker: React.FC<P>): React.ReactElement<P> | null => {\n const visit = (node: React.ReactNode): React.ReactElement<P> | null => {\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return null;\n }\n if (Array.isArray(node)) {\n for (const item of node) {\n const found = visit(item);\n if (found) {\n return found;\n }\n }\n return null;\n }\n if (isElementOf(node, marker)) {\n return node as React.ReactElement<P>;\n }\n if (React.isValidElement(node)) {\n const el = node as React.ReactElement<{ children?: React.ReactNode }>;\n return visit(el.props.children);\n }\n return null;\n };\n return visit(children);\n};\n\ntype CollectedPivotItem = {\n id: string;\n label?: string;\n content: React.ReactNode;\n disabled?: boolean;\n};\n\nconst collectPivotItems = (children: React.ReactNode): CollectedPivotItem[] => {\n const items: CollectedPivotItem[] = [];\n const visit = (node: React.ReactNode): void => {\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return;\n }\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n if (isElementOf(node, PivotItem)) {\n const props = node.props as PivotItemDeclProps;\n if (!props.id) {\n throw new Error(\"<PivotItem> requires an 'id' prop.\");\n }\n items.push({\n id: props.id,\n label: props.label,\n content: props.children ?? null,\n disabled: props.disabled,\n });\n return;\n }\n if (React.isValidElement(node)) {\n if (node.type === React.Fragment) {\n const el = node as React.ReactElement<{ children?: React.ReactNode }>;\n visit(el.props.children);\n }\n }\n };\n visit(children);\n return items;\n};\n\nexport const buildConfigFromChildren = (children: React.ReactNode): PanelLayoutConfig | null => {\n const collected = collectConfigBlock(children);\n if (!collected) {\n return null;\n }\n if (!collected.rows || collected.rows.length === 0) {\n throw new Error(\"Config must include at least one <Row size=...> inside <Config>.\");\n }\n if (!collected.columns || collected.columns.length === 0) {\n throw new Error(\"Config must include at least one <Col size=...> inside <Config>.\");\n }\n if (!collected.areas || collected.areas.length === 0) {\n throw new Error(\"Config must include <Areas matrix={...}> inside <Config>.\");\n }\n\n const rowCount = collected.areas.length;\n const colCount = collected.areas[0]?.length ?? 0;\n if (rowCount !== collected.rows.length) {\n throw new Error(`Areas row count (${rowCount}) must match Rows count (${collected.rows.length}).`);\n }\n if (colCount !== collected.columns.length) {\n throw new Error(`Areas column count (${colCount}) must match Columns count (${collected.columns.length}).`);\n }\n\n return {\n areas: collected.areas,\n rows: collected.rows,\n columns: collected.columns,\n gap: collected.gap,\n style: collected.style,\n } satisfies PanelLayoutConfig;\n};\n"],"names":["toLayer","route","inferredMode","resolveRoutePositionMode","flattenRoutes","routes","result","walk","node","child","r","validateUniqueIds","seen","buildLayersFromRoutes","flat","Panel","PivotItem","isElementOf","element","component","React","buildRoutesFromChildren","children","visit","props","pivotItems","collectPivotItems","PanelLayout","config","style","layers","derivedConfig","built","buildConfigFromChildren","jsx","GridLayout","Config","Rows","Columns","Row","Col","Areas","collectTracks","marker","collectConfigBlock","findFirst","rows","columns","areasNode","areas","item","found","items","collected","rowCount","colCount"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sources":["../src/config/panelRouter.tsx","../src/config/PanelContentDeclaration.tsx"],"sourcesContent":["/**\n * @file Router-like builder for GridLayout\n *\n * Provides a React Router–style configuration API to declare panel layers.\n * Converts route objects to the existing GridLayout props without magic.\n */\nimport * as React from \"react\";\nimport type {\n DrawerBehavior,\n FloatingBehavior,\n LayerDefinition,\n LayerPositionMode,\n PanelLayoutConfig,\n PanelLayoutProps,\n PivotBehavior,\n WindowPosition,\n} from \"../types\";\nimport { GridLayout } from \"../components/grid/GridLayout\";\n\nexport type PanelRoute = {\n /** Unique id for the layer. Required. */\n id: string;\n /** React node to render for this layer. Required. */\n element: React.ReactNode;\n /** Visibility flag. Defaults to visible. */\n visible?: boolean;\n\n /**\n * Grid placement key. When using `positionMode: 'grid'` (default), this must be provided.\n * Using `area` mirrors React Router's route path intent but for grid cells.\n */\n area?: string;\n\n /** Explicit positioning mode; defaults to 'grid' unless floating/drawer implies otherwise. */\n positionMode?: LayerPositionMode;\n /** Offsets when using non-grid modes. */\n position?: WindowPosition;\n /** Optional stacking order. */\n zIndex?: number;\n /** Optional dimensions; required for resizable/draggable floating layers. */\n width?: number | string;\n height?: number | string;\n /** Pointer events control. */\n pointerEvents?: boolean | \"auto\" | \"none\";\n /** Optional style overrides. */\n style?: React.CSSProperties;\n /** Optional backdrop style (drawer). */\n backdropStyle?: React.CSSProperties;\n\n /** Drawer behavior for mobile-friendly panels. */\n drawer?: DrawerBehavior;\n /** Floating window configuration. */\n floating?: FloatingBehavior;\n /** Pivot behavior for content switching. */\n pivot?: PivotBehavior;\n\n /**\n * Optional child declarations; purely a grouping convenience.\n * Children are flattened; no implicit inheritance.\n */\n children?: PanelRoute[];\n};\n\nconst toLayer = (route: PanelRoute): LayerDefinition => {\n const inferredMode: LayerPositionMode = resolveRoutePositionMode(route);\n\n if (inferredMode === \"grid\") {\n if (!route.area) {\n throw new Error(`PanelRoute ${route.id} must specify 'area' for grid placement.`);\n }\n }\n\n return {\n id: route.id,\n component: route.element,\n visible: route.visible,\n gridArea: route.area,\n positionMode: inferredMode,\n position: route.position,\n zIndex: route.zIndex,\n width: route.width,\n height: route.height,\n pointerEvents: route.pointerEvents,\n style: route.style,\n drawer: route.drawer,\n floating: route.floating,\n pivot: route.pivot,\n backdropStyle: route.backdropStyle,\n } satisfies LayerDefinition;\n};\n\nconst resolveRoutePositionMode = (route: PanelRoute): LayerPositionMode => {\n if (route.positionMode) {\n return route.positionMode;\n }\n if (route.floating) {\n // Embedded => absolute, Popup => relative (handled by renderer); keep explicitness here.\n return \"absolute\";\n }\n if (route.drawer) {\n return \"grid\";\n }\n return \"grid\";\n};\n\nconst flattenRoutes = (routes: PanelRoute[]): PanelRoute[] => {\n const result: PanelRoute[] = [];\n const walk = (node: PanelRoute): void => {\n result.push(node);\n if (node.children) {\n node.children.forEach((child) => walk(child));\n }\n };\n routes.forEach((r) => walk(r));\n return result;\n};\n\nconst validateUniqueIds = (routes: PanelRoute[]): void => {\n const seen = new Set<string>();\n routes.forEach((r) => {\n if (seen.has(r.id)) {\n throw new Error(`Duplicate PanelRoute id detected: ${r.id}`);\n }\n seen.add(r.id);\n });\n};\n\nexport const buildLayersFromRoutes = (routes: PanelRoute[]): LayerDefinition[] => {\n const flat = flattenRoutes(routes);\n validateUniqueIds(flat);\n return flat.map((r) => toLayer(r));\n};\n\nexport const createPanelLayoutFromRoutes = (input: {\n config: PanelLayoutConfig;\n routes: PanelRoute[];\n style?: React.CSSProperties;\n}): PanelLayoutProps => {\n const layers = buildLayersFromRoutes(input.routes);\n return {\n config: input.config,\n layers,\n };\n};\n\nexport type PanelLayoutRouterProps = {\n config: PanelLayoutConfig;\n routes: PanelRoute[];\n style?: React.CSSProperties;\n};\n\nexport const PanelLayoutRouter: React.FC<PanelLayoutRouterProps> = ({ config, routes, style }) => {\n const layers = React.useMemo(() => buildLayersFromRoutes(routes), [routes]);\n return <GridLayout config={config} layers={layers} style={style} />;\n};\n","/**\n * @file PanelContentDeclaration (JSX DSL for content configuration ONLY)\n *\n * IMPORTANT: This file declares a JSX DSL to configure panel \"content\" and layout\n * tracks. It does NOT implement grid rendering, resizing, dragging, or drawers.\n * Those behaviors live in the existing layout/rendering modules. Keep this file\n * limited to declaration and conversion into GridLayout props.\n *\n * Usage (content declaration):\n * <PanelLayout>\n * <Config>\n * <Rows>...</Rows>\n * <Columns>...</Columns>\n * <Areas matrix={...}/>\n * </Config>\n * <Panel type=\"grid\" id=\"main\" area=\"main\">...</Panel>\n * <Panel type=\"floating\" id=\"preview\" position={{ left: 0, top: 0 }} width={300} height={200} />\n * <Panel type=\"drawer\" id=\"nav\" drawer={{ defaultOpen: true }} position={{ left: 0 }} />\n * </PanelLayout>\n */\nimport * as React from \"react\";\nimport { GridLayout } from \"../components/grid/GridLayout\";\nimport type { DrawerBehavior, GridTrack, PanelLayoutConfig, WindowPosition } from \"../types\";\nimport type { PanelRoute } from \"./panelRouter\";\nimport { buildLayersFromRoutes } from \"./panelRouter\";\n\nexport type PanelRootProps = {\n config?: PanelLayoutConfig;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n};\n\n// Unified child declaration: <Panel type=\"grid\" .../> or <Panel type=\"floating\" .../>...\ntype PanelCommonProps = {\n id: string;\n visible?: boolean;\n zIndex?: number;\n width?: number | string;\n height?: number | string;\n pointerEvents?: boolean | \"auto\" | \"none\";\n style?: React.CSSProperties;\n children?: React.ReactNode;\n};\n\nexport type PanelProps =\n | (PanelCommonProps & { type: \"grid\"; area: string })\n | (PanelCommonProps & {\n type: \"floating\";\n position: WindowPosition;\n width: number | string;\n height: number | string;\n draggable?: boolean;\n resizable?: boolean;\n })\n | (PanelCommonProps & {\n type: \"drawer\";\n drawer: DrawerBehavior;\n position?: WindowPosition;\n backdropStyle?: React.CSSProperties;\n })\n | (Omit<PanelCommonProps, \"children\"> & {\n type: \"pivot\";\n area: string;\n /** Currently active item ID (controlled mode) */\n activeId?: string;\n /** Default active item ID (uncontrolled mode) */\n defaultActiveId?: string;\n /** Callback when active item changes */\n onActiveChange?: (id: string) => void;\n children?: React.ReactNode;\n });\n\nexport const Panel: React.FC<PanelProps> = () => null;\n\n/**\n * PivotItem declaration for use inside <Panel type=\"pivot\">\n */\nexport type PivotItemDeclProps = {\n id: string;\n label?: string;\n disabled?: boolean;\n children?: React.ReactNode;\n};\n\nexport const PivotItem: React.FC<PivotItemDeclProps> = () => null;\n\nconst isElementOf = <P,>(element: unknown, component: React.FC<P>): element is React.ReactElement<P> => {\n if (!React.isValidElement<P>(element)) {\n return false;\n }\n return element.type === component;\n};\n\nexport const buildRoutesFromChildren = (children: React.ReactNode): PanelRoute[] => {\n const routes: PanelRoute[] = [];\n\n const visit = (node: React.ReactNode): void => {\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return;\n }\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n // Unified <Panel type=\"...\" />\n if (isElementOf(node, Panel)) {\n const props = node.props as PanelProps;\n if (!props.id) {\n throw new Error(\"<Panel> requires an 'id' prop.\");\n }\n if (props.type === \"grid\") {\n if (!props.area) {\n throw new Error(`<Panel id=\"${props.id}\"> requires an explicit 'area' prop when type=\"grid\".`);\n }\n routes.push({\n id: props.id,\n area: props.area,\n element: props.children ?? null,\n visible: props.visible,\n zIndex: props.zIndex,\n width: props.width,\n height: props.height,\n pointerEvents: props.pointerEvents,\n style: props.style,\n });\n return;\n }\n if (props.type === \"floating\") {\n if (!props.position) {\n throw new Error(`<Panel id=\"${props.id}\"> requires a 'position' prop when type=\"floating\".`);\n }\n if (props.width === undefined || props.height === undefined) {\n throw new Error(`<Panel id=\"${props.id}\"> requires 'width' and 'height' when type=\"floating\".`);\n }\n routes.push({\n id: props.id,\n element: props.children ?? null,\n visible: props.visible ?? true,\n positionMode: \"absolute\",\n position: props.position,\n zIndex: props.zIndex,\n width: props.width,\n height: props.height,\n pointerEvents: props.pointerEvents,\n style: props.style,\n floating: { mode: \"embedded\", draggable: props.draggable, resizable: props.resizable },\n });\n return;\n }\n if (props.type === \"drawer\") {\n routes.push({\n id: props.id,\n element: props.children ?? null,\n visible: props.visible ?? true,\n positionMode: \"relative\",\n position: props.position,\n zIndex: props.zIndex,\n width: props.width,\n height: props.height,\n pointerEvents: props.pointerEvents,\n style: props.style,\n drawer: props.drawer,\n backdropStyle: props.backdropStyle,\n });\n return;\n }\n if (props.type === \"pivot\") {\n if (!props.area) {\n throw new Error(`<Panel id=\"${props.id}\"> requires an explicit 'area' prop when type=\"pivot\".`);\n }\n const pivotItems = collectPivotItems(props.children);\n if (pivotItems.length === 0) {\n throw new Error(`<Panel id=\"${props.id}\"> requires at least one <PivotItem> child when type=\"pivot\".`);\n }\n routes.push({\n id: props.id,\n area: props.area,\n element: null,\n visible: props.visible,\n zIndex: props.zIndex,\n width: props.width,\n height: props.height,\n pointerEvents: props.pointerEvents,\n style: props.style,\n pivot: {\n items: pivotItems,\n activeId: props.activeId,\n defaultActiveId: props.defaultActiveId,\n onActiveChange: props.onActiveChange,\n },\n });\n return;\n }\n // unknown type -> error for explicitness\n throw new Error(\"<Panel> has unsupported type.\");\n }\n\n if (React.isValidElement(node)) {\n if (node.type === React.Fragment) {\n const el = node as React.ReactElement<{ children?: React.ReactNode }>;\n visit(el.props.children);\n return;\n }\n // Unknown element: ignore quietly to allow comments/wrappers.\n return;\n }\n // Primitive nodes (string/number) are ignored.\n };\n\n visit(children);\n return routes;\n};\n\n// Root container renamed to PanelLayout to avoid name collision with child <Panel/>\nexport const PanelLayout: React.FC<PanelRootProps> = ({ config, style, children }) => {\n const routes = React.useMemo(() => buildRoutesFromChildren(children), [children]);\n const layers = React.useMemo(() => buildLayersFromRoutes(routes), [routes]);\n const derivedConfig = React.useMemo(() => {\n if (config) {\n return config;\n }\n const built = buildConfigFromChildren(children);\n if (!built) {\n throw new Error(\"Panel requires either 'config' prop or a JSX config (<Config><Rows/><Columns/><Areas/></Config>). \");\n }\n return built;\n }, [children, config]);\n return <GridLayout config={derivedConfig} layers={layers} style={style} />;\n};\n\n// =============================\n// JSX Config Declarations\n// =============================\n\nexport type ConfigProps = {\n gap?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n};\n\nexport const Config: React.FC<ConfigProps> = () => {\n return null;\n};\n\nexport const Rows: React.FC<{ children?: React.ReactNode }> = () => {\n return null;\n};\n\nexport const Columns: React.FC<{ children?: React.ReactNode }> = () => {\n return null;\n};\n\nexport type RowProps = GridTrack;\nexport const Row: React.FC<RowProps> = () => {\n return null;\n};\n\nexport type ColumnProps = GridTrack;\nexport const Col: React.FC<ColumnProps> = () => {\n return null;\n};\n\nexport type AreasProps = {\n matrix: string[][];\n};\nexport const Areas: React.FC<AreasProps> = () => {\n return null;\n};\n\ntype CollectedConfig = {\n gap?: string;\n style?: React.CSSProperties;\n rows?: GridTrack[];\n columns?: GridTrack[];\n areas?: string[][];\n};\n\nconst collectTracks = <P extends GridTrack>(children: React.ReactNode, marker: React.FC<P>): GridTrack[] => {\n const result: GridTrack[] = [];\n const visit = (node: React.ReactNode): void => {\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return;\n }\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n if (isElementOf(node, marker)) {\n const props = node.props as P;\n if (!props.size) {\n throw new Error(\"Row/Col requires 'size' property.\");\n }\n result.push({\n size: props.size,\n resizable: props.resizable,\n minSize: props.minSize,\n maxSize: props.maxSize,\n });\n return;\n }\n if (React.isValidElement(node)) {\n const el = node as React.ReactElement<{ children?: React.ReactNode }>;\n visit(el.props.children);\n }\n };\n visit(children);\n return result;\n};\n\nconst collectConfigBlock = (children: React.ReactNode): CollectedConfig | null => {\n const node = findFirst(children, Config);\n if (!node) {\n return null;\n }\n const props = node.props as ConfigProps;\n const rows = collectTracks(node.props.children, Row);\n const columns = collectTracks(node.props.children, Col);\n const areasNode = findFirst(node.props.children, Areas);\n const areas = areasNode ? (areasNode.props as AreasProps).matrix : undefined;\n return {\n gap: props.gap,\n style: props.style,\n rows,\n columns,\n areas,\n };\n};\n\nconst findFirst = <P,>(children: React.ReactNode, marker: React.FC<P>): React.ReactElement<P> | null => {\n const visit = (node: React.ReactNode): React.ReactElement<P> | null => {\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return null;\n }\n if (Array.isArray(node)) {\n for (const item of node) {\n const found = visit(item);\n if (found) {\n return found;\n }\n }\n return null;\n }\n if (isElementOf(node, marker)) {\n return node as React.ReactElement<P>;\n }\n if (React.isValidElement(node)) {\n const el = node as React.ReactElement<{ children?: React.ReactNode }>;\n return visit(el.props.children);\n }\n return null;\n };\n return visit(children);\n};\n\ntype CollectedPivotItem = {\n id: string;\n label?: string;\n content: React.ReactNode;\n disabled?: boolean;\n};\n\nconst collectPivotItems = (children: React.ReactNode): CollectedPivotItem[] => {\n const items: CollectedPivotItem[] = [];\n const visit = (node: React.ReactNode): void => {\n if (node === null || node === undefined || typeof node === \"boolean\") {\n return;\n }\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n if (isElementOf(node, PivotItem)) {\n const props = node.props as PivotItemDeclProps;\n if (!props.id) {\n throw new Error(\"<PivotItem> requires an 'id' prop.\");\n }\n items.push({\n id: props.id,\n label: props.label,\n content: props.children ?? null,\n disabled: props.disabled,\n });\n return;\n }\n if (React.isValidElement(node)) {\n if (node.type === React.Fragment) {\n const el = node as React.ReactElement<{ children?: React.ReactNode }>;\n visit(el.props.children);\n }\n }\n };\n visit(children);\n return items;\n};\n\nexport const buildConfigFromChildren = (children: React.ReactNode): PanelLayoutConfig | null => {\n const collected = collectConfigBlock(children);\n if (!collected) {\n return null;\n }\n if (!collected.rows || collected.rows.length === 0) {\n throw new Error(\"Config must include at least one <Row size=...> inside <Config>.\");\n }\n if (!collected.columns || collected.columns.length === 0) {\n throw new Error(\"Config must include at least one <Col size=...> inside <Config>.\");\n }\n if (!collected.areas || collected.areas.length === 0) {\n throw new Error(\"Config must include <Areas matrix={...}> inside <Config>.\");\n }\n\n const rowCount = collected.areas.length;\n const colCount = collected.areas[0]?.length ?? 0;\n if (rowCount !== collected.rows.length) {\n throw new Error(`Areas row count (${rowCount}) must match Rows count (${collected.rows.length}).`);\n }\n if (colCount !== collected.columns.length) {\n throw new Error(`Areas column count (${colCount}) must match Columns count (${collected.columns.length}).`);\n }\n\n return {\n areas: collected.areas,\n rows: collected.rows,\n columns: collected.columns,\n gap: collected.gap,\n style: collected.style,\n } satisfies PanelLayoutConfig;\n};\n"],"names":["toLayer","route","inferredMode","resolveRoutePositionMode","flattenRoutes","routes","result","walk","node","child","r","validateUniqueIds","seen","buildLayersFromRoutes","flat","Panel","PivotItem","isElementOf","element","component","React","buildRoutesFromChildren","children","visit","props","pivotItems","collectPivotItems","PanelLayout","config","style","layers","derivedConfig","built","buildConfigFromChildren","jsx","GridLayout","Config","Rows","Columns","Row","Col","Areas","collectTracks","marker","collectConfigBlock","findFirst","rows","columns","areasNode","areas","item","found","items","collected","rowCount","colCount"],"mappings":"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"}
|
|
@@ -209,3 +209,20 @@ export declare const SPLIT_HANDLE_THICKNESS = "var(--rpl-size-split-handle-thick
|
|
|
209
209
|
*/
|
|
210
210
|
export declare const HORIZONTAL_DIVIDER_WIDTH = "var(--rpl-size-horizontal-divider-width, 4px)";
|
|
211
211
|
export declare const HORIZONTAL_DIVIDER_HIT_AREA_OFFSET = "var(--rpl-space-horizontal-divider-hit-area-offset, 4px)";
|
|
212
|
+
/**
|
|
213
|
+
* Modal
|
|
214
|
+
*/
|
|
215
|
+
export declare const COLOR_MODAL_BACKDROP = "var(--rpl-color-modal-backdrop, rgba(0, 0, 0, 0.5))";
|
|
216
|
+
export declare const MODAL_TRANSITION_DURATION = "var(--rpl-modal-transition-duration, 200ms)";
|
|
217
|
+
export declare const MODAL_TRANSITION_EASING = "var(--rpl-modal-transition-easing, ease-out)";
|
|
218
|
+
export declare const MODAL_MIN_WIDTH = "var(--rpl-modal-min-width, 280px)";
|
|
219
|
+
export declare const MODAL_MAX_WIDTH = "var(--rpl-modal-max-width, 90vw)";
|
|
220
|
+
export declare const MODAL_MAX_HEIGHT = "var(--rpl-modal-max-height, 85vh)";
|
|
221
|
+
/**
|
|
222
|
+
* Alert Dialog
|
|
223
|
+
*/
|
|
224
|
+
export declare const ALERT_DIALOG_WIDTH = "var(--rpl-alert-dialog-width, 320px)";
|
|
225
|
+
export declare const ALERT_DIALOG_BUTTON_GAP = "var(--rpl-alert-dialog-button-gap, 8px)";
|
|
226
|
+
export declare const ALERT_DIALOG_ACTIONS_PADDING = "var(--rpl-alert-dialog-actions-padding, 12px)";
|
|
227
|
+
export declare const ALERT_DIALOG_MESSAGE_PADDING = "var(--rpl-alert-dialog-message-padding, 16px)";
|
|
228
|
+
export declare const ALERT_DIALOG_INPUT_MARGIN_TOP = "var(--rpl-alert-dialog-input-margin-top, 12px)";
|