@kushagradhawan/kookie-ui 0.1.44 → 0.1.45
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 +57 -98
- package/dist/cjs/components/shell.d.ts +3 -3
- package/dist/cjs/components/shell.d.ts.map +1 -1
- package/dist/cjs/components/shell.js +1 -1
- package/dist/cjs/components/shell.js.map +2 -2
- package/dist/cjs/components/sidebar.props.d.ts +1 -1
- package/dist/cjs/components/sidebar.props.js +1 -1
- package/dist/cjs/components/sidebar.props.js.map +2 -2
- package/dist/esm/components/shell.d.ts +3 -3
- package/dist/esm/components/shell.d.ts.map +1 -1
- package/dist/esm/components/shell.js +1 -1
- package/dist/esm/components/shell.js.map +2 -2
- package/dist/esm/components/sidebar.props.d.ts +1 -1
- package/dist/esm/components/sidebar.props.js +1 -1
- package/dist/esm/components/sidebar.props.js.map +2 -2
- package/package.json +1 -1
- 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-sidebar-menu.css +6 -1
- package/src/components/_internal/base-sidebar.css +6 -29
- package/src/components/shell.css +22 -0
- package/src/components/shell.tsx +7 -9
- package/src/components/sidebar.css +55 -99
- package/src/components/sidebar.props.tsx +1 -1
- package/styles.css +57 -98
|
@@ -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';\n\n// Types\ntype PresentationValue = 'fixed' | 'overlay' | 'stacked';\ntype ResponsivePresentation =\n | PresentationValue\n | Partial<Record<'initial' | 'xs' | 'sm' | 'md' | 'lg' | 'xl', PresentationValue>>;\ntype PaneMode = 'expanded' | 'collapsed';\ntype SidebarMode = 'collapsed' | 'thin' | 'expanded';\ntype ResponsiveMode =\n | PaneMode\n | Partial<Record<'initial' | 'xs' | 'sm' | 'md' | 'lg' | 'xl', PaneMode>>;\n\n// Sidebar responsive mode (includes 'thin')\ntype ResponsiveSidebarMode =\n | SidebarMode\n | Partial<Record<'initial' | 'xs' | 'sm' | 'md' | 'lg' | 'xl', SidebarMode>>;\n\n// Persistence adapter for pane sizes\ntype PaneSizePersistence = {\n load?: () => number | Promise<number | undefined> | undefined;\n save?: (size: number) => void | Promise<void>;\n};\n\n// Breakpoint system\nconst BREAKPOINTS = {\n xs: '(min-width: 520px)',\n sm: '(min-width: 768px)',\n md: '(min-width: 1024px)',\n lg: '(min-width: 1280px)',\n xl: '(min-width: 1640px)',\n} as const;\n\ntype Breakpoint = 'initial' | keyof typeof BREAKPOINTS;\n\n// Shell context\ninterface ShellContextValue {\n // Pane states\n leftMode: PaneMode;\n setLeftMode: (mode: PaneMode) => void;\n panelMode: PaneMode; // Panel state within left container\n setPanelMode: (mode: PaneMode) => void;\n sidebarMode: SidebarMode;\n setSidebarMode: (mode: SidebarMode) => void;\n inspectorMode: PaneMode;\n setInspectorMode: (mode: PaneMode) => void;\n bottomMode: PaneMode;\n setBottomMode: (mode: PaneMode) => void;\n\n // Peek state (layout-only, ephemeral)\n peekTarget: PaneTarget | null;\n setPeekTarget: (target: PaneTarget | null) => void;\n peekPane: (target: PaneTarget) => void;\n clearPeek: () => void;\n\n // Composition detection\n hasLeft: boolean;\n setHasLeft: (has: boolean) => void;\n hasSidebar: boolean;\n setHasSidebar: (has: boolean) => void;\n\n // Presentation resolution\n currentBreakpoint: Breakpoint;\n currentBreakpointReady: boolean;\n leftResolvedPresentation?: PresentationValue;\n\n // Actions\n togglePane: (target: PaneTarget) => void;\n expandPane: (target: PaneTarget) => void;\n collapsePane: (target: PaneTarget) => void;\n // Toggle customization\n setSidebarToggleComputer?: (fn: (current: SidebarMode) => SidebarMode) => void;\n // Dev-only hooks for presentation warnings\n onLeftPres?: (p: PresentationValue) => void;\n // Sizing info for overlay grouping\n onLeftDefaults?: (size: number) => void;\n}\n\nconst ShellContext = React.createContext<ShellContextValue | null>(null);\n\nfunction useShell() {\n const ctx = React.useContext(ShellContext);\n if (!ctx) throw new Error('Shell components must be used within <Shell.Root>');\n return ctx;\n}\n\n// Pane resize context for composed Handles\ninterface PaneResizeContextValue {\n containerRef: React.RefObject<HTMLDivElement | null>;\n cssVarName: string;\n minSize: number;\n maxSize: number;\n defaultSize: number;\n orientation: 'vertical' | 'horizontal';\n edge: 'start' | 'end';\n computeNext: (clientPos: number, startClientPos: number, startSize: number) => number;\n onResize?: (size: number) => void;\n onResizeStart?: (size: number) => void;\n onResizeEnd?: (size: number) => void;\n // new features\n target: PaneTarget;\n collapsible: boolean;\n snapPoints?: number[];\n snapTolerance: number;\n collapseThreshold?: number;\n requestCollapse?: () => void;\n requestToggle?: () => void;\n}\n\nconst PaneResizeContext = React.createContext<PaneResizeContextValue | null>(null);\n\nfunction usePaneResize() {\n const ctx = React.useContext(PaneResizeContext);\n if (!ctx) throw new Error('Shell.Handle must be used within a resizable pane');\n return ctx;\n}\n\nconst PaneHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>(\n ({ className, children, ...props }, ref) => {\n const {\n containerRef,\n cssVarName,\n minSize,\n maxSize,\n defaultSize,\n orientation,\n edge,\n computeNext,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n collapsible,\n target,\n requestCollapse,\n requestToggle,\n } = usePaneResize();\n\n // Track active drag cleanup to avoid leaking listeners if unmounted mid-drag\n const activeCleanupRef = React.useRef<(() => void) | null>(null);\n React.useEffect(\n () => () => {\n // Cleanup any in-flight drag on unmount\n try {\n activeCleanupRef.current?.();\n } catch {}\n activeCleanupRef.current = null;\n },\n [],\n );\n\n const ariaOrientation = orientation;\n\n return (\n <div\n {...props}\n ref={ref}\n className={classNames('rt-ShellResizer', className)}\n data-orientation={orientation}\n data-edge={edge}\n role=\"slider\"\n aria-orientation={ariaOrientation}\n aria-valuemin={minSize}\n aria-valuemax={maxSize}\n aria-valuenow={defaultSize}\n tabIndex={0}\n onPointerDown={(e) => {\n if (!containerRef.current) return;\n e.preventDefault();\n const container = containerRef.current;\n const handleEl = e.currentTarget as HTMLElement;\n const pointerId = e.pointerId;\n // If a previous drag didn't finalize properly, force cleanup first\n try {\n activeCleanupRef.current?.();\n } catch {}\n container.setAttribute('data-resizing', '');\n try {\n handleEl.setPointerCapture(pointerId);\n } catch {}\n const startClient = orientation === 'vertical' ? e.clientX : e.clientY;\n const startSize = parseFloat(\n getComputedStyle(container).getPropertyValue(cssVarName) || `${defaultSize}`,\n );\n const clamp = (v: number) => Math.min(Math.max(v, minSize), maxSize);\n const body = document.body;\n const prevCursor = body.style.cursor;\n const prevUserSelect = body.style.userSelect;\n body.style.cursor = orientation === 'vertical' ? 'col-resize' : 'row-resize';\n body.style.userSelect = 'none';\n onResizeStart?.(startSize);\n const handleMove = (ev: PointerEvent) => {\n const client = orientation === 'vertical' ? ev.clientX : ev.clientY;\n const next = clamp(computeNext(client, startClient, startSize));\n container.style.setProperty(cssVarName, `${next}px`);\n handleEl.setAttribute('aria-valuenow', String(next));\n onResize?.(next);\n };\n const cleanup = () => {\n try {\n handleEl.releasePointerCapture(pointerId);\n } catch {}\n window.removeEventListener('pointermove', handleMove as any);\n window.removeEventListener('pointerup', handleUp as any);\n window.removeEventListener('pointercancel', handleUp as any);\n window.removeEventListener('keydown', handleKey as any);\n handleEl.removeEventListener('lostpointercapture', handleUp as any);\n container.removeAttribute('data-resizing');\n body.style.cursor = prevCursor;\n body.style.userSelect = prevUserSelect;\n activeCleanupRef.current = null;\n };\n const handleUp = () => {\n const finalSize = parseFloat(\n getComputedStyle(container).getPropertyValue(cssVarName) || `${defaultSize}`,\n );\n // snap logic\n let snapped = finalSize;\n if (snapPoints && snapPoints.length) {\n const nearest = snapPoints.reduce(\n (acc, p) => (Math.abs(p - finalSize) < Math.abs(acc - finalSize) ? p : acc),\n snapPoints[0],\n );\n if (Math.abs(nearest - finalSize) <= (snapTolerance ?? 8)) {\n snapped = nearest;\n container.style.setProperty(cssVarName, `${snapped}px`);\n handleEl.setAttribute('aria-valuenow', String(snapped));\n onResize?.(snapped);\n }\n }\n // collapse threshold\n if (\n collapsible &&\n typeof collapseThreshold === 'number' &&\n finalSize <= collapseThreshold\n ) {\n requestCollapse?.();\n }\n onResizeEnd?.(snapped);\n cleanup();\n };\n const handleKey = (kev: KeyboardEvent) => {\n if (kev.key === 'Escape') {\n // cancel to start size\n container.style.setProperty(cssVarName, `${startSize}px`);\n handleEl.setAttribute('aria-valuenow', String(startSize));\n onResizeEnd?.(startSize);\n cleanup();\n }\n };\n window.addEventListener('pointermove', handleMove as any);\n window.addEventListener('pointerup', handleUp as any);\n window.addEventListener('pointercancel', handleUp as any);\n window.addEventListener('keydown', handleKey as any);\n handleEl.addEventListener('lostpointercapture', handleUp as any);\n // Store cleanup so unmounts or re-entries can clean up properly\n activeCleanupRef.current = cleanup;\n }}\n onDoubleClick={() => {\n if (collapsible) requestToggle?.();\n }}\n onKeyDown={(e) => {\n if (!containerRef.current) return;\n const container = containerRef.current;\n const current = parseFloat(\n getComputedStyle(container).getPropertyValue(cssVarName) || `${defaultSize}`,\n );\n const clamp = (v: number) => Math.min(Math.max(v, minSize), maxSize);\n const step = e.shiftKey ? 32 : 8;\n let delta = 0;\n if (orientation === 'vertical') {\n if (e.key === 'ArrowRight') delta = step;\n else if (e.key === 'ArrowLeft') delta = -step;\n } else {\n if (e.key === 'ArrowDown') delta = step;\n else if (e.key === 'ArrowUp') delta = -step;\n }\n if (e.key === 'Home') {\n e.preventDefault();\n onResizeStart?.(current);\n const next = clamp(minSize);\n container.style.setProperty(cssVarName, `${next}px`);\n (e.currentTarget as HTMLElement).setAttribute('aria-valuenow', String(next));\n onResize?.(next);\n onResizeEnd?.(next);\n return;\n }\n if (e.key === 'End') {\n e.preventDefault();\n onResizeStart?.(current);\n const next = clamp(maxSize);\n container.style.setProperty(cssVarName, `${next}px`);\n (e.currentTarget as HTMLElement).setAttribute('aria-valuenow', String(next));\n onResize?.(next);\n onResizeEnd?.(next);\n return;\n }\n if (delta !== 0) {\n e.preventDefault();\n onResizeStart?.(current);\n // approximate computeNext with delta from keyboard\n const next = clamp(\n current + (edge === 'start' && orientation === 'vertical' ? -delta : delta),\n );\n container.style.setProperty(cssVarName, `${next}px`);\n (e.currentTarget as HTMLElement).setAttribute('aria-valuenow', String(next));\n onResize?.(next);\n onResizeEnd?.(next);\n }\n }}\n >\n {children}\n </div>\n );\n },\n);\nPaneHandle.displayName = 'Shell.Handle';\n\n// Composed Handle wrappers per pane\nconst PanelHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>(\n (props, ref) => <PaneHandle {...props} ref={ref} />,\n);\nPanelHandle.displayName = 'Shell.Panel.Handle';\n\nconst SidebarHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>(\n (props, ref) => <PaneHandle {...props} ref={ref} />,\n);\nSidebarHandle.displayName = 'Shell.Sidebar.Handle';\n\nconst InspectorHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>(\n (props, ref) => <PaneHandle {...props} ref={ref} />,\n);\nInspectorHandle.displayName = 'Shell.Inspector.Handle';\n\nconst BottomHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>(\n (props, ref) => <PaneHandle {...props} ref={ref} />,\n);\nBottomHandle.displayName = 'Shell.Bottom.Handle';\n\n// Hook to resolve responsive presentation\nfunction useResponsivePresentation(presentation: ResponsivePresentation): PresentationValue {\n const { currentBreakpoint } = useShell();\n\n return React.useMemo(() => {\n if (typeof presentation === 'string') {\n return presentation;\n }\n\n // Try current breakpoint first\n if (presentation[currentBreakpoint]) {\n return presentation[currentBreakpoint]!;\n }\n\n // Cascade down to smaller breakpoints based on configured BREAKPOINTS\n const bpKeys = Object.keys(BREAKPOINTS) as Array<keyof typeof BREAKPOINTS>;\n const order: Breakpoint[] = ([...bpKeys].reverse() as Breakpoint[]).concat(\n 'initial' as Breakpoint,\n );\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'; // Default fallback\n }, [presentation, currentBreakpoint]);\n}\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(\n BREAKPOINTS,\n ) 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>(\n ({ 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>(\n (current) =>\n current === 'collapsed' ? 'thin' : current === 'thin' ? 'expanded' : 'collapsed',\n );\n const setSidebarToggleComputer = React.useCallback(\n (fn: (current: SidebarMode) => SidebarMode) => {\n sidebarToggleComputerRef.current = fn;\n },\n [],\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(\n 'Shell: Sidebar cannot coexist with Rail or Panel. Use either Rail+Panel OR Sidebar.',\n );\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) =>\n React.isValidElement(el) &&\n (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) =>\n React.isValidElement(el) &&\n (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) =>\n React.isValidElement(el) &&\n (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\n {...props}\n ref={ref}\n className={classNames('rt-ShellRoot', className)}\n style={{ ...heightStyle, ...props.style }}\n >\n <ShellContext.Provider\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 </ShellContext.Provider>\n </div>\n );\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>(\n ({ 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 ),\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 (\n {\n className,\n presentation = { initial: 'overlay', sm: 'fixed' },\n mode,\n defaultMode = 'collapsed',\n onModeChange,\n collapsible = true,\n onExpand,\n onCollapse,\n children,\n style,\n ...props\n },\n ref,\n ) => {\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(\n 'initial' as Breakpoint,\n );\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 }, [\n mode,\n shell.currentBreakpoint,\n shell.currentBreakpointReady,\n resolveResponsiveMode,\n shell.leftMode,\n shell.setLeftMode,\n ]);\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) =>\n 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 =\n typeof (railEl as any)?.props?.expandedSize === 'number'\n ? (railEl as any).props.expandedSize\n : 64;\n const panelSize =\n typeof (panelEl as any)?.props?.expandedSize === 'number'\n ? (panelEl as any).props.expandedSize\n : 288;\n const hasRail = Boolean(railEl);\n const hasPanel = Boolean(panelEl);\n const overlayPx =\n (hasRail ? railSize : 0) + (shell.panelMode === 'expanded' && hasPanel ? panelSize : 0);\n return (\n <Sheet.Root\n open={open}\n onOpenChange={(o) => shell.setLeftMode(o ? 'expanded' : 'collapsed')}\n >\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) =>\n 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 =\n typeof (railEl as any)?.props?.expandedSize === 'number'\n ? (railEl as any).props.expandedSize\n : 64;\n const panelSize =\n typeof (panelEl as any)?.props?.expandedSize === 'number'\n ? (panelEl as any).props.expandedSize\n : 288;\n const hasRail = Boolean(railEl);\n const hasPanel = Boolean(panelEl);\n const includePanel =\n 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={\n shell.peekTarget === 'left' ||\n shell.peekTarget === 'rail' ||\n shell.peekTarget === 'panel' ||\n undefined\n }\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={\n shell.peekTarget === 'left' ||\n shell.peekTarget === 'rail' ||\n shell.peekTarget === 'panel' ||\n undefined\n }\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 (\n {\n className,\n presentation,\n mode,\n defaultMode,\n onModeChange,\n expandedSize = 64,\n collapsible,\n onExpand,\n onCollapse,\n children,\n style,\n ...props\n },\n ref,\n ) => {\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={\n (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'rail') || undefined\n }\n style={{\n ...style,\n ['--rail-size' as any]: `${expandedSize}px`,\n }}\n >\n <div\n className=\"rt-ShellRailContent\"\n data-visible={\n isExpanded ||\n (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'rail') ||\n undefined\n }\n >\n {children}\n </div>\n </div>\n );\n },\n);\nRail.displayName = 'Shell.Rail';\n\n// Panel\ntype HandleComponent = React.ForwardRefExoticComponent<\n React.ComponentPropsWithoutRef<'div'> & React.RefAttributes<HTMLDivElement>\n>;\n\ntype PanelComponent = React.ForwardRefExoticComponent<\n Omit<PaneProps, 'defaultMode'> & React.RefAttributes<HTMLDivElement>\n> & { 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?: Array<'thin' | 'expanded'>;\n }) &\n React.RefAttributes<HTMLDivElement>\n> & { Handle: HandleComponent };\n\ntype InspectorComponent = React.ForwardRefExoticComponent<\n PaneProps & React.RefAttributes<HTMLDivElement>\n> & { Handle: HandleComponent };\n\ntype BottomComponent = React.ForwardRefExoticComponent<\n PaneProps & React.RefAttributes<HTMLDivElement>\n> & { 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(\n (el: React.ReactElement) => React.isValidElement(el) && el.type === PanelHandle,\n );\n const contentChildren = childArray.filter(\n (el: React.ReactElement) => !(React.isValidElement(el) && el.type === PanelHandle),\n );\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 (\n shell.leftResolvedPresentation !== 'overlay' &&\n shell.leftMode === 'expanded' &&\n shell.panelMode === 'expanded'\n ) {\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 ? (\n handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i }))\n ) : (\n <PaneHandle />\n )}\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={\n isExpanded ||\n (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'panel') ||\n undefined\n }\n data-peek={\n (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'panel') ||\n undefined\n }\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 (alternative to Rail+Panel)\nconst Sidebar = React.forwardRef<\n HTMLDivElement,\n Omit<PaneProps, 'mode' | 'defaultMode' | 'onModeChange'> & {\n mode?: SidebarMode;\n defaultMode?: ResponsiveSidebarMode;\n onModeChange?: (mode: SidebarMode) => void;\n thinSize?: number;\n toggleModes?: Array<'thin' | 'expanded'>;\n }\n>(\n (\n {\n className,\n presentation = { initial: 'overlay', md: 'fixed' },\n mode,\n defaultMode = 'expanded',\n onModeChange,\n expandedSize = 288,\n minSize = 200,\n maxSize = 400,\n resizable = false,\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 thinSize = 64,\n toggleModes,\n ...props\n },\n ref,\n ) => {\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 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(\n (el: React.ReactElement) => React.isValidElement(el) && el.type === SidebarHandle,\n );\n const contentChildren = childArray.filter(\n (el: React.ReactElement) => !(React.isValidElement(el) && el.type === SidebarHandle),\n );\n\n // Register with shell\n const sidebarId = React.useId();\n React.useEffect(() => {\n shell.setHasSidebar(true);\n return () => {\n shell.setHasSidebar(false);\n };\n }, [shell, sidebarId]);\n\n // Honor defaultMode on mount when uncontrolled\n const didInitRef = React.useRef(false);\n React.useEffect(() => {\n if (didInitRef.current) return;\n didInitRef.current = true;\n if (mode === undefined && shell.sidebarMode !== (defaultMode as SidebarMode)) {\n shell.setSidebarMode(defaultMode as SidebarMode);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Sync controlled mode\n React.useEffect(() => {\n if (mode !== undefined && shell.sidebarMode !== mode) {\n shell.setSidebarMode(mode);\n }\n }, [mode, shell]);\n\n // Emit mode changes\n React.useEffect(() => {\n if (mode === undefined) {\n onModeChange?.(shell.sidebarMode);\n }\n }, [shell.sidebarMode, mode, onModeChange]);\n\n // Emit expand/collapse events\n React.useEffect(() => {\n if (shell.sidebarMode === 'expanded') {\n onExpand?.();\n } else {\n onCollapse?.();\n }\n }, [shell.sidebarMode, onExpand, onCollapse]);\n\n // Option A: thin is width-only; content remains visible whenever not collapsed\n const isContentVisible = shell.sidebarMode !== 'collapsed';\n\n // Default persistence if paneId provided and none supplied (fixed only)\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:sidebar:${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 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('--sidebar-size', `${loaded}px`);\n onResize?.(loaded);\n }\n })();\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n // Register custom toggle behavior based on toggleModes\n const shellForToggle = useShell();\n React.useEffect(() => {\n if (!shellForToggle.setSidebarToggleComputer) return;\n // Build cycle from provided modes (defaults to both)\n const enabled = (\n toggleModes && toggleModes.length > 0 ? toggleModes : (['thin', 'expanded'] as const)\n ) as Array<'thin' | 'expanded'>;\n const compute = (current: SidebarMode): SidebarMode => {\n if (current === 'collapsed') return enabled[0] ?? 'expanded';\n if (current === 'thin') {\n // if thin not enabled, go to collapsed; else if expanded enabled go expanded; else collapsed\n return enabled.includes('thin')\n ? enabled.includes('expanded')\n ? 'expanded'\n : 'collapsed'\n : 'collapsed';\n }\n // expanded\n if (enabled.length === 2 && enabled.includes('thin') && enabled.includes('expanded')) {\n return 'collapsed';\n }\n // if only expanded enabled, collapse next; if only thin enabled, go thin next\n return enabled.includes('thin') && !enabled.includes('expanded') ? 'thin' : 'collapsed';\n };\n shellForToggle.setSidebarToggleComputer(compute);\n return () => {\n // reset to default sequence when unmounting this Sidebar\n shellForToggle.setSidebarToggleComputer?.((cur) =>\n cur === 'collapsed' ? 'thin' : cur === 'thin' ? 'expanded' : 'collapsed',\n );\n };\n }, [shellForToggle, toggleModes]);\n\n // Preserve last non-collapsed width for smooth overlay close animation\n const lastOverlayWidthRef = React.useRef<number>(expandedSize);\n const lastOverlayModeRef = React.useRef<SidebarMode>('expanded');\n React.useEffect(() => {\n if (shell.sidebarMode !== 'collapsed') {\n lastOverlayModeRef.current = shell.sidebarMode as SidebarMode;\n lastOverlayWidthRef.current = shell.sidebarMode === 'thin' ? thinSize : expandedSize;\n }\n }, [shell.sidebarMode, thinSize, expandedSize]);\n\n // Always-follow responsive defaultMode for uncontrolled Sidebar (on breakpoint change only)\n const resolveResponsiveMode = React.useCallback((): SidebarMode => {\n if (typeof defaultMode === 'string') return defaultMode as SidebarMode;\n const dm = defaultMode as Partial<Record<Breakpoint, SidebarMode>> | undefined;\n if (dm && dm[shell.currentBreakpoint as Breakpoint]) {\n return dm[shell.currentBreakpoint as Breakpoint] as SidebarMode;\n }\n const bpKeys = Object.keys(BREAKPOINTS) as Array<keyof typeof BREAKPOINTS>;\n const order: Breakpoint[] = ([...bpKeys].reverse() as Breakpoint[]).concat(\n 'initial' as Breakpoint,\n );\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]) return dm[bp] as SidebarMode;\n }\n return 'collapsed';\n }, [defaultMode, shell.currentBreakpoint]);\n\n const lastSidebarBpRef = 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 (lastSidebarBpRef.current === shell.currentBreakpoint) return; // only on bp change\n lastSidebarBpRef.current = shell.currentBreakpoint as Breakpoint;\n const next = resolveResponsiveMode();\n if (next !== shell.sidebarMode) shell.setSidebarMode(next);\n }, [\n mode,\n shell.currentBreakpoint,\n shell.currentBreakpointReady,\n resolveResponsiveMode,\n shell.sidebarMode,\n shell.setSidebarMode,\n ]);\n\n const handleEl =\n resizable && !isOverlay && shell.sidebarMode === 'expanded' ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--sidebar-size',\n minSize,\n maxSize,\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,\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n persistenceAdapter?.save?.(size);\n },\n target: 'sidebar',\n collapsible,\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => shell.setSidebarMode('collapsed'),\n requestToggle: () => shell.togglePane('sidebar'),\n }}\n >\n {handleChildren.length > 0 ? (\n handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i }))\n ) : (\n <PaneHandle />\n )}\n </PaneResizeContext.Provider>\n ) : null;\n\n if (isOverlay) {\n const open = shell.sidebarMode !== 'collapsed';\n return (\n <Sheet.Root\n open={open}\n onOpenChange={(o) => shell.setSidebarMode(o ? 'expanded' : 'collapsed')}\n >\n <Sheet.Content\n side=\"start\"\n style={{ padding: 0 }}\n width={{\n initial: `${open ? (shell.sidebarMode === 'thin' ? thinSize : expandedSize) : lastOverlayWidthRef.current}px`,\n }}\n >\n <VisuallyHidden>\n <Sheet.Title>Sidebar</Sheet.Title>\n </VisuallyHidden>\n {children}\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n\n return (\n <div\n {...props}\n ref={setRef}\n className={classNames('rt-ShellSidebar', className)}\n data-mode={shell.sidebarMode}\n data-peek={shell.peekTarget === 'sidebar' || undefined}\n data-presentation={resolvedPresentation}\n style={{\n ...style,\n ['--sidebar-size' as any]: `${expandedSize}px`,\n ['--sidebar-thin-size' as any]: `${thinSize}px`,\n ['--sidebar-min-size' as any]: `${minSize}px`,\n ['--sidebar-max-size' as any]: `${maxSize}px`,\n // When peeking in fixed presentation, use the next toggle target's width (thin or expanded)\n ...(shell.peekTarget === 'sidebar' && !isOverlay\n ? (() => {\n const enabled = (\n toggleModes && toggleModes.length > 0\n ? toggleModes\n : (['thin', 'expanded'] as const)\n ) as Array<'thin' | 'expanded'>;\n const current = shell.sidebarMode as SidebarMode;\n let next: SidebarMode = 'collapsed';\n if (current === 'collapsed') {\n next = (enabled[0] ?? 'expanded') as SidebarMode;\n } else if (current === 'thin') {\n next = enabled.includes('expanded') ? 'expanded' : 'collapsed';\n } else {\n next = enabled.includes('thin') ? 'thin' : 'collapsed';\n }\n const peekWidth = next === 'thin' ? thinSize : expandedSize;\n return { ['--peek-sidebar-width' as any]: `${peekWidth}px` } as React.CSSProperties;\n })()\n : {}),\n }}\n >\n <div className=\"rt-ShellSidebarContent\" data-visible={isContentVisible || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n },\n) as SidebarComponent;\nSidebar.displayName = 'Shell.Sidebar';\nSidebar.Handle = SidebarHandle;\n\n// Content (always required)\ninterface ShellContentProps extends React.ComponentPropsWithoutRef<'main'> {}\n\nconst Content = React.forwardRef<HTMLElement, ShellContentProps>(({ className, ...props }, ref) => (\n <main {...props} ref={ref} className={classNames('rt-ShellContent', className)} />\n));\nContent.displayName = 'Shell.Content';\n\n// Inspector\nconst Inspector = React.forwardRef<HTMLDivElement, PaneProps>(\n (\n {\n className,\n presentation = { initial: 'overlay', lg: 'fixed' },\n mode,\n defaultMode = 'collapsed',\n onModeChange,\n expandedSize = 320,\n minSize = 200,\n maxSize = 500,\n resizable = false,\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 const resolvedPresentation = useResponsivePresentation(presentation);\n const isOverlay = resolvedPresentation === 'overlay';\n const isStacked = resolvedPresentation === 'stacked';\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(\n (el: React.ReactElement) => React.isValidElement(el) && el.type === InspectorHandle,\n );\n const contentChildren = childArray.filter(\n (el: React.ReactElement) => !(React.isValidElement(el) && el.type === InspectorHandle),\n );\n\n // Apply responsive defaultMode only on mount and when breakpoint changes (uncontrolled Inspector)\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(\n 'initial' as Breakpoint,\n );\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 lastInspectorBpRef = 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 (lastInspectorBpRef.current === shell.currentBreakpoint) return; // only on bp change\n lastInspectorBpRef.current = shell.currentBreakpoint as Breakpoint;\n const next = resolveResponsiveMode();\n if (next !== shell.inspectorMode) {\n shell.setInspectorMode(next);\n }\n }, [\n mode,\n shell.currentBreakpoint,\n shell.currentBreakpointReady,\n resolveResponsiveMode,\n shell.inspectorMode,\n shell.setInspectorMode,\n ]);\n\n // Sync controlled mode\n React.useEffect(() => {\n if (mode !== undefined && shell.inspectorMode !== mode) {\n shell.setInspectorMode(mode);\n }\n }, [mode, shell]);\n\n // Emit mode changes\n React.useEffect(() => {\n if (mode === undefined) {\n onModeChange?.(shell.inspectorMode);\n }\n }, [shell.inspectorMode, mode, onModeChange]);\n\n // Emit expand/collapse events\n React.useEffect(() => {\n if (shell.inspectorMode === 'expanded') {\n onExpand?.();\n } else {\n onCollapse?.();\n }\n }, [shell.inspectorMode, onExpand, onCollapse]);\n\n const isExpanded = shell.inspectorMode === 'expanded';\n\n // Default persistence if paneId provided and none supplied (fixed only)\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:inspector:${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 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('--inspector-size', `${loaded}px`);\n onResize?.(loaded);\n }\n })();\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n const handleEl =\n resizable && !isOverlay && isExpanded ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--inspector-size',\n minSize,\n maxSize,\n defaultSize: expandedSize,\n orientation: 'vertical',\n edge: 'start',\n computeNext: (client, startClient, startSize) => {\n const isRtl = getComputedStyle(localRef.current!).direction === 'rtl';\n const delta = client - startClient;\n // start edge; reverse for LTR\n return startSize + (isRtl ? delta : -delta);\n },\n onResize,\n onResizeStart,\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n persistenceAdapter?.save?.(size);\n },\n target: 'inspector',\n collapsible,\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => shell.setInspectorMode('collapsed'),\n requestToggle: () => shell.togglePane('inspector'),\n }}\n >\n {handleChildren.length > 0 ? (\n handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i }))\n ) : (\n <PaneHandle />\n )}\n </PaneResizeContext.Provider>\n ) : null;\n\n if (isOverlay) {\n const open = shell.inspectorMode === 'expanded';\n return (\n <Sheet.Root\n open={open}\n onOpenChange={(o) => shell.setInspectorMode(o ? 'expanded' : 'collapsed')}\n >\n <Sheet.Content side=\"end\" style={{ padding: 0 }} width={{ initial: `${expandedSize}px` }}>\n <VisuallyHidden>\n <Sheet.Title>Inspector</Sheet.Title>\n </VisuallyHidden>\n {children}\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n\n return (\n <div\n {...props}\n ref={setRef}\n className={classNames('rt-ShellInspector', className)}\n data-mode={shell.inspectorMode}\n data-peek={shell.peekTarget === 'inspector' || undefined}\n data-presentation={resolvedPresentation}\n data-open={(isStacked && isExpanded) || undefined}\n style={{\n ...style,\n ['--inspector-size' as any]: `${expandedSize}px`,\n ['--inspector-min-size' as any]: `${minSize}px`,\n ['--inspector-max-size' as any]: `${maxSize}px`,\n }}\n >\n <div className=\"rt-ShellInspectorContent\" data-visible={isExpanded || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n },\n) as InspectorComponent;\nInspector.displayName = 'Shell.Inspector';\nInspector.Handle = InspectorHandle;\n\n// Bottom\nconst Bottom = React.forwardRef<HTMLDivElement, PaneProps>(\n (\n {\n className,\n presentation = 'fixed', // Bottom is usually fixed\n mode,\n defaultMode = 'collapsed',\n onModeChange,\n expandedSize = 200,\n minSize = 100,\n maxSize = 400,\n resizable = false,\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 const resolvedPresentation = useResponsivePresentation(presentation);\n const isOverlay = resolvedPresentation === 'overlay';\n const isStacked = resolvedPresentation === 'stacked';\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(\n (el: React.ReactElement) => React.isValidElement(el) && el.type === BottomHandle,\n );\n const contentChildren = childArray.filter(\n (el: React.ReactElement) => !(React.isValidElement(el) && el.type === BottomHandle),\n );\n\n // Honor defaultMode on mount when uncontrolled\n const didInitRef = React.useRef(false);\n React.useEffect(() => {\n if (didInitRef.current) return;\n didInitRef.current = true;\n if (mode === undefined && shell.bottomMode !== (defaultMode as PaneMode)) {\n shell.setBottomMode(defaultMode as PaneMode);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Sync controlled mode\n React.useEffect(() => {\n if (mode !== undefined && shell.bottomMode !== mode) {\n shell.setBottomMode(mode);\n }\n }, [mode, shell]);\n\n // Emit mode changes\n React.useEffect(() => {\n if (mode === undefined) {\n onModeChange?.(shell.bottomMode);\n }\n }, [shell.bottomMode, mode, onModeChange]);\n\n // Emit expand/collapse events\n React.useEffect(() => {\n if (shell.bottomMode === 'expanded') {\n onExpand?.();\n } else {\n onCollapse?.();\n }\n }, [shell.bottomMode, onExpand, onCollapse]);\n\n const isExpanded = shell.bottomMode === 'expanded';\n\n // Default persistence if paneId provided and none supplied (fixed only)\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:bottom:${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 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('--bottom-size', `${loaded}px`);\n onResize?.(loaded);\n }\n })();\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n const handleEl =\n resizable && !isOverlay && isExpanded ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--bottom-size',\n minSize,\n maxSize,\n defaultSize: expandedSize,\n orientation: 'horizontal',\n edge: 'start',\n computeNext: (client, startClient, startSize) => {\n const delta = client - startClient;\n return startSize - delta; // drag up reduces size\n },\n onResize,\n onResizeStart,\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n persistenceAdapter?.save?.(size);\n },\n target: 'bottom',\n collapsible,\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => shell.setBottomMode('collapsed'),\n requestToggle: () => shell.togglePane('bottom'),\n }}\n >\n {handleChildren.length > 0 ? (\n handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i }))\n ) : (\n <PaneHandle />\n )}\n </PaneResizeContext.Provider>\n ) : null;\n\n if (isOverlay) {\n const open = shell.bottomMode === 'expanded';\n return (\n <Sheet.Root\n open={open}\n onOpenChange={(o) => shell.setBottomMode(o ? 'expanded' : 'collapsed')}\n >\n <Sheet.Content\n side=\"bottom\"\n style={{ padding: 0 }}\n height={{ initial: `${expandedSize}px` }}\n >\n <VisuallyHidden>\n <Sheet.Title>Bottom panel</Sheet.Title>\n </VisuallyHidden>\n {children}\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n\n return (\n <div\n {...props}\n ref={setRef}\n className={classNames('rt-ShellBottom', className)}\n data-mode={shell.bottomMode}\n data-peek={shell.peekTarget === 'bottom' || undefined}\n data-presentation={resolvedPresentation}\n data-open={(isStacked && isExpanded) || undefined}\n style={{\n ...style,\n ['--bottom-size' as any]: `${expandedSize}px`,\n ['--bottom-min-size' as any]: `${minSize}px`,\n ['--bottom-max-size' as any]: `${maxSize}px`,\n }}\n >\n <div className=\"rt-ShellBottomContent\" data-visible={isExpanded || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n },\n) as BottomComponent;\nBottom.displayName = 'Shell.Bottom';\nBottom.Handle = BottomHandle;\n\n// Trigger\ntype PaneTarget = 'left' | 'rail' | 'panel' | 'sidebar' | 'inspector' | 'bottom';\ntype TriggerAction = 'toggle' | 'expand' | 'collapse';\n\ninterface TriggerProps extends React.ComponentPropsWithoutRef<'button'> {\n target: PaneTarget;\n action?: TriggerAction;\n /**\n * If true, peeks the target on hover and clears on leave.\n * If set to 'collapsed', only peeks when the target is currently collapsed (recommended).\n */\n peekOnHover?: boolean | 'collapsed';\n}\n\nconst Trigger = React.forwardRef<HTMLButtonElement, TriggerProps>(\n (\n {\n target,\n action = 'toggle',\n peekOnHover,\n onClick,\n onMouseEnter,\n onMouseLeave,\n children,\n ...props\n },\n ref,\n ) => {\n const shell = useShell();\n\n const handleClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\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) return;\n const shouldPeek = peekOnHover === 'collapsed' ? isCollapsed : true;\n if (shouldPeek) {\n // Use the actual target for peek behavior (not mapped to left)\n shell.peekPane(target);\n }\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\n {...props}\n ref={ref}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n data-shell-trigger={target}\n data-shell-action={action}\n >\n {children}\n </button>\n );\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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",
|
|
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';\n\n// Types\ntype PresentationValue = 'fixed' | 'overlay' | 'stacked';\ntype ResponsivePresentation =\n | PresentationValue\n | Partial<Record<'initial' | 'xs' | 'sm' | 'md' | 'lg' | 'xl', PresentationValue>>;\ntype PaneMode = 'expanded' | 'collapsed';\ntype SidebarMode = 'collapsed' | 'thin' | 'expanded';\ntype ResponsiveMode =\n | PaneMode\n | Partial<Record<'initial' | 'xs' | 'sm' | 'md' | 'lg' | 'xl', PaneMode>>;\n\n// Sidebar responsive mode (includes 'thin')\ntype ResponsiveSidebarMode =\n | SidebarMode\n | Partial<Record<'initial' | 'xs' | 'sm' | 'md' | 'lg' | 'xl', SidebarMode>>;\n\n// Persistence adapter for pane sizes\ntype PaneSizePersistence = {\n load?: () => number | Promise<number | undefined> | undefined;\n save?: (size: number) => void | Promise<void>;\n};\n\n// Breakpoint system\nconst BREAKPOINTS = {\n xs: '(min-width: 520px)',\n sm: '(min-width: 768px)',\n md: '(min-width: 1024px)',\n lg: '(min-width: 1280px)',\n xl: '(min-width: 1640px)',\n} as const;\n\ntype Breakpoint = 'initial' | keyof typeof BREAKPOINTS;\n\n// Shell context\ninterface ShellContextValue {\n // Pane states\n leftMode: PaneMode;\n setLeftMode: (mode: PaneMode) => void;\n panelMode: PaneMode; // Panel state within left container\n setPanelMode: (mode: PaneMode) => void;\n sidebarMode: SidebarMode;\n setSidebarMode: (mode: SidebarMode) => void;\n inspectorMode: PaneMode;\n setInspectorMode: (mode: PaneMode) => void;\n bottomMode: PaneMode;\n setBottomMode: (mode: PaneMode) => void;\n\n // Peek state (layout-only, ephemeral)\n peekTarget: PaneTarget | null;\n setPeekTarget: (target: PaneTarget | null) => void;\n peekPane: (target: PaneTarget) => void;\n clearPeek: () => void;\n\n // Composition detection\n hasLeft: boolean;\n setHasLeft: (has: boolean) => void;\n hasSidebar: boolean;\n setHasSidebar: (has: boolean) => void;\n\n // Presentation resolution\n currentBreakpoint: Breakpoint;\n currentBreakpointReady: boolean;\n leftResolvedPresentation?: PresentationValue;\n\n // Actions\n togglePane: (target: PaneTarget) => void;\n expandPane: (target: PaneTarget) => void;\n collapsePane: (target: PaneTarget) => void;\n // Toggle customization\n setSidebarToggleComputer?: (fn: (current: SidebarMode) => SidebarMode) => void;\n // Dev-only hooks for presentation warnings\n onLeftPres?: (p: PresentationValue) => void;\n // Sizing info for overlay grouping\n onLeftDefaults?: (size: number) => void;\n}\n\nconst ShellContext = React.createContext<ShellContextValue | null>(null);\n\nfunction useShell() {\n const ctx = React.useContext(ShellContext);\n if (!ctx) throw new Error('Shell components must be used within <Shell.Root>');\n return ctx;\n}\n\n// Pane resize context for composed Handles\ninterface PaneResizeContextValue {\n containerRef: React.RefObject<HTMLDivElement | null>;\n cssVarName: string;\n minSize: number;\n maxSize: number;\n defaultSize: number;\n orientation: 'vertical' | 'horizontal';\n edge: 'start' | 'end';\n computeNext: (clientPos: number, startClientPos: number, startSize: number) => number;\n onResize?: (size: number) => void;\n onResizeStart?: (size: number) => void;\n onResizeEnd?: (size: number) => void;\n // new features\n target: PaneTarget;\n collapsible: boolean;\n snapPoints?: number[];\n snapTolerance: number;\n collapseThreshold?: number;\n requestCollapse?: () => void;\n requestToggle?: () => void;\n}\n\nconst PaneResizeContext = React.createContext<PaneResizeContextValue | null>(null);\n\nfunction usePaneResize() {\n const ctx = React.useContext(PaneResizeContext);\n if (!ctx) throw new Error('Shell.Handle must be used within a resizable pane');\n return ctx;\n}\n\nconst PaneHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>(\n ({ className, children, ...props }, ref) => {\n const {\n containerRef,\n cssVarName,\n minSize,\n maxSize,\n defaultSize,\n orientation,\n edge,\n computeNext,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n collapsible,\n target,\n requestCollapse,\n requestToggle,\n } = usePaneResize();\n\n // Track active drag cleanup to avoid leaking listeners if unmounted mid-drag\n const activeCleanupRef = React.useRef<(() => void) | null>(null);\n React.useEffect(\n () => () => {\n // Cleanup any in-flight drag on unmount\n try {\n activeCleanupRef.current?.();\n } catch {}\n activeCleanupRef.current = null;\n },\n [],\n );\n\n const ariaOrientation = orientation;\n\n return (\n <div\n {...props}\n ref={ref}\n className={classNames('rt-ShellResizer', className)}\n data-orientation={orientation}\n data-edge={edge}\n role=\"slider\"\n aria-orientation={ariaOrientation}\n aria-valuemin={minSize}\n aria-valuemax={maxSize}\n aria-valuenow={defaultSize}\n tabIndex={0}\n onPointerDown={(e) => {\n if (!containerRef.current) return;\n e.preventDefault();\n const container = containerRef.current;\n const handleEl = e.currentTarget as HTMLElement;\n const pointerId = e.pointerId;\n // If a previous drag didn't finalize properly, force cleanup first\n try {\n activeCleanupRef.current?.();\n } catch {}\n container.setAttribute('data-resizing', '');\n try {\n handleEl.setPointerCapture(pointerId);\n } catch {}\n const startClient = orientation === 'vertical' ? e.clientX : e.clientY;\n const startSize = parseFloat(\n getComputedStyle(container).getPropertyValue(cssVarName) || `${defaultSize}`,\n );\n const clamp = (v: number) => Math.min(Math.max(v, minSize), maxSize);\n const body = document.body;\n const prevCursor = body.style.cursor;\n const prevUserSelect = body.style.userSelect;\n body.style.cursor = orientation === 'vertical' ? 'col-resize' : 'row-resize';\n body.style.userSelect = 'none';\n onResizeStart?.(startSize);\n const handleMove = (ev: PointerEvent) => {\n const client = orientation === 'vertical' ? ev.clientX : ev.clientY;\n const next = clamp(computeNext(client, startClient, startSize));\n container.style.setProperty(cssVarName, `${next}px`);\n handleEl.setAttribute('aria-valuenow', String(next));\n onResize?.(next);\n };\n const cleanup = () => {\n try {\n handleEl.releasePointerCapture(pointerId);\n } catch {}\n window.removeEventListener('pointermove', handleMove as any);\n window.removeEventListener('pointerup', handleUp as any);\n window.removeEventListener('pointercancel', handleUp as any);\n window.removeEventListener('keydown', handleKey as any);\n handleEl.removeEventListener('lostpointercapture', handleUp as any);\n container.removeAttribute('data-resizing');\n body.style.cursor = prevCursor;\n body.style.userSelect = prevUserSelect;\n activeCleanupRef.current = null;\n };\n const handleUp = () => {\n const finalSize = parseFloat(\n getComputedStyle(container).getPropertyValue(cssVarName) || `${defaultSize}`,\n );\n // snap logic\n let snapped = finalSize;\n if (snapPoints && snapPoints.length) {\n const nearest = snapPoints.reduce(\n (acc, p) => (Math.abs(p - finalSize) < Math.abs(acc - finalSize) ? p : acc),\n snapPoints[0],\n );\n if (Math.abs(nearest - finalSize) <= (snapTolerance ?? 8)) {\n snapped = nearest;\n container.style.setProperty(cssVarName, `${snapped}px`);\n handleEl.setAttribute('aria-valuenow', String(snapped));\n onResize?.(snapped);\n }\n }\n // collapse threshold\n if (\n collapsible &&\n typeof collapseThreshold === 'number' &&\n finalSize <= collapseThreshold\n ) {\n requestCollapse?.();\n }\n onResizeEnd?.(snapped);\n cleanup();\n };\n const handleKey = (kev: KeyboardEvent) => {\n if (kev.key === 'Escape') {\n // cancel to start size\n container.style.setProperty(cssVarName, `${startSize}px`);\n handleEl.setAttribute('aria-valuenow', String(startSize));\n onResizeEnd?.(startSize);\n cleanup();\n }\n };\n window.addEventListener('pointermove', handleMove as any);\n window.addEventListener('pointerup', handleUp as any);\n window.addEventListener('pointercancel', handleUp as any);\n window.addEventListener('keydown', handleKey as any);\n handleEl.addEventListener('lostpointercapture', handleUp as any);\n // Store cleanup so unmounts or re-entries can clean up properly\n activeCleanupRef.current = cleanup;\n }}\n onDoubleClick={() => {\n if (collapsible) requestToggle?.();\n }}\n onKeyDown={(e) => {\n if (!containerRef.current) return;\n const container = containerRef.current;\n const current = parseFloat(\n getComputedStyle(container).getPropertyValue(cssVarName) || `${defaultSize}`,\n );\n const clamp = (v: number) => Math.min(Math.max(v, minSize), maxSize);\n const step = e.shiftKey ? 32 : 8;\n let delta = 0;\n if (orientation === 'vertical') {\n if (e.key === 'ArrowRight') delta = step;\n else if (e.key === 'ArrowLeft') delta = -step;\n } else {\n if (e.key === 'ArrowDown') delta = step;\n else if (e.key === 'ArrowUp') delta = -step;\n }\n if (e.key === 'Home') {\n e.preventDefault();\n onResizeStart?.(current);\n const next = clamp(minSize);\n container.style.setProperty(cssVarName, `${next}px`);\n (e.currentTarget as HTMLElement).setAttribute('aria-valuenow', String(next));\n onResize?.(next);\n onResizeEnd?.(next);\n return;\n }\n if (e.key === 'End') {\n e.preventDefault();\n onResizeStart?.(current);\n const next = clamp(maxSize);\n container.style.setProperty(cssVarName, `${next}px`);\n (e.currentTarget as HTMLElement).setAttribute('aria-valuenow', String(next));\n onResize?.(next);\n onResizeEnd?.(next);\n return;\n }\n if (delta !== 0) {\n e.preventDefault();\n onResizeStart?.(current);\n // approximate computeNext with delta from keyboard\n const next = clamp(\n current + (edge === 'start' && orientation === 'vertical' ? -delta : delta),\n );\n container.style.setProperty(cssVarName, `${next}px`);\n (e.currentTarget as HTMLElement).setAttribute('aria-valuenow', String(next));\n onResize?.(next);\n onResizeEnd?.(next);\n }\n }}\n >\n {children}\n </div>\n );\n },\n);\nPaneHandle.displayName = 'Shell.Handle';\n\n// Composed Handle wrappers per pane\nconst PanelHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>(\n (props, ref) => <PaneHandle {...props} ref={ref} />,\n);\nPanelHandle.displayName = 'Shell.Panel.Handle';\n\nconst SidebarHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>(\n (props, ref) => <PaneHandle {...props} ref={ref} />,\n);\nSidebarHandle.displayName = 'Shell.Sidebar.Handle';\n\nconst InspectorHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>(\n (props, ref) => <PaneHandle {...props} ref={ref} />,\n);\nInspectorHandle.displayName = 'Shell.Inspector.Handle';\n\nconst BottomHandle = React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<'div'>>(\n (props, ref) => <PaneHandle {...props} ref={ref} />,\n);\nBottomHandle.displayName = 'Shell.Bottom.Handle';\n\n// Hook to resolve responsive presentation\nfunction useResponsivePresentation(presentation: ResponsivePresentation): PresentationValue {\n const { currentBreakpoint } = useShell();\n\n return React.useMemo(() => {\n if (typeof presentation === 'string') {\n return presentation;\n }\n\n // Try current breakpoint first\n if (presentation[currentBreakpoint]) {\n return presentation[currentBreakpoint]!;\n }\n\n // Cascade down to smaller breakpoints based on configured BREAKPOINTS\n const bpKeys = Object.keys(BREAKPOINTS) as Array<keyof typeof BREAKPOINTS>;\n const order: Breakpoint[] = ([...bpKeys].reverse() as Breakpoint[]).concat(\n 'initial' as Breakpoint,\n );\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'; // Default fallback\n }, [presentation, currentBreakpoint]);\n}\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(\n BREAKPOINTS,\n ) 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>(\n ({ 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>(\n (current) =>\n current === 'collapsed' ? 'thin' : current === 'thin' ? 'expanded' : 'collapsed',\n );\n const setSidebarToggleComputer = React.useCallback(\n (fn: (current: SidebarMode) => SidebarMode) => {\n sidebarToggleComputerRef.current = fn;\n },\n [],\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(\n 'Shell: Sidebar cannot coexist with Rail or Panel. Use either Rail+Panel OR Sidebar.',\n );\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) =>\n React.isValidElement(el) &&\n (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) =>\n React.isValidElement(el) &&\n (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) =>\n React.isValidElement(el) &&\n (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\n {...props}\n ref={ref}\n className={classNames('rt-ShellRoot', className)}\n style={{ ...heightStyle, ...props.style }}\n >\n <ShellContext.Provider\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 </ShellContext.Provider>\n </div>\n );\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>(\n ({ 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 ),\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 (\n {\n className,\n presentation = { initial: 'overlay', sm: 'fixed' },\n mode,\n defaultMode = 'collapsed',\n onModeChange,\n collapsible = true,\n onExpand,\n onCollapse,\n children,\n style,\n ...props\n },\n ref,\n ) => {\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(\n 'initial' as Breakpoint,\n );\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 }, [\n mode,\n shell.currentBreakpoint,\n shell.currentBreakpointReady,\n resolveResponsiveMode,\n shell.leftMode,\n shell.setLeftMode,\n ]);\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) =>\n 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 =\n typeof (railEl as any)?.props?.expandedSize === 'number'\n ? (railEl as any).props.expandedSize\n : 64;\n const panelSize =\n typeof (panelEl as any)?.props?.expandedSize === 'number'\n ? (panelEl as any).props.expandedSize\n : 288;\n const hasRail = Boolean(railEl);\n const hasPanel = Boolean(panelEl);\n const overlayPx =\n (hasRail ? railSize : 0) + (shell.panelMode === 'expanded' && hasPanel ? panelSize : 0);\n return (\n <Sheet.Root\n open={open}\n onOpenChange={(o) => shell.setLeftMode(o ? 'expanded' : 'collapsed')}\n >\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) =>\n 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 =\n typeof (railEl as any)?.props?.expandedSize === 'number'\n ? (railEl as any).props.expandedSize\n : 64;\n const panelSize =\n typeof (panelEl as any)?.props?.expandedSize === 'number'\n ? (panelEl as any).props.expandedSize\n : 288;\n const hasRail = Boolean(railEl);\n const hasPanel = Boolean(panelEl);\n const includePanel =\n 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={\n shell.peekTarget === 'left' ||\n shell.peekTarget === 'rail' ||\n shell.peekTarget === 'panel' ||\n undefined\n }\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={\n shell.peekTarget === 'left' ||\n shell.peekTarget === 'rail' ||\n shell.peekTarget === 'panel' ||\n undefined\n }\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 (\n {\n className,\n presentation,\n mode,\n defaultMode,\n onModeChange,\n expandedSize = 64,\n collapsible,\n onExpand,\n onCollapse,\n children,\n style,\n ...props\n },\n ref,\n ) => {\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={\n (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'rail') || undefined\n }\n style={{\n ...style,\n ['--rail-size' as any]: `${expandedSize}px`,\n }}\n >\n <div\n className=\"rt-ShellRailContent\"\n data-visible={\n isExpanded ||\n (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'rail') ||\n undefined\n }\n >\n {children}\n </div>\n </div>\n );\n },\n);\nRail.displayName = 'Shell.Rail';\n\n// Panel\ntype HandleComponent = React.ForwardRefExoticComponent<\n React.ComponentPropsWithoutRef<'div'> & React.RefAttributes<HTMLDivElement>\n>;\n\ntype PanelComponent = React.ForwardRefExoticComponent<\n Omit<PaneProps, 'defaultMode'> & React.RefAttributes<HTMLDivElement>\n> & { 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?: Array<'thin' | 'expanded'>;\n }) &\n React.RefAttributes<HTMLDivElement>\n> & { Handle: HandleComponent };\n\ntype InspectorComponent = React.ForwardRefExoticComponent<\n PaneProps & React.RefAttributes<HTMLDivElement>\n> & { Handle: HandleComponent };\n\ntype BottomComponent = React.ForwardRefExoticComponent<\n PaneProps & React.RefAttributes<HTMLDivElement>\n> & { 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(\n (el: React.ReactElement) => React.isValidElement(el) && el.type === PanelHandle,\n );\n const contentChildren = childArray.filter(\n (el: React.ReactElement) => !(React.isValidElement(el) && el.type === PanelHandle),\n );\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 (\n shell.leftResolvedPresentation !== 'overlay' &&\n shell.leftMode === 'expanded' &&\n shell.panelMode === 'expanded'\n ) {\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 ? (\n handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i }))\n ) : (\n <PaneHandle />\n )}\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={\n isExpanded ||\n (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'panel') ||\n undefined\n }\n data-peek={\n (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'panel') ||\n undefined\n }\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 (alternative to Rail+Panel)\nconst Sidebar = React.forwardRef<\n HTMLDivElement,\n Omit<PaneProps, 'mode' | 'defaultMode' | 'onModeChange'> & {\n mode?: SidebarMode;\n defaultMode?: ResponsiveSidebarMode;\n onModeChange?: (mode: SidebarMode) => void;\n thinSize?: number;\n toggleModes?: Array<'thin' | 'expanded'>;\n }\n>(\n (\n {\n className,\n presentation = { initial: 'overlay', md: 'fixed' },\n mode,\n defaultMode = 'expanded',\n onModeChange,\n expandedSize = 288,\n minSize = 200,\n maxSize = 400,\n resizable = false,\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 thinSize = 64,\n toggleModes,\n ...props\n },\n ref,\n ) => {\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 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(\n (el: React.ReactElement) => React.isValidElement(el) && el.type === SidebarHandle,\n );\n const contentChildren = childArray.filter(\n (el: React.ReactElement) => !(React.isValidElement(el) && el.type === SidebarHandle),\n );\n\n // Register with shell\n const sidebarId = React.useId();\n React.useEffect(() => {\n shell.setHasSidebar(true);\n return () => {\n shell.setHasSidebar(false);\n };\n }, [shell, sidebarId]);\n\n // Honor defaultMode on mount when uncontrolled\n const didInitRef = React.useRef(false);\n React.useEffect(() => {\n if (didInitRef.current) return;\n didInitRef.current = true;\n if (mode === undefined && shell.sidebarMode !== (defaultMode as SidebarMode)) {\n shell.setSidebarMode(defaultMode as SidebarMode);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Sync controlled mode\n React.useEffect(() => {\n if (mode !== undefined && shell.sidebarMode !== mode) {\n shell.setSidebarMode(mode);\n }\n }, [mode, shell]);\n\n // Emit mode changes\n React.useEffect(() => {\n if (mode === undefined) {\n onModeChange?.(shell.sidebarMode);\n }\n }, [shell.sidebarMode, mode, onModeChange]);\n\n // Emit expand/collapse events\n React.useEffect(() => {\n if (shell.sidebarMode === 'expanded') {\n onExpand?.();\n } else {\n onCollapse?.();\n }\n }, [shell.sidebarMode, onExpand, onCollapse]);\n\n // Option A: thin is width-only; content remains visible whenever not collapsed\n const isContentVisible = shell.sidebarMode !== 'collapsed';\n\n // Default persistence if paneId provided and none supplied (fixed only)\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:sidebar:${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 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('--sidebar-size', `${loaded}px`);\n onResize?.(loaded);\n }\n })();\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n // Register custom toggle behavior based on toggleModes\n const shellForToggle = useShell();\n React.useEffect(() => {\n if (!shellForToggle.setSidebarToggleComputer) return;\n // Build cycle from provided modes (defaults to both)\n const enabled = (\n toggleModes && toggleModes.length > 0 ? toggleModes : (['thin', 'expanded'] as const)\n ) as Array<'thin' | 'expanded'>;\n const compute = (current: SidebarMode): SidebarMode => {\n if (current === 'collapsed') return enabled[0] ?? 'expanded';\n if (current === 'thin') {\n // if thin not enabled, go to collapsed; else if expanded enabled go expanded; else collapsed\n return enabled.includes('thin')\n ? enabled.includes('expanded')\n ? 'expanded'\n : 'collapsed'\n : 'collapsed';\n }\n // expanded\n if (enabled.length === 2 && enabled.includes('thin') && enabled.includes('expanded')) {\n return 'collapsed';\n }\n // if only expanded enabled, collapse next; if only thin enabled, go thin next\n return enabled.includes('thin') && !enabled.includes('expanded') ? 'thin' : 'collapsed';\n };\n shellForToggle.setSidebarToggleComputer(compute);\n return () => {\n // reset to default sequence when unmounting this Sidebar\n shellForToggle.setSidebarToggleComputer?.((cur) =>\n cur === 'collapsed' ? 'thin' : cur === 'thin' ? 'expanded' : 'collapsed',\n );\n };\n }, [shellForToggle, toggleModes]);\n\n // Preserve last non-collapsed width for smooth overlay close animation\n const lastOverlayWidthRef = React.useRef<number>(expandedSize);\n const lastOverlayModeRef = React.useRef<SidebarMode>('expanded');\n React.useEffect(() => {\n if (shell.sidebarMode !== 'collapsed') {\n lastOverlayModeRef.current = shell.sidebarMode as SidebarMode;\n lastOverlayWidthRef.current = shell.sidebarMode === 'thin' ? thinSize : expandedSize;\n }\n }, [shell.sidebarMode, thinSize, expandedSize]);\n\n // Always-follow responsive defaultMode for uncontrolled Sidebar (on breakpoint change only)\n const resolveResponsiveMode = React.useCallback((): SidebarMode => {\n if (typeof defaultMode === 'string') return defaultMode as SidebarMode;\n const dm = defaultMode as Partial<Record<Breakpoint, SidebarMode>> | undefined;\n if (dm && dm[shell.currentBreakpoint as Breakpoint]) {\n return dm[shell.currentBreakpoint as Breakpoint] as SidebarMode;\n }\n const bpKeys = Object.keys(BREAKPOINTS) as Array<keyof typeof BREAKPOINTS>;\n const order: Breakpoint[] = ([...bpKeys].reverse() as Breakpoint[]).concat(\n 'initial' as Breakpoint,\n );\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]) return dm[bp] as SidebarMode;\n }\n return 'collapsed';\n }, [defaultMode, shell.currentBreakpoint]);\n\n const lastSidebarBpRef = 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 (lastSidebarBpRef.current === shell.currentBreakpoint) return; // only on bp change\n lastSidebarBpRef.current = shell.currentBreakpoint as Breakpoint;\n const next = resolveResponsiveMode();\n if (next !== shell.sidebarMode) shell.setSidebarMode(next);\n }, [\n mode,\n shell.currentBreakpoint,\n shell.currentBreakpointReady,\n resolveResponsiveMode,\n shell.sidebarMode,\n shell.setSidebarMode,\n ]);\n\n const handleEl =\n resizable && !isOverlay && shell.sidebarMode === 'expanded' ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--sidebar-size',\n minSize,\n maxSize,\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,\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n persistenceAdapter?.save?.(size);\n },\n target: 'sidebar',\n collapsible,\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => shell.setSidebarMode('collapsed'),\n requestToggle: () => shell.togglePane('sidebar'),\n }}\n >\n {handleChildren.length > 0 ? (\n handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i }))\n ) : (\n <PaneHandle />\n )}\n </PaneResizeContext.Provider>\n ) : null;\n\n if (isOverlay) {\n const open = shell.sidebarMode !== 'collapsed';\n return (\n <Sheet.Root\n open={open}\n onOpenChange={(o) => shell.setSidebarMode(o ? 'expanded' : 'collapsed')}\n >\n <Sheet.Content\n side=\"start\"\n style={{ padding: 0 }}\n width={{\n initial: `${open ? (shell.sidebarMode === 'thin' ? thinSize : expandedSize) : lastOverlayWidthRef.current}px`,\n }}\n >\n <VisuallyHidden>\n <Sheet.Title>Sidebar</Sheet.Title>\n </VisuallyHidden>\n {children}\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n\n return (\n <div\n {...props}\n ref={setRef}\n className={classNames('rt-ShellSidebar', className)}\n data-mode={shell.sidebarMode}\n data-peek={shell.peekTarget === 'sidebar' || undefined}\n data-presentation={resolvedPresentation}\n data-open={(isStacked && isContentVisible) || undefined}\n style={{\n ...style,\n ['--sidebar-size' as any]: `${expandedSize}px`,\n ['--sidebar-thin-size' as any]: `${thinSize}px`,\n ['--sidebar-min-size' as any]: `${minSize}px`,\n ['--sidebar-max-size' as any]: `${maxSize}px`,\n // When peeking in fixed presentation, use the next toggle target's width (thin or expanded)\n ...(shell.peekTarget === 'sidebar' && !isOverlay\n ? (() => {\n const enabled = (\n toggleModes && toggleModes.length > 0\n ? toggleModes\n : (['thin', 'expanded'] as const)\n ) as Array<'thin' | 'expanded'>;\n const current = shell.sidebarMode as SidebarMode;\n let next: SidebarMode = 'collapsed';\n if (current === 'collapsed') {\n next = (enabled[0] ?? 'expanded') as SidebarMode;\n } else if (current === 'thin') {\n next = enabled.includes('expanded') ? 'expanded' : 'collapsed';\n } else {\n next = enabled.includes('thin') ? 'thin' : 'collapsed';\n }\n const peekWidth = next === 'thin' ? thinSize : expandedSize;\n return { ['--peek-sidebar-width' as any]: `${peekWidth}px` } as React.CSSProperties;\n })()\n : {}),\n }}\n >\n <div className=\"rt-ShellSidebarContent\" data-visible={isContentVisible || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n },\n) as SidebarComponent;\nSidebar.displayName = 'Shell.Sidebar';\nSidebar.Handle = SidebarHandle;\n\n// Content (always required)\ninterface ShellContentProps extends React.ComponentPropsWithoutRef<'main'> {}\n\nconst Content = React.forwardRef<HTMLElement, ShellContentProps>(({ className, ...props }, ref) => (\n <main {...props} ref={ref} className={classNames('rt-ShellContent', className)} />\n));\nContent.displayName = 'Shell.Content';\n\n// Inspector\nconst Inspector = React.forwardRef<HTMLDivElement, PaneProps>(\n (\n {\n className,\n presentation = { initial: 'overlay', lg: 'fixed' },\n mode,\n defaultMode = 'collapsed',\n onModeChange,\n expandedSize = 320,\n minSize = 200,\n maxSize = 500,\n resizable = false,\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 const resolvedPresentation = useResponsivePresentation(presentation);\n const isOverlay = resolvedPresentation === 'overlay';\n const isStacked = resolvedPresentation === 'stacked';\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(\n (el: React.ReactElement) => React.isValidElement(el) && el.type === InspectorHandle,\n );\n const contentChildren = childArray.filter(\n (el: React.ReactElement) => !(React.isValidElement(el) && el.type === InspectorHandle),\n );\n\n // Apply responsive defaultMode only on mount and when breakpoint changes (uncontrolled Inspector)\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(\n 'initial' as Breakpoint,\n );\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 lastInspectorBpRef = 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 (lastInspectorBpRef.current === shell.currentBreakpoint) return; // only on bp change\n lastInspectorBpRef.current = shell.currentBreakpoint as Breakpoint;\n const next = resolveResponsiveMode();\n if (next !== shell.inspectorMode) {\n shell.setInspectorMode(next);\n }\n }, [\n mode,\n shell.currentBreakpoint,\n shell.currentBreakpointReady,\n resolveResponsiveMode,\n shell.inspectorMode,\n shell.setInspectorMode,\n ]);\n\n // Sync controlled mode\n React.useEffect(() => {\n if (mode !== undefined && shell.inspectorMode !== mode) {\n shell.setInspectorMode(mode);\n }\n }, [mode, shell]);\n\n // Emit mode changes\n React.useEffect(() => {\n if (mode === undefined) {\n onModeChange?.(shell.inspectorMode);\n }\n }, [shell.inspectorMode, mode, onModeChange]);\n\n // Emit expand/collapse events\n React.useEffect(() => {\n if (shell.inspectorMode === 'expanded') {\n onExpand?.();\n } else {\n onCollapse?.();\n }\n }, [shell.inspectorMode, onExpand, onCollapse]);\n\n const isExpanded = shell.inspectorMode === 'expanded';\n\n // Default persistence if paneId provided and none supplied (fixed only)\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:inspector:${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 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('--inspector-size', `${loaded}px`);\n onResize?.(loaded);\n }\n })();\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n const handleEl =\n resizable && !isOverlay && isExpanded ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--inspector-size',\n minSize,\n maxSize,\n defaultSize: expandedSize,\n orientation: 'vertical',\n edge: 'start',\n computeNext: (client, startClient, startSize) => {\n const isRtl = getComputedStyle(localRef.current!).direction === 'rtl';\n const delta = client - startClient;\n // start edge; reverse for LTR\n return startSize + (isRtl ? delta : -delta);\n },\n onResize,\n onResizeStart,\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n persistenceAdapter?.save?.(size);\n },\n target: 'inspector',\n collapsible,\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => shell.setInspectorMode('collapsed'),\n requestToggle: () => shell.togglePane('inspector'),\n }}\n >\n {handleChildren.length > 0 ? (\n handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i }))\n ) : (\n <PaneHandle />\n )}\n </PaneResizeContext.Provider>\n ) : null;\n\n if (isOverlay) {\n const open = shell.inspectorMode === 'expanded';\n return (\n <Sheet.Root\n open={open}\n onOpenChange={(o) => shell.setInspectorMode(o ? 'expanded' : 'collapsed')}\n >\n <Sheet.Content side=\"end\" style={{ padding: 0 }} width={{ initial: `${expandedSize}px` }}>\n <VisuallyHidden>\n <Sheet.Title>Inspector</Sheet.Title>\n </VisuallyHidden>\n {children}\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n\n return (\n <div\n {...props}\n ref={setRef}\n className={classNames('rt-ShellInspector', className)}\n data-mode={shell.inspectorMode}\n data-peek={shell.peekTarget === 'inspector' || undefined}\n data-presentation={resolvedPresentation}\n data-open={(isStacked && isExpanded) || undefined}\n style={{\n ...style,\n ['--inspector-size' as any]: `${expandedSize}px`,\n ['--inspector-min-size' as any]: `${minSize}px`,\n ['--inspector-max-size' as any]: `${maxSize}px`,\n }}\n >\n <div className=\"rt-ShellInspectorContent\" data-visible={isExpanded || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n },\n) as InspectorComponent;\nInspector.displayName = 'Shell.Inspector';\nInspector.Handle = InspectorHandle;\n\n// Bottom\nconst Bottom = React.forwardRef<HTMLDivElement, PaneProps>(\n (\n {\n className,\n presentation = 'fixed', // Bottom is usually fixed\n mode,\n defaultMode = 'collapsed',\n onModeChange,\n expandedSize = 200,\n minSize = 100,\n maxSize = 400,\n resizable = false,\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 const resolvedPresentation = useResponsivePresentation(presentation);\n const isOverlay = resolvedPresentation === 'overlay';\n const isStacked = resolvedPresentation === 'stacked';\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(\n (el: React.ReactElement) => React.isValidElement(el) && el.type === BottomHandle,\n );\n const contentChildren = childArray.filter(\n (el: React.ReactElement) => !(React.isValidElement(el) && el.type === BottomHandle),\n );\n\n // Honor defaultMode on mount when uncontrolled\n const didInitRef = React.useRef(false);\n React.useEffect(() => {\n if (didInitRef.current) return;\n didInitRef.current = true;\n if (mode === undefined && shell.bottomMode !== (defaultMode as PaneMode)) {\n shell.setBottomMode(defaultMode as PaneMode);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Sync controlled mode\n React.useEffect(() => {\n if (mode !== undefined && shell.bottomMode !== mode) {\n shell.setBottomMode(mode);\n }\n }, [mode, shell]);\n\n // Emit mode changes\n React.useEffect(() => {\n if (mode === undefined) {\n onModeChange?.(shell.bottomMode);\n }\n }, [shell.bottomMode, mode, onModeChange]);\n\n // Emit expand/collapse events\n React.useEffect(() => {\n if (shell.bottomMode === 'expanded') {\n onExpand?.();\n } else {\n onCollapse?.();\n }\n }, [shell.bottomMode, onExpand, onCollapse]);\n\n const isExpanded = shell.bottomMode === 'expanded';\n\n // Default persistence if paneId provided and none supplied (fixed only)\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:bottom:${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 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('--bottom-size', `${loaded}px`);\n onResize?.(loaded);\n }\n })();\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n const handleEl =\n resizable && !isOverlay && isExpanded ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--bottom-size',\n minSize,\n maxSize,\n defaultSize: expandedSize,\n orientation: 'horizontal',\n edge: 'start',\n computeNext: (client, startClient, startSize) => {\n const delta = client - startClient;\n return startSize - delta; // drag up reduces size\n },\n onResize,\n onResizeStart,\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n persistenceAdapter?.save?.(size);\n },\n target: 'bottom',\n collapsible,\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => shell.setBottomMode('collapsed'),\n requestToggle: () => shell.togglePane('bottom'),\n }}\n >\n {handleChildren.length > 0 ? (\n handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i }))\n ) : (\n <PaneHandle />\n )}\n </PaneResizeContext.Provider>\n ) : null;\n\n if (isOverlay) {\n const open = shell.bottomMode === 'expanded';\n return (\n <Sheet.Root\n open={open}\n onOpenChange={(o) => shell.setBottomMode(o ? 'expanded' : 'collapsed')}\n >\n <Sheet.Content\n side=\"bottom\"\n style={{ padding: 0 }}\n height={{ initial: `${expandedSize}px` }}\n >\n <VisuallyHidden>\n <Sheet.Title>Bottom panel</Sheet.Title>\n </VisuallyHidden>\n {children}\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n\n return (\n <div\n {...props}\n ref={setRef}\n className={classNames('rt-ShellBottom', className)}\n data-mode={shell.bottomMode}\n data-peek={shell.peekTarget === 'bottom' || undefined}\n data-presentation={resolvedPresentation}\n data-open={(isStacked && isExpanded) || undefined}\n style={{\n ...style,\n ['--bottom-size' as any]: `${expandedSize}px`,\n ['--bottom-min-size' as any]: `${minSize}px`,\n ['--bottom-max-size' as any]: `${maxSize}px`,\n }}\n >\n <div className=\"rt-ShellBottomContent\" data-visible={isExpanded || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n },\n) as BottomComponent;\nBottom.displayName = 'Shell.Bottom';\nBottom.Handle = BottomHandle;\n\n// Trigger\ntype PaneTarget = 'left' | 'rail' | 'panel' | 'sidebar' | 'inspector' | 'bottom';\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>(\n (\n {\n target,\n action = 'toggle',\n peekOnHover,\n onClick,\n onMouseEnter,\n onMouseLeave,\n children,\n ...props\n },\n ref,\n ) => {\n const shell = useShell();\n\n const handleClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\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\n {...props}\n ref={ref}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n data-shell-trigger={target}\n data-shell-action={action}\n >\n {children}\n </button>\n );\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
6
|
"names": ["shell_exports", "__export", "Bottom", "Content", "Header", "Inspector", "Left", "Panel", "Rail", "Root", "Sidebar", "Trigger", "useResponsivePresentation", "useShell", "__toCommonJS", "React", "import_classnames", "Sheet", "import_inset", "import_visually_hidden", "BREAKPOINTS", "ShellContext", "ctx", "PaneResizeContext", "usePaneResize", "PaneHandle", "className", "children", "props", "ref", "containerRef", "cssVarName", "minSize", "maxSize", "defaultSize", "orientation", "edge", "computeNext", "onResize", "onResizeStart", "onResizeEnd", "snapPoints", "snapTolerance", "collapseThreshold", "collapsible", "target", "requestCollapse", "requestToggle", "activeCleanupRef", "ariaOrientation", "classNames", "e", "container", "handleEl", "pointerId", "startClient", "startSize", "clamp", "v", "body", "prevCursor", "prevUserSelect", "handleMove", "ev", "client", "next", "cleanup", "handleUp", "handleKey", "finalSize", "snapped", "nearest", "acc", "p", "kev", "current", "step", "delta", "PanelHandle", "SidebarHandle", "InspectorHandle", "BottomHandle", "presentation", "currentBreakpoint", "order", "startIdx", "i", "bp", "useBreakpoint", "currentBp", "setCurrentBp", "ready", "setReady", "mqls", "k", "q", "compute", "matched", "m", "height", "currentBreakpointReady", "leftMode", "setLeftMode", "panelMode", "setPanelMode", "sidebarMode", "setSidebarMode", "inspectorMode", "setInspectorMode", "bottomMode", "setBottomMode", "hasLeft", "setHasLeft", "hasSidebar", "setHasSidebar", "sidebarToggleComputerRef", "setSidebarToggleComputer", "fn", "devLeftPres", "setDevLeftPres", "onLeftPres", "railDefaultSizeRef", "panelDefaultSizeRef", "onRailDefaults", "size", "onPanelDefaults", "hasLeftChildren", "childArray", "isType", "el", "comp", "hasSidebarChildren", "togglePane", "prev", "expandPane", "collapsePane", "baseContextValue", "headerEls", "railEls", "panelEls", "sidebarEls", "contentEls", "inspectorEls", "bottomEls", "heightStyle", "peekTarget", "setPeekTarget", "peekPane", "clearPeek", "firstRail", "passthroughProps", "style", "mode", "defaultMode", "onModeChange", "onExpand", "onCollapse", "shell", "resolvedPresentation", "isOverlay", "isStacked", "localRef", "setRef", "node", "resolveResponsiveMode", "dm", "lastBpRef", "isExpanded", "open", "railEl", "panelEl", "railSize", "panelSize", "hasRail", "hasPanel", "overlayPx", "o", "includePanel", "floatingWidthPx", "expandedSize", "resizable", "paneId", "persistence", "handleChildren", "contentChildren", "persistenceAdapter", "key", "mounted", "loaded", "leftEl", "isRtl", "thinSize", "toggleModes", "sidebarId", "didInitRef", "isContentVisible", "shellForToggle", "enabled", "cur", "lastOverlayWidthRef", "lastOverlayModeRef", "lastSidebarBpRef", "lastInspectorBpRef", "action", "peekOnHover", "onClick", "onMouseEnter", "onMouseLeave", "handleClick", "event", "isCollapsed", "handleMouseEnter", "handleMouseLeave"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var r=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var d=(a,e)=>{for(var o in e)r(a,o,{get:e[o],enumerable:!0})},y=(a,e,o,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of m(e))!c.call(a,t)&&t!==o&&r(a,t,{get:()=>e[t],enumerable:!(n=i(e,t))||n.enumerable});return a};var b=a=>y(r({},"__esModule",{value:!0}),a);var
|
|
1
|
+
"use strict";var r=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var d=(a,e)=>{for(var o in e)r(a,o,{get:e[o],enumerable:!0})},y=(a,e,o,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of m(e))!c.call(a,t)&&t!==o&&r(a,t,{get:()=>e[t],enumerable:!(n=i(e,t))||n.enumerable});return a};var b=a=>y(r({},"__esModule",{value:!0}),a);var M={};d(M,{sidebarCheckboxItemPropDefs:()=>s.baseMenuCheckboxItemPropDefs,sidebarContentPropDefs:()=>s.baseMenuContentPropDefs,sidebarItemPropDefs:()=>s.baseMenuItemPropDefs,sidebarPropDefs:()=>u,sidebarRadioItemPropDefs:()=>s.baseMenuRadioItemPropDefs});module.exports=b(M);var p=require("../props/as-child.prop.js"),l=require("../props/color.prop.js"),f=require("../props/high-contrast.prop.js"),s=require("./_internal/base-menu.props.js");const D=["1","2"],P=["soft","outline","surface","ghost"],v=["solid","soft"],h=["sidebar"],N=["left","right"],C=["offcanvas","icon","none"],I=["rail","panel"],u={...p.asChildPropDef,size:{type:"enum",className:"rt-r-size",values:D,default:"2",responsive:!0},variant:{type:"enum",className:"rt-variant",values:P,default:"outline"},menuVariant:{type:"enum",className:"rt-menu-variant",values:v,default:"soft"},type:{type:"enum",className:"rt-type",values:h,default:"sidebar"},side:{type:"enum",className:"rt-side",values:N,default:"left"},collapsible:{type:"enum",className:"rt-collapsible",values:C,default:"offcanvas"},layout:{type:"enum",className:"rt-layout",values:I,default:void 0},panelBackground:{type:"enum",values:["solid","translucent"],default:void 0},...l.colorPropDef,...f.highContrastPropDef};
|
|
2
2
|
//# sourceMappingURL=sidebar.props.js.map
|