@kushagradhawan/kookie-ui 0.1.49 → 0.1.51
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/components.css +880 -243
- package/dist/cjs/components/_internal/shell-bottom.d.ts +31 -5
- package/dist/cjs/components/_internal/shell-bottom.d.ts.map +1 -1
- package/dist/cjs/components/_internal/shell-bottom.js +1 -1
- package/dist/cjs/components/_internal/shell-bottom.js.map +3 -3
- package/dist/cjs/components/_internal/shell-handles.d.ts.map +1 -1
- package/dist/cjs/components/_internal/shell-handles.js +1 -1
- package/dist/cjs/components/_internal/shell-handles.js.map +3 -3
- package/dist/cjs/components/_internal/shell-inspector.d.ts +23 -5
- package/dist/cjs/components/_internal/shell-inspector.d.ts.map +1 -1
- package/dist/cjs/components/_internal/shell-inspector.js +1 -1
- package/dist/cjs/components/_internal/shell-inspector.js.map +3 -3
- package/dist/cjs/components/_internal/shell-sidebar.d.ts +24 -6
- package/dist/cjs/components/_internal/shell-sidebar.d.ts.map +1 -1
- package/dist/cjs/components/_internal/shell-sidebar.js +1 -1
- package/dist/cjs/components/_internal/shell-sidebar.js.map +3 -3
- package/dist/cjs/components/chatbar.d.ts +9 -2
- package/dist/cjs/components/chatbar.d.ts.map +1 -1
- package/dist/cjs/components/chatbar.js +1 -1
- package/dist/cjs/components/chatbar.js.map +3 -3
- package/dist/cjs/components/shell.context.d.ts +88 -0
- package/dist/cjs/components/shell.context.d.ts.map +1 -1
- package/dist/cjs/components/shell.context.js +1 -1
- package/dist/cjs/components/shell.context.js.map +3 -3
- package/dist/cjs/components/shell.d.ts +51 -13
- package/dist/cjs/components/shell.d.ts.map +1 -1
- package/dist/cjs/components/shell.hooks.d.ts +7 -1
- package/dist/cjs/components/shell.hooks.d.ts.map +1 -1
- package/dist/cjs/components/shell.hooks.js +1 -1
- package/dist/cjs/components/shell.hooks.js.map +3 -3
- package/dist/cjs/components/shell.js +1 -1
- package/dist/cjs/components/shell.js.map +3 -3
- package/dist/cjs/components/shell.types.d.ts +1 -0
- package/dist/cjs/components/shell.types.d.ts.map +1 -1
- package/dist/cjs/components/shell.types.js +1 -1
- package/dist/cjs/components/shell.types.js.map +2 -2
- package/dist/cjs/components/sidebar.d.ts +7 -1
- package/dist/cjs/components/sidebar.d.ts.map +1 -1
- package/dist/cjs/components/sidebar.js +1 -1
- package/dist/cjs/components/sidebar.js.map +3 -3
- package/dist/esm/components/_internal/shell-bottom.d.ts +31 -5
- package/dist/esm/components/_internal/shell-bottom.d.ts.map +1 -1
- package/dist/esm/components/_internal/shell-bottom.js +1 -1
- package/dist/esm/components/_internal/shell-bottom.js.map +3 -3
- package/dist/esm/components/_internal/shell-handles.d.ts.map +1 -1
- package/dist/esm/components/_internal/shell-handles.js +1 -1
- package/dist/esm/components/_internal/shell-handles.js.map +3 -3
- package/dist/esm/components/_internal/shell-inspector.d.ts +23 -5
- package/dist/esm/components/_internal/shell-inspector.d.ts.map +1 -1
- package/dist/esm/components/_internal/shell-inspector.js +1 -1
- package/dist/esm/components/_internal/shell-inspector.js.map +3 -3
- package/dist/esm/components/_internal/shell-sidebar.d.ts +24 -6
- package/dist/esm/components/_internal/shell-sidebar.d.ts.map +1 -1
- package/dist/esm/components/_internal/shell-sidebar.js +1 -1
- package/dist/esm/components/_internal/shell-sidebar.js.map +3 -3
- package/dist/esm/components/chatbar.d.ts +9 -2
- package/dist/esm/components/chatbar.d.ts.map +1 -1
- package/dist/esm/components/chatbar.js +1 -1
- package/dist/esm/components/chatbar.js.map +3 -3
- package/dist/esm/components/shell.context.d.ts +88 -0
- package/dist/esm/components/shell.context.d.ts.map +1 -1
- package/dist/esm/components/shell.context.js +1 -1
- package/dist/esm/components/shell.context.js.map +3 -3
- package/dist/esm/components/shell.d.ts +51 -13
- package/dist/esm/components/shell.d.ts.map +1 -1
- package/dist/esm/components/shell.hooks.d.ts +7 -1
- package/dist/esm/components/shell.hooks.d.ts.map +1 -1
- package/dist/esm/components/shell.hooks.js +1 -1
- package/dist/esm/components/shell.hooks.js.map +3 -3
- package/dist/esm/components/shell.js +1 -1
- package/dist/esm/components/shell.js.map +3 -3
- package/dist/esm/components/shell.types.d.ts +1 -0
- package/dist/esm/components/shell.types.d.ts.map +1 -1
- package/dist/esm/components/shell.types.js.map +2 -2
- package/dist/esm/components/sidebar.d.ts +7 -1
- package/dist/esm/components/sidebar.d.ts.map +1 -1
- package/dist/esm/components/sidebar.js +1 -1
- package/dist/esm/components/sidebar.js.map +3 -3
- package/package.json +14 -3
- package/schemas/base-button.json +1 -1
- package/schemas/button.json +1 -1
- package/schemas/icon-button.json +1 -1
- package/schemas/index.json +6 -6
- package/schemas/toggle-button.json +1 -1
- package/schemas/toggle-icon-button.json +1 -1
- package/src/components/_internal/base-menu.css +17 -18
- package/src/components/_internal/base-sidebar-menu.css +23 -21
- package/src/components/_internal/base-sidebar.css +20 -0
- package/src/components/_internal/shell-bottom.tsx +176 -49
- package/src/components/_internal/shell-handles.tsx +29 -4
- package/src/components/_internal/shell-inspector.tsx +175 -43
- package/src/components/_internal/shell-sidebar.tsx +176 -69
- package/src/components/chatbar.css +240 -21
- package/src/components/chatbar.tsx +246 -290
- package/src/components/sheet.css +8 -16
- package/src/components/shell.context.tsx +79 -0
- package/src/components/shell.css +28 -2
- package/src/components/shell.hooks.ts +35 -0
- package/src/components/shell.tsx +574 -214
- package/src/components/shell.types.ts +2 -0
- package/src/components/sidebar.css +233 -33
- package/src/components/sidebar.tsx +247 -213
- package/styles.css +841 -204
|
@@ -3,7 +3,7 @@ import { useResponsivePresentation } from './shell.hooks.js';
|
|
|
3
3
|
import { Sidebar } from './_internal/shell-sidebar.js';
|
|
4
4
|
import { Bottom } from './_internal/shell-bottom.js';
|
|
5
5
|
import { Inspector } from './_internal/shell-inspector.js';
|
|
6
|
-
import type { ResponsivePresentation, PaneMode, SidebarMode,
|
|
6
|
+
import type { ResponsivePresentation, PaneMode, SidebarMode, PaneSizePersistence, PaneTarget } from './shell.types.js';
|
|
7
7
|
import { useShell } from './shell.context.js';
|
|
8
8
|
interface ShellRootProps extends React.ComponentPropsWithoutRef<'div'> {
|
|
9
9
|
children: React.ReactNode;
|
|
@@ -16,9 +16,6 @@ interface ShellHeaderProps extends React.ComponentPropsWithoutRef<'header'> {
|
|
|
16
16
|
declare const Header: React.ForwardRefExoticComponent<ShellHeaderProps & React.RefAttributes<HTMLElement>>;
|
|
17
17
|
interface PaneProps extends React.ComponentPropsWithoutRef<'div'> {
|
|
18
18
|
presentation?: ResponsivePresentation;
|
|
19
|
-
mode?: PaneMode;
|
|
20
|
-
defaultMode?: ResponsiveMode;
|
|
21
|
-
onModeChange?: (mode: PaneMode) => void;
|
|
22
19
|
expandedSize?: number;
|
|
23
20
|
minSize?: number;
|
|
24
21
|
maxSize?: number;
|
|
@@ -39,27 +36,68 @@ interface PaneProps extends React.ComponentPropsWithoutRef<'div'> {
|
|
|
39
36
|
}
|
|
40
37
|
interface LeftProps extends React.ComponentPropsWithoutRef<'div'> {
|
|
41
38
|
presentation?: ResponsivePresentation;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
39
|
+
open?: boolean;
|
|
40
|
+
defaultOpen?: boolean;
|
|
41
|
+
onOpenChange?: (open: boolean, meta: {
|
|
42
|
+
reason: 'init' | 'toggle' | 'panel' | 'responsive';
|
|
43
|
+
}) => void;
|
|
45
44
|
collapsible?: boolean;
|
|
46
45
|
onExpand?: () => void;
|
|
47
46
|
onCollapse?: () => void;
|
|
48
47
|
}
|
|
49
|
-
|
|
48
|
+
type LeftOpenChangeMeta = {
|
|
49
|
+
reason: 'init' | 'toggle' | 'responsive' | 'panel';
|
|
50
|
+
};
|
|
51
|
+
type RailControlledProps = {
|
|
52
|
+
open: boolean;
|
|
53
|
+
onOpenChange?: (open: boolean, meta: LeftOpenChangeMeta) => void;
|
|
54
|
+
defaultOpen?: never;
|
|
55
|
+
};
|
|
56
|
+
type RailUncontrolledProps = {
|
|
57
|
+
defaultOpen?: boolean;
|
|
58
|
+
onOpenChange?: (open: boolean, meta: LeftOpenChangeMeta) => void;
|
|
59
|
+
open?: never;
|
|
60
|
+
};
|
|
61
|
+
type RailProps = React.ComponentPropsWithoutRef<'div'> & {
|
|
50
62
|
presentation?: ResponsivePresentation;
|
|
51
|
-
mode?: PaneMode;
|
|
52
|
-
defaultMode?: ResponsiveMode;
|
|
53
|
-
onModeChange?: (mode: PaneMode) => void;
|
|
54
63
|
expandedSize?: number;
|
|
55
64
|
collapsible?: boolean;
|
|
56
65
|
onExpand?: () => void;
|
|
57
66
|
onCollapse?: () => void;
|
|
58
|
-
}
|
|
67
|
+
} & (RailControlledProps | RailUncontrolledProps);
|
|
59
68
|
declare const Left: React.ForwardRefExoticComponent<LeftProps & React.RefAttributes<HTMLDivElement>>;
|
|
60
69
|
declare const Rail: React.ForwardRefExoticComponent<RailProps & React.RefAttributes<HTMLDivElement>>;
|
|
61
70
|
type HandleComponent = React.ForwardRefExoticComponent<React.ComponentPropsWithoutRef<'div'> & React.RefAttributes<HTMLDivElement>>;
|
|
62
|
-
type
|
|
71
|
+
type PanelOpenChangeMeta = {
|
|
72
|
+
reason: 'toggle' | 'left' | 'init';
|
|
73
|
+
};
|
|
74
|
+
type PanelControlledProps = {
|
|
75
|
+
open: boolean;
|
|
76
|
+
onOpenChange?: (open: boolean, meta: PanelOpenChangeMeta) => void;
|
|
77
|
+
defaultOpen?: never;
|
|
78
|
+
};
|
|
79
|
+
type PanelUncontrolledProps = {
|
|
80
|
+
defaultOpen?: boolean;
|
|
81
|
+
onOpenChange?: (open: boolean, meta: PanelOpenChangeMeta) => void;
|
|
82
|
+
open?: never;
|
|
83
|
+
};
|
|
84
|
+
type PanelSizeControlledProps = {
|
|
85
|
+
size: number | string;
|
|
86
|
+
defaultSize?: never;
|
|
87
|
+
};
|
|
88
|
+
type PanelSizeUncontrolledProps = {
|
|
89
|
+
defaultSize?: number | string;
|
|
90
|
+
size?: never;
|
|
91
|
+
};
|
|
92
|
+
type PanelSizeChangeMeta = {
|
|
93
|
+
reason: 'init' | 'resize' | 'controlled';
|
|
94
|
+
};
|
|
95
|
+
type PanelPublicProps = Omit<PaneProps, 'presentation' | 'defaultMode'> & (PanelControlledProps | PanelUncontrolledProps) & (PanelSizeControlledProps | PanelSizeUncontrolledProps) & {
|
|
96
|
+
onSizeChange?: (size: number, meta: PanelSizeChangeMeta) => void;
|
|
97
|
+
sizeUpdate?: 'throttle' | 'debounce';
|
|
98
|
+
sizeUpdateMs?: number;
|
|
99
|
+
};
|
|
100
|
+
type PanelComponent = React.ForwardRefExoticComponent<PanelPublicProps & React.RefAttributes<HTMLDivElement>> & {
|
|
63
101
|
Handle: HandleComponent;
|
|
64
102
|
};
|
|
65
103
|
declare const Panel: PanelComponent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../src/components/shell.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../src/components/shell.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
-
import type { PresentationValue, ResponsivePresentation } from './shell.types.js';
|
|
1
|
+
import type { Breakpoint, PresentationValue, ResponsivePresentation } from './shell.types.js';
|
|
2
2
|
export declare function useResponsivePresentation(presentation: ResponsivePresentation): PresentationValue;
|
|
3
|
+
/**
|
|
4
|
+
* Resolve a responsive value (T or responsive map keyed by breakpoints) against the current Shell breakpoint.
|
|
5
|
+
* If no value is defined for the current breakpoint, search smaller breakpoints down to 'initial'.
|
|
6
|
+
* Returns undefined when passed a responsive map with no matching key across the chain.
|
|
7
|
+
*/
|
|
8
|
+
export declare function useResponsiveValue<T>(value: T | Partial<Record<Breakpoint, T>> | undefined): T | undefined;
|
|
3
9
|
//# sourceMappingURL=shell.hooks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.hooks.d.ts","sourceRoot":"","sources":["../../../src/components/shell.hooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"shell.hooks.d.ts","sourceRoot":"","sources":["../../../src/components/shell.hooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAI9F,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,sBAAsB,GAAG,iBAAiB,CAyBjG;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,SAAS,CA4B1G"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import*as
|
|
1
|
+
import*as p from"react";import{BREAKPOINTS as f}from"./shell.types.js";import{useShell as u}from"./shell.context.js";function k(e){const{currentBreakpoint:r}=u();return p.useMemo(()=>{if(typeof e=="string")return e;if(e[r])return e[r];const i=[...Object.keys(f)].reverse().concat("initial"),o=i.indexOf(r);for(let s=o+1;s<i.length;s++){const t=i[s];if(e[t])return e[t]}return"fixed"},[e,r])}function B(e){const{currentBreakpoint:r}=u();return p.useMemo(()=>{if(e==null)return;if(typeof e!="object")return e;const n=e;if(n[r]!==void 0)return n[r];const o=[...Object.keys(f)].reverse().concat("initial"),s=o.indexOf(r);for(let t=s+1;t<o.length;t++){const a=o[t];if(n[a]!==void 0)return n[a]}},[e,r])}export{k as useResponsivePresentation,B as useResponsiveValue};
|
|
2
2
|
//# sourceMappingURL=shell.hooks.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/shell.hooks.ts"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nimport type { Breakpoint, PresentationValue, ResponsivePresentation } from './shell.types.js';\nimport { BREAKPOINTS } from './shell.types.js';\nimport { useShell } from './shell.context.js';\n\nexport function useResponsivePresentation(presentation: ResponsivePresentation): PresentationValue {\n const { currentBreakpoint } = useShell();\n\n return React.useMemo(() => {\n if (typeof presentation === 'string') {\n return presentation;\n }\n\n if (presentation[currentBreakpoint]) {\n return presentation[currentBreakpoint]!;\n }\n\n const bpKeys = Object.keys(BREAKPOINTS) as Array<keyof typeof BREAKPOINTS>;\n const order: Breakpoint[] = ([...bpKeys].reverse() as Breakpoint[]).concat('initial' as Breakpoint);\n const startIdx = order.indexOf(currentBreakpoint as Breakpoint);\n\n for (let i = startIdx + 1; i < order.length; i++) {\n const bp = order[i];\n if (presentation[bp]) {\n return presentation[bp]!;\n }\n }\n\n return 'fixed';\n }, [presentation, currentBreakpoint]);\n}\n"],
|
|
5
|
-
"mappings": "AAAA,UAAYA,MAAW,QAEvB,OAAS,eAAAC,MAAmB,mBAC5B,OAAS,YAAAC,MAAgB,qBAElB,SAASC,EAA0BC,EAAyD,CACjG,KAAM,CAAE,kBAAAC,CAAkB,EAAIH,EAAS,EAEvC,OAAOF,EAAM,QAAQ,IAAM,CACzB,GAAI,OAAOI,GAAiB,SAC1B,OAAOA,EAGT,GAAIA,EAAaC,CAAiB,EAChC,OAAOD,EAAaC,CAAiB,EAIvC,MAAMC,EAAuB,CAAC,GADf,OAAO,KAAKL,CAAW,CACC,EAAE,QAAQ,EAAmB,OAAO,SAAuB,EAC5FM,EAAWD,EAAM,QAAQD,CAA+B,EAE9D,QAASG,EAAID,EAAW,EAAGC,EAAIF,EAAM,OAAQE,IAAK,CAChD,MAAMC,EAAKH,EAAME,CAAC,EAClB,GAAIJ,EAAaK,CAAE,EACjB,OAAOL,EAAaK,CAAE,CAE1B,CAEA,MAAO,OACT,EAAG,CAACL,EAAcC,CAAiB,CAAC,CACtC",
|
|
6
|
-
"names": ["React", "BREAKPOINTS", "useShell", "useResponsivePresentation", "presentation", "currentBreakpoint", "order", "startIdx", "i", "bp"]
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nimport type { Breakpoint, PresentationValue, ResponsivePresentation } from './shell.types.js';\nimport { BREAKPOINTS } from './shell.types.js';\nimport { useShell } from './shell.context.js';\n\nexport function useResponsivePresentation(presentation: ResponsivePresentation): PresentationValue {\n const { currentBreakpoint } = useShell();\n\n return React.useMemo(() => {\n if (typeof presentation === 'string') {\n return presentation;\n }\n\n if (presentation[currentBreakpoint]) {\n return presentation[currentBreakpoint]!;\n }\n\n const bpKeys = Object.keys(BREAKPOINTS) as Array<keyof typeof BREAKPOINTS>;\n const order: Breakpoint[] = ([...bpKeys].reverse() as Breakpoint[]).concat('initial' as Breakpoint);\n const startIdx = order.indexOf(currentBreakpoint as Breakpoint);\n\n for (let i = startIdx + 1; i < order.length; i++) {\n const bp = order[i];\n if (presentation[bp]) {\n return presentation[bp]!;\n }\n }\n\n return 'fixed';\n }, [presentation, currentBreakpoint]);\n}\n\n/**\n * Resolve a responsive value (T or responsive map keyed by breakpoints) against the current Shell breakpoint.\n * If no value is defined for the current breakpoint, search smaller breakpoints down to 'initial'.\n * Returns undefined when passed a responsive map with no matching key across the chain.\n */\nexport function useResponsiveValue<T>(value: T | Partial<Record<Breakpoint, T>> | undefined): T | undefined {\n const { currentBreakpoint } = useShell();\n\n return React.useMemo(() => {\n if (value == null) return undefined;\n // Primitive value\n if (typeof value !== 'object') {\n return value as T;\n }\n\n const map = value as Partial<Record<Breakpoint, T>>;\n if (map[currentBreakpoint as Breakpoint] !== undefined) {\n return map[currentBreakpoint as Breakpoint] as T;\n }\n\n const bpKeys = Object.keys(BREAKPOINTS) as Array<keyof typeof BREAKPOINTS>;\n const order: Breakpoint[] = ([...bpKeys].reverse() as Breakpoint[]).concat('initial' as Breakpoint);\n const startIdx = order.indexOf(currentBreakpoint as Breakpoint);\n\n for (let i = startIdx + 1; i < order.length; i++) {\n const bp = order[i];\n if (map[bp] !== undefined) {\n return map[bp] as T;\n }\n }\n\n return undefined;\n }, [value, currentBreakpoint]);\n}\n"],
|
|
5
|
+
"mappings": "AAAA,UAAYA,MAAW,QAEvB,OAAS,eAAAC,MAAmB,mBAC5B,OAAS,YAAAC,MAAgB,qBAElB,SAASC,EAA0BC,EAAyD,CACjG,KAAM,CAAE,kBAAAC,CAAkB,EAAIH,EAAS,EAEvC,OAAOF,EAAM,QAAQ,IAAM,CACzB,GAAI,OAAOI,GAAiB,SAC1B,OAAOA,EAGT,GAAIA,EAAaC,CAAiB,EAChC,OAAOD,EAAaC,CAAiB,EAIvC,MAAMC,EAAuB,CAAC,GADf,OAAO,KAAKL,CAAW,CACC,EAAE,QAAQ,EAAmB,OAAO,SAAuB,EAC5FM,EAAWD,EAAM,QAAQD,CAA+B,EAE9D,QAASG,EAAID,EAAW,EAAGC,EAAIF,EAAM,OAAQE,IAAK,CAChD,MAAMC,EAAKH,EAAME,CAAC,EAClB,GAAIJ,EAAaK,CAAE,EACjB,OAAOL,EAAaK,CAAE,CAE1B,CAEA,MAAO,OACT,EAAG,CAACL,EAAcC,CAAiB,CAAC,CACtC,CAOO,SAASK,EAAsBC,EAAsE,CAC1G,KAAM,CAAE,kBAAAN,CAAkB,EAAIH,EAAS,EAEvC,OAAOF,EAAM,QAAQ,IAAM,CACzB,GAAIW,GAAS,KAAM,OAEnB,GAAI,OAAOA,GAAU,SACnB,OAAOA,EAGT,MAAMC,EAAMD,EACZ,GAAIC,EAAIP,CAA+B,IAAM,OAC3C,OAAOO,EAAIP,CAA+B,EAI5C,MAAMC,EAAuB,CAAC,GADf,OAAO,KAAKL,CAAW,CACC,EAAE,QAAQ,EAAmB,OAAO,SAAuB,EAC5FM,EAAWD,EAAM,QAAQD,CAA+B,EAE9D,QAASG,EAAID,EAAW,EAAGC,EAAIF,EAAM,OAAQE,IAAK,CAChD,MAAMC,EAAKH,EAAME,CAAC,EAClB,GAAII,EAAIH,CAAE,IAAM,OACd,OAAOG,EAAIH,CAAE,CAEjB,CAGF,EAAG,CAACE,EAAON,CAAiB,CAAC,CAC/B",
|
|
6
|
+
"names": ["React", "BREAKPOINTS", "useShell", "useResponsivePresentation", "presentation", "currentBreakpoint", "order", "startIdx", "i", "bp", "useResponsiveValue", "value", "map"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import*as e from"react";import O from"classnames";import*as Q from"./sheet.js";import"./inset.js";import{VisuallyHidden as be}from"./visually-hidden.js";import{useResponsivePresentation as ne}from"./shell.hooks.js";import{PaneResizeContext as Re}from"./_internal/shell-resize.js";import{PaneHandle as Me,PanelHandle as X}from"./_internal/shell-handles.js";import{Sidebar as Y}from"./_internal/shell-sidebar.js";import{Bottom as ae}from"./_internal/shell-bottom.js";import{Inspector as oe}from"./_internal/shell-inspector.js";import{BREAKPOINTS as se}from"./shell.types.js";import{ShellProvider as he,useShell as F}from"./shell.context.js";function ve(){const[r,m]=e.useState("initial"),[s,c]=e.useState(!1);return e.useEffect(()=>{if(typeof window>"u")return;const P=Object.entries(se).map(([i,u])=>[i,window.matchMedia(u)]),M=()=>{const i=P.filter(([,o])=>o.matches).map(([o])=>o),u=i[i.length-1]??"initial";m(u),c(!0)};return M(),P.forEach(([,i])=>i.addEventListener("change",M)),()=>{P.forEach(([,i])=>i.removeEventListener("change",M))}},[]),{bp:r,ready:s}}const le=e.forwardRef(({className:r,children:m,height:s="full",...c},E)=>{const{bp:P,ready:M}=ve(),[i,u]=e.useState("collapsed"),[o,b]=e.useState("collapsed"),[v,t]=e.useState("expanded"),[f,h]=e.useState("collapsed"),[W,B]=e.useState("collapsed"),[T,$]=e.useState(!1),[z,K]=e.useState(!1),d=e.useRef(n=>n==="collapsed"?"thin":n==="thin"?"expanded":"collapsed"),l=e.useCallback(n=>{d.current=n},[]);e.useEffect(()=>{i==="collapsed"&&b("collapsed")},[i]),e.useEffect(()=>{z&&T&&console.warn("Shell: Sidebar cannot coexist with Rail or Panel. Use either Rail+Panel OR Sidebar.")},[z,T]);const[p,S]=e.useState(void 0),R=e.useCallback(n=>S(n),[]),C=e.useRef(64),D=e.useRef(288),L=e.useCallback(n=>{C.current=n},[]),w=e.useCallback(n=>{D.current=n},[]),A=e.useMemo(()=>{const n=e.Children.toArray(m),y=(x,j)=>e.isValidElement(x)&&(x.type===j||x.type?.displayName===j.displayName);return n.some(x=>y(x,q)||y(x,I))},[m]),g=e.useMemo(()=>{const n=e.Children.toArray(m),y=(x,j)=>e.isValidElement(x)&&(x.type===j||x.type?.displayName===j.displayName);return n.some(x=>y(x,Y))},[m]),a=e.useCallback(n=>{switch(n){case"left":case"rail":u(y=>y==="expanded"?"collapsed":"expanded");break;case"panel":i==="collapsed"?(u("expanded"),b("expanded")):b(y=>y==="expanded"?"collapsed":"expanded");break;case"sidebar":t(y=>d.current(y));break;case"inspector":h(y=>y==="expanded"?"collapsed":"expanded");break;case"bottom":B(y=>y==="expanded"?"collapsed":"expanded");break}},[i]),k=e.useCallback(n=>{switch(n){case"left":case"rail":u("expanded");break;case"panel":u("expanded"),b("expanded");break;case"sidebar":t("expanded");break;case"inspector":h("expanded");break;case"bottom":B("expanded");break}},[]),H=e.useCallback(n=>{switch(n){case"left":case"rail":u("collapsed");break;case"panel":b("collapsed");break;case"sidebar":t("collapsed");break;case"inspector":h("collapsed");break;case"bottom":B("collapsed");break}},[]),G=e.useMemo(()=>({leftMode:i,setLeftMode:u,panelMode:o,setPanelMode:b,sidebarMode:v,setSidebarMode:t,inspectorMode:f,setInspectorMode:h,bottomMode:W,setBottomMode:B,hasLeft:T,setHasLeft:$,hasSidebar:z,setHasSidebar:K,currentBreakpoint:P,currentBreakpointReady:M,leftResolvedPresentation:p,togglePane:a,expandPane:k,collapsePane:H,setSidebarToggleComputer:l,onLeftPres:R,onRailDefaults:L,onPanelDefaults:w}),[i,o,v,f,W,T,z,P,M,p,a,k,H,l,R,L,w]),N=e.Children.toArray(m),V=(n,y)=>e.isValidElement(n)&&(n.type===y||n.type?.displayName===y.displayName),de=N.filter(n=>V(n,Z)),te=N.filter(n=>V(n,q)),ie=N.filter(n=>V(n,I)),pe=N.filter(n=>V(n,Y)),ce=N.filter(n=>V(n,ee)),fe=N.filter(n=>V(n,oe)),ue=N.filter(n=>V(n,ae)),me=e.useMemo(()=>s==="full"?{height:"100vh"}:s==="auto"?{height:"auto"}:typeof s=="string"?{height:s}:typeof s=="number"?{height:`${s}px`}:{},[s]),[U,J]=e.useState(null),ye=e.useCallback(n=>J(n),[]),Pe=e.useCallback(()=>J(null),[]);return e.createElement("div",{...c,ref:E,className:O("rt-ShellRoot",r),style:{...me,...c.style}},e.createElement(he,{value:{...G,peekTarget:U,setPeekTarget:J,peekPane:ye,clearPeek:Pe}},de,e.createElement("div",{className:"rt-ShellBody","data-peek-target":U??void 0,style:U==="rail"||U==="panel"?{"--peek-rail-width":`${C.current}px`}:void 0},A&&!g?(()=>{const n=te[0],y=n?{mode:n.props?.mode,defaultMode:n.props?.defaultMode,onModeChange:n.props?.onModeChange,presentation:n.props?.presentation,collapsible:n.props?.collapsible,onExpand:n.props?.onExpand,onCollapse:n.props?.onCollapse}:{};return e.createElement(_,{...y},te,ie)})():pe,ce,fe),ue))});le.displayName="Shell.Root";const Z=e.forwardRef(({className:r,height:m=64,style:s,...c},E)=>e.createElement("header",{...c,ref:E,className:O("rt-ShellHeader",r),style:{...s,"--shell-header-height":`${m}px`}}));Z.displayName="Shell.Header";const _=e.forwardRef(({className:r,presentation:m={initial:"overlay",sm:"fixed"},mode:s,defaultMode:c="collapsed",onModeChange:E,collapsible:P=!0,onExpand:M,onCollapse:i,children:u,style:o,...b},v)=>{const t=F(),f=ne(m),h=f==="overlay",W=f==="stacked",B=e.useRef(null);e.useEffect(()=>{t.onLeftPres?.(f)},[t,f]);const T=e.useCallback(d=>{B.current=d,typeof v=="function"?v(d):v&&(v.current=d)},[v]);e.useEffect(()=>(t.setHasLeft(!0),()=>t.setHasLeft(!1)),[t]);const $=e.useCallback(()=>{if(typeof c=="string")return c;const d=c;if(d&&d[t.currentBreakpoint])return d[t.currentBreakpoint];const p=[...Object.keys(se)].reverse().concat("initial"),S=p.indexOf(t.currentBreakpoint);for(let R=S+1;R<p.length;R++){const C=p[R];if(d&&d[C])return d[C]}return"collapsed"},[c,t.currentBreakpoint]),z=e.useRef(null);e.useEffect(()=>{if(s!==void 0||!t.currentBreakpointReady||z.current===t.currentBreakpoint)return;z.current=t.currentBreakpoint;const d=$();d!==t.leftMode&&t.setLeftMode(d)},[s,t.currentBreakpoint,t.currentBreakpointReady,$,t.leftMode,t.setLeftMode]),e.useEffect(()=>{s!==void 0&&t.leftMode!==s&&t.setLeftMode(s)},[s,t]),e.useEffect(()=>{s===void 0&&E?.(t.leftMode)},[t.leftMode,s,E]),e.useEffect(()=>{t.leftMode==="expanded"?M?.():i?.()},[t.leftMode,M,i]);const K=t.leftMode==="expanded";if(h){const d=t.leftMode==="expanded",l=e.Children.toArray(u),p=(g,a)=>e.isValidElement(g)&&g.type===a,S=l.find(g=>p(g,q)),R=l.find(g=>p(g,I)),C=typeof S?.props?.expandedSize=="number"?S.props.expandedSize:64,D=typeof R?.props?.expandedSize=="number"?R.props.expandedSize:288,L=!!S,w=!!R,A=(L?C:0)+(t.panelMode==="expanded"&&w?D:0);return e.createElement(Q.Root,{open:d,onOpenChange:g=>t.setLeftMode(g?"expanded":"collapsed")},e.createElement(Q.Content,{side:"start",style:{padding:0},width:{initial:`${A}px`}},e.createElement(be,null,e.createElement(Q.Title,null,"Navigation")),e.createElement("div",{className:"rt-ShellLeft"},u)))}if(W){const d=t.leftMode==="expanded",l=e.Children.toArray(u),p=(a,k)=>e.isValidElement(a)&&a.type===k,S=l.find(a=>p(a,q)),R=l.find(a=>p(a,I)),C=typeof S?.props?.expandedSize=="number"?S.props.expandedSize:64,D=typeof R?.props?.expandedSize=="number"?R.props.expandedSize:288,L=!!S,A=!!R&&(t.panelMode==="expanded"||t.peekTarget==="panel"),g=(L?C:0)+(A?D:0);return e.createElement("div",{...b,ref:T,className:O("rt-ShellLeft",r),"data-mode":t.leftMode,"data-peek":t.peekTarget==="left"||t.peekTarget==="rail"||t.peekTarget==="panel"||void 0,"data-presentation":f,style:{...o},"data-open":d||void 0},u)}return e.createElement("div",{...b,ref:T,className:O("rt-ShellLeft",r),"data-mode":t.leftMode,"data-peek":t.peekTarget==="left"||t.peekTarget==="rail"||t.peekTarget==="panel"||void 0,"data-presentation":f,style:{...o}},u)});_.displayName="Shell.Left";const q=e.forwardRef(({className:r,presentation:m,mode:s,defaultMode:c,onModeChange:E,expandedSize:P=64,collapsible:M,onExpand:i,onCollapse:u,children:o,style:b,...v},t)=>{const f=F();e.useEffect(()=>{f.onRailDefaults?.(P)},[f,P]);const h=f.leftMode==="expanded";return e.createElement("div",{...v,ref:t,className:O("rt-ShellRail",r),"data-mode":f.leftMode,"data-peek":f.leftResolvedPresentation!=="overlay"&&f.peekTarget==="rail"||void 0,style:{...b,"--rail-size":`${P}px`}},e.createElement("div",{className:"rt-ShellRailContent","data-visible":h||f.leftResolvedPresentation!=="overlay"&&f.peekTarget==="rail"||void 0},o))});q.displayName="Shell.Rail";const I=e.forwardRef(({className:r,mode:m,onModeChange:s,expandedSize:c=288,minSize:E,maxSize:P,resizable:M,collapsible:i=!0,onExpand:u,onCollapse:o,onResize:b,onResizeStart:v,onResizeEnd:t,snapPoints:f,snapTolerance:h,collapseThreshold:W,paneId:B,persistence:T,children:$,style:z,...K},d)=>{const l=F();e.useEffect(()=>{l.onPanelDefaults?.(c)},[l,c]);const p=e.useRef(null),S=e.useCallback(a=>{p.current=a,typeof d=="function"?d(a):d&&(d.current=a)},[d]),R=e.Children.toArray($),C=R.filter(a=>e.isValidElement(a)&&a.type===X),D=R.filter(a=>!(e.isValidElement(a)&&a.type===X)),L=l.leftResolvedPresentation==="overlay",w=e.useMemo(()=>{if(!B||T)return T;const a=`kookie-ui:shell:panel:${B}`;return{load:()=>{if(typeof window>"u")return;const H=window.localStorage.getItem(a);return H?Number(H):void 0},save:H=>{typeof window>"u"||window.localStorage.setItem(a,String(H))}}},[B,T]);e.useEffect(()=>{let a=!0;return(async()=>{if(!M||!w?.load||L)return;const k=await w.load();a&&typeof k=="number"&&p.current&&(p.current.style.setProperty("--panel-size",`${k}px`),b?.(k))})(),()=>{a=!1}},[M,w,b,L]),e.useEffect(()=>{p.current&&L&&p.current.style.setProperty("--panel-size",`${c}px`)},[L,c]),e.useEffect(()=>{if(p.current&&l.leftResolvedPresentation!=="overlay"&&l.leftMode==="expanded"&&l.panelMode==="expanded"){const a=p.current.parentElement||null;try{a?.style.removeProperty("width")}catch{}}},[l.leftResolvedPresentation,l.leftMode,l.panelMode]);const A=l.leftMode==="expanded"&&l.panelMode==="expanded",g=M&&l.leftResolvedPresentation!=="overlay"&&A?e.createElement(Re.Provider,{value:{containerRef:p,cssVarName:"--panel-size",minSize:typeof E=="number"?E:100,maxSize:typeof P=="number"?P:800,defaultSize:c,orientation:"vertical",edge:"end",computeNext:(a,k,H)=>{const G=getComputedStyle(p.current).direction==="rtl",N=a-k;return H+(G?-N:N)},onResize:b,onResizeStart:a=>{const H=p.current?.parentElement;try{H?.style.removeProperty("width")}catch{}v?.(a)},onResizeEnd:a=>{t?.(a),w?.save?.(a)},target:"panel",collapsible:!!i,snapPoints:f,snapTolerance:h??8,collapseThreshold:W,requestCollapse:()=>l.setPanelMode("collapsed"),requestToggle:()=>l.togglePane("panel")}},C.length>0?C.map((a,k)=>e.cloneElement(a,{key:a.key??k})):e.createElement(Me,null)):null;return e.createElement("div",{...K,ref:S,className:O("rt-ShellPanel",r),"data-mode":l.panelMode,"data-visible":A||l.leftResolvedPresentation!=="overlay"&&l.peekTarget==="panel"||void 0,"data-peek":l.leftResolvedPresentation!=="overlay"&&l.peekTarget==="panel"||void 0,style:{...z,"--panel-size":`${c}px`}},e.createElement("div",{className:"rt-ShellPanelContent","data-visible":A||void 0},D),g)});I.displayName="Shell.Panel",I.Handle=X;const ee=e.forwardRef(({className:r,...m},s)=>e.createElement("main",{...m,ref:s,className:O("rt-ShellContent",r)}));ee.displayName="Shell.Content";const re=e.forwardRef(({target:r,action:m="toggle",peekOnHover:s,onClick:c,onMouseEnter:E,onMouseLeave:P,children:M,...i},u)=>{const o=F(),b=e.useCallback(h=>{switch(c?.(h),o.peekTarget===r&&o.clearPeek(),m){case"toggle":o.togglePane(r);break;case"expand":o.expandPane(r);break;case"collapse":o.collapsePane(r);break}},[o,r,m,c]),v=(()=>{switch(r){case"left":case"rail":return o.leftMode==="collapsed";case"panel":return o.leftMode==="collapsed"||o.panelMode==="collapsed";case"sidebar":return o.sidebarMode==="collapsed";case"inspector":return o.inspectorMode==="collapsed";case"bottom":return o.bottomMode==="collapsed"}})(),t=e.useCallback(h=>{E?.(h),!(!s||!v)&&o.peekPane(r)},[E,s,v,o,r]),f=e.useCallback(h=>{P?.(h),s&&o.peekTarget===r&&o.clearPeek()},[P,s,o,r]);return e.createElement("button",{...i,ref:u,onClick:b,onMouseEnter:t,onMouseLeave:f,"data-shell-trigger":r,"data-shell-action":m},M)});re.displayName="Shell.Trigger";export{ae as Bottom,ee as Content,Z as Header,oe as Inspector,_ as Left,I as Panel,q as Rail,le as Root,Y as Sidebar,re as Trigger,ne as useResponsivePresentation,F as useShell};
|
|
1
|
+
"use client";import*as e from"react";import J from"classnames";import*as de from"./sheet.js";import{VisuallyHidden as Se}from"./visually-hidden.js";import{useResponsivePresentation as Me,useResponsiveValue as Te}from"./shell.hooks.js";import{PaneResizeContext as Oe}from"./_internal/shell-resize.js";import{PaneHandle as Le,PanelHandle as se}from"./_internal/shell-handles.js";import{Sidebar as ie}from"./_internal/shell-sidebar.js";import{Bottom as ye}from"./_internal/shell-bottom.js";import{Inspector as Pe}from"./_internal/shell-inspector.js";import{BREAKPOINTS as ke}from"./shell.types.js";import{ShellProvider as Ne,useShell as ae,LeftModeContext as _e,PanelModeContext as De,SidebarModeContext as we,InspectorModeContext as Ae,BottomModeContext as He,PresentationContext as Be,PeekContext as ze,ActionsContext as Ie,CompositionContext as Ve}from"./shell.context.js";function Fe(){const[o,d]=e.useState("initial"),[s,h]=e.useState(!1);return e.useEffect(()=>{if(typeof window>"u")return;const y=Object.entries(ke).map(([p,n])=>[p,window.matchMedia(n)]),c=()=>{const p=y.filter(([,r])=>r.matches).map(([r])=>r),n=p[p.length-1]??"initial";d(n),h(!0)};c();const i=[];return y.forEach(([,p])=>{const n=p;typeof n.addEventListener=="function"&&typeof n.removeEventListener=="function"?(n.addEventListener("change",c),i.push(()=>n.removeEventListener?.("change",c))):typeof n.addListener=="function"&&typeof n.removeListener=="function"&&(n.addListener(c),i.push(()=>n.removeListener?.(c)))}),()=>{i.forEach(p=>{try{p()}catch{}})}},[]),{bp:o,ready:s}}function We(o,d){switch(d.type){case"SET_LEFT_MODE":return d.mode==="collapsed"?{...o,leftMode:"collapsed",panelMode:"collapsed"}:{...o,leftMode:d.mode};case"SET_PANEL_MODE":return d.mode==="expanded"&&o.leftMode!=="expanded"?{...o,leftMode:"expanded",panelMode:"expanded"}:{...o,panelMode:d.mode};case"SET_SIDEBAR_MODE":return{...o,sidebarMode:d.mode};case"SET_INSPECTOR_MODE":return{...o,inspectorMode:d.mode};case"SET_BOTTOM_MODE":return{...o,bottomMode:d.mode};case"TOGGLE_PANE":{switch(d.target){case"left":case"rail":return{...o,leftMode:o.leftMode==="expanded"?"collapsed":"expanded",panelMode:o.leftMode==="expanded"?"collapsed":o.panelMode};case"panel":return o.leftMode==="collapsed"?{...o,leftMode:"expanded",panelMode:"expanded"}:{...o,panelMode:o.panelMode==="expanded"?"collapsed":"expanded"};case"sidebar":{const s=o.sidebarMode==="collapsed"?"expanded":o.sidebarMode==="expanded"?"collapsed":"expanded";return{...o,sidebarMode:s}}case"inspector":return{...o,inspectorMode:o.inspectorMode==="expanded"?"collapsed":"expanded"};case"bottom":return{...o,bottomMode:o.bottomMode==="expanded"?"collapsed":"expanded"};default:return o}return o}case"EXPAND_PANE":{switch(d.target){case"left":case"rail":return{...o,leftMode:"expanded"};case"panel":return{...o,leftMode:"expanded",panelMode:"expanded"};case"sidebar":return{...o,sidebarMode:"expanded"};case"inspector":return{...o,inspectorMode:"expanded"};case"bottom":return{...o,bottomMode:"expanded"};default:return o}return o}case"COLLAPSE_PANE":{switch(d.target){case"left":case"rail":return{...o,leftMode:"collapsed",panelMode:"collapsed"};case"panel":return{...o,panelMode:"collapsed"};case"sidebar":return{...o,sidebarMode:"collapsed"};case"inspector":return{...o,inspectorMode:"collapsed"};case"bottom":return{...o,bottomMode:"collapsed"};default:return o}return o}}return o}const be=e.forwardRef(({className:o,children:d,height:s="full",...h},v)=>{const{bp:y,ready:c}=Fe(),i=e.Children.toArray(d),p=i.some(t=>e.isValidElement(t)&&t.type?.displayName==="Shell.Panel"&&!!t.props?.defaultOpen),n=i.some(t=>e.isValidElement(t)&&t.type?.displayName==="Shell.Rail"&&!!t.props?.defaultOpen),[r,P]=e.useReducer(We,{leftMode:p||n?"expanded":"collapsed",panelMode:p?"expanded":"collapsed",sidebarMode:"expanded",inspectorMode:"collapsed",bottomMode:"collapsed"}),N=e.useCallback(t=>P({type:"SET_LEFT_MODE",mode:t}),[]),T=e.useCallback(t=>P({type:"SET_PANEL_MODE",mode:t}),[]),E=e.useCallback(t=>P({type:"SET_SIDEBAR_MODE",mode:t}),[]),$=e.useCallback(t=>P({type:"SET_INSPECTOR_MODE",mode:t}),[]),_=e.useCallback(t=>P({type:"SET_BOTTOM_MODE",mode:t}),[]),[R,H]=e.useState(!1),[x,W]=e.useState(!1),ne=e.useRef(t=>t==="collapsed"?"thin":t==="thin"?"expanded":"collapsed"),q=e.useCallback(t=>{ne.current=t},[]);e.useEffect(()=>{x&&R&&console.warn("Shell: Sidebar cannot coexist with Rail or Panel. Use either Rail+Panel OR Sidebar.")},[x,R]);const[D,Y]=e.useState(void 0),G=e.useCallback(t=>Y(t),[]),te=e.useRef(64),V=e.useRef(288),b=e.useCallback(t=>{te.current=t},[]),l=e.useCallback(t=>{V.current=t},[]),B=e.useMemo(()=>{const t=e.Children.toArray(d),w=(k,oe)=>e.isValidElement(k)&&(k.type===oe||k.type?.displayName===oe.displayName);return t.some(k=>w(k,ee)||w(k,A))},[d]),O=e.useMemo(()=>{const t=e.Children.toArray(d),w=(k,oe)=>e.isValidElement(k)&&(k.type===oe||k.type?.displayName===oe.displayName);return t.some(k=>w(k,ie))},[d]),g=e.useCallback(t=>{if(t==="sidebar"){const w=ne.current(r.sidebarMode);E(w);return}P({type:"TOGGLE_PANE",target:t})},[r.sidebarMode]),f=e.useCallback(t=>{if(t==="sidebar")return E("expanded");P({type:"EXPAND_PANE",target:t})},[]),F=e.useCallback(t=>{if(t==="sidebar")return E("collapsed");P({type:"COLLAPSE_PANE",target:t})},[]),Q=e.useMemo(()=>({leftMode:r.leftMode,setLeftMode:N,panelMode:r.panelMode,setPanelMode:T,sidebarMode:r.sidebarMode,setSidebarMode:E,inspectorMode:r.inspectorMode,setInspectorMode:$,bottomMode:r.bottomMode,setBottomMode:_,hasLeft:R,setHasLeft:H,hasSidebar:x,setHasSidebar:W,currentBreakpoint:y,currentBreakpointReady:c,leftResolvedPresentation:D,togglePane:g,expandPane:f,collapsePane:F,setSidebarToggleComputer:q,onLeftPres:G,onRailDefaults:b,onPanelDefaults:l}),[r.leftMode,r.panelMode,r.sidebarMode,r.inspectorMode,r.bottomMode,R,x,y,c,D,g,f,F,q,G,b,l]),S=e.Children.toArray(d),L=(t,w)=>e.isValidElement(t)&&(t.type===w||t.type?.displayName===w.displayName),C=S.filter(t=>L(t,pe)),z=S.filter(t=>L(t,ee)),U=S.filter(t=>L(t,A)),j=S.filter(t=>L(t,ie)),I=S.filter(t=>L(t,ce)),le=S.filter(t=>L(t,Pe)),fe=S.filter(t=>L(t,ye)),re=z[0]?.props?.open;e.useEffect(()=>{if(typeof re>"u")return;N(!!re?"expanded":"collapsed")},[re]);const me=e.useMemo(()=>s==="full"?{height:"100vh"}:s==="auto"?{height:"auto"}:typeof s=="string"?{height:s}:typeof s=="number"?{height:`${s}px`}:{},[s]),[X,K]=e.useState(null),a=e.useCallback(t=>K(t),[]),u=e.useCallback(()=>K(null),[]),m=e.useMemo(()=>({currentBreakpoint:y,currentBreakpointReady:c,leftResolvedPresentation:D}),[y,c,D]),M=e.useMemo(()=>({leftMode:r.leftMode,setLeftMode:N}),[r.leftMode,N]),Z=e.useMemo(()=>({panelMode:r.panelMode,setPanelMode:T}),[r.panelMode,T]),he=e.useMemo(()=>({sidebarMode:r.sidebarMode,setSidebarMode:E}),[r.sidebarMode,E]),ve=e.useMemo(()=>({inspectorMode:r.inspectorMode,setInspectorMode:$}),[r.inspectorMode,$]),Ce=e.useMemo(()=>({bottomMode:r.bottomMode,setBottomMode:_}),[r.bottomMode,_]),Re=e.useMemo(()=>({hasLeft:R,setHasLeft:H,hasSidebar:x,setHasSidebar:W}),[R,H,x,W]),ge=e.useMemo(()=>({peekTarget:X,setPeekTarget:K,peekPane:a,clearPeek:u}),[X,K,a,u]),xe=e.useMemo(()=>({togglePane:g,expandPane:f,collapsePane:F,setSidebarToggleComputer:q}),[g,f,F,q]);return e.createElement("div",{...h,ref:v,className:J("rt-ShellRoot",o),style:{...me,...h.style}},e.createElement(Ne,{value:{...Q,peekTarget:X,setPeekTarget:K,peekPane:a,clearPeek:u}},e.createElement(Be.Provider,{value:m},e.createElement(_e.Provider,{value:M},e.createElement(De.Provider,{value:Z},e.createElement(we.Provider,{value:he},e.createElement(Ae.Provider,{value:ve},e.createElement(He.Provider,{value:Ce},e.createElement(Ve.Provider,{value:Re},e.createElement(ze.Provider,{value:ge},e.createElement(Ie.Provider,{value:xe},C,e.createElement("div",{className:"rt-ShellBody","data-peek-target":X??void 0,style:X==="rail"||X==="panel"?{"--peek-rail-width":`${te.current}px`}:void 0},B&&!O?(()=>{const t=z[0],w=t?{onOpenChange:t.props?.onOpenChange,open:t.props?.open,defaultOpen:t.props?.defaultOpen,presentation:t.props?.presentation,collapsible:t.props?.collapsible,onExpand:t.props?.onExpand,onCollapse:t.props?.onCollapse}:{defaultOpen:p?!0:void 0};return e.createElement(ue,{...w},z,U)})():j,I,le),fe)))))))))))});be.displayName="Shell.Root";const pe=e.forwardRef(({className:o,height:d=64,style:s,...h},v)=>e.createElement("header",{...h,ref:v,className:J("rt-ShellHeader",o),style:{...s,"--shell-header-height":`${d}px`}}));pe.displayName="Shell.Header";const ue=e.forwardRef(({className:o,presentation:d={initial:"fixed",sm:"fixed"},collapsible:s=!0,onExpand:h,onCollapse:v,children:y,style:c,...i},p)=>{const n=ae(),r=Me(d),P=r==="overlay",N=r==="stacked",T=e.useRef(null);e.useEffect(()=>{n.onLeftPres?.(r)},[n,r]);const E=e.useCallback(b=>{T.current=b,typeof p=="function"?p(b):p&&(p.current=b)},[p]);e.useEffect(()=>(n.setHasLeft(!0),()=>n.setHasLeft(!1)),[n]);const $=e.useRef(null),_=e.useRef(null),R=e.useRef(!1),H=Te(i.defaultOpen),x=e.useRef(!1);e.useEffect(()=>{if(x.current||!n.currentBreakpointReady||typeof i.open<"u"||typeof i.defaultOpen>"u")return;x.current=!0;const b=!!H;n.setLeftMode(b?"expanded":"collapsed"),i.onOpenChange?.(b,{reason:"init"})},[n.currentBreakpointReady,i.open,i.defaultOpen,H]),e.useEffect(()=>{if(typeof i.open<"u"){const b=!!i.open;n.setLeftMode(b?"expanded":"collapsed");return}},[n,i.open]),e.useEffect(()=>{typeof i.open<"u"||(!R.current&&H&&n.leftMode==="expanded"&&(i.onOpenChange?.(!0,{reason:"init"}),R.current=!0),_.current!==null&&_.current!==n.leftMode&&i.onOpenChange?.(n.leftMode==="expanded",{reason:"toggle"}),_.current=n.leftMode)},[n.leftMode,H]),e.useEffect(()=>{n.leftMode==="expanded"?h?.():v?.()},[n.leftMode,h,v]);const W=n.leftMode==="expanded";if(P){const b=n.leftMode==="expanded",l=e.Children.toArray(y),B=(C,z)=>e.isValidElement(C)&&C.type===z,O=l.find(C=>B(C,ee)),g=l.find(C=>B(C,A)),f=typeof O?.props?.expandedSize=="number"?O.props.expandedSize:64,F=typeof g?.props?.expandedSize=="number"?g.props.expandedSize:288,Q=!!O,S=!!g,L=(Q?f:0)+(n.panelMode==="expanded"&&S?F:0);return e.createElement(de.Root,{open:b,onOpenChange:C=>n.setLeftMode(C?"expanded":"collapsed")},e.createElement(de.Content,{side:"start",style:{padding:0},width:{initial:`${L}px`}},e.createElement(Se,null,e.createElement(de.Title,null,"Navigation")),e.createElement("div",{className:"rt-ShellLeft"},y)))}if(N){const b=n.leftMode==="expanded",l=e.Children.toArray(y),B=(I,le)=>e.isValidElement(I)&&I.type===le,O=l.find(I=>B(I,ee)),g=l.find(I=>B(I,A)),f=typeof O?.props?.expandedSize=="number"?O.props.expandedSize:64,F=typeof g?.props?.expandedSize=="number"?g.props.expandedSize:288,Q=!!O,L=!!g&&(n.panelMode==="expanded"||n.peekTarget==="panel"),{open:C,defaultOpen:z,onOpenChange:U,...j}=i;return e.createElement("div",{...j,ref:E,className:J("rt-ShellLeft",o),"data-mode":n.leftMode,"data-peek":n.peekTarget==="left"||n.peekTarget==="rail"||n.peekTarget==="panel"||void 0,"data-presentation":r,style:{...c},"data-open":b||void 0},y)}const{open:ne,defaultOpen:q,onOpenChange:D,mode:Y,defaultMode:G,onModeChange:te,...V}=i;return e.createElement("div",{...V,ref:E,className:J("rt-ShellLeft",o),"data-mode":n.leftMode,"data-peek":n.peekTarget==="left"||n.peekTarget==="rail"||n.peekTarget==="panel"||void 0,"data-presentation":r,style:{...c}},y)});ue.displayName="Shell.Left";const ee=e.forwardRef(({className:o,presentation:d,expandedSize:s=64,collapsible:h,onExpand:v,onCollapse:y,children:c,style:i,...p},n)=>{const r=ae(),P=e.useRef(null);e.useEffect(()=>{const R=typeof p.open<"u";if(P.current===null){P.current=R;return}P.current!==R&&(console.warn("Shell.Rail: Switching between controlled and uncontrolled `open` is not supported."),P.current=R)},[p.open]),e.useEffect(()=>{r.onRailDefaults?.(s)},[r,s]);const N=r.leftMode==="expanded",{defaultOpen:T,open:E,onOpenChange:$,..._}=p;return e.createElement("div",{..._,ref:n,className:J("rt-ShellRail",o),"data-mode":r.leftMode,"data-peek":r.currentBreakpointReady&&r.leftResolvedPresentation!=="overlay"&&r.peekTarget==="rail"||void 0,style:{...i,"--rail-size":`${s}px`}},e.createElement("div",{className:"rt-ShellRailContent","data-visible":r.currentBreakpointReady&&(N||r.leftResolvedPresentation!=="overlay"&&r.peekTarget==="rail")||void 0},c))});ee.displayName="Shell.Rail";const A=e.forwardRef(({className:o,defaultOpen:d,open:s,onOpenChange:h,size:v,defaultSize:y,expandedSize:c=288,minSize:i,maxSize:p,resizable:n,collapsible:r=!0,onExpand:P,onCollapse:N,onResize:T,onResizeStart:E,onResizeEnd:$,snapPoints:_,snapTolerance:R,collapseThreshold:H,paneId:x,persistence:W,children:ne,style:q,onSizeChange:D,sizeUpdate:Y,sizeUpdateMs:G=50,...te},V)=>{const b=e.useMemo(()=>{if(!D)return()=>{};if(Y==="debounce"){let a=null;return(m,M)=>{a&&clearTimeout(a),a=setTimeout(()=>{D?.(m,M)},G)}}if(Y==="throttle"){let a=0;return(u,m)=>{const M=Date.now();M-a>=G&&(a=M,D?.(u,m))}}return(a,u)=>D?.(a,u)},[D,Y,G]),l=ae(),B=e.useRef(null),O=e.useRef(null),g=e.useRef(!1);e.useEffect(()=>{typeof s>"u"&&typeof d=="boolean"&&(d?(l.setLeftMode("expanded"),l.setPanelMode("expanded")):l.setPanelMode("collapsed"))},[]),e.useEffect(()=>{typeof s>"u"||(s?(l.leftMode!=="expanded"&&l.setLeftMode("expanded"),l.panelMode!=="expanded"&&l.setPanelMode("expanded")):l.panelMode!=="collapsed"&&l.setPanelMode("collapsed"))},[s,l.leftMode,l.panelMode]),e.useEffect(()=>{const a=typeof s<"u";A._wasControlled=A._wasControlled??a,A._wasControlled!==a&&(console.warn("Shell.Panel: Switching between controlled and uncontrolled `open` is not supported."),A._wasControlled=a)},[s]),e.useEffect(()=>{g.current||typeof s>"u"&&d&&l.panelMode==="expanded"&&(h?.(!0,{reason:"init"}),g.current=!0)},[]),e.useEffect(()=>{l.onPanelDefaults?.(c)},[l,c]);const f=e.useRef(null),F=e.useCallback(a=>{f.current=a,typeof V=="function"?V(a):V&&(V.current=a)},[V]),Q=e.Children.toArray(ne),S=Q.filter(a=>e.isValidElement(a)&&a.type===se),L=Q.filter(a=>!(e.isValidElement(a)&&a.type===se)),C=l.leftResolvedPresentation==="overlay",z=e.useCallback(a=>{if(a==null)return;if(typeof a=="number"&&Number.isFinite(a))return a;const u=String(a).trim();if(!u)return;if(u.endsWith("px"))return Number.parseFloat(u);if(u.endsWith("rem")){const M=Number.parseFloat(getComputedStyle(document.documentElement).fontSize||"16")||16;return Number.parseFloat(u)*M}if(u.endsWith("%")){const M=Number.parseFloat(u),Z=document.documentElement.clientWidth||window.innerWidth||0;return M/100*Z}const m=Number.parseFloat(u);return Number.isFinite(m)?m:void 0},[]),U=e.useMemo(()=>{if(!x||W)return W;const a=`kookie-ui:shell:panel:${x}`;return{load:()=>{if(typeof window>"u")return;const m=window.localStorage.getItem(a);return m?Number(m):void 0},save:m=>{typeof window>"u"||window.localStorage.setItem(a,String(m))}}},[x,W]);e.useEffect(()=>{let a=!0;return(async()=>{if(!n||!U?.load||C)return;const u=await U.load();a&&typeof u=="number"&&f.current&&(f.current.style.setProperty("--panel-size",`${u}px`),T?.(u))})(),()=>{a=!1}},[n,U,T,C]),e.useEffect(()=>{f.current&&C&&f.current.style.setProperty("--panel-size",`${c}px`)},[C,c]),e.useEffect(()=>{if(f.current&&typeof v>"u"&&typeof y<"u"){const a=z(y);if(typeof a=="number"&&Number.isFinite(a)){const M=Math.min((typeof p=="number"?p:void 0)??a,Math.max((typeof i=="number"?i:void 0)??a,a));f.current.style.setProperty("--panel-size",`${M}px`),b(M,{reason:"init"})}}},[]),e.useEffect(()=>{if(!f.current||typeof v>"u")return;const a=z(v);if(typeof a=="number"&&Number.isFinite(a)){const M=Math.min((typeof p=="number"?p:void 0)??a,Math.max((typeof i=="number"?i:void 0)??a,a));f.current.style.setProperty("--panel-size",`${M}px`),b(M,{reason:"controlled"})}},[v,i,p,z]),e.useEffect(()=>{if(f.current&&l.leftResolvedPresentation!=="overlay"&&l.leftMode==="expanded"&&l.panelMode==="expanded"){const a=f.current.parentElement||null;try{a?.style.removeProperty("width")}catch{}}},[l.leftResolvedPresentation,l.leftMode,l.panelMode]);const j=l.leftMode==="expanded"&&l.panelMode==="expanded";e.useEffect(()=>{const a=B.current,u=O.current;if(a!==null&&a!==l.panelMode){const m=l.panelMode==="expanded";let M="toggle";u!==l.leftMode&&l.leftMode==="collapsed"&&!m&&(M="left"),h?.(m,{reason:M})}B.current=l.panelMode,O.current=l.leftMode},[l.panelMode,l.leftMode,h]);const I=n&&l.leftResolvedPresentation!=="overlay"&&j?e.createElement(Oe.Provider,{value:{containerRef:f,cssVarName:"--panel-size",minSize:typeof i=="number"?i:100,maxSize:typeof p=="number"?p:800,defaultSize:c,orientation:"vertical",edge:"end",computeNext:(a,u,m)=>{const M=getComputedStyle(f.current).direction==="rtl",Z=a-u;return m+(M?-Z:Z)},onResize:T,onResizeStart:a=>{const m=f.current?.parentElement;try{m?.style.removeProperty("width")}catch{}E?.(a)},onResizeEnd:a=>{$?.(a),b(a,{reason:"resize"}),U?.save?.(a)},target:"panel",collapsible:!!r,snapPoints:_,snapTolerance:R??8,collapseThreshold:H,requestCollapse:()=>l.setPanelMode("collapsed"),requestToggle:()=>l.togglePane("panel")}},S.length>0?S.map((a,u)=>e.cloneElement(a,{key:a.key??u})):e.createElement(Le,null)):null,{defaultOpen:le,open:fe,onOpenChange:re,size:me,defaultSize:X,...K}=te;return e.createElement("div",{...K,ref:F,className:J("rt-ShellPanel",o),"data-mode":l.panelMode,"data-visible":l.currentBreakpointReady&&(j||l.leftResolvedPresentation!=="overlay"&&l.peekTarget==="panel")||void 0,"data-peek":l.currentBreakpointReady&&l.leftResolvedPresentation!=="overlay"&&l.peekTarget==="panel"||void 0,style:{...q,"--panel-size":`${c}px`}},e.createElement("div",{className:"rt-ShellPanelContent","data-visible":j||void 0},L),I)});A.displayName="Shell.Panel",A.Handle=se;const ce=e.forwardRef(({className:o,...d},s)=>e.createElement("main",{...d,ref:s,className:J("rt-ShellContent",o)}));ce.displayName="Shell.Content";const Ee=e.forwardRef(({target:o,action:d="toggle",peekOnHover:s,onClick:h,onMouseEnter:v,onMouseLeave:y,children:c,...i},p)=>{const n=ae(),r=e.useCallback(E=>{switch(h?.(E),n.peekTarget===o&&n.clearPeek(),d){case"toggle":n.togglePane(o);break;case"expand":n.expandPane(o);break;case"collapse":n.collapsePane(o);break}},[n,o,d,h]),P=(()=>{switch(o){case"left":case"rail":return n.leftMode==="collapsed";case"panel":return n.leftMode==="collapsed"||n.panelMode==="collapsed";case"sidebar":return n.sidebarMode==="collapsed";case"inspector":return n.inspectorMode==="collapsed";case"bottom":return n.bottomMode==="collapsed"}})(),N=e.useCallback(E=>{v?.(E),!(!s||!P)&&n.peekPane(o)},[v,s,P,n,o]),T=e.useCallback(E=>{y?.(E),s&&n.peekTarget===o&&n.clearPeek()},[y,s,n,o]);return e.createElement("button",{...i,ref:p,onClick:r,onMouseEnter:N,onMouseLeave:T,"data-shell-trigger":o,"data-shell-action":d},c)});Ee.displayName="Shell.Trigger";export{ye as Bottom,ce as Content,pe as Header,Pe as Inspector,ue as Left,A as Panel,ee as Rail,be as Root,ie as Sidebar,Ee as Trigger,Me as useResponsivePresentation,ae as useShell};
|
|
2
2
|
//# sourceMappingURL=shell.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/shell.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Shell Component - Layout Engine + Chrome\n *\n * Philosophy:\n * - Shell = layout engine + chrome\n * - Manages layout state: expanded/collapsed, fixed/overlay, sizes\n * - Does not manage content/navigation state\n * - Provides unstyled primitives (slots, triggers)\n * - Enforces composition rules (Rail \u2194 Panel dependency, Sidebar exclusivity)\n *\n * Core Slots:\n * - Header: global top bar\n * - Rail: slim nav strip\n * - Panel: sidebar next to rail\n * - Sidebar: alternative to Rail+Panel (exclusive)\n * - Content: main work area\n * - Inspector: right-side panel\n * - Bottom: bottom panel\n *\n * Composition Rules:\n * - Rail + Panel: valid together (Rail collapse \u2192 Panel collapse)\n * - Sidebar: cannot coexist with Rail or Panel\n * - Content: always required\n * - Inspector/Bottom: optional, independent\n */\n'use client';\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport * as Sheet from './sheet.js';\nimport { Inset } from './inset.js';\nimport { VisuallyHidden } from './visually-hidden.js';\nimport { useResponsivePresentation } from './shell.hooks.js';\nimport { PaneResizeContext } from './_internal/shell-resize.js';\nimport { PaneHandle, PanelHandle, SidebarHandle, InspectorHandle, BottomHandle } from './_internal/shell-handles.js';\nimport { Sidebar } from './_internal/shell-sidebar.js';\nimport { Bottom } from './_internal/shell-bottom.js';\nimport { Inspector } from './_internal/shell-inspector.js';\nimport type { PresentationValue, ResponsivePresentation, PaneMode, SidebarMode, ResponsiveMode, ResponsiveSidebarMode, PaneSizePersistence, Breakpoint, PaneTarget } from './shell.types.js';\nimport { BREAKPOINTS } from './shell.types.js';\nimport { ShellProvider, useShell } from './shell.context.js';\n\n// Shell context is provided via ShellProvider (see shell.context.tsx)\n\n// Pane resize context moved to ./_internal/shell-resize\n\n// Local PaneHandle moved to ./_internal/shell-handles\n// Removed local PaneHandle implementation; using internal PaneHandle\n\n// Composed Handle wrappers per pane\n// Handles moved to ./_internal/shell-handles\n\n// Hook to resolve responsive presentation\n// useResponsivePresentation moved to shell.hooks.ts\n\n// Hook to resolve responsive mode defaults\n// Removed: defaultMode responsiveness\n\n// Hook to get current breakpoint\nfunction useBreakpoint(): { bp: Breakpoint; ready: boolean } {\n const [currentBp, setCurrentBp] = React.useState<Breakpoint>('initial');\n const [ready, setReady] = React.useState(false);\n\n React.useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const queries: [key: keyof typeof BREAKPOINTS, query: string][] = Object.entries(BREAKPOINTS) as any;\n const mqls = queries.map(([k, q]) => [k, window.matchMedia(q)] as const);\n\n const compute = () => {\n // Highest matched wins\n const matched = mqls.filter(([, m]) => m.matches).map(([k]) => k);\n const next = (matched[matched.length - 1] as Breakpoint | undefined) ?? 'initial';\n setCurrentBp(next);\n setReady(true);\n };\n\n compute();\n mqls.forEach(([, m]) => m.addEventListener('change', compute));\n\n return () => {\n mqls.forEach(([, m]) => m.removeEventListener('change', compute));\n };\n }, []);\n\n return { bp: currentBp, ready };\n}\n\n// Root Component\ninterface ShellRootProps extends React.ComponentPropsWithoutRef<'div'> {\n children: React.ReactNode;\n height?: 'full' | 'auto' | string | number;\n}\n\nconst Root = React.forwardRef<HTMLDivElement, ShellRootProps>(({ className, children, height = 'full', ...props }, ref) => {\n const { bp: currentBreakpoint, ready: currentBreakpointReady } = useBreakpoint();\n\n // Pane state management\n const [leftMode, setLeftMode] = React.useState<PaneMode>('collapsed');\n const [panelMode, setPanelMode] = React.useState<PaneMode>('collapsed');\n const [sidebarMode, setSidebarMode] = React.useState<SidebarMode>('expanded');\n const [inspectorMode, setInspectorMode] = React.useState<PaneMode>('collapsed');\n const [bottomMode, setBottomMode] = React.useState<PaneMode>('collapsed');\n\n // Removed: defaultMode responsiveness and manual change tracking\n\n // Composition detection\n const [hasLeft, setHasLeft] = React.useState(false);\n const [hasSidebar, setHasSidebar] = React.useState(false);\n\n // Customizable sidebar toggle sequencing\n const sidebarToggleComputerRef = React.useRef<(current: SidebarMode) => SidebarMode>((current) => (current === 'collapsed' ? 'thin' : current === 'thin' ? 'expanded' : 'collapsed'));\n const setSidebarToggleComputer = React.useCallback((fn: (current: SidebarMode) => SidebarMode) => {\n sidebarToggleComputerRef.current = fn;\n }, []);\n\n // Left collapse cascades to Panel\n React.useEffect(() => {\n if (leftMode === 'collapsed') {\n setPanelMode('collapsed');\n }\n }, [leftMode]);\n\n // Composition validation\n React.useEffect(() => {\n if (hasSidebar && hasLeft) {\n console.warn('Shell: Sidebar cannot coexist with Rail or Panel. Use either Rail+Panel OR Sidebar.');\n }\n }, [hasSidebar, hasLeft]);\n\n // Left presentation + defaults from children\n const [devLeftPres, setDevLeftPres] = React.useState<PresentationValue | undefined>(undefined);\n const onLeftPres = React.useCallback((p: PresentationValue) => setDevLeftPres(p), []);\n const railDefaultSizeRef = React.useRef<number>(64);\n const panelDefaultSizeRef = React.useRef<number>(288);\n const onRailDefaults = React.useCallback((size: number) => {\n railDefaultSizeRef.current = size;\n }, []);\n const onPanelDefaults = React.useCallback((size: number) => {\n panelDefaultSizeRef.current = size;\n }, []);\n\n // Determine children presence for left composition\n const hasLeftChildren = React.useMemo(() => {\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && (el.type === comp || (el as any).type?.displayName === comp.displayName);\n return childArray.some((el) => isType(el, Rail) || isType(el, Panel));\n }, [children]);\n\n const hasSidebarChildren = React.useMemo(() => {\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && (el.type === comp || (el as any).type?.displayName === comp.displayName);\n return childArray.some((el) => isType(el, Sidebar));\n }, [children]);\n\n const togglePane = React.useCallback(\n (target: PaneTarget) => {\n switch (target) {\n case 'left':\n case 'rail':\n setLeftMode((prev) => (prev === 'expanded' ? 'collapsed' : 'expanded'));\n break;\n case 'panel':\n // Panel toggle: expand left if collapsed, then toggle panel\n if (leftMode === 'collapsed') {\n setLeftMode('expanded');\n setPanelMode('expanded');\n } else {\n setPanelMode((prev) => (prev === 'expanded' ? 'collapsed' : 'expanded'));\n }\n break;\n case 'sidebar':\n setSidebarMode((prev) => sidebarToggleComputerRef.current(prev as SidebarMode));\n break;\n case 'inspector':\n setInspectorMode((prev) => (prev === 'expanded' ? 'collapsed' : 'expanded'));\n break;\n case 'bottom':\n setBottomMode((prev) => (prev === 'expanded' ? 'collapsed' : 'expanded'));\n break;\n }\n },\n [leftMode],\n );\n\n const expandPane = React.useCallback((target: PaneTarget) => {\n switch (target) {\n case 'left':\n case 'rail':\n setLeftMode('expanded');\n break;\n case 'panel':\n setLeftMode('expanded');\n setPanelMode('expanded');\n break;\n case 'sidebar':\n setSidebarMode('expanded');\n break;\n case 'inspector':\n setInspectorMode('expanded');\n break;\n case 'bottom':\n setBottomMode('expanded');\n break;\n }\n }, []);\n\n const collapsePane = React.useCallback((target: PaneTarget) => {\n switch (target) {\n case 'left':\n case 'rail':\n setLeftMode('collapsed');\n break;\n case 'panel':\n setPanelMode('collapsed');\n break;\n case 'sidebar':\n setSidebarMode('collapsed');\n break;\n case 'inspector':\n setInspectorMode('collapsed');\n break;\n case 'bottom':\n setBottomMode('collapsed');\n break;\n }\n }, []);\n\n const baseContextValue = React.useMemo(\n () => ({\n leftMode,\n setLeftMode,\n panelMode,\n setPanelMode,\n sidebarMode,\n setSidebarMode,\n inspectorMode,\n setInspectorMode,\n bottomMode,\n setBottomMode,\n hasLeft,\n setHasLeft,\n hasSidebar,\n setHasSidebar,\n currentBreakpoint,\n currentBreakpointReady,\n leftResolvedPresentation: devLeftPres,\n togglePane,\n expandPane,\n collapsePane,\n setSidebarToggleComputer,\n onLeftPres,\n onRailDefaults,\n onPanelDefaults,\n }),\n [\n leftMode,\n panelMode,\n sidebarMode,\n inspectorMode,\n bottomMode,\n hasLeft,\n hasSidebar,\n currentBreakpoint,\n currentBreakpointReady,\n devLeftPres,\n togglePane,\n expandPane,\n collapsePane,\n setSidebarToggleComputer,\n onLeftPres,\n onRailDefaults,\n onPanelDefaults,\n ],\n );\n\n // Organize children by type\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && (el.type === comp || (el as any).type?.displayName === comp.displayName);\n\n const headerEls = childArray.filter((el) => isType(el, Header));\n const railEls = childArray.filter((el) => isType(el, Rail));\n const panelEls = childArray.filter((el) => isType(el, Panel));\n const sidebarEls = childArray.filter((el) => isType(el, Sidebar));\n const contentEls = childArray.filter((el) => isType(el, Content));\n const inspectorEls = childArray.filter((el) => isType(el, Inspector));\n const bottomEls = childArray.filter((el) => isType(el, Bottom));\n\n const heightStyle = React.useMemo(() => {\n if (height === 'full') return { height: '100vh' };\n if (height === 'auto') return { height: 'auto' };\n if (typeof height === 'string') return { height };\n if (typeof height === 'number') return { height: `${height}px` };\n return {};\n }, [height]);\n\n // Peek state (layout-only overlay without mode changes)\n const [peekTarget, setPeekTarget] = React.useState<PaneTarget | null>(null);\n const peekPane = React.useCallback((target: PaneTarget) => setPeekTarget(target), []);\n const clearPeek = React.useCallback(() => setPeekTarget(null), []);\n\n return (\n <div {...props} ref={ref} className={classNames('rt-ShellRoot', className)} style={{ ...heightStyle, ...props.style }}>\n <ShellProvider\n value={{\n ...baseContextValue,\n peekTarget,\n setPeekTarget,\n peekPane,\n clearPeek,\n }}\n >\n {headerEls}\n <div\n className=\"rt-ShellBody\"\n data-peek-target={peekTarget ?? undefined}\n style={\n peekTarget === 'rail' || peekTarget === 'panel'\n ? ({\n ['--peek-rail-width' as any]: `${railDefaultSizeRef.current}px`,\n } as React.CSSProperties)\n : undefined\n }\n >\n {hasLeftChildren && !hasSidebarChildren\n ? (() => {\n const firstRail = railEls[0] as any;\n const passthroughProps = firstRail\n ? {\n mode: firstRail.props?.mode,\n defaultMode: firstRail.props?.defaultMode,\n onModeChange: firstRail.props?.onModeChange,\n presentation: firstRail.props?.presentation,\n collapsible: firstRail.props?.collapsible,\n onExpand: firstRail.props?.onExpand,\n onCollapse: firstRail.props?.onCollapse,\n }\n : {};\n return (\n <Left {...(passthroughProps as any)}>\n {railEls}\n {panelEls}\n </Left>\n );\n })()\n : sidebarEls}\n {contentEls}\n {inspectorEls}\n </div>\n {bottomEls}\n </ShellProvider>\n </div>\n );\n});\nRoot.displayName = 'Shell.Root';\n\n// Header\ninterface ShellHeaderProps extends React.ComponentPropsWithoutRef<'header'> {\n height?: number;\n}\n\nconst Header = React.forwardRef<HTMLElement, ShellHeaderProps>(({ className, height = 64, style, ...props }, ref) => (\n <header\n {...props}\n ref={ref}\n className={classNames('rt-ShellHeader', className)}\n style={{\n ...style,\n ['--shell-header-height' as any]: `${height}px`,\n }}\n />\n));\nHeader.displayName = 'Shell.Header';\n\n// Pane Props Interface (shared by Panel, Sidebar, Inspector, Bottom)\ninterface PaneProps extends React.ComponentPropsWithoutRef<'div'> {\n presentation?: ResponsivePresentation;\n mode?: PaneMode;\n defaultMode?: ResponsiveMode;\n onModeChange?: (mode: PaneMode) => void;\n expandedSize?: number;\n minSize?: number;\n maxSize?: number;\n resizable?: boolean;\n collapsible?: boolean;\n onExpand?: () => void;\n onCollapse?: () => void;\n onResize?: (size: number) => void;\n /** Optional custom content inside the resizer handle (kept unstyled). */\n resizer?: React.ReactNode;\n onResizeStart?: (size: number) => void;\n onResizeEnd?: (size: number) => void;\n snapPoints?: number[];\n snapTolerance?: number;\n collapseThreshold?: number;\n paneId?: string;\n persistence?: PaneSizePersistence;\n}\n\n// Left container (auto-created for Rail+Panel)\ninterface LeftProps extends React.ComponentPropsWithoutRef<'div'> {\n presentation?: ResponsivePresentation;\n mode?: PaneMode;\n defaultMode?: ResponsiveMode;\n onModeChange?: (mode: PaneMode) => void;\n collapsible?: boolean;\n onExpand?: () => void;\n onCollapse?: () => void;\n}\n\n// Rail (special case)\ninterface RailProps extends React.ComponentPropsWithoutRef<'div'> {\n presentation?: ResponsivePresentation;\n mode?: PaneMode;\n defaultMode?: ResponsiveMode;\n onModeChange?: (mode: PaneMode) => void;\n expandedSize?: number;\n collapsible?: boolean;\n onExpand?: () => void;\n onCollapse?: () => void;\n}\n\n// Left container - behaves like Inspector but contains Rail+Panel\nconst Left = React.forwardRef<HTMLDivElement, LeftProps>(\n ({ className, presentation = { initial: 'overlay', sm: 'fixed' }, mode, defaultMode = 'collapsed', onModeChange, collapsible = true, onExpand, onCollapse, children, style, ...props }, ref) => {\n const shell = useShell();\n const resolvedPresentation = useResponsivePresentation(presentation);\n const isOverlay = resolvedPresentation === 'overlay';\n const isStacked = resolvedPresentation === 'stacked';\n const localRef = React.useRef<HTMLDivElement | null>(null);\n // Publish resolved presentation so Root can gate peeking in overlay\n React.useEffect(() => {\n (shell as any).onLeftPres?.(resolvedPresentation);\n }, [shell, resolvedPresentation]);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n\n // Register with shell\n React.useEffect(() => {\n shell.setHasLeft(true);\n return () => shell.setHasLeft(false);\n }, [shell]);\n\n // Always-follow responsive defaultMode for uncontrolled Left (Rail stack)\n const resolveResponsiveMode = React.useCallback((): PaneMode => {\n if (typeof defaultMode === 'string') return defaultMode as PaneMode;\n const dm = defaultMode as Partial<Record<Breakpoint, PaneMode>> | undefined;\n if (dm && dm[shell.currentBreakpoint as Breakpoint]) {\n return dm[shell.currentBreakpoint as Breakpoint] as PaneMode;\n }\n const bpKeys = Object.keys(BREAKPOINTS) as Array<keyof typeof BREAKPOINTS>;\n const order: Breakpoint[] = ([...bpKeys].reverse() as Breakpoint[]).concat('initial' as Breakpoint);\n const startIdx = order.indexOf(shell.currentBreakpoint as Breakpoint);\n for (let i = startIdx + 1; i < order.length; i++) {\n const bp = order[i];\n if (dm && dm[bp]) {\n return dm[bp] as PaneMode;\n }\n }\n return 'collapsed';\n }, [defaultMode, shell.currentBreakpoint]);\n\n const lastBpRef = React.useRef<Breakpoint | null>(null);\n React.useEffect(() => {\n if (mode !== undefined) return; // controlled wins\n if (!shell.currentBreakpointReady) return; // avoid SSR mismatch\n if (lastBpRef.current === shell.currentBreakpoint) return; // only on bp change\n lastBpRef.current = shell.currentBreakpoint as Breakpoint;\n const next = resolveResponsiveMode();\n if (next !== shell.leftMode) {\n shell.setLeftMode(next);\n }\n }, [mode, shell.currentBreakpoint, shell.currentBreakpointReady, resolveResponsiveMode, shell.leftMode, shell.setLeftMode]);\n\n // Sync controlled mode\n React.useEffect(() => {\n if (mode !== undefined && shell.leftMode !== mode) {\n shell.setLeftMode(mode);\n }\n }, [mode, shell]);\n\n // Emit mode changes\n React.useEffect(() => {\n if (mode === undefined) {\n onModeChange?.(shell.leftMode);\n }\n }, [shell.leftMode, mode, onModeChange]);\n\n // Emit expand/collapse events\n React.useEffect(() => {\n if (shell.leftMode === 'expanded') {\n onExpand?.();\n } else {\n onCollapse?.();\n }\n }, [shell.leftMode, onExpand, onCollapse]);\n\n const isExpanded = shell.leftMode === 'expanded';\n\n // Left is not resizable; width derives from Rail/Panel.\n\n if (isOverlay) {\n const open = shell.leftMode === 'expanded';\n // Compute overlay width from child Rail/Panel expanded sizes\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && el.type === comp;\n const railEl = childArray.find((el) => isType(el, Rail));\n const panelEl = childArray.find((el) => isType(el, Panel));\n const railSize = typeof (railEl as any)?.props?.expandedSize === 'number' ? (railEl as any).props.expandedSize : 64;\n const panelSize = typeof (panelEl as any)?.props?.expandedSize === 'number' ? (panelEl as any).props.expandedSize : 288;\n const hasRail = Boolean(railEl);\n const hasPanel = Boolean(panelEl);\n const overlayPx = (hasRail ? railSize : 0) + (shell.panelMode === 'expanded' && hasPanel ? panelSize : 0);\n return (\n <Sheet.Root open={open} onOpenChange={(o) => shell.setLeftMode(o ? 'expanded' : 'collapsed')}>\n <Sheet.Content\n side=\"start\"\n style={{ padding: 0 }}\n width={{\n initial: `${overlayPx}px`,\n }}\n >\n <VisuallyHidden>\n <Sheet.Title>Navigation</Sheet.Title>\n </VisuallyHidden>\n <div className=\"rt-ShellLeft\">{children}</div>\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n\n if (isStacked) {\n const open = shell.leftMode === 'expanded';\n // Compute floating width from child Rail/Panel expanded sizes (like overlay)\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && el.type === comp;\n const railEl = childArray.find((el) => isType(el, Rail));\n const panelEl = childArray.find((el) => isType(el, Panel));\n const railSize = typeof (railEl as any)?.props?.expandedSize === 'number' ? (railEl as any).props.expandedSize : 64;\n const panelSize = typeof (panelEl as any)?.props?.expandedSize === 'number' ? (panelEl as any).props.expandedSize : 288;\n const hasRail = Boolean(railEl);\n const hasPanel = Boolean(panelEl);\n const includePanel = hasPanel && (shell.panelMode === 'expanded' || shell.peekTarget === 'panel');\n const floatingWidthPx = (hasRail ? railSize : 0) + (includePanel ? panelSize : 0);\n\n return (\n <div\n {...props}\n ref={setRef}\n className={classNames('rt-ShellLeft', className)}\n data-mode={shell.leftMode}\n data-peek={shell.peekTarget === 'left' || shell.peekTarget === 'rail' || shell.peekTarget === 'panel' || undefined}\n data-presentation={resolvedPresentation}\n style={{\n ...style,\n }}\n data-open={open || undefined}\n >\n {children}\n </div>\n );\n }\n\n return (\n <div\n {...props}\n ref={setRef}\n className={classNames('rt-ShellLeft', className)}\n data-mode={shell.leftMode}\n data-peek={shell.peekTarget === 'left' || shell.peekTarget === 'rail' || shell.peekTarget === 'panel' || undefined}\n data-presentation={resolvedPresentation}\n style={{\n ...style,\n }}\n >\n {children}\n </div>\n );\n },\n);\nLeft.displayName = 'Shell.Left';\n\nconst Rail = React.forwardRef<HTMLDivElement, RailProps>(\n ({ className, presentation, mode, defaultMode, onModeChange, expandedSize = 64, collapsible, onExpand, onCollapse, children, style, ...props }, ref) => {\n const shell = useShell();\n\n // Register expanded size with Left container\n React.useEffect(() => {\n (shell as any).onRailDefaults?.(expandedSize);\n }, [shell, expandedSize]);\n\n const isExpanded = shell.leftMode === 'expanded';\n\n return (\n <div\n {...props}\n ref={ref}\n className={classNames('rt-ShellRail', className)}\n data-mode={shell.leftMode}\n data-peek={(shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'rail') || undefined}\n style={{\n ...style,\n ['--rail-size' as any]: `${expandedSize}px`,\n }}\n >\n <div className=\"rt-ShellRailContent\" data-visible={isExpanded || (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'rail') || undefined}>\n {children}\n </div>\n </div>\n );\n },\n);\nRail.displayName = 'Shell.Rail';\n\n// Panel\ntype HandleComponent = React.ForwardRefExoticComponent<React.ComponentPropsWithoutRef<'div'> & React.RefAttributes<HTMLDivElement>>;\n\ntype PanelComponent = React.ForwardRefExoticComponent<Omit<PaneProps, 'defaultMode'> & React.RefAttributes<HTMLDivElement>> & { Handle: HandleComponent };\n\ntype SidebarComponent = React.ForwardRefExoticComponent<\n (Omit<PaneProps, 'mode' | 'defaultMode' | 'onModeChange'> & {\n mode?: SidebarMode;\n defaultMode?: ResponsiveSidebarMode;\n onModeChange?: (mode: SidebarMode) => void;\n thinSize?: number;\n toggleModes?: 'both' | 'single';\n }) &\n React.RefAttributes<HTMLDivElement>\n> & { Handle: HandleComponent };\n\ntype InspectorComponent = React.ForwardRefExoticComponent<PaneProps & React.RefAttributes<HTMLDivElement>> & { Handle: HandleComponent };\n\ntype BottomComponent = React.ForwardRefExoticComponent<PaneProps & React.RefAttributes<HTMLDivElement>> & { Handle: HandleComponent };\n\nconst Panel = React.forwardRef<HTMLDivElement, Omit<PaneProps, 'presentation' | 'defaultMode'>>(\n (\n {\n className,\n mode,\n onModeChange,\n expandedSize = 288,\n minSize,\n maxSize,\n resizable,\n collapsible = true,\n onExpand,\n onCollapse,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n paneId,\n persistence,\n children,\n style,\n ...props\n },\n ref,\n ) => {\n const shell = useShell();\n React.useEffect(() => {\n (shell as any).onPanelDefaults?.(expandedSize);\n }, [shell, expandedSize]);\n const localRef = React.useRef<HTMLDivElement | null>(null);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const handleChildren = childArray.filter((el: React.ReactElement) => React.isValidElement(el) && el.type === PanelHandle);\n const contentChildren = childArray.filter((el: React.ReactElement) => !(React.isValidElement(el) && el.type === PanelHandle));\n\n const isOverlay = shell.leftResolvedPresentation === 'overlay';\n\n // Derive a default persistence adapter from paneId if none provided\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:panel:${paneId}`;\n const adapter: PaneSizePersistence = {\n load: () => {\n if (typeof window === 'undefined') return undefined;\n const v = window.localStorage.getItem(key);\n return v ? Number(v) : undefined;\n },\n save: (size: number) => {\n if (typeof window === 'undefined') return;\n window.localStorage.setItem(key, String(size));\n },\n };\n return adapter;\n }, [paneId, persistence]);\n\n // Load persisted size if configured (only in fixed presentation)\n React.useEffect(() => {\n let mounted = true;\n (async () => {\n if (!resizable || !persistenceAdapter?.load || isOverlay) return;\n const loaded = await persistenceAdapter.load();\n if (mounted && typeof loaded === 'number' && localRef.current) {\n localRef.current.style.setProperty('--panel-size', `${loaded}px`);\n onResize?.(loaded);\n }\n })();\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n // In overlay, ensure panel uses the fixed expandedSize, ignoring any persisted size\n React.useEffect(() => {\n if (!localRef.current) return;\n if (isOverlay) {\n localRef.current.style.setProperty('--panel-size', `${expandedSize}px`);\n }\n }, [isOverlay, expandedSize]);\n\n // Ensure Left container width is auto whenever Panel is expanded in fixed presentation\n React.useEffect(() => {\n if (!localRef.current) return;\n if (shell.leftResolvedPresentation !== 'overlay' && shell.leftMode === 'expanded' && shell.panelMode === 'expanded') {\n const leftEl = (localRef.current.parentElement as HTMLElement) || null;\n try {\n leftEl?.style.removeProperty('width');\n } catch {}\n }\n }, [shell.leftResolvedPresentation, shell.leftMode, shell.panelMode]);\n\n const isExpanded = shell.leftMode === 'expanded' && shell.panelMode === 'expanded';\n\n // Provide resizer handle when fixed (not overlay)\n const handleEl =\n resizable && shell.leftResolvedPresentation !== 'overlay' && isExpanded ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--panel-size',\n minSize: typeof minSize === 'number' ? minSize : 100,\n maxSize: typeof maxSize === 'number' ? maxSize : 800,\n defaultSize: expandedSize,\n orientation: 'vertical',\n edge: 'end',\n computeNext: (client, startClient, startSize) => {\n const isRtl = getComputedStyle(localRef.current!).direction === 'rtl';\n const delta = client - startClient;\n return startSize + (isRtl ? -delta : delta);\n },\n onResize,\n onResizeStart: (size) => {\n // Ensure Left container is not stuck with a fixed width in stacked\n const panelEl = localRef.current as HTMLElement | null;\n const leftEl = panelEl?.parentElement as HTMLElement | null;\n try {\n leftEl?.style.removeProperty('width');\n } catch {}\n onResizeStart?.(size);\n },\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n persistenceAdapter?.save?.(size);\n },\n target: 'panel',\n collapsible: Boolean(collapsible),\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => shell.setPanelMode('collapsed'),\n requestToggle: () => shell.togglePane('panel'),\n }}\n >\n {handleChildren.length > 0 ? handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i })) : <PaneHandle />}\n </PaneResizeContext.Provider>\n ) : null;\n\n return (\n <div\n {...props}\n ref={setRef}\n className={classNames('rt-ShellPanel', className)}\n data-mode={shell.panelMode}\n data-visible={isExpanded || (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'panel') || undefined}\n data-peek={(shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'panel') || undefined}\n style={{\n ...style,\n ['--panel-size' as any]: `${expandedSize}px`,\n }}\n >\n <div className=\"rt-ShellPanelContent\" data-visible={isExpanded || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n },\n) as PanelComponent;\nPanel.displayName = 'Shell.Panel';\nPanel.Handle = PanelHandle;\n\n// Sidebar moved to ./_internal/shell-sidebar\n\n// Content (always required)\ninterface ShellContentProps extends React.ComponentPropsWithoutRef<'main'> {}\n\nconst Content = React.forwardRef<HTMLElement, ShellContentProps>(({ className, ...props }, ref) => <main {...props} ref={ref} className={classNames('rt-ShellContent', className)} />);\nContent.displayName = 'Shell.Content';\n\n// Inspector moved to ./_internal/shell-inspector\n\n// Bottom\n// Bottom moved to ./_internal/shell-bottom\n// (Bottom implementation extracted)\n\n// Trigger\n// PaneTarget type moved to shell.types.ts\ntype TriggerAction = 'toggle' | 'expand' | 'collapse';\n\ninterface TriggerProps extends React.ComponentPropsWithoutRef<'button'> {\n target: PaneTarget;\n action?: TriggerAction;\n /**\n * Whether to show peek preview on hover when the target pane is collapsed.\n * Defaults to false.\n */\n peekOnHover?: boolean;\n}\n\nconst Trigger = React.forwardRef<HTMLButtonElement, TriggerProps>(({ target, action = 'toggle', peekOnHover, onClick, onMouseEnter, onMouseLeave, children, ...props }, ref) => {\n const shell = useShell();\n\n const handleClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n\n // Clear any active peek on this target before toggling to avoid sticky peek state\n if ((shell as any).peekTarget === target) {\n shell.clearPeek();\n }\n\n switch (action) {\n case 'toggle':\n shell.togglePane(target);\n break;\n case 'expand':\n shell.expandPane(target);\n break;\n case 'collapse':\n shell.collapsePane(target);\n break;\n }\n },\n [shell, target, action, onClick],\n );\n\n const isCollapsed = (() => {\n switch (target) {\n case 'left':\n case 'rail':\n return shell.leftMode === 'collapsed';\n case 'panel':\n return shell.leftMode === 'collapsed' || shell.panelMode === 'collapsed';\n case 'sidebar':\n return shell.sidebarMode === 'collapsed';\n case 'inspector':\n return shell.inspectorMode === 'collapsed';\n case 'bottom':\n return shell.bottomMode === 'collapsed';\n }\n })();\n\n const handleMouseEnter = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseEnter?.(event);\n if (!peekOnHover || !isCollapsed) return;\n // Use the actual target for peek behavior (not mapped to left)\n shell.peekPane(target);\n },\n [onMouseEnter, peekOnHover, isCollapsed, shell, target],\n );\n\n const handleMouseLeave = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseLeave?.(event);\n if (!peekOnHover) return;\n if ((shell as any).peekTarget === target) {\n shell.clearPeek();\n }\n },\n [onMouseLeave, peekOnHover, shell, target],\n );\n\n return (\n <button {...props} ref={ref} onClick={handleClick} onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave} data-shell-trigger={target} data-shell-action={action}>\n {children}\n </button>\n );\n});\nTrigger.displayName = 'Shell.Trigger';\n\n// Exports\nexport {\n Root,\n Header,\n Left,\n Rail,\n Panel,\n Sidebar,\n Content,\n Inspector,\n Bottom,\n Trigger,\n useShell,\n useResponsivePresentation,\n type PaneMode,\n type SidebarMode,\n type ResponsivePresentation,\n type PaneTarget,\n type TriggerAction,\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["React", "classNames", "Sheet", "VisuallyHidden", "useResponsivePresentation", "PaneResizeContext", "PaneHandle", "PanelHandle", "Sidebar", "Bottom", "Inspector", "BREAKPOINTS", "ShellProvider", "useShell", "useBreakpoint", "currentBp", "setCurrentBp", "ready", "setReady", "mqls", "k", "q", "compute", "matched", "m", "next", "Root", "className", "children", "height", "props", "ref", "currentBreakpoint", "currentBreakpointReady", "
|
|
4
|
+
"sourcesContent": ["/**\n * Shell Component - Layout Engine + Chrome\n *\n * Philosophy:\n * - Shell = layout engine + chrome\n * - Manages layout state: expanded/collapsed, fixed/overlay, sizes\n * - Does not manage content/navigation state\n * - Provides unstyled primitives (slots, triggers)\n * - Enforces composition rules (Rail \u2194 Panel dependency, Sidebar exclusivity)\n *\n * Core Slots:\n * - Header: global top bar\n * - Rail: slim nav strip\n * - Panel: sidebar next to rail\n * - Sidebar: alternative to Rail+Panel (exclusive)\n * - Content: main work area\n * - Inspector: right-side panel\n * - Bottom: bottom panel\n *\n * Composition Rules:\n * - Rail + Panel: valid together (Rail collapse \u2192 Panel collapse)\n * - Sidebar: cannot coexist with Rail or Panel\n * - Content: always required\n * - Inspector/Bottom: optional, independent\n */\n'use client';\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport * as Sheet from './sheet.js';\nimport { VisuallyHidden } from './visually-hidden.js';\nimport { useResponsivePresentation, useResponsiveValue } from './shell.hooks.js';\nimport { PaneResizeContext } from './_internal/shell-resize.js';\nimport { PaneHandle, PanelHandle, SidebarHandle, InspectorHandle, BottomHandle } from './_internal/shell-handles.js';\nimport { Sidebar } from './_internal/shell-sidebar.js';\nimport { Bottom } from './_internal/shell-bottom.js';\nimport { Inspector } from './_internal/shell-inspector.js';\nimport type { PresentationValue, ResponsivePresentation, PaneMode, SidebarMode, PaneSizePersistence, Breakpoint, PaneTarget, Responsive } from './shell.types.js';\nimport { BREAKPOINTS } from './shell.types.js';\nimport {\n ShellProvider,\n useShell,\n LeftModeContext,\n PanelModeContext,\n SidebarModeContext,\n InspectorModeContext,\n BottomModeContext,\n PresentationContext,\n PeekContext,\n ActionsContext,\n CompositionContext,\n} from './shell.context.js';\n\n// Shell context is provided via ShellProvider (see shell.context.tsx)\n\n// Pane resize context moved to ./_internal/shell-resize\n\n// Local PaneHandle moved to ./_internal/shell-handles\n// Removed local PaneHandle implementation; using internal PaneHandle\n\n// Composed Handle wrappers per pane\n// Handles moved to ./_internal/shell-handles\n\n// Hook to resolve responsive presentation\n// useResponsivePresentation moved to shell.hooks.ts\n\n// Hook to resolve responsive mode defaults\n// Removed: defaultMode responsiveness\n\n// Hook to get current breakpoint\nfunction useBreakpoint(): { bp: Breakpoint; ready: boolean } {\n const [currentBp, setCurrentBp] = React.useState<Breakpoint>('initial');\n const [ready, setReady] = React.useState(false);\n\n React.useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const queries: [key: keyof typeof BREAKPOINTS, query: string][] = Object.entries(BREAKPOINTS) as any;\n const mqls = queries.map(([k, q]) => [k, window.matchMedia(q)] as const);\n\n const compute = () => {\n // Highest matched wins\n const matched = mqls.filter(([, m]) => m.matches).map(([k]) => k);\n const next = (matched[matched.length - 1] as Breakpoint | undefined) ?? 'initial';\n setCurrentBp(next);\n setReady(true);\n };\n\n compute();\n const cleanups: Array<() => void> = [];\n mqls.forEach(([, m]) => {\n const mm = m as MediaQueryList & {\n addEventListener?: (type: 'change', listener: (e: MediaQueryListEvent) => void) => void;\n removeEventListener?: (type: 'change', listener: (e: MediaQueryListEvent) => void) => void;\n addListener?: (listener: (e: MediaQueryListEvent) => void) => void;\n removeListener?: (listener: (e: MediaQueryListEvent) => void) => void;\n };\n if (typeof mm.addEventListener === 'function' && typeof mm.removeEventListener === 'function') {\n mm.addEventListener('change', compute as any);\n cleanups.push(() => mm.removeEventListener?.('change', compute as any));\n } else if (typeof mm.addListener === 'function' && typeof mm.removeListener === 'function') {\n mm.addListener(compute as any);\n cleanups.push(() => mm.removeListener?.(compute as any));\n }\n });\n\n return () => {\n cleanups.forEach((fn) => {\n try {\n fn();\n } catch {}\n });\n };\n }, []);\n\n return { bp: currentBp, ready };\n}\n\n// Reducer-based pane state management to simplify cascading rules\ntype PaneState = {\n leftMode: PaneMode;\n panelMode: PaneMode;\n sidebarMode: SidebarMode;\n inspectorMode: PaneMode;\n bottomMode: PaneMode;\n};\n\ntype PaneAction =\n | { type: 'SET_LEFT_MODE'; mode: PaneMode }\n | { type: 'SET_PANEL_MODE'; mode: PaneMode }\n | { type: 'SET_SIDEBAR_MODE'; mode: SidebarMode }\n | { type: 'SET_INSPECTOR_MODE'; mode: PaneMode }\n | { type: 'SET_BOTTOM_MODE'; mode: PaneMode }\n | { type: 'TOGGLE_PANE'; target: PaneTarget }\n | { type: 'EXPAND_PANE'; target: PaneTarget }\n | { type: 'COLLAPSE_PANE'; target: PaneTarget };\n\nfunction paneReducer(state: PaneState, action: PaneAction): PaneState {\n switch (action.type) {\n case 'SET_LEFT_MODE': {\n // Collapsing left cascades to panel collapse\n if (action.mode === 'collapsed') {\n return { ...state, leftMode: 'collapsed', panelMode: 'collapsed' };\n }\n return { ...state, leftMode: action.mode };\n }\n case 'SET_PANEL_MODE': {\n // Expanding panel ensures left is expanded\n if (action.mode === 'expanded' && state.leftMode !== 'expanded') {\n return { ...state, leftMode: 'expanded', panelMode: 'expanded' };\n }\n return { ...state, panelMode: action.mode };\n }\n case 'SET_SIDEBAR_MODE':\n return { ...state, sidebarMode: action.mode };\n case 'SET_INSPECTOR_MODE':\n return { ...state, inspectorMode: action.mode };\n case 'SET_BOTTOM_MODE':\n return { ...state, bottomMode: action.mode };\n case 'TOGGLE_PANE': {\n switch (action.target) {\n case 'left':\n case 'rail':\n return { ...state, leftMode: state.leftMode === 'expanded' ? 'collapsed' : 'expanded', panelMode: state.leftMode === 'expanded' ? 'collapsed' : state.panelMode };\n case 'panel': {\n if (state.leftMode === 'collapsed') {\n return { ...state, leftMode: 'expanded', panelMode: 'expanded' };\n }\n return { ...state, panelMode: state.panelMode === 'expanded' ? 'collapsed' : 'expanded' };\n }\n case 'sidebar': {\n // Sidebar toggle sequencing is handled externally via setSidebarToggleComputer\n // This reducer only flips between expanded<->collapsed by default; thin is set by caller\n const next: SidebarMode = state.sidebarMode === 'collapsed' ? 'expanded' : state.sidebarMode === 'expanded' ? 'collapsed' : 'expanded';\n return { ...state, sidebarMode: next };\n }\n case 'inspector':\n return { ...state, inspectorMode: state.inspectorMode === 'expanded' ? 'collapsed' : 'expanded' };\n case 'bottom':\n return { ...state, bottomMode: state.bottomMode === 'expanded' ? 'collapsed' : 'expanded' };\n default:\n return state;\n }\n // Fallback to satisfy no-fallthrough in some environments\n return state;\n }\n case 'EXPAND_PANE': {\n switch (action.target) {\n case 'left':\n case 'rail':\n return { ...state, leftMode: 'expanded' };\n case 'panel':\n return { ...state, leftMode: 'expanded', panelMode: 'expanded' };\n case 'sidebar':\n return { ...state, sidebarMode: 'expanded' };\n case 'inspector':\n return { ...state, inspectorMode: 'expanded' };\n case 'bottom':\n return { ...state, bottomMode: 'expanded' };\n default:\n return state;\n }\n // Fallback to satisfy no-fallthrough in some environments\n return state;\n }\n case 'COLLAPSE_PANE': {\n switch (action.target) {\n case 'left':\n case 'rail':\n return { ...state, leftMode: 'collapsed', panelMode: 'collapsed' };\n case 'panel':\n return { ...state, panelMode: 'collapsed' };\n case 'sidebar':\n return { ...state, sidebarMode: 'collapsed' };\n case 'inspector':\n return { ...state, inspectorMode: 'collapsed' };\n case 'bottom':\n return { ...state, bottomMode: 'collapsed' };\n default:\n return state;\n }\n // Fallback to satisfy no-fallthrough in some environments\n return state;\n }\n }\n return state;\n}\n\n// Root Component\ninterface ShellRootProps extends React.ComponentPropsWithoutRef<'div'> {\n children: React.ReactNode;\n height?: 'full' | 'auto' | string | number;\n}\n\nconst Root = React.forwardRef<HTMLDivElement, ShellRootProps>(({ className, children, height = 'full', ...props }, ref) => {\n const { bp: currentBreakpoint, ready: currentBreakpointReady } = useBreakpoint();\n\n // Compute initial defaults from immediate children (one-time, uncontrolled defaults)\n const initialChildren = React.Children.toArray(children) as React.ReactElement[];\n const hasPanelDefaultOpen = initialChildren.some((el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Panel' && Boolean((el as any).props?.defaultOpen));\n const hasRailDefaultOpen = initialChildren.some((el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Rail' && Boolean((el as any).props?.defaultOpen));\n\n // Pane state management via reducer\n const [paneState, dispatchPane] = React.useReducer(paneReducer, {\n leftMode: hasPanelDefaultOpen || hasRailDefaultOpen ? 'expanded' : 'collapsed',\n panelMode: hasPanelDefaultOpen ? 'expanded' : 'collapsed',\n sidebarMode: 'expanded',\n inspectorMode: 'collapsed',\n bottomMode: 'collapsed',\n });\n const setLeftMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_LEFT_MODE', mode }), []);\n const setPanelMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_PANEL_MODE', mode }), []);\n const setSidebarMode = React.useCallback((mode: SidebarMode) => dispatchPane({ type: 'SET_SIDEBAR_MODE', mode }), []);\n const setInspectorMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_INSPECTOR_MODE', mode }), []);\n const setBottomMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_BOTTOM_MODE', mode }), []);\n\n // Removed: defaultMode responsiveness and manual change tracking\n\n // Composition detection\n const [hasLeft, setHasLeft] = React.useState(false);\n const [hasSidebar, setHasSidebar] = React.useState(false);\n\n // Customizable sidebar toggle sequencing\n const sidebarToggleComputerRef = React.useRef<(current: SidebarMode) => SidebarMode>((current) => (current === 'collapsed' ? 'thin' : current === 'thin' ? 'expanded' : 'collapsed'));\n const setSidebarToggleComputer = React.useCallback((fn: (current: SidebarMode) => SidebarMode) => {\n sidebarToggleComputerRef.current = fn;\n }, []);\n\n // Reducer handles left\u2192panel cascade; no effect needed\n\n // Composition validation\n React.useEffect(() => {\n if (hasSidebar && hasLeft) {\n console.warn('Shell: Sidebar cannot coexist with Rail or Panel. Use either Rail+Panel OR Sidebar.');\n }\n }, [hasSidebar, hasLeft]);\n\n // Left presentation + defaults from children\n const [devLeftPres, setDevLeftPres] = React.useState<PresentationValue | undefined>(undefined);\n const onLeftPres = React.useCallback((p: PresentationValue) => setDevLeftPres(p), []);\n const railDefaultSizeRef = React.useRef<number>(64);\n const panelDefaultSizeRef = React.useRef<number>(288);\n const onRailDefaults = React.useCallback((size: number) => {\n railDefaultSizeRef.current = size;\n }, []);\n const onPanelDefaults = React.useCallback((size: number) => {\n panelDefaultSizeRef.current = size;\n }, []);\n\n // Determine children presence for left composition\n const hasLeftChildren = React.useMemo(() => {\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && (el.type === comp || (el as any).type?.displayName === comp.displayName);\n return childArray.some((el) => isType(el, Rail) || isType(el, Panel));\n }, [children]);\n\n const hasSidebarChildren = React.useMemo(() => {\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && (el.type === comp || (el as any).type?.displayName === comp.displayName);\n return childArray.some((el) => isType(el, Sidebar));\n }, [children]);\n\n const togglePane = React.useCallback(\n (target: PaneTarget) => {\n if (target === 'sidebar') {\n const next = sidebarToggleComputerRef.current(paneState.sidebarMode as SidebarMode);\n setSidebarMode(next);\n return;\n }\n dispatchPane({ type: 'TOGGLE_PANE', target });\n },\n [paneState.sidebarMode],\n );\n\n const expandPane = React.useCallback((target: PaneTarget) => {\n if (target === 'sidebar') return setSidebarMode('expanded');\n dispatchPane({ type: 'EXPAND_PANE', target });\n }, []);\n\n const collapsePane = React.useCallback((target: PaneTarget) => {\n if (target === 'sidebar') return setSidebarMode('collapsed');\n dispatchPane({ type: 'COLLAPSE_PANE', target });\n }, []);\n\n const baseContextValue = React.useMemo(\n () => ({\n leftMode: paneState.leftMode,\n setLeftMode,\n panelMode: paneState.panelMode,\n setPanelMode,\n sidebarMode: paneState.sidebarMode,\n setSidebarMode,\n inspectorMode: paneState.inspectorMode,\n setInspectorMode,\n bottomMode: paneState.bottomMode,\n setBottomMode,\n hasLeft,\n setHasLeft,\n hasSidebar,\n setHasSidebar,\n currentBreakpoint,\n currentBreakpointReady,\n leftResolvedPresentation: devLeftPres,\n togglePane,\n expandPane,\n collapsePane,\n setSidebarToggleComputer,\n onLeftPres,\n onRailDefaults,\n onPanelDefaults,\n }),\n [\n paneState.leftMode,\n paneState.panelMode,\n paneState.sidebarMode,\n paneState.inspectorMode,\n paneState.bottomMode,\n hasLeft,\n hasSidebar,\n currentBreakpoint,\n currentBreakpointReady,\n devLeftPres,\n togglePane,\n expandPane,\n collapsePane,\n setSidebarToggleComputer,\n onLeftPres,\n onRailDefaults,\n onPanelDefaults,\n ],\n );\n\n // Organize children by type\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && (el.type === comp || (el as any).type?.displayName === comp.displayName);\n\n const headerEls = childArray.filter((el) => isType(el, Header));\n const railEls = childArray.filter((el) => isType(el, Rail));\n const panelEls = childArray.filter((el) => isType(el, Panel));\n const sidebarEls = childArray.filter((el) => isType(el, Sidebar));\n const contentEls = childArray.filter((el) => isType(el, Content));\n const inspectorEls = childArray.filter((el) => isType(el, Inspector));\n const bottomEls = childArray.filter((el) => isType(el, Bottom));\n\n // Controlled sync in Root: mirror first Rail.open if provided\n const firstRailOpen = (railEls[0] as any)?.props?.open;\n React.useEffect(() => {\n if (typeof firstRailOpen === 'undefined') return;\n const shouldOpen = Boolean(firstRailOpen);\n setLeftMode(shouldOpen ? 'expanded' : 'collapsed');\n }, [firstRailOpen]);\n\n const heightStyle = React.useMemo(() => {\n if (height === 'full') return { height: '100vh' };\n if (height === 'auto') return { height: 'auto' };\n if (typeof height === 'string') return { height };\n if (typeof height === 'number') return { height: `${height}px` };\n return {};\n }, [height]);\n\n // Peek state (layout-only overlay without mode changes)\n const [peekTarget, setPeekTarget] = React.useState<PaneTarget | null>(null);\n const peekPane = React.useCallback((target: PaneTarget) => setPeekTarget(target), []);\n const clearPeek = React.useCallback(() => setPeekTarget(null), []);\n\n // Memoized slice context values to avoid notifying unrelated consumers\n const presentationCtxValue = React.useMemo(() => ({ currentBreakpoint, currentBreakpointReady, leftResolvedPresentation: devLeftPres }), [currentBreakpoint, currentBreakpointReady, devLeftPres]);\n const leftModeCtxValue = React.useMemo(() => ({ leftMode: paneState.leftMode, setLeftMode }), [paneState.leftMode, setLeftMode]);\n const panelModeCtxValue = React.useMemo(() => ({ panelMode: paneState.panelMode, setPanelMode }), [paneState.panelMode, setPanelMode]);\n const sidebarModeCtxValue = React.useMemo(() => ({ sidebarMode: paneState.sidebarMode, setSidebarMode }), [paneState.sidebarMode, setSidebarMode]);\n const inspectorModeCtxValue = React.useMemo(() => ({ inspectorMode: paneState.inspectorMode, setInspectorMode }), [paneState.inspectorMode, setInspectorMode]);\n const bottomModeCtxValue = React.useMemo(() => ({ bottomMode: paneState.bottomMode, setBottomMode }), [paneState.bottomMode, setBottomMode]);\n const compositionCtxValue = React.useMemo(() => ({ hasLeft, setHasLeft, hasSidebar, setHasSidebar }), [hasLeft, setHasLeft, hasSidebar, setHasSidebar]);\n const peekCtxValue = React.useMemo(() => ({ peekTarget, setPeekTarget, peekPane, clearPeek }), [peekTarget, setPeekTarget, peekPane, clearPeek]);\n const actionsCtxValue = React.useMemo(() => ({ togglePane, expandPane, collapsePane, setSidebarToggleComputer }), [togglePane, expandPane, collapsePane, setSidebarToggleComputer]);\n\n return (\n <div {...props} ref={ref} className={classNames('rt-ShellRoot', className)} style={{ ...heightStyle, ...props.style }}>\n <ShellProvider\n value={{\n ...baseContextValue,\n peekTarget,\n setPeekTarget,\n peekPane,\n clearPeek,\n }}\n >\n <PresentationContext.Provider value={presentationCtxValue}>\n <LeftModeContext.Provider value={leftModeCtxValue}>\n <PanelModeContext.Provider value={panelModeCtxValue}>\n <SidebarModeContext.Provider value={sidebarModeCtxValue}>\n <InspectorModeContext.Provider value={inspectorModeCtxValue}>\n <BottomModeContext.Provider value={bottomModeCtxValue}>\n <CompositionContext.Provider value={compositionCtxValue}>\n <PeekContext.Provider value={peekCtxValue}>\n <ActionsContext.Provider value={actionsCtxValue}>\n {headerEls}\n <div\n className=\"rt-ShellBody\"\n data-peek-target={peekTarget ?? undefined}\n style={\n peekTarget === 'rail' || peekTarget === 'panel'\n ? ({\n ['--peek-rail-width' as any]: `${railDefaultSizeRef.current}px`,\n } as React.CSSProperties)\n : undefined\n }\n >\n {hasLeftChildren && !hasSidebarChildren\n ? (() => {\n const firstRail = railEls[0] as any;\n const passthroughProps = firstRail\n ? {\n // Notification passthrough used by Left; not spread to DOM in Left\n onOpenChange: firstRail.props?.onOpenChange,\n open: firstRail.props?.open,\n defaultOpen: firstRail.props?.defaultOpen,\n presentation: firstRail.props?.presentation,\n collapsible: firstRail.props?.collapsible,\n onExpand: firstRail.props?.onExpand,\n onCollapse: firstRail.props?.onCollapse,\n }\n : { defaultOpen: hasPanelDefaultOpen ? true : undefined };\n return (\n <Left {...(passthroughProps as any)}>\n {railEls}\n {panelEls}\n </Left>\n );\n })()\n : sidebarEls}\n {contentEls}\n {inspectorEls}\n </div>\n {bottomEls}\n </ActionsContext.Provider>\n </PeekContext.Provider>\n </CompositionContext.Provider>\n </BottomModeContext.Provider>\n </InspectorModeContext.Provider>\n </SidebarModeContext.Provider>\n </PanelModeContext.Provider>\n </LeftModeContext.Provider>\n </PresentationContext.Provider>\n </ShellProvider>\n </div>\n );\n});\nRoot.displayName = 'Shell.Root';\n\n// Header\ninterface ShellHeaderProps extends React.ComponentPropsWithoutRef<'header'> {\n height?: number;\n}\n\nconst Header = React.forwardRef<HTMLElement, ShellHeaderProps>(({ className, height = 64, style, ...props }, ref) => (\n <header\n {...props}\n ref={ref}\n className={classNames('rt-ShellHeader', className)}\n style={{\n ...style,\n ['--shell-header-height' as any]: `${height}px`,\n }}\n />\n));\nHeader.displayName = 'Shell.Header';\n\n// Pane Props Interface (shared by Panel, Sidebar, Inspector, Bottom)\ninterface PaneProps extends React.ComponentPropsWithoutRef<'div'> {\n presentation?: ResponsivePresentation;\n expandedSize?: number;\n minSize?: number;\n maxSize?: number;\n resizable?: boolean;\n collapsible?: boolean;\n onExpand?: () => void;\n onCollapse?: () => void;\n onResize?: (size: number) => void;\n /** Optional custom content inside the resizer handle (kept unstyled). */\n resizer?: React.ReactNode;\n onResizeStart?: (size: number) => void;\n onResizeEnd?: (size: number) => void;\n snapPoints?: number[];\n snapTolerance?: number;\n collapseThreshold?: number;\n paneId?: string;\n persistence?: PaneSizePersistence;\n}\n\n// Left container (auto-created for Rail+Panel)\ninterface LeftProps extends React.ComponentPropsWithoutRef<'div'> {\n presentation?: ResponsivePresentation;\n // New: passthrough from Rail\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean, meta: { reason: 'init' | 'toggle' | 'panel' | 'responsive' }) => void;\n collapsible?: boolean;\n onExpand?: () => void;\n onCollapse?: () => void;\n}\n\n// Rail (special case)\ntype LeftOpenChangeMeta = { reason: 'init' | 'toggle' | 'responsive' | 'panel' };\n\ntype RailControlledProps = { open: boolean; onOpenChange?: (open: boolean, meta: LeftOpenChangeMeta) => void; defaultOpen?: never };\ntype RailUncontrolledProps = { defaultOpen?: boolean; onOpenChange?: (open: boolean, meta: LeftOpenChangeMeta) => void; open?: never };\n\ntype RailProps = React.ComponentPropsWithoutRef<'div'> & {\n presentation?: ResponsivePresentation;\n expandedSize?: number;\n collapsible?: boolean;\n onExpand?: () => void;\n onCollapse?: () => void;\n} & (RailControlledProps | RailUncontrolledProps);\n\n// Left container - behaves like Inspector but contains Rail+Panel\nconst Left = React.forwardRef<HTMLDivElement, LeftProps>(\n ({ className, presentation = { initial: 'fixed', sm: 'fixed' }, collapsible = true, onExpand, onCollapse, children, style, ...props }, ref) => {\n const shell = useShell();\n const resolvedPresentation = useResponsivePresentation(presentation);\n const isOverlay = resolvedPresentation === 'overlay';\n const isStacked = resolvedPresentation === 'stacked';\n const localRef = React.useRef<HTMLDivElement | null>(null);\n // Publish resolved presentation so Root can gate peeking in overlay\n React.useEffect(() => {\n (shell as any).onLeftPres?.(resolvedPresentation);\n }, [shell, resolvedPresentation]);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n\n // Register with shell\n React.useEffect(() => {\n shell.setHasLeft(true);\n return () => shell.setHasLeft(false);\n }, [shell]);\n\n const lastBpRef = React.useRef<Breakpoint | null>(null);\n const lastLeftModeRef = React.useRef<PaneMode | null>(null);\n const initNotifiedRef = React.useRef(false);\n const resolvedDefaultOpen = useResponsiveValue((props as any).defaultOpen as any);\n\n // Initialize from responsive defaultOpen once when uncontrolled and breakpoint ready\n const didInitFromDefaultOpenRef = React.useRef(false);\n React.useEffect(() => {\n if (didInitFromDefaultOpenRef.current) return;\n if (!shell.currentBreakpointReady) return;\n if (typeof (props as any).open !== 'undefined') return; // controlled\n if (typeof (props as any).defaultOpen === 'undefined') return;\n didInitFromDefaultOpenRef.current = true;\n const initial = Boolean(resolvedDefaultOpen);\n shell.setLeftMode(initial ? 'expanded' : 'collapsed');\n (props as any).onOpenChange?.(initial, { reason: 'init' });\n }, [shell.currentBreakpointReady, (props as any).open, (props as any).defaultOpen, resolvedDefaultOpen]);\n React.useEffect(() => {\n // Controlled Left via Rail.open\n if (typeof (props as any).open !== 'undefined') {\n const shouldOpen = Boolean((props as any).open);\n shell.setLeftMode(shouldOpen ? 'expanded' : 'collapsed');\n return;\n }\n // defaultOpen is applied in Rail; Left no longer follows responsive defaults\n }, [shell, (props as any).open]);\n\n // Sync controlled mode\n // removed mode sync\n\n // Emit mode changes (uncontrolled toggles + init)\n React.useEffect(() => {\n if (typeof (props as any).open !== 'undefined') return; // controlled, notifications only via parent changes\n if (!initNotifiedRef.current && Boolean(resolvedDefaultOpen) && shell.leftMode === 'expanded') {\n (props as any).onOpenChange?.(true, { reason: 'init' });\n initNotifiedRef.current = true;\n }\n if (lastLeftModeRef.current !== null && lastLeftModeRef.current !== shell.leftMode) {\n (props as any).onOpenChange?.(shell.leftMode === 'expanded', { reason: 'toggle' });\n }\n lastLeftModeRef.current = shell.leftMode;\n }, [shell.leftMode, resolvedDefaultOpen]);\n\n // Emit expand/collapse events\n React.useEffect(() => {\n if (shell.leftMode === 'expanded') {\n onExpand?.();\n } else {\n onCollapse?.();\n }\n }, [shell.leftMode, onExpand, onCollapse]);\n\n const isExpanded = shell.leftMode === 'expanded';\n\n // Left is not resizable; width derives from Rail/Panel.\n\n if (isOverlay) {\n const open = shell.leftMode === 'expanded';\n // Compute overlay width from child Rail/Panel expanded sizes\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && el.type === comp;\n const railEl = childArray.find((el) => isType(el, Rail));\n const panelEl = childArray.find((el) => isType(el, Panel));\n const railSize = typeof (railEl as any)?.props?.expandedSize === 'number' ? (railEl as any).props.expandedSize : 64;\n const panelSize = typeof (panelEl as any)?.props?.expandedSize === 'number' ? (panelEl as any).props.expandedSize : 288;\n const hasRail = Boolean(railEl);\n const hasPanel = Boolean(panelEl);\n const overlayPx = (hasRail ? railSize : 0) + (shell.panelMode === 'expanded' && hasPanel ? panelSize : 0);\n return (\n <Sheet.Root open={open} onOpenChange={(o) => shell.setLeftMode(o ? 'expanded' : 'collapsed')}>\n <Sheet.Content\n side=\"start\"\n style={{ padding: 0 }}\n width={{\n initial: `${overlayPx}px`,\n }}\n >\n <VisuallyHidden>\n <Sheet.Title>Navigation</Sheet.Title>\n </VisuallyHidden>\n <div className=\"rt-ShellLeft\">{children}</div>\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n\n if (isStacked) {\n const open = shell.leftMode === 'expanded';\n // Compute floating width from child Rail/Panel expanded sizes (like overlay)\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && el.type === comp;\n const railEl = childArray.find((el) => isType(el, Rail));\n const panelEl = childArray.find((el) => isType(el, Panel));\n const railSize = typeof (railEl as any)?.props?.expandedSize === 'number' ? (railEl as any).props.expandedSize : 64;\n const panelSize = typeof (panelEl as any)?.props?.expandedSize === 'number' ? (panelEl as any).props.expandedSize : 288;\n const hasRail = Boolean(railEl);\n const hasPanel = Boolean(panelEl);\n const includePanel = hasPanel && (shell.panelMode === 'expanded' || shell.peekTarget === 'panel');\n\n // Strip control props from DOM spread\n const { open: _openIgnored, defaultOpen: _defaultOpenIgnored, onOpenChange: _onOpenChangeIgnored, ...stackDomProps } = props as any;\n\n return (\n <div\n {...stackDomProps}\n ref={setRef}\n className={classNames('rt-ShellLeft', className)}\n data-mode={shell.leftMode}\n data-peek={shell.peekTarget === 'left' || shell.peekTarget === 'rail' || shell.peekTarget === 'panel' || undefined}\n data-presentation={resolvedPresentation}\n style={{\n ...style,\n }}\n data-open={open || undefined}\n >\n {children}\n </div>\n );\n }\n\n // Strip control/legacy props from DOM spread\n const {\n open: _openIgnored,\n defaultOpen: _defaultOpenIgnored,\n onOpenChange: _onOpenChangeIgnored,\n // legacy\n mode: _legacyModeIgnored,\n defaultMode: _legacyDefaultModeIgnored,\n onModeChange: _legacyOnModeChangeIgnored,\n ...domProps\n } = props as any;\n\n return (\n <div\n {...domProps}\n ref={setRef}\n className={classNames('rt-ShellLeft', className)}\n data-mode={shell.leftMode}\n data-peek={shell.peekTarget === 'left' || shell.peekTarget === 'rail' || shell.peekTarget === 'panel' || undefined}\n data-presentation={resolvedPresentation}\n style={{\n ...style,\n }}\n >\n {children}\n </div>\n );\n },\n);\nLeft.displayName = 'Shell.Left';\n\nconst Rail = React.forwardRef<HTMLDivElement, RailProps>(({ className, presentation, expandedSize = 64, collapsible, onExpand, onCollapse, children, style, ...props }, ref) => {\n const shell = useShell();\n\n // Dev guards\n const wasControlledRef = React.useRef<boolean | null>(null);\n if (process.env.NODE_ENV !== 'production') {\n if (typeof props.open !== 'undefined' && typeof props.defaultOpen !== 'undefined') {\n // eslint-disable-next-line no-console\n console.error('Shell.Rail: Do not pass both `open` and `defaultOpen`. Choose one.');\n }\n }\n\n // Warn on controlled/uncontrolled mode switch\n React.useEffect(() => {\n const isControlled = typeof props.open !== 'undefined';\n if (wasControlledRef.current === null) {\n wasControlledRef.current = isControlled;\n return;\n }\n if (wasControlledRef.current !== isControlled) {\n // eslint-disable-next-line no-console\n console.warn('Shell.Rail: Switching between controlled and uncontrolled `open` is not supported.');\n wasControlledRef.current = isControlled;\n }\n }, [props.open]);\n\n // Register expanded size with Left container\n React.useEffect(() => {\n (shell as any).onRailDefaults?.(expandedSize);\n }, [shell, expandedSize]);\n\n const isExpanded = shell.leftMode === 'expanded';\n\n // Strip unknown open/defaultOpen props from DOM by not spreading them\n const { defaultOpen: _defaultOpenIgnored, open: _openIgnored, onOpenChange: _onOpenChangeIgnored, ...domProps } = props as any;\n\n return (\n <div\n {...domProps}\n ref={ref}\n className={classNames('rt-ShellRail', className)}\n data-mode={shell.leftMode}\n data-peek={(shell.currentBreakpointReady && shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'rail') || undefined}\n style={{\n ...style,\n ['--rail-size' as any]: `${expandedSize}px`,\n }}\n >\n <div className=\"rt-ShellRailContent\" data-visible={(shell.currentBreakpointReady && (isExpanded || (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'rail'))) || undefined}>\n {children}\n </div>\n </div>\n );\n});\nRail.displayName = 'Shell.Rail';\n\n// Panel\ntype HandleComponent = React.ForwardRefExoticComponent<React.ComponentPropsWithoutRef<'div'> & React.RefAttributes<HTMLDivElement>>;\n\ntype PanelOpenChangeMeta = { reason: 'toggle' | 'left' | 'init' };\ntype PanelControlledProps = { open: boolean; onOpenChange?: (open: boolean, meta: PanelOpenChangeMeta) => void; defaultOpen?: never };\ntype PanelUncontrolledProps = { defaultOpen?: boolean; onOpenChange?: (open: boolean, meta: PanelOpenChangeMeta) => void; open?: never };\n\ntype PanelSizeControlledProps = { size: number | string; defaultSize?: never };\ntype PanelSizeUncontrolledProps = { defaultSize?: number | string; size?: never };\n\ntype PanelSizeChangeMeta = { reason: 'init' | 'resize' | 'controlled' };\ntype PanelPublicProps = Omit<PaneProps, 'presentation' | 'defaultMode'> &\n (PanelControlledProps | PanelUncontrolledProps) &\n (PanelSizeControlledProps | PanelSizeUncontrolledProps) & {\n onSizeChange?: (size: number, meta: PanelSizeChangeMeta) => void;\n sizeUpdate?: 'throttle' | 'debounce';\n sizeUpdateMs?: number;\n };\ntype PanelComponent = React.ForwardRefExoticComponent<PanelPublicProps & React.RefAttributes<HTMLDivElement>> & {\n Handle: HandleComponent;\n};\n\ntype SidebarComponent = React.ForwardRefExoticComponent<\n (Omit<PaneProps, 'mode' | 'defaultMode' | 'onModeChange'> & {\n state?: Responsive<SidebarMode>;\n defaultState?: SidebarMode;\n onStateChange?: (mode: SidebarMode) => void;\n thinSize?: number;\n toggleModes?: 'both' | 'single';\n }) &\n React.RefAttributes<HTMLDivElement>\n> & { Handle: HandleComponent };\n\ntype InspectorComponent = React.ForwardRefExoticComponent<PaneProps & React.RefAttributes<HTMLDivElement>> & { Handle: HandleComponent };\n\ntype BottomComponent = React.ForwardRefExoticComponent<PaneProps & React.RefAttributes<HTMLDivElement>> & { Handle: HandleComponent };\n\nconst Panel = React.forwardRef<HTMLDivElement, PanelPublicProps>(\n (\n {\n className,\n defaultOpen,\n open,\n onOpenChange,\n size,\n defaultSize,\n expandedSize = 288,\n minSize,\n maxSize,\n resizable,\n collapsible = true,\n onExpand,\n onCollapse,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n paneId,\n persistence,\n children,\n style,\n onSizeChange,\n sizeUpdate,\n sizeUpdateMs = 50,\n ...props\n },\n ref,\n ) => {\n // Throttled/debounced emitter for onSizeChange\n const emitSizeChange = React.useMemo(() => {\n if (!onSizeChange) return () => {};\n if (sizeUpdate === 'debounce') {\n let t: any = null;\n const fn = (s: number, meta: PanelSizeChangeMeta) => {\n if (t) clearTimeout(t);\n t = setTimeout(() => {\n onSizeChange?.(s, meta);\n }, sizeUpdateMs);\n };\n return fn;\n }\n if (sizeUpdate === 'throttle') {\n let last = 0;\n return (s: number, meta: PanelSizeChangeMeta) => {\n const now = Date.now();\n if (now - last >= sizeUpdateMs) {\n last = now;\n onSizeChange?.(s, meta);\n }\n };\n }\n return (s: number, meta: PanelSizeChangeMeta) => onSizeChange?.(s, meta);\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n const shell = useShell();\n const prevPanelModeRef = React.useRef<PaneMode | null>(null);\n const prevLeftModeRef = React.useRef<PaneMode | null>(null);\n const initNotifiedRef = React.useRef(false);\n\n // Dev-only runtime guard\n if (process.env.NODE_ENV !== 'production') {\n if (typeof open !== 'undefined' && typeof defaultOpen !== 'undefined') {\n // eslint-disable-next-line no-console\n console.error('Shell.Panel: Do not pass both `open` and `defaultOpen`. Choose one.');\n }\n if (typeof size !== 'undefined' && typeof defaultSize !== 'undefined') {\n // eslint-disable-next-line no-console\n console.error('Shell.Panel: Do not pass both `size` and `defaultSize`. Choose one.');\n }\n }\n\n // Initialize uncontrolled open state from defaultOpen on first mount\n React.useEffect(() => {\n if (typeof open === 'undefined' && typeof defaultOpen === 'boolean') {\n if (defaultOpen) {\n // Ensure Left is expanded before expanding Panel\n shell.setLeftMode('expanded');\n shell.setPanelMode('expanded');\n } else {\n shell.setPanelMode('collapsed');\n }\n }\n // run only on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Controlled sync: mirror shell state when `open` is provided\n React.useEffect(() => {\n if (typeof open === 'undefined') return;\n if (open) {\n if (shell.leftMode !== 'expanded') shell.setLeftMode('expanded');\n if (shell.panelMode !== 'expanded') shell.setPanelMode('expanded');\n } else {\n if (shell.panelMode !== 'collapsed') shell.setPanelMode('collapsed');\n }\n }, [open, shell.leftMode, shell.panelMode]);\n\n // Dev-only warning if switching controlled/uncontrolled between renders\n React.useEffect(() => {\n const isControlled = typeof open !== 'undefined';\n (Panel as any)._wasControlled = (Panel as any)._wasControlled ?? isControlled;\n if ((Panel as any)._wasControlled !== isControlled) {\n // eslint-disable-next-line no-console\n console.warn('Shell.Panel: Switching between controlled and uncontrolled `open` is not supported.');\n (Panel as any)._wasControlled = isControlled;\n }\n }, [open]);\n\n // Notify init open\n React.useEffect(() => {\n if (initNotifiedRef.current) return;\n if (typeof open === 'undefined' && defaultOpen && shell.panelMode === 'expanded') {\n onOpenChange?.(true, { reason: 'init' });\n initNotifiedRef.current = true;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.useEffect(() => {\n (shell as any).onPanelDefaults?.(expandedSize);\n }, [shell, expandedSize]);\n const localRef = React.useRef<HTMLDivElement | null>(null);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const handleChildren = childArray.filter((el: React.ReactElement) => React.isValidElement(el) && el.type === PanelHandle);\n const contentChildren = childArray.filter((el: React.ReactElement) => !(React.isValidElement(el) && el.type === PanelHandle));\n\n const isOverlay = shell.leftResolvedPresentation === 'overlay';\n\n // Normalize CSS lengths to px\n const normalizeToPx = React.useCallback((value: number | string | undefined): number | undefined => {\n if (value == null) return undefined;\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n const str = String(value).trim();\n if (!str) return undefined;\n if (str.endsWith('px')) return Number.parseFloat(str);\n if (str.endsWith('rem')) {\n const rem = Number.parseFloat(getComputedStyle(document.documentElement).fontSize || '16') || 16;\n return Number.parseFloat(str) * rem;\n }\n if (str.endsWith('%')) {\n const pct = Number.parseFloat(str);\n const base = document.documentElement.clientWidth || window.innerWidth || 0;\n return (pct / 100) * base;\n }\n // Bare number-like string\n const n = Number.parseFloat(str);\n return Number.isFinite(n) ? n : undefined;\n }, []);\n\n // Derive a default persistence adapter from paneId if none provided\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:panel:${paneId}`;\n const adapter: PaneSizePersistence = {\n load: () => {\n if (typeof window === 'undefined') return undefined;\n const v = window.localStorage.getItem(key);\n return v ? Number(v) : undefined;\n },\n save: (size: number) => {\n if (typeof window === 'undefined') return;\n window.localStorage.setItem(key, String(size));\n },\n };\n return adapter;\n }, [paneId, persistence]);\n\n // Load persisted size if configured (only in fixed presentation)\n React.useEffect(() => {\n let mounted = true;\n (async () => {\n if (!resizable || !persistenceAdapter?.load || isOverlay) return;\n const loaded = await persistenceAdapter.load();\n if (mounted && typeof loaded === 'number' && localRef.current) {\n localRef.current.style.setProperty('--panel-size', `${loaded}px`);\n onResize?.(loaded);\n }\n })();\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n // In overlay, ensure panel uses the fixed expandedSize, ignoring any persisted size\n React.useEffect(() => {\n if (!localRef.current) return;\n if (isOverlay) {\n localRef.current.style.setProperty('--panel-size', `${expandedSize}px`);\n }\n }, [isOverlay, expandedSize]);\n\n // Apply defaultSize on mount when uncontrolled\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof size === 'undefined' && typeof defaultSize !== 'undefined') {\n const px = normalizeToPx(defaultSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n // Clamp to min/max if provided\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--panel-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'init' });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Controlled size sync\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof size === 'undefined') return;\n const px = normalizeToPx(size);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--panel-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'controlled' });\n }\n }, [size, minSize, maxSize, normalizeToPx]);\n\n // Ensure Left container width is auto whenever Panel is expanded in fixed presentation\n React.useEffect(() => {\n if (!localRef.current) return;\n if (shell.leftResolvedPresentation !== 'overlay' && shell.leftMode === 'expanded' && shell.panelMode === 'expanded') {\n const leftEl = (localRef.current.parentElement as HTMLElement) || null;\n try {\n leftEl?.style.removeProperty('width');\n } catch {}\n }\n }, [shell.leftResolvedPresentation, shell.leftMode, shell.panelMode]);\n\n const isExpanded = shell.leftMode === 'expanded' && shell.panelMode === 'expanded';\n\n // Notify on internal toggles and left cascade\n React.useEffect(() => {\n const prevPanel = prevPanelModeRef.current;\n const prevLeft = prevLeftModeRef.current;\n if (prevPanel !== null && prevPanel !== shell.panelMode) {\n const open = shell.panelMode === 'expanded';\n let reason: PanelOpenChangeMeta['reason'] = 'toggle';\n if (prevLeft !== shell.leftMode && shell.leftMode === 'collapsed' && !open) {\n reason = 'left';\n }\n onOpenChange?.(open, { reason });\n }\n prevPanelModeRef.current = shell.panelMode;\n prevLeftModeRef.current = shell.leftMode;\n }, [shell.panelMode, shell.leftMode, onOpenChange]);\n\n // Provide resizer handle when fixed (not overlay)\n const handleEl =\n resizable && shell.leftResolvedPresentation !== 'overlay' && isExpanded ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--panel-size',\n minSize: typeof minSize === 'number' ? minSize : 100,\n maxSize: typeof maxSize === 'number' ? maxSize : 800,\n defaultSize: expandedSize,\n orientation: 'vertical',\n edge: 'end',\n computeNext: (client, startClient, startSize) => {\n const isRtl = getComputedStyle(localRef.current!).direction === 'rtl';\n const delta = client - startClient;\n return startSize + (isRtl ? -delta : delta);\n },\n onResize,\n onResizeStart: (size) => {\n // Ensure Left container is not stuck with a fixed width in stacked\n const panelEl = localRef.current as HTMLElement | null;\n const leftEl = panelEl?.parentElement as HTMLElement | null;\n try {\n leftEl?.style.removeProperty('width');\n } catch {}\n onResizeStart?.(size);\n },\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n emitSizeChange(size, { reason: 'resize' });\n persistenceAdapter?.save?.(size);\n },\n target: 'panel',\n collapsible: Boolean(collapsible),\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => shell.setPanelMode('collapsed'),\n requestToggle: () => shell.togglePane('panel'),\n }}\n >\n {handleChildren.length > 0 ? handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i })) : <PaneHandle />}\n </PaneResizeContext.Provider>\n ) : null;\n\n // Strip control props from DOM spread\n const {\n defaultOpen: _panelDefaultOpenIgnored,\n open: _panelOpenIgnored,\n onOpenChange: _panelOnOpenChangeIgnored,\n size: _panelSizeIgnored,\n defaultSize: _panelDefaultSizeIgnored,\n ...panelDomProps\n } = props as any;\n\n return (\n <div\n {...panelDomProps}\n ref={setRef}\n className={classNames('rt-ShellPanel', className)}\n data-mode={shell.panelMode}\n data-visible={(shell.currentBreakpointReady && (isExpanded || (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'panel'))) || undefined}\n data-peek={(shell.currentBreakpointReady && shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'panel') || undefined}\n style={{\n ...style,\n ['--panel-size' as any]: `${expandedSize}px`,\n }}\n >\n <div className=\"rt-ShellPanelContent\" data-visible={isExpanded || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n },\n) as PanelComponent;\nPanel.displayName = 'Shell.Panel';\nPanel.Handle = PanelHandle;\n\n// Sidebar moved to ./_internal/shell-sidebar\n\n// Content (always required)\ninterface ShellContentProps extends React.ComponentPropsWithoutRef<'main'> {}\n\nconst Content = React.forwardRef<HTMLElement, ShellContentProps>(({ className, ...props }, ref) => <main {...props} ref={ref} className={classNames('rt-ShellContent', className)} />);\nContent.displayName = 'Shell.Content';\n\n// Inspector moved to ./_internal/shell-inspector\n\n// Bottom\n// Bottom moved to ./_internal/shell-bottom\n// (Bottom implementation extracted)\n\n// Trigger\n// PaneTarget type moved to shell.types.ts\ntype TriggerAction = 'toggle' | 'expand' | 'collapse';\n\ninterface TriggerProps extends React.ComponentPropsWithoutRef<'button'> {\n target: PaneTarget;\n action?: TriggerAction;\n /**\n * Whether to show peek preview on hover when the target pane is collapsed.\n * Defaults to false.\n */\n peekOnHover?: boolean;\n}\n\nconst Trigger = React.forwardRef<HTMLButtonElement, TriggerProps>(({ target, action = 'toggle', peekOnHover, onClick, onMouseEnter, onMouseLeave, children, ...props }, ref) => {\n const shell = useShell();\n\n const handleClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n\n // Clear any active peek on this target before toggling to avoid sticky peek state\n if ((shell as any).peekTarget === target) {\n shell.clearPeek();\n }\n\n switch (action) {\n case 'toggle':\n shell.togglePane(target);\n break;\n case 'expand':\n shell.expandPane(target);\n break;\n case 'collapse':\n shell.collapsePane(target);\n break;\n }\n },\n [shell, target, action, onClick],\n );\n\n const isCollapsed = (() => {\n switch (target) {\n case 'left':\n case 'rail':\n return shell.leftMode === 'collapsed';\n case 'panel':\n return shell.leftMode === 'collapsed' || shell.panelMode === 'collapsed';\n case 'sidebar':\n return shell.sidebarMode === 'collapsed';\n case 'inspector':\n return shell.inspectorMode === 'collapsed';\n case 'bottom':\n return shell.bottomMode === 'collapsed';\n }\n })();\n\n const handleMouseEnter = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseEnter?.(event);\n if (!peekOnHover || !isCollapsed) return;\n // Use the actual target for peek behavior (not mapped to left)\n shell.peekPane(target);\n },\n [onMouseEnter, peekOnHover, isCollapsed, shell, target],\n );\n\n const handleMouseLeave = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseLeave?.(event);\n if (!peekOnHover) return;\n if ((shell as any).peekTarget === target) {\n shell.clearPeek();\n }\n },\n [onMouseLeave, peekOnHover, shell, target],\n );\n\n return (\n <button {...props} ref={ref} onClick={handleClick} onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave} data-shell-trigger={target} data-shell-action={action}>\n {children}\n </button>\n );\n});\nTrigger.displayName = 'Shell.Trigger';\n\n// Exports\nexport {\n Root,\n Header,\n Left,\n Rail,\n Panel,\n Sidebar,\n Content,\n Inspector,\n Bottom,\n Trigger,\n useShell,\n useResponsivePresentation,\n type PaneMode,\n type SidebarMode,\n type ResponsivePresentation,\n type PaneTarget,\n type TriggerAction,\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "classNames", "Sheet", "VisuallyHidden", "useResponsivePresentation", "useResponsiveValue", "PaneResizeContext", "PaneHandle", "PanelHandle", "Sidebar", "Bottom", "Inspector", "BREAKPOINTS", "ShellProvider", "useShell", "LeftModeContext", "PanelModeContext", "SidebarModeContext", "InspectorModeContext", "BottomModeContext", "PresentationContext", "PeekContext", "ActionsContext", "CompositionContext", "useBreakpoint", "currentBp", "setCurrentBp", "ready", "setReady", "mqls", "k", "q", "compute", "matched", "m", "next", "cleanups", "mm", "fn", "paneReducer", "state", "action", "Root", "className", "children", "height", "props", "ref", "currentBreakpoint", "currentBreakpointReady", "initialChildren", "hasPanelDefaultOpen", "el", "hasRailDefaultOpen", "paneState", "dispatchPane", "setLeftMode", "mode", "setPanelMode", "setSidebarMode", "setInspectorMode", "setBottomMode", "hasLeft", "setHasLeft", "hasSidebar", "setHasSidebar", "sidebarToggleComputerRef", "current", "setSidebarToggleComputer", "devLeftPres", "setDevLeftPres", "onLeftPres", "p", "railDefaultSizeRef", "panelDefaultSizeRef", "onRailDefaults", "size", "onPanelDefaults", "hasLeftChildren", "childArray", "isType", "comp", "Rail", "Panel", "hasSidebarChildren", "togglePane", "target", "expandPane", "collapsePane", "baseContextValue", "headerEls", "Header", "railEls", "panelEls", "sidebarEls", "contentEls", "Content", "inspectorEls", "bottomEls", "firstRailOpen", "heightStyle", "peekTarget", "setPeekTarget", "peekPane", "clearPeek", "presentationCtxValue", "leftModeCtxValue", "panelModeCtxValue", "sidebarModeCtxValue", "inspectorModeCtxValue", "bottomModeCtxValue", "compositionCtxValue", "peekCtxValue", "actionsCtxValue", "firstRail", "passthroughProps", "Left", "style", "presentation", "collapsible", "onExpand", "onCollapse", "shell", "resolvedPresentation", "isOverlay", "isStacked", "localRef", "setRef", "node", "lastBpRef", "lastLeftModeRef", "initNotifiedRef", "resolvedDefaultOpen", "didInitFromDefaultOpenRef", "initial", "shouldOpen", "isExpanded", "open", "railEl", "panelEl", "railSize", "panelSize", "hasRail", "hasPanel", "overlayPx", "o", "includePanel", "_openIgnored", "_defaultOpenIgnored", "_onOpenChangeIgnored", "stackDomProps", "_legacyModeIgnored", "_legacyDefaultModeIgnored", "_legacyOnModeChangeIgnored", "domProps", "expandedSize", "wasControlledRef", "isControlled", "defaultOpen", "onOpenChange", "defaultSize", "minSize", "maxSize", "resizable", "onResize", "onResizeStart", "onResizeEnd", "snapPoints", "snapTolerance", "collapseThreshold", "paneId", "persistence", "onSizeChange", "sizeUpdate", "sizeUpdateMs", "emitSizeChange", "t", "s", "meta", "last", "now", "prevPanelModeRef", "prevLeftModeRef", "handleChildren", "contentChildren", "normalizeToPx", "value", "str", "rem", "pct", "base", "n", "persistenceAdapter", "key", "v", "mounted", "loaded", "px", "clamped", "leftEl", "prevPanel", "prevLeft", "reason", "handleEl", "client", "startClient", "startSize", "isRtl", "delta", "i", "_panelDefaultOpenIgnored", "_panelOpenIgnored", "_panelOnOpenChangeIgnored", "_panelSizeIgnored", "_panelDefaultSizeIgnored", "panelDomProps", "Trigger", "peekOnHover", "onClick", "onMouseEnter", "onMouseLeave", "handleClick", "event", "isCollapsed", "handleMouseEnter", "handleMouseLeave"]
|
|
7
7
|
}
|