@kushagradhawan/kookie-ui 0.1.129 → 0.1.130
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/shell.d.ts.map +1 -1
- package/dist/cjs/components/shell.js +1 -1
- package/dist/cjs/components/shell.js.map +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 +3 -3
- 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/shell.tsx +14 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import*as e from"react";import X from"classnames";import*as he from"./sheet.js";import{VisuallyHidden as Fe}from"./visually-hidden.js";import{useResponsivePresentation as Oe,useResponsiveInitialState as Le}from"./shell.hooks.js";import{PaneResizeContext as $e}from"./_internal/shell-resize.js";import{PaneHandle as Ge,PanelHandle as Se}from"./_internal/shell-handles.js";import{omitPaneProps as Qe,extractPaneDomProps as qe,mapResponsiveBooleanToPaneMode as Ee}from"./_internal/shell-prop-helpers.js";import{Sidebar as ue}from"./_internal/shell-sidebar.js";import{Bottom as Ce}from"./_internal/shell-bottom.js";import{Inspector as ve}from"./_internal/shell-inspector.js";import{_BREAKPOINTS as Ke}from"./shell.types.js";import{normalizeToPx as Xe}from"../helpers/normalize-to-px.js";import{ShellProvider as Ye,useShell as ie,LeftModeContext as Je,PanelModeContext as Ze,SidebarModeContext as en,InspectorModeContext as nn,BottomModeContext as tn,PresentationContext as on,PeekContext as an,ActionsContext as ln,CompositionContext as rn,InsetContext as sn,useInset as ke}from"./shell.context.js";function dn(){const[t,l]=e.useState("initial"),[i,v]=e.useState(!1);return e.useEffect(()=>{if(typeof window>"u")return;const y=Object.entries(Ke).map(([m,a])=>[m,window.matchMedia(a)]),S=m=>{const a=y.filter(([,R])=>R.matches).map(([R])=>R),u=a[a.length-1]??"initial";l(u),v(!0)};S();const b=[];return y.forEach(([,m])=>{const a=m;typeof a.addEventListener=="function"&&typeof a.removeEventListener=="function"?(a.addEventListener("change",S),b.push(()=>a.removeEventListener?.("change",S))):typeof a.addListener=="function"&&typeof a.removeListener=="function"&&(a.addListener(S),b.push(()=>a.removeListener?.(S)))}),()=>{b.forEach(m=>{try{m()}catch{}})}},[]),{bp:t,ready:i}}const fe=Symbol("rtShellSlot");function Y(t,l){return t[fe]=l,t}function Rn(t,l){if(!e.isValidElement(t))return!1;const i=t.type;if(i===l)return!0;const v=l?.[fe];return!!(i?.[fe]&&v&&i[fe]===v)}Y(ue,"Shell.Sidebar"),Y(ve,"Shell.Inspector"),Y(Ce,"Shell.Bottom");function pn(t,l){switch(l.type){case"SET_LEFT_MODE":return l.mode==="collapsed"?{...t,leftMode:"collapsed",panelMode:"collapsed"}:{...t,leftMode:l.mode};case"SET_PANEL_MODE":return l.mode==="expanded"&&t.leftMode!=="expanded"?{...t,leftMode:"expanded",panelMode:"expanded"}:{...t,panelMode:l.mode};case"SET_SIDEBAR_MODE":return{...t,sidebarMode:l.mode};case"SET_INSPECTOR_MODE":return{...t,inspectorMode:l.mode};case"SET_BOTTOM_MODE":return{...t,bottomMode:l.mode};case"TOGGLE_PANE":{switch(l.target){case"left":case"rail":return{...t,leftMode:t.leftMode==="expanded"?"collapsed":"expanded",panelMode:t.leftMode==="expanded"?"collapsed":t.panelMode};case"panel":return t.leftMode==="collapsed"?{...t,leftMode:"expanded",panelMode:"expanded"}:{...t,panelMode:t.panelMode==="expanded"?"collapsed":"expanded"};case"sidebar":{const i=t.sidebarMode==="collapsed"?"expanded":t.sidebarMode==="expanded"?"collapsed":"expanded";return{...t,sidebarMode:i}}case"inspector":return{...t,inspectorMode:t.inspectorMode==="expanded"?"collapsed":"expanded"};case"bottom":return{...t,bottomMode:t.bottomMode==="expanded"?"collapsed":"expanded"};default:return t}return t}case"EXPAND_PANE":{switch(l.target){case"left":case"rail":return{...t,leftMode:"expanded"};case"panel":return{...t,leftMode:"expanded",panelMode:"expanded"};case"sidebar":return{...t,sidebarMode:"expanded"};case"inspector":return{...t,inspectorMode:"expanded"};case"bottom":return{...t,bottomMode:"expanded"};default:return t}return t}case"COLLAPSE_PANE":{switch(l.target){case"left":case"rail":return{...t,leftMode:"collapsed",panelMode:"collapsed"};case"panel":return{...t,panelMode:"collapsed"};case"sidebar":return{...t,sidebarMode:"collapsed"};case"inspector":return{...t,inspectorMode:"collapsed"};case"bottom":return{...t,bottomMode:"collapsed"};default:return t}return t}}return t}const ze=e.forwardRef(({className:t,children:l,height:i="full",...v},M)=>{const{bp:y,ready:S}=dn(),b=e.Children.toArray(l),m=b.some(n=>e.isValidElement(n)&&n.type?.displayName==="Shell.Panel"&&!!n.props?.defaultOpen),a=b.find(n=>e.isValidElement(n)&&n.type?.displayName==="Shell.Rail"),u=a?a.props?.defaultOpen:void 0,R=a?u===void 0?!0:typeof u=="boolean"?u:typeof u=="object"?u.initial??Object.values(u)[0]??!0:!0:!1,j=b.some(n=>e.isValidElement(n)&&n.type?.displayName==="Shell.Inspector"&&!!n.props?.defaultOpen),_=b.some(n=>e.isValidElement(n)&&n.type?.displayName==="Shell.Inspector"&&typeof n.props?.open<"u"&&!!n.props?.open),h=()=>{const n=b.find(c=>e.isValidElement(c)&&c.type?.displayName==="Shell.Sidebar");if(!n)return"expanded";const d=n.props;if(typeof d?.state<"u"){if(typeof d.state=="string")return d.state;if(typeof d.state=="object")return d.state.initial??Object.values(d.state)[0]??"expanded"}if(typeof d?.defaultState<"u"){if(typeof d.defaultState=="string")return d.defaultState;if(typeof d.defaultState=="object")return d.defaultState.initial??Object.values(d.defaultState)[0]??"expanded"}return"expanded"},k=()=>{const n=b.find(c=>e.isValidElement(c)&&c.type?.displayName==="Shell.Bottom");if(!n)return"collapsed";const d=n.props;if(typeof d?.open<"u"){if(typeof d.open=="boolean")return d.open?"expanded":"collapsed";if(typeof d.open=="object")return d.open.initial??Object.values(d.open)[0]?"expanded":"collapsed"}return typeof d?.defaultOpen<"u"&&d.defaultOpen?"expanded":"collapsed"},[p,s]=e.useReducer(pn,{leftMode:m||R?"expanded":"collapsed",panelMode:m?"expanded":"collapsed",sidebarMode:h(),inspectorMode:j||_?"expanded":"collapsed",bottomMode:k()}),T=e.useCallback(n=>s({type:"SET_LEFT_MODE",mode:n}),[]),W=e.useCallback(n=>s({type:"SET_PANEL_MODE",mode:n}),[]),z=e.useCallback(n=>s({type:"SET_SIDEBAR_MODE",mode:n}),[]),w=e.useCallback(n=>s({type:"SET_INSPECTOR_MODE",mode:n}),[]),A=e.useCallback(n=>s({type:"SET_BOTTOM_MODE",mode:n}),[]),[D,ee]=e.useState(!1),[O,I]=e.useState(!1),F=e.useRef(n=>n==="collapsed"?"thin":n==="thin"?"expanded":"collapsed"),g=e.useCallback(n=>{F.current=n},[]);e.useEffect(()=>{O&&D&&console.warn("Shell: Sidebar cannot coexist with Rail or Panel. Use either Rail+Panel OR Sidebar.")},[O,D]);const[x,B]=e.useState(void 0),r=e.useCallback(n=>B(n),[]),N=e.useRef(64),$=e.useRef(288),ne=e.useCallback(n=>{N.current=n},[]),G=e.useCallback(n=>{$.current=n},[]),te=e.useMemo(()=>{const n=e.Children.toArray(l),d=(c,K)=>e.isValidElement(c)&&(c.type===K||c.type?.displayName===K.displayName);return n.some(c=>d(c,J)||d(c,Z))},[l]),oe=e.useMemo(()=>{const n=e.Children.toArray(l),d=(c,K)=>e.isValidElement(c)&&(c.type===K||c.type?.displayName===K.displayName);return n.some(c=>d(c,ue))},[l]),f=e.useCallback(n=>{if(n==="sidebar"){const d=F.current(p.sidebarMode);z(d);return}s({type:"TOGGLE_PANE",target:n})},[p.sidebarMode,z]),P=e.useCallback(n=>{if(n==="sidebar")return z("expanded");s({type:"EXPAND_PANE",target:n})},[z]),ae=e.useCallback(n=>{if(n==="sidebar")return z("collapsed");s({type:"COLLAPSE_PANE",target:n})},[z]),se=e.useMemo(()=>({leftMode:p.leftMode,setLeftMode:T,panelMode:p.panelMode,setPanelMode:W,sidebarMode:p.sidebarMode,setSidebarMode:z,inspectorMode:p.inspectorMode,setInspectorMode:w,bottomMode:p.bottomMode,setBottomMode:A,hasLeft:D,setHasLeft:ee,hasSidebar:O,setHasSidebar:I,currentBreakpoint:y,currentBreakpointReady:S,leftResolvedPresentation:x,togglePane:f,expandPane:P,collapsePane:ae,setSidebarToggleComputer:g,onLeftPres:r,onRailDefaults:ne,onPanelDefaults:G}),[p.leftMode,T,p.panelMode,W,p.sidebarMode,z,p.inspectorMode,w,p.bottomMode,A,D,O,y,S,x,f,P,ae,g,r,ne,G]),V=e.Children.toArray(l),U=(n,d)=>e.isValidElement(n)&&(n.type===d||n.type?.displayName===d.displayName),le=V.filter(n=>U(n,xe)),Q=V.filter(n=>U(n,J)),q=V.filter(n=>U(n,Z)),de=V.filter(n=>U(n,ue)),Pe=V.filter(n=>U(n,Me)),o=V.filter(n=>U(n,ve)),E=V.filter(n=>U(n,Ce)),C=Q[0]?.props?.open;e.useEffect(()=>{if(typeof C>"u")return;T(!!C?"expanded":"collapsed")},[C,T]);const L=e.useMemo(()=>i==="full"?{height:"100vh"}:i==="auto"?{height:"auto"}:typeof i=="string"?{height:i}:typeof i=="number"?{height:`${i}px`}:{},[i]),[H,re]=e.useState(null),pe=e.useCallback(n=>re(n),[]),ce=e.useCallback(()=>re(null),[]),_e=e.useMemo(()=>({currentBreakpoint:y,currentBreakpointReady:S,leftResolvedPresentation:x}),[y,S,x]),De=e.useMemo(()=>({leftMode:p.leftMode,setLeftMode:T}),[p.leftMode,T]),Be=e.useMemo(()=>({panelMode:p.panelMode,setPanelMode:W}),[p.panelMode,W]),Ae=e.useMemo(()=>({sidebarMode:p.sidebarMode,setSidebarMode:z}),[p.sidebarMode,z]),we=e.useMemo(()=>({inspectorMode:p.inspectorMode,setInspectorMode:w}),[p.inspectorMode,w]),Ie=e.useMemo(()=>({bottomMode:p.bottomMode,setBottomMode:A}),[p.bottomMode,A]),Ve=e.useMemo(()=>({hasLeft:D,setHasLeft:ee,hasSidebar:O,setHasSidebar:I}),[D,ee,O,I]),[ye,Re]=e.useState(new Set),ge=e.useCallback(n=>{Re(d=>{if(d.has(n))return d;const c=new Set(d);return c.add(n),c})},[]),Te=e.useCallback(n=>{Re(d=>{if(!d.has(n))return d;const c=new Set(d);return c.delete(n),c})},[]),be=ye.size>0,He=e.useMemo(()=>({insetPanes:ye,registerInset:ge,unregisterInset:Te,hasAnyInset:be}),[ye,ge,Te,be]),je=e.useMemo(()=>({peekTarget:H,setPeekTarget:re,peekPane:pe,clearPeek:ce}),[H,re,pe,ce]),Ue=e.useMemo(()=>({togglePane:f,expandPane:P,collapsePane:ae,setSidebarToggleComputer:g}),[f,P,ae,g]),We=e.useMemo(()=>({...se,peekTarget:H,setPeekTarget:re,peekPane:pe,clearPeek:ce}),[se,H,re,pe,ce]);return e.createElement("div",{...v,ref:M,className:X("rt-ShellRoot",t),style:{...L,...v.style}},e.createElement(Ye,{value:We},e.createElement(on.Provider,{value:_e},e.createElement(Je.Provider,{value:De},e.createElement(Ze.Provider,{value:Be},e.createElement(en.Provider,{value:Ae},e.createElement(nn.Provider,{value:we},e.createElement(tn.Provider,{value:Ie},e.createElement(rn.Provider,{value:Ve},e.createElement(an.Provider,{value:je},e.createElement(ln.Provider,{value:Ue},e.createElement(sn.Provider,{value:He},le,e.createElement("div",{className:"rt-ShellBody","data-peek-target":H??void 0,"data-has-inset":be||void 0,style:H==="rail"||H==="panel"?{"--peek-rail-width":`${N.current}px`}:void 0},te&&!oe?(()=>{const n=Q[0],d=q[0],c=!!n?.props?.inset||!!d?.props?.inset,K=n?{onOpenChange:n.props?.onOpenChange,open:n.props?.open,defaultOpen:n.props?.defaultOpen,presentation:n.props?.presentation,collapsible:n.props?.collapsible,onExpand:n.props?.onExpand,onCollapse:n.props?.onCollapse,inset:c}:{defaultOpen:m?!0:void 0,inset:c};return e.createElement(me,{...K},Q,q)})():de,Pe,o),E))))))))))))});ze.displayName="Shell.Root";const xe=e.forwardRef(({className:t,height:l=64,style:i,...v},M)=>e.createElement("header",{...v,ref:M,className:X("rt-ShellHeader",t),style:{...i,"--shell-header-height":`${l}px`}}));xe.displayName="Shell.Header";const cn=["open","defaultOpen","onOpenChange","mode","defaultMode","onModeChange"],me=e.forwardRef((t,l)=>{const{className:i,presentation:v={initial:"fixed",sm:"fixed"},collapsible:M=!0,onExpand:y,onCollapse:S,children:b,style:m,inset:a,...u}=t,{registerInset:R,unregisterInset:j}=ke();e.useEffect(()=>{if(a)return R("left"),()=>j("left")},[a,R,j]);const _=u.open,h=u.defaultOpen,k=u.onOpenChange,p=Qe(u,cn),s=ie(),T=Oe(v),W=T==="overlay",z=T==="stacked",w=e.useRef(null);e.useEffect(()=>{s.onLeftPres?.(T)},[s,T]);const A=e.useCallback(g=>{w.current=g,typeof l=="function"?l(g):l&&(l.current=g)},[l]);e.useEffect(()=>(s.setHasLeft(!0),()=>s.setHasLeft(!1)),[s]);const D=e.useRef(null),ee=e.useRef(!1),O=e.useMemo(()=>{if(!(typeof _>"u"))return _?"expanded":"collapsed"},[_]),I=e.useMemo(()=>Ee(h),[h]);Le({controlledValue:O,defaultValue:I,currentValue:s.leftMode,setValue:s.setLeftMode,breakpointReady:s.currentBreakpointReady,onInit:g=>k?.(g==="expanded",{reason:"init"})}),e.useEffect(()=>{typeof _<"u"||(D.current!==null&&D.current!==s.leftMode&&k?.(s.leftMode==="expanded",{reason:"toggle"}),D.current=s.leftMode)},[s,k,_]),e.useEffect(()=>{s.leftMode==="expanded"?y?.():S?.()},[s.leftMode,y,S]);const F=s.leftMode==="expanded";if(W){const g=s.leftMode==="expanded",x=e.Children.toArray(b),B=(f,P)=>e.isValidElement(f)&&f.type===P,r=x.find(f=>B(f,J)),N=x.find(f=>B(f,Z)),$=typeof r?.props?.expandedSize=="number"?r.props.expandedSize:64,ne=typeof N?.props?.expandedSize=="number"?N.props.expandedSize:288,G=!!r,te=!!N,oe=(G?$:0)+(s.panelMode==="expanded"&&te?ne:0);return e.createElement(he.Root,{open:g,onOpenChange:f=>s.setLeftMode(f?"expanded":"collapsed")},e.createElement(he.Content,{side:"start",style:{padding:0},width:{initial:`${oe}px`}},e.createElement(Fe,null,e.createElement(he.Title,null,"Navigation")),e.createElement("div",{className:"rt-ShellLeft"},b)))}if(z){const g=s.leftMode==="expanded",x=e.Children.toArray(b),B=(f,P)=>e.isValidElement(f)&&f.type===P,r=x.find(f=>B(f,J)),N=x.find(f=>B(f,Z)),$=typeof r?.props?.expandedSize=="number"?r.props.expandedSize:64,ne=typeof N?.props?.expandedSize=="number"?N.props.expandedSize:288,G=!!r,oe=!!N&&(s.panelMode==="expanded"||s.peekTarget==="panel");return e.createElement("div",{...p,ref:A,className:X("rt-ShellLeft",i),"data-mode":s.leftMode,"data-peek":s.peekTarget==="left"||s.peekTarget==="rail"||s.peekTarget==="panel"||void 0,"data-presentation":T,"data-inset":a||void 0,style:{...m},"data-open":g||void 0},b)}return e.createElement("div",{...p,ref:A,className:X("rt-ShellLeft",i),"data-mode":s.leftMode,"data-peek":s.peekTarget==="left"||s.peekTarget==="rail"||s.peekTarget==="panel"||void 0,"data-presentation":T,"data-inset":a||void 0,style:{...m}},b)});me.displayName="Shell.Left",Y(me,"Shell.Left");const J=e.forwardRef((t,l)=>{const{className:i,presentation:v,expandedSize:M=64,collapsible:y,onExpand:S,onCollapse:b,children:m,style:a,open:u,defaultOpen:R,onOpenChange:j,..._}=t,h=ie(),k=e.useRef(null);e.useEffect(()=>{const s=typeof u<"u";if(k.current===null){k.current=s;return}k.current!==s&&(console.warn("Shell.Rail: Switching between controlled and uncontrolled `open` is not supported."),k.current=s)},[u]),e.useEffect(()=>{h.onRailDefaults?.(M)},[h,M]);const p=h.leftMode==="expanded";return e.createElement("div",{..._,ref:l,className:X("rt-ShellRail",i),"data-mode":h.leftMode,"data-peek":h.currentBreakpointReady&&h.leftResolvedPresentation!=="overlay"&&h.peekTarget==="rail"||void 0,style:{...a,"--rail-size":`${M}px`}},e.createElement("div",{className:"rt-ShellRailContent","data-visible":h.currentBreakpointReady&&(p||h.leftResolvedPresentation!=="overlay"&&h.peekTarget==="rail")||void 0},m))});J.displayName="Shell.Rail",Y(J,"Shell.Rail");const un=["className","children","defaultOpen","open","onOpenChange","size","defaultSize","onSizeChange","sizeUpdate","sizeUpdateMs","style"],Z=Y(e.forwardRef((t,l)=>{const{className:i,defaultOpen:v,open:M,onOpenChange:y,size:S,defaultSize:b,expandedSize:m=288,minSize:a,maxSize:u,resizable:R,collapsible:j=!0,onExpand:_,onCollapse:h,onResize:k,onResizeStart:p,onResizeEnd:s,snapPoints:T,snapTolerance:W,collapseThreshold:z,paneId:w,persistence:A,children:D,style:ee,onSizeChange:O,sizeUpdate:I,sizeUpdateMs:F=50}=t,g=qe(t,un),x=e.useRef(null);e.useEffect(()=>()=>{x.current&&(clearTimeout(x.current),x.current=null)},[O,I,F]);const B=e.useMemo(()=>{if(!O)return()=>{};if(I==="debounce")return(E,C)=>{x.current&&clearTimeout(x.current),x.current=setTimeout(()=>{O?.(E,C),x.current=null},F)};if(I==="throttle"){let o=0;return(E,C)=>{const L=Date.now();L-o>=F&&(o=L,O?.(E,C))}}return(o,E)=>O?.(o,E)},[O,I,F]),r=ie(),N=e.useRef(null),$=e.useRef(null),ne=e.useRef(!1),G=e.useMemo(()=>Ee(M),[M]),te=e.useMemo(()=>Ee(v),[v]),oe=typeof M=="object"&&M!==null;Le({controlledValue:G,defaultValue:te,currentValue:r.panelMode,setValue:o=>{o==="expanded"&&r.leftMode!=="expanded"&&r.setLeftMode("expanded"),r.setPanelMode(o)},breakpointReady:r.currentBreakpointReady,controlledIsResponsive:oe,onResponsiveChange:o=>y?.(o==="expanded",{reason:"responsive"}),onInit:o=>{typeof M>"u"&&y?.(o==="expanded",{reason:"init"})}});const f=e.useRef(null);e.useEffect(()=>{const o=typeof M<"u";if(f.current===null){f.current=o;return}f.current!==o&&(console.warn("Shell.Panel: Switching between controlled and uncontrolled `open` is not supported."),f.current=o)},[M]),e.useEffect(()=>{r.onPanelDefaults?.(m)},[r,m]);const P=e.useRef(null),ae=e.useCallback(o=>{P.current=o,typeof l=="function"?l(o):l&&(l.current=o)},[l]),se=e.Children.toArray(D),V=se.filter(o=>e.isValidElement(o)&&o.type===Se),U=se.filter(o=>!(e.isValidElement(o)&&o.type===Se)),le=r.leftResolvedPresentation==="overlay",Q=e.useCallback(o=>Xe(o,"horizontal"),[]),q=e.useMemo(()=>{if(!w||A)return A;const o=`kookie-ui:shell:panel:${w}`;return{load:()=>{if(typeof window>"u")return;const C=window.localStorage.getItem(o);return C?Number(C):void 0},save:C=>{typeof window>"u"||window.localStorage.setItem(o,String(C))}}},[w,A]);e.useEffect(()=>{let o=!0;return(async()=>{if(!R||!q?.load||le)return;const E=await q.load();o&&typeof E=="number"&&P.current&&(P.current.style.setProperty("--panel-size",`${E}px`),k?.(E))})(),()=>{o=!1}},[R,q,k,le]),e.useEffect(()=>{P.current&&le&&P.current.style.setProperty("--panel-size",`${m}px`)},[le,m]),e.useEffect(()=>{if(P.current&&typeof S>"u"&&typeof b<"u"){const o=Q(b);if(typeof o=="number"&&Number.isFinite(o)){const L=Math.min((typeof u=="number"?u:void 0)??o,Math.max((typeof a=="number"?a:void 0)??o,o));P.current.style.setProperty("--panel-size",`${L}px`),B(L,{reason:"init"})}}},[]),e.useEffect(()=>{if(!P.current||typeof S>"u")return;const o=Q(S);if(typeof o=="number"&&Number.isFinite(o)){const L=Math.min((typeof u=="number"?u:void 0)??o,Math.max((typeof a=="number"?a:void 0)??o,o));P.current.style.setProperty("--panel-size",`${L}px`),B(L,{reason:"controlled"})}},[S,a,u,Q,B]),e.useEffect(()=>{if(P.current&&r.leftResolvedPresentation!=="overlay"&&r.leftMode==="expanded"&&r.panelMode==="expanded"){const o=P.current.parentElement||null;try{o?.style.removeProperty("width")}catch{}}},[r.leftResolvedPresentation,r.leftMode,r.panelMode]);const de=r.leftMode==="expanded"&&r.panelMode==="expanded";e.useEffect(()=>{const o=N.current,E=$.current;if(o!==null&&o!==r.panelMode){const C=r.panelMode==="expanded";let L="toggle";E!==r.leftMode&&r.leftMode==="collapsed"&&!C&&(L="left"),y?.(C,{reason:L})}N.current=r.panelMode,$.current=r.leftMode},[r.panelMode,r.leftMode,y]);const Pe=R&&r.leftResolvedPresentation!=="overlay"&&de?e.createElement($e.Provider,{value:{containerRef:P,cssVarName:"--panel-size",minSize:typeof a=="number"?a:100,maxSize:typeof u=="number"?u:800,defaultSize:m,orientation:"vertical",edge:"end",computeNext:(o,E,C)=>{const L=getComputedStyle(P.current).direction==="rtl",H=o-E;return C+(L?-H:H)},onResize:k,onResizeStart:o=>{const C=P.current?.parentElement;try{C?.style.removeProperty("width")}catch{}p?.(o)},onResizeEnd:o=>{s?.(o),B(o,{reason:"resize"}),q?.save?.(o)},target:"panel",collapsible:!!j,snapPoints:T,snapTolerance:W??8,collapseThreshold:z,requestCollapse:()=>r.setPanelMode("collapsed"),requestToggle:()=>r.togglePane("panel")}},V.length>0?V.map((o,E)=>e.cloneElement(o,{key:o.key??E})):e.createElement(Ge,null)):null;return e.createElement("div",{...g,ref:ae,className:X("rt-ShellPanel",i),"data-mode":r.panelMode,"data-visible":r.currentBreakpointReady&&(de||r.leftResolvedPresentation!=="overlay"&&r.peekTarget==="panel")||void 0,"data-peek":r.currentBreakpointReady&&r.leftResolvedPresentation!=="overlay"&&r.peekTarget==="panel"||void 0,style:{...ee,"--panel-size":`${m}px`}},e.createElement("div",{className:"rt-ShellPanelContent","data-visible":de||void 0},U),Pe)}),"Shell.Panel");Z.displayName="Shell.Panel",Z.Handle=Se;const Me=e.forwardRef(({className:t,inset:l,...i},v)=>{const{registerInset:M,unregisterInset:y}=ke();return e.useEffect(()=>{if(l)return M("content"),()=>y("content")},[l,M,y]),e.createElement("main",{...i,ref:v,className:X("rt-ShellContent",t),"data-inset":l||void 0})});Me.displayName="Shell.Content",Y(Me,"Shell.Content");const Ne=e.forwardRef(({target:t,action:l="toggle",peekOnHover:i,onClick:v,onMouseEnter:M,onMouseLeave:y,children:S,...b},m)=>{const a=ie(),u=e.useCallback(h=>{switch(v?.(h),a.peekTarget===t&&a.clearPeek(),l){case"toggle":a.togglePane(t);break;case"expand":a.expandPane(t);break;case"collapse":a.collapsePane(t);break}},[a,t,l,v]),R=(()=>{switch(t){case"left":case"rail":return a.leftMode==="collapsed";case"panel":return a.leftMode==="collapsed"||a.panelMode==="collapsed";case"sidebar":return a.sidebarMode==="collapsed";case"inspector":return a.inspectorMode==="collapsed";case"bottom":return a.bottomMode==="collapsed"}})(),j=e.useCallback(h=>{M?.(h),!(!i||!R)&&a.peekPane(t)},[M,i,R,a,t]),_=e.useCallback(h=>{y?.(h),i&&a.peekTarget===t&&a.clearPeek()},[y,i,a,t]);return e.createElement("button",{...b,ref:m,onClick:u,onMouseEnter:j,onMouseLeave:_,"data-shell-trigger":t,"data-shell-action":l,"aria-expanded":!R},S)});Ne.displayName="Shell.Trigger";export{Ce as Bottom,Me as Content,xe as Header,ve as Inspector,me as Left,Z as Panel,J as Rail,ze as Root,ue as Sidebar,Ne as Trigger,Oe as useResponsivePresentation,ie as useShell};
|
|
1
|
+
"use client";import*as e from"react";import J from"classnames";import*as Se from"./sheet.js";import{VisuallyHidden as $e}from"./visually-hidden.js";import{useResponsivePresentation as Le,useResponsiveInitialState as ke}from"./shell.hooks.js";import{PaneResizeContext as Ge}from"./_internal/shell-resize.js";import{PaneHandle as Qe,PanelHandle as Ee}from"./_internal/shell-handles.js";import{omitPaneProps as qe,extractPaneDomProps as Ke,mapResponsiveBooleanToPaneMode as Ce}from"./_internal/shell-prop-helpers.js";import{Sidebar as fe}from"./_internal/shell-sidebar.js";import{Bottom as ve}from"./_internal/shell-bottom.js";import{Inspector as xe}from"./_internal/shell-inspector.js";import{_BREAKPOINTS as Xe}from"./shell.types.js";import{normalizeToPx as Ye}from"../helpers/normalize-to-px.js";import{ShellProvider as Je,useShell as ie,LeftModeContext as Ze,PanelModeContext as en,SidebarModeContext as nn,InspectorModeContext as tn,BottomModeContext as on,PresentationContext as an,PeekContext as ln,ActionsContext as rn,CompositionContext as sn,InsetContext as dn,useInset as ze}from"./shell.context.js";function pn(){const[t,r]=e.useState("initial"),[i,E]=e.useState(!1);return e.useEffect(()=>{if(typeof window>"u")return;const y=Object.entries(Xe).map(([u,l])=>[u,window.matchMedia(l)]),h=u=>{const l=y.filter(([,x])=>x.matches).map(([x])=>x),c=l[l.length-1]??"initial";r(c),E(!0)};h();const m=[];return y.forEach(([,u])=>{const l=u;typeof l.addEventListener=="function"&&typeof l.removeEventListener=="function"?(l.addEventListener("change",h),m.push(()=>l.removeEventListener?.("change",h))):typeof l.addListener=="function"&&typeof l.removeListener=="function"&&(l.addListener(h),m.push(()=>l.removeListener?.(h)))}),()=>{m.forEach(u=>{try{u()}catch{}})}},[]),{bp:t,ready:i}}const me=Symbol("rtShellSlot");function Z(t,r){return t[me]=r,t}function gn(t,r){if(!e.isValidElement(t))return!1;const i=t.type;if(i===r)return!0;const E=r?.[me];return!!(i?.[me]&&E&&i[me]===E)}Z(fe,"Shell.Sidebar"),Z(xe,"Shell.Inspector"),Z(ve,"Shell.Bottom");function cn(t,r){switch(r.type){case"SET_LEFT_MODE":return r.mode==="collapsed"?{...t,leftMode:"collapsed",panelMode:"collapsed"}:{...t,leftMode:r.mode};case"SET_PANEL_MODE":return r.mode==="expanded"&&t.leftMode!=="expanded"?{...t,leftMode:"expanded",panelMode:"expanded"}:{...t,panelMode:r.mode};case"SET_SIDEBAR_MODE":return{...t,sidebarMode:r.mode};case"SET_INSPECTOR_MODE":return{...t,inspectorMode:r.mode};case"SET_BOTTOM_MODE":return{...t,bottomMode:r.mode};case"TOGGLE_PANE":{switch(r.target){case"left":case"rail":return{...t,leftMode:t.leftMode==="expanded"?"collapsed":"expanded",panelMode:t.leftMode==="expanded"?"collapsed":t.panelMode};case"panel":return t.leftMode==="collapsed"?{...t,leftMode:"expanded",panelMode:"expanded"}:{...t,panelMode:t.panelMode==="expanded"?"collapsed":"expanded"};case"sidebar":{const i=t.sidebarMode==="collapsed"?"expanded":t.sidebarMode==="expanded"?"collapsed":"expanded";return{...t,sidebarMode:i}}case"inspector":return{...t,inspectorMode:t.inspectorMode==="expanded"?"collapsed":"expanded"};case"bottom":return{...t,bottomMode:t.bottomMode==="expanded"?"collapsed":"expanded"};default:return t}return t}case"EXPAND_PANE":{switch(r.target){case"left":case"rail":return{...t,leftMode:"expanded"};case"panel":return{...t,leftMode:"expanded",panelMode:"expanded"};case"sidebar":return{...t,sidebarMode:"expanded"};case"inspector":return{...t,inspectorMode:"expanded"};case"bottom":return{...t,bottomMode:"expanded"};default:return t}return t}case"COLLAPSE_PANE":{switch(r.target){case"left":case"rail":return{...t,leftMode:"collapsed",panelMode:"collapsed"};case"panel":return{...t,panelMode:"collapsed"};case"sidebar":return{...t,sidebarMode:"collapsed"};case"inspector":return{...t,inspectorMode:"collapsed"};case"bottom":return{...t,bottomMode:"collapsed"};default:return t}return t}}return t}const Ne=e.forwardRef(({className:t,children:r,height:i="full",...E},f)=>{const{bp:y,ready:h}=pn(),m=e.Children.toArray(r),u=m.some(n=>e.isValidElement(n)&&n.type?.displayName==="Shell.Panel"&&!!n.props?.defaultOpen),l=m.find(n=>e.isValidElement(n)&&n.type?.displayName==="Shell.Rail"),c=l?l.props?.defaultOpen:void 0,x=l?c===void 0?!0:typeof c=="boolean"?c:typeof c=="object"?c.initial??Object.values(c)[0]??!0:!0:!1,V=m.some(n=>e.isValidElement(n)&&n.type?.displayName==="Shell.Inspector"&&!!n.props?.defaultOpen),_=m.some(n=>e.isValidElement(n)&&n.type?.displayName==="Shell.Inspector"&&typeof n.props?.open<"u"&&!!n.props?.open),M=m.some(n=>{if(!e.isValidElement(n)||n.type?.displayName!=="Shell.Panel")return!1;const s=n.props?.open;return typeof s>"u"?!1:typeof s=="boolean"?s:typeof s=="object"&&s!==null?s.initial??Object.values(s)[0]??!1:!1}),L=()=>{const n=m.find(p=>e.isValidElement(p)&&p.type?.displayName==="Shell.Sidebar");if(!n)return"expanded";const s=n.props;if(typeof s?.state<"u"){if(typeof s.state=="string")return s.state;if(typeof s.state=="object")return s.state.initial??Object.values(s.state)[0]??"expanded"}if(typeof s?.defaultState<"u"){if(typeof s.defaultState=="string")return s.defaultState;if(typeof s.defaultState=="object")return s.defaultState.initial??Object.values(s.defaultState)[0]??"expanded"}return"expanded"},W=()=>{const n=m.find(p=>e.isValidElement(p)&&p.type?.displayName==="Shell.Bottom");if(!n)return"collapsed";const s=n.props;if(typeof s?.open<"u"){if(typeof s.open=="boolean")return s.open?"expanded":"collapsed";if(typeof s.open=="object")return s.open.initial??Object.values(s.open)[0]?"expanded":"collapsed"}return typeof s?.defaultOpen<"u"&&s.defaultOpen?"expanded":"collapsed"},[a,R]=e.useReducer(cn,{leftMode:u||M||x?"expanded":"collapsed",panelMode:u||M?"expanded":"collapsed",sidebarMode:L(),inspectorMode:V||_?"expanded":"collapsed",bottomMode:W()}),w=e.useCallback(n=>R({type:"SET_LEFT_MODE",mode:n}),[]),F=e.useCallback(n=>R({type:"SET_PANEL_MODE",mode:n}),[]),T=e.useCallback(n=>R({type:"SET_SIDEBAR_MODE",mode:n}),[]),A=e.useCallback(n=>R({type:"SET_INSPECTOR_MODE",mode:n}),[]),I=e.useCallback(n=>R({type:"SET_BOTTOM_MODE",mode:n}),[]),[H,D]=e.useState(!1),[z,j]=e.useState(!1),k=e.useRef(n=>n==="collapsed"?"thin":n==="thin"?"expanded":"collapsed"),v=e.useCallback(n=>{k.current=n},[]);e.useEffect(()=>{z&&H&&console.warn("Shell: Sidebar cannot coexist with Rail or Panel. Use either Rail+Panel OR Sidebar.")},[z,H]);const[O,d]=e.useState(void 0),N=e.useCallback(n=>d(n),[]),$=e.useRef(64),re=e.useRef(288),Q=e.useCallback(n=>{$.current=n},[]),q=e.useCallback(n=>{re.current=n},[]),te=e.useMemo(()=>{const n=e.Children.toArray(r),s=(p,Y)=>e.isValidElement(p)&&(p.type===Y||p.type?.displayName===Y.displayName);return n.some(p=>s(p,ee)||s(p,ne))},[r]),b=e.useMemo(()=>{const n=e.Children.toArray(r),s=(p,Y)=>e.isValidElement(p)&&(p.type===Y||p.type?.displayName===Y.displayName);return n.some(p=>s(p,fe))},[r]),P=e.useCallback(n=>{if(n==="sidebar"){const s=k.current(a.sidebarMode);T(s);return}R({type:"TOGGLE_PANE",target:n})},[a.sidebarMode,T]),oe=e.useCallback(n=>{if(n==="sidebar")return T("expanded");R({type:"EXPAND_PANE",target:n})},[T]),K=e.useCallback(n=>{if(n==="sidebar")return T("collapsed");R({type:"COLLAPSE_PANE",target:n})},[T]),se=e.useMemo(()=>({leftMode:a.leftMode,setLeftMode:w,panelMode:a.panelMode,setPanelMode:F,sidebarMode:a.sidebarMode,setSidebarMode:T,inspectorMode:a.inspectorMode,setInspectorMode:A,bottomMode:a.bottomMode,setBottomMode:I,hasLeft:H,setHasLeft:D,hasSidebar:z,setHasSidebar:j,currentBreakpoint:y,currentBreakpointReady:h,leftResolvedPresentation:O,togglePane:P,expandPane:oe,collapsePane:K,setSidebarToggleComputer:v,onLeftPres:N,onRailDefaults:Q,onPanelDefaults:q}),[a.leftMode,w,a.panelMode,F,a.sidebarMode,T,a.inspectorMode,A,a.bottomMode,I,H,z,y,h,O,P,oe,K,v,N,Q,q]),U=e.Children.toArray(r),B=(n,s)=>e.isValidElement(n)&&(n.type===s||n.type?.displayName===s.displayName),de=U.filter(n=>B(n,Re)),G=U.filter(n=>B(n,ee)),ae=U.filter(n=>B(n,ne)),ye=U.filter(n=>B(n,fe)),o=U.filter(n=>B(n,Pe)),S=U.filter(n=>B(n,xe)),C=U.filter(n=>B(n,ve)),g=G[0]?.props?.open;e.useEffect(()=>{if(typeof g>"u")return;w(!!g?"expanded":"collapsed")},[g,w]);const pe=e.useMemo(()=>i==="full"?{height:"100vh"}:i==="auto"?{height:"auto"}:typeof i=="string"?{height:i}:typeof i=="number"?{height:`${i}px`}:{},[i]),[X,le]=e.useState(null),ce=e.useCallback(n=>le(n),[]),ue=e.useCallback(()=>le(null),[]),De=e.useMemo(()=>({currentBreakpoint:y,currentBreakpointReady:h,leftResolvedPresentation:O}),[y,h,O]),Be=e.useMemo(()=>({leftMode:a.leftMode,setLeftMode:w}),[a.leftMode,w]),Ae=e.useMemo(()=>({panelMode:a.panelMode,setPanelMode:F}),[a.panelMode,F]),we=e.useMemo(()=>({sidebarMode:a.sidebarMode,setSidebarMode:T}),[a.sidebarMode,T]),Ie=e.useMemo(()=>({inspectorMode:a.inspectorMode,setInspectorMode:A}),[a.inspectorMode,A]),Ve=e.useMemo(()=>({bottomMode:a.bottomMode,setBottomMode:I}),[a.bottomMode,I]),He=e.useMemo(()=>({hasLeft:H,setHasLeft:D,hasSidebar:z,setHasSidebar:j}),[H,D,z,j]),[be,ge]=e.useState(new Set),Te=e.useCallback(n=>{ge(s=>{if(s.has(n))return s;const p=new Set(s);return p.add(n),p})},[]),Oe=e.useCallback(n=>{ge(s=>{if(!s.has(n))return s;const p=new Set(s);return p.delete(n),p})},[]),he=be.size>0,je=e.useMemo(()=>({insetPanes:be,registerInset:Te,unregisterInset:Oe,hasAnyInset:he}),[be,Te,Oe,he]),Ue=e.useMemo(()=>({peekTarget:X,setPeekTarget:le,peekPane:ce,clearPeek:ue}),[X,le,ce,ue]),We=e.useMemo(()=>({togglePane:P,expandPane:oe,collapsePane:K,setSidebarToggleComputer:v}),[P,oe,K,v]),Fe=e.useMemo(()=>({...se,peekTarget:X,setPeekTarget:le,peekPane:ce,clearPeek:ue}),[se,X,le,ce,ue]);return e.createElement("div",{...E,ref:f,className:J("rt-ShellRoot",t),style:{...pe,...E.style}},e.createElement(Je,{value:Fe},e.createElement(an.Provider,{value:De},e.createElement(Ze.Provider,{value:Be},e.createElement(en.Provider,{value:Ae},e.createElement(nn.Provider,{value:we},e.createElement(tn.Provider,{value:Ie},e.createElement(on.Provider,{value:Ve},e.createElement(sn.Provider,{value:He},e.createElement(ln.Provider,{value:Ue},e.createElement(rn.Provider,{value:We},e.createElement(dn.Provider,{value:je},de,e.createElement("div",{className:"rt-ShellBody","data-peek-target":X??void 0,"data-has-inset":he||void 0,style:X==="rail"||X==="panel"?{"--peek-rail-width":`${$.current}px`}:void 0},te&&!b?(()=>{const n=G[0],s=ae[0],p=!!n?.props?.inset||!!s?.props?.inset,Y=n?{onOpenChange:n.props?.onOpenChange,open:n.props?.open,defaultOpen:n.props?.defaultOpen,presentation:n.props?.presentation,collapsible:n.props?.collapsible,onExpand:n.props?.onExpand,onCollapse:n.props?.onCollapse,inset:p}:{defaultOpen:u?!0:void 0,inset:p};return e.createElement(Me,{...Y},G,ae)})():ye,o,S),C))))))))))))});Ne.displayName="Shell.Root";const Re=e.forwardRef(({className:t,height:r=64,style:i,...E},f)=>e.createElement("header",{...E,ref:f,className:J("rt-ShellHeader",t),style:{...i,"--shell-header-height":`${r}px`}}));Re.displayName="Shell.Header";const un=["open","defaultOpen","onOpenChange","mode","defaultMode","onModeChange"],Me=e.forwardRef((t,r)=>{const{className:i,presentation:E={initial:"fixed",sm:"fixed"},collapsible:f=!0,onExpand:y,onCollapse:h,children:m,style:u,inset:l,...c}=t,{registerInset:x,unregisterInset:V}=ze();e.useEffect(()=>{if(l)return x("left"),()=>V("left")},[l,x,V]);const _=c.open,M=c.defaultOpen,L=c.onOpenChange,W=qe(c,un),a=ie(),R=Le(E),w=R==="overlay",F=R==="stacked",T=e.useRef(null);e.useEffect(()=>{a.onLeftPres?.(R)},[a,R]);const A=e.useCallback(k=>{T.current=k,typeof r=="function"?r(k):r&&(r.current=k)},[r]);e.useEffect(()=>(a.setHasLeft(!0),()=>a.setHasLeft(!1)),[a]);const I=e.useRef(null),H=e.useRef(!1),D=e.useMemo(()=>{if(!(typeof _>"u"))return _?"expanded":"collapsed"},[_]),z=e.useMemo(()=>Ce(M),[M]);ke({controlledValue:D,defaultValue:z,currentValue:a.leftMode,setValue:a.setLeftMode,breakpointReady:a.currentBreakpointReady,onInit:k=>L?.(k==="expanded",{reason:"init"})}),e.useEffect(()=>{typeof _<"u"||(I.current!==null&&I.current!==a.leftMode&&L?.(a.leftMode==="expanded",{reason:"toggle"}),I.current=a.leftMode)},[a,L,_]),e.useEffect(()=>{a.leftMode==="expanded"?y?.():h?.()},[a.leftMode,y,h]);const j=a.leftMode==="expanded";if(w){const k=a.leftMode==="expanded",v=e.Children.toArray(m),O=(b,P)=>e.isValidElement(b)&&b.type===P,d=v.find(b=>O(b,ee)),N=v.find(b=>O(b,ne)),$=typeof d?.props?.expandedSize=="number"?d.props.expandedSize:64,re=typeof N?.props?.expandedSize=="number"?N.props.expandedSize:288,Q=!!d,q=!!N,te=(Q?$:0)+(a.panelMode==="expanded"&&q?re:0);return e.createElement(Se.Root,{open:k,onOpenChange:b=>a.setLeftMode(b?"expanded":"collapsed")},e.createElement(Se.Content,{side:"start",style:{padding:0},width:{initial:`${te}px`}},e.createElement($e,null,e.createElement(Se.Title,null,"Navigation")),e.createElement("div",{className:"rt-ShellLeft"},m)))}if(F){const k=a.leftMode==="expanded",v=e.Children.toArray(m),O=(b,P)=>e.isValidElement(b)&&b.type===P,d=v.find(b=>O(b,ee)),N=v.find(b=>O(b,ne)),$=typeof d?.props?.expandedSize=="number"?d.props.expandedSize:64,re=typeof N?.props?.expandedSize=="number"?N.props.expandedSize:288,Q=!!d,te=!!N&&(a.panelMode==="expanded"||a.peekTarget==="panel");return e.createElement("div",{...W,ref:A,className:J("rt-ShellLeft",i),"data-mode":a.leftMode,"data-peek":a.peekTarget==="left"||a.peekTarget==="rail"||a.peekTarget==="panel"||void 0,"data-presentation":R,"data-inset":l||void 0,style:{...u},"data-open":k||void 0},m)}return e.createElement("div",{...W,ref:A,className:J("rt-ShellLeft",i),"data-mode":a.leftMode,"data-peek":a.peekTarget==="left"||a.peekTarget==="rail"||a.peekTarget==="panel"||void 0,"data-presentation":R,"data-inset":l||void 0,style:{...u}},m)});Me.displayName="Shell.Left",Z(Me,"Shell.Left");const ee=e.forwardRef((t,r)=>{const{className:i,presentation:E,expandedSize:f=64,collapsible:y,onExpand:h,onCollapse:m,children:u,style:l,open:c,defaultOpen:x,onOpenChange:V,..._}=t,M=ie(),L=e.useRef(null);e.useEffect(()=>{const a=typeof c<"u";if(L.current===null){L.current=a;return}L.current!==a&&(console.warn("Shell.Rail: Switching between controlled and uncontrolled `open` is not supported."),L.current=a)},[c]),e.useEffect(()=>{M.onRailDefaults?.(f)},[M,f]);const W=M.leftMode==="expanded";return e.createElement("div",{..._,ref:r,className:J("rt-ShellRail",i),"data-mode":M.leftMode,"data-peek":M.currentBreakpointReady&&M.leftResolvedPresentation!=="overlay"&&M.peekTarget==="rail"||void 0,style:{...l,"--rail-size":`${f}px`}},e.createElement("div",{className:"rt-ShellRailContent","data-visible":M.currentBreakpointReady&&(W||M.leftResolvedPresentation!=="overlay"&&M.peekTarget==="rail")||void 0},u))});ee.displayName="Shell.Rail",Z(ee,"Shell.Rail");const fn=["className","children","defaultOpen","open","onOpenChange","size","defaultSize","onSizeChange","sizeUpdate","sizeUpdateMs","style"],ne=Z(e.forwardRef((t,r)=>{const{className:i,defaultOpen:E,open:f,onOpenChange:y,size:h,defaultSize:m,expandedSize:u=288,minSize:l,maxSize:c,resizable:x,collapsible:V=!0,onExpand:_,onCollapse:M,onResize:L,onResizeStart:W,onResizeEnd:a,snapPoints:R,snapTolerance:w,collapseThreshold:F,paneId:T,persistence:A,children:I,style:H,onSizeChange:D,sizeUpdate:z,sizeUpdateMs:j=50}=t,k=Ke(t,fn),v=e.useRef(null);e.useEffect(()=>()=>{v.current&&(clearTimeout(v.current),v.current=null)},[D,z,j]);const O=e.useMemo(()=>{if(!D)return()=>{};if(z==="debounce")return(S,C)=>{v.current&&clearTimeout(v.current),v.current=setTimeout(()=>{D?.(S,C),v.current=null},j)};if(z==="throttle"){let o=0;return(S,C)=>{const g=Date.now();g-o>=j&&(o=g,D?.(S,C))}}return(o,S)=>D?.(o,S)},[D,z,j]),d=ie(),N=e.useRef(null),$=e.useRef(null),re=e.useRef(!1),Q=e.useMemo(()=>Ce(f),[f]),q=e.useMemo(()=>Ce(E),[E]),te=typeof f=="object"&&f!==null;ke({controlledValue:Q,defaultValue:q,currentValue:d.panelMode,setValue:o=>{o==="expanded"&&d.leftMode!=="expanded"&&d.setLeftMode("expanded"),d.setPanelMode(o)},breakpointReady:d.currentBreakpointReady,controlledIsResponsive:te,onResponsiveChange:o=>y?.(o==="expanded",{reason:"responsive"}),onInit:o=>{typeof f>"u"&&y?.(o==="expanded",{reason:"init"})}});const b=e.useRef(null);e.useEffect(()=>{const o=typeof f<"u";if(b.current===null){b.current=o;return}b.current!==o&&(console.warn("Shell.Panel: Switching between controlled and uncontrolled `open` is not supported."),b.current=o)},[f]),e.useEffect(()=>{d.onPanelDefaults?.(u)},[d,u]);const P=e.useRef(null),oe=e.useCallback(o=>{P.current=o,typeof r=="function"?r(o):r&&(r.current=o)},[r]),K=e.Children.toArray(I),se=K.filter(o=>e.isValidElement(o)&&o.type===Ee),U=K.filter(o=>!(e.isValidElement(o)&&o.type===Ee)),B=d.leftResolvedPresentation==="overlay",de=e.useCallback(o=>Ye(o,"horizontal"),[]),G=e.useMemo(()=>{if(!T||A)return A;const o=`kookie-ui:shell:panel:${T}`;return{load:()=>{if(typeof window>"u")return;const C=window.localStorage.getItem(o);return C?Number(C):void 0},save:C=>{typeof window>"u"||window.localStorage.setItem(o,String(C))}}},[T,A]);e.useEffect(()=>{let o=!0;return(async()=>{if(!x||!G?.load||B)return;const S=await G.load();o&&typeof S=="number"&&P.current&&(P.current.style.setProperty("--panel-size",`${S}px`),L?.(S))})(),()=>{o=!1}},[x,G,L,B]),e.useEffect(()=>{P.current&&B&&P.current.style.setProperty("--panel-size",`${u}px`)},[B,u]),e.useEffect(()=>{if(P.current&&typeof h>"u"&&typeof m<"u"){const o=de(m);if(typeof o=="number"&&Number.isFinite(o)){const g=Math.min((typeof c=="number"?c:void 0)??o,Math.max((typeof l=="number"?l:void 0)??o,o));P.current.style.setProperty("--panel-size",`${g}px`),O(g,{reason:"init"})}}},[]),e.useEffect(()=>{if(!P.current||typeof h>"u")return;const o=de(h);if(typeof o=="number"&&Number.isFinite(o)){const g=Math.min((typeof c=="number"?c:void 0)??o,Math.max((typeof l=="number"?l:void 0)??o,o));P.current.style.setProperty("--panel-size",`${g}px`),O(g,{reason:"controlled"})}},[h,l,c,de,O]),e.useEffect(()=>{if(P.current&&d.leftResolvedPresentation!=="overlay"&&d.leftMode==="expanded"&&d.panelMode==="expanded"){const o=P.current.parentElement||null;try{o?.style.removeProperty("width")}catch{}}},[d.leftResolvedPresentation,d.leftMode,d.panelMode]);const ae=d.leftMode==="expanded"&&d.panelMode==="expanded";e.useEffect(()=>{const o=N.current,S=$.current;if(o!==null&&o!==d.panelMode){const C=d.panelMode==="expanded";let g="toggle";S!==d.leftMode&&d.leftMode==="collapsed"&&!C&&(g="left"),y?.(C,{reason:g})}N.current=d.panelMode,$.current=d.leftMode},[d.panelMode,d.leftMode,y]);const ye=x&&d.leftResolvedPresentation!=="overlay"&&ae?e.createElement(Ge.Provider,{value:{containerRef:P,cssVarName:"--panel-size",minSize:typeof l=="number"?l:100,maxSize:typeof c=="number"?c:800,defaultSize:u,orientation:"vertical",edge:"end",computeNext:(o,S,C)=>{const g=getComputedStyle(P.current).direction==="rtl",pe=o-S;return C+(g?-pe:pe)},onResize:L,onResizeStart:o=>{const C=P.current?.parentElement;try{C?.style.removeProperty("width")}catch{}W?.(o)},onResizeEnd:o=>{a?.(o),O(o,{reason:"resize"}),G?.save?.(o)},target:"panel",collapsible:!!V,snapPoints:R,snapTolerance:w??8,collapseThreshold:F,requestCollapse:()=>d.setPanelMode("collapsed"),requestToggle:()=>d.togglePane("panel")}},se.length>0?se.map((o,S)=>e.cloneElement(o,{key:o.key??S})):e.createElement(Qe,null)):null;return e.createElement("div",{...k,ref:oe,className:J("rt-ShellPanel",i),"data-mode":d.panelMode,"data-visible":d.currentBreakpointReady&&(ae||d.leftResolvedPresentation!=="overlay"&&d.peekTarget==="panel")||void 0,"data-peek":d.currentBreakpointReady&&d.leftResolvedPresentation!=="overlay"&&d.peekTarget==="panel"||void 0,style:{...H,"--panel-size":`${u}px`}},e.createElement("div",{className:"rt-ShellPanelContent","data-visible":ae||void 0},U),ye)}),"Shell.Panel");ne.displayName="Shell.Panel",ne.Handle=Ee;const Pe=e.forwardRef(({className:t,inset:r,...i},E)=>{const{registerInset:f,unregisterInset:y}=ze();return e.useEffect(()=>{if(r)return f("content"),()=>y("content")},[r,f,y]),e.createElement("main",{...i,ref:E,className:J("rt-ShellContent",t),"data-inset":r||void 0})});Pe.displayName="Shell.Content",Z(Pe,"Shell.Content");const _e=e.forwardRef(({target:t,action:r="toggle",peekOnHover:i,onClick:E,onMouseEnter:f,onMouseLeave:y,children:h,...m},u)=>{const l=ie(),c=e.useCallback(M=>{switch(E?.(M),l.peekTarget===t&&l.clearPeek(),r){case"toggle":l.togglePane(t);break;case"expand":l.expandPane(t);break;case"collapse":l.collapsePane(t);break}},[l,t,r,E]),x=(()=>{switch(t){case"left":case"rail":return l.leftMode==="collapsed";case"panel":return l.leftMode==="collapsed"||l.panelMode==="collapsed";case"sidebar":return l.sidebarMode==="collapsed";case"inspector":return l.inspectorMode==="collapsed";case"bottom":return l.bottomMode==="collapsed"}})(),V=e.useCallback(M=>{f?.(M),!(!i||!x)&&l.peekPane(t)},[f,i,x,l,t]),_=e.useCallback(M=>{y?.(M),i&&l.peekTarget===t&&l.clearPeek()},[y,i,l,t]);return e.createElement("button",{...m,ref:u,onClick:c,onMouseEnter:V,onMouseLeave:_,"data-shell-trigger":t,"data-shell-action":r,"aria-expanded":!x},h)});_e.displayName="Shell.Trigger";export{ve as Bottom,Pe as Content,Re as Header,xe as Inspector,Me as Left,ne as Panel,ee as Rail,Ne as Root,fe as Sidebar,_e as Trigger,Le as useResponsivePresentation,ie as useShell};
|
|
2
2
|
//# sourceMappingURL=shell.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/shell.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Shell Component - Layout Engine + Chrome\n *\n * Philosophy:\n * - Shell = layout engine + chrome\n * - Manages layout state: expanded/collapsed, fixed/overlay, sizes\n * - Does not manage content/navigation state\n * - Provides unstyled primitives (slots, triggers)\n * - Enforces composition rules (Rail \u2194 Panel dependency, Sidebar exclusivity)\n *\n * Core Slots:\n * - Header: global top bar\n * - Rail: slim nav strip\n * - Panel: sidebar next to rail\n * - Sidebar: alternative to Rail+Panel (exclusive)\n * - Content: main work area\n * - Inspector: right-side panel\n * - Bottom: bottom panel\n *\n * Composition Rules:\n * - Rail + Panel: valid together (Rail collapse \u2192 Panel collapse)\n * - Sidebar: cannot coexist with Rail or Panel\n * - Content: always required\n * - Inspector/Bottom: optional, independent\n */\n'use client';\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport * as Sheet from './sheet.js';\nimport { VisuallyHidden } from './visually-hidden.js';\nimport { useResponsivePresentation, useResponsiveInitialState } from './shell.hooks.js';\nimport { PaneResizeContext } from './_internal/shell-resize.js';\nimport { PaneHandle, PanelHandle } from './_internal/shell-handles.js';\nimport { omitPaneProps, extractPaneDomProps, mapResponsiveBooleanToPaneMode } from './_internal/shell-prop-helpers.js';\nimport { Sidebar } from './_internal/shell-sidebar.js';\nimport { Bottom } from './_internal/shell-bottom.js';\nimport { Inspector } from './_internal/shell-inspector.js';\nimport type { PresentationValue, ResponsivePresentation, PaneMode, SidebarMode, PaneSizePersistence, Breakpoint, PaneTarget, Responsive, PaneBaseProps, CSSPropertiesWithVars } from './shell.types.js';\nimport { _BREAKPOINTS } from './shell.types.js';\nimport { normalizeToPx } from '../helpers/normalize-to-px.js';\nimport {\n ShellProvider,\n useShell,\n LeftModeContext,\n PanelModeContext,\n SidebarModeContext,\n InspectorModeContext,\n BottomModeContext,\n PresentationContext,\n PeekContext,\n ActionsContext,\n CompositionContext,\n InsetContext,\n useInset,\n type InsetPaneId,\n} from './shell.context.js';\n\n// Shell context is provided via ShellProvider (see shell.context.tsx)\n\n// Pane resize context moved to ./_internal/shell-resize\n\n// Local PaneHandle moved to ./_internal/shell-handles\n// Removed local PaneHandle implementation; using internal PaneHandle\n\n// Composed Handle wrappers per pane\n// Handles moved to ./_internal/shell-handles\n\n// Hook to resolve responsive presentation\n// useResponsivePresentation moved to shell.hooks.ts\n\n// Hook to resolve responsive mode defaults\n// Removed: defaultMode responsiveness\n\n// Hook to get current breakpoint\nfunction useBreakpoint(): { bp: Breakpoint; ready: boolean } {\n const [currentBp, setCurrentBp] = React.useState<Breakpoint>('initial');\n const [ready, setReady] = React.useState(false);\n\n React.useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const queries = Object.entries(_BREAKPOINTS) as [keyof typeof _BREAKPOINTS, string][];\n const mqls = queries.map(([k, q]) => [k, window.matchMedia(q)] as const);\n\n // Accept optional event param to satisfy MediaQueryList listener signature\n const compute = (_e?: MediaQueryListEvent) => {\n // Highest matched wins\n const matched = mqls.filter(([, m]) => m.matches).map(([k]) => k);\n const next = (matched[matched.length - 1] as Breakpoint | undefined) ?? 'initial';\n setCurrentBp(next);\n setReady(true);\n };\n\n compute();\n const cleanups: Array<() => void> = [];\n mqls.forEach(([, m]) => {\n const mm = m as MediaQueryList & {\n addEventListener?: (type: 'change', listener: (e: MediaQueryListEvent) => void) => void;\n removeEventListener?: (type: 'change', listener: (e: MediaQueryListEvent) => void) => void;\n addListener?: (listener: (e: MediaQueryListEvent) => void) => void;\n removeListener?: (listener: (e: MediaQueryListEvent) => void) => void;\n };\n if (typeof mm.addEventListener === 'function' && typeof mm.removeEventListener === 'function') {\n mm.addEventListener('change', compute);\n cleanups.push(() => mm.removeEventListener?.('change', compute));\n } else if (typeof mm.addListener === 'function' && typeof mm.removeListener === 'function') {\n mm.addListener(compute);\n cleanups.push(() => mm.removeListener?.(compute));\n }\n });\n\n return () => {\n cleanups.forEach((fn) => {\n try {\n fn();\n } catch {}\n });\n };\n }, []);\n\n return { bp: currentBp, ready };\n}\n\n// Reducer-based pane state management to simplify cascading rules\ntype PaneState = {\n leftMode: PaneMode;\n panelMode: PaneMode;\n sidebarMode: SidebarMode;\n inspectorMode: PaneMode;\n bottomMode: PaneMode;\n};\n\ntype PaneAction =\n | { type: 'SET_LEFT_MODE'; mode: PaneMode }\n | { type: 'SET_PANEL_MODE'; mode: PaneMode }\n | { type: 'SET_SIDEBAR_MODE'; mode: SidebarMode }\n | { type: 'SET_INSPECTOR_MODE'; mode: PaneMode }\n | { type: 'SET_BOTTOM_MODE'; mode: PaneMode }\n | { type: 'TOGGLE_PANE'; target: PaneTarget }\n | { type: 'EXPAND_PANE'; target: PaneTarget }\n | { type: 'COLLAPSE_PANE'; target: PaneTarget };\n\nconst SHELL_SLOT = Symbol('rtShellSlot');\n\nfunction assignShellSlot<T extends React.ComponentType<any>>(component: T, slot: string): T {\n (component as any)[SHELL_SLOT] = slot;\n return component;\n}\n\nfunction isShellComponent(element: React.ReactElement, component: any): boolean {\n if (!React.isValidElement(element)) return false;\n const type: any = element.type;\n if (type === component) return true;\n const targetSlot = (component as any)?.[SHELL_SLOT];\n return Boolean(type?.[SHELL_SLOT] && targetSlot && type[SHELL_SLOT] === targetSlot);\n}\n\n// Tag imported slot components so isType remains stable after minification\nassignShellSlot(Sidebar as any, 'Shell.Sidebar');\nassignShellSlot(Inspector as any, 'Shell.Inspector');\nassignShellSlot(Bottom as any, 'Shell.Bottom');\n\nfunction paneReducer(state: PaneState, action: PaneAction): PaneState {\n switch (action.type) {\n case 'SET_LEFT_MODE': {\n // Collapsing left cascades to panel collapse\n if (action.mode === 'collapsed') {\n return { ...state, leftMode: 'collapsed', panelMode: 'collapsed' };\n }\n return { ...state, leftMode: action.mode };\n }\n case 'SET_PANEL_MODE': {\n // Expanding panel ensures left is expanded\n if (action.mode === 'expanded' && state.leftMode !== 'expanded') {\n return { ...state, leftMode: 'expanded', panelMode: 'expanded' };\n }\n return { ...state, panelMode: action.mode };\n }\n case 'SET_SIDEBAR_MODE':\n return { ...state, sidebarMode: action.mode };\n case 'SET_INSPECTOR_MODE':\n return { ...state, inspectorMode: action.mode };\n case 'SET_BOTTOM_MODE':\n return { ...state, bottomMode: action.mode };\n case 'TOGGLE_PANE': {\n switch (action.target) {\n case 'left':\n case 'rail':\n return { ...state, leftMode: state.leftMode === 'expanded' ? 'collapsed' : 'expanded', panelMode: state.leftMode === 'expanded' ? 'collapsed' : state.panelMode };\n case 'panel': {\n if (state.leftMode === 'collapsed') {\n return { ...state, leftMode: 'expanded', panelMode: 'expanded' };\n }\n return { ...state, panelMode: state.panelMode === 'expanded' ? 'collapsed' : 'expanded' };\n }\n case 'sidebar': {\n // Sidebar toggle sequencing is handled externally via setSidebarToggleComputer\n // This reducer only flips between expanded<->collapsed by default; thin is set by caller\n const next: SidebarMode = state.sidebarMode === 'collapsed' ? 'expanded' : state.sidebarMode === 'expanded' ? 'collapsed' : 'expanded';\n return { ...state, sidebarMode: next };\n }\n case 'inspector':\n return { ...state, inspectorMode: state.inspectorMode === 'expanded' ? 'collapsed' : 'expanded' };\n case 'bottom':\n return { ...state, bottomMode: state.bottomMode === 'expanded' ? 'collapsed' : 'expanded' };\n default:\n return state;\n }\n // Fallback to satisfy no-fallthrough in some environments\n return state;\n }\n case 'EXPAND_PANE': {\n switch (action.target) {\n case 'left':\n case 'rail':\n return { ...state, leftMode: 'expanded' };\n case 'panel':\n return { ...state, leftMode: 'expanded', panelMode: 'expanded' };\n case 'sidebar':\n return { ...state, sidebarMode: 'expanded' };\n case 'inspector':\n return { ...state, inspectorMode: 'expanded' };\n case 'bottom':\n return { ...state, bottomMode: 'expanded' };\n default:\n return state;\n }\n // Fallback to satisfy no-fallthrough in some environments\n return state;\n }\n case 'COLLAPSE_PANE': {\n switch (action.target) {\n case 'left':\n case 'rail':\n return { ...state, leftMode: 'collapsed', panelMode: 'collapsed' };\n case 'panel':\n return { ...state, panelMode: 'collapsed' };\n case 'sidebar':\n return { ...state, sidebarMode: 'collapsed' };\n case 'inspector':\n return { ...state, inspectorMode: 'collapsed' };\n case 'bottom':\n return { ...state, bottomMode: 'collapsed' };\n default:\n return state;\n }\n // Fallback to satisfy no-fallthrough in some environments\n return state;\n }\n }\n return state;\n}\n\n// Root Component\ninterface ShellRootProps extends React.ComponentPropsWithoutRef<'div'> {\n children: React.ReactNode;\n height?: 'full' | 'auto' | string | number;\n}\n\nconst Root = React.forwardRef<HTMLDivElement, ShellRootProps>(({ className, children, height = 'full', ...props }, ref) => {\n const { bp: currentBreakpoint, ready: currentBreakpointReady } = useBreakpoint();\n\n // Compute initial defaults from immediate children (one-time, uncontrolled defaults)\n const initialChildren = React.Children.toArray(children) as React.ReactElement[];\n const hasPanelDefaultOpen = initialChildren.some((el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Panel' && Boolean((el as any).props?.defaultOpen));\n // Rail defaults to open (true) unless explicitly set to false\n // Supports responsive objects: { initial: false, md: true }\n const railEl = initialChildren.find((el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Rail');\n const railDefaultOpen = railEl ? (railEl as any).props?.defaultOpen : undefined;\n const hasRailDefaultOpen = (() => {\n if (!railEl) return false;\n if (railDefaultOpen === undefined) return true; // Default to open\n if (typeof railDefaultOpen === 'boolean') return railDefaultOpen;\n // Responsive object - use 'initial' value, or first defined value, or default true\n if (typeof railDefaultOpen === 'object') {\n return railDefaultOpen.initial ?? Object.values(railDefaultOpen)[0] ?? true;\n }\n return true;\n })();\n const hasInspectorDefaultOpen = initialChildren.some((el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Inspector' && Boolean((el as any).props?.defaultOpen));\n const hasInspectorOpenControlled = initialChildren.some(\n (el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Inspector' && typeof (el as any).props?.open !== 'undefined' && Boolean((el as any).props?.open),\n );\n\n // Detect Sidebar initial state from props\n const getSidebarInitialState = (): SidebarMode => {\n const sidebarEl = initialChildren.find((el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Sidebar');\n if (!sidebarEl) return 'expanded';\n const props = (sidebarEl as any).props;\n // Check controlled state first\n if (typeof props?.state !== 'undefined') {\n if (typeof props.state === 'string') return props.state as SidebarMode;\n // Responsive object - use 'initial' breakpoint or first defined value\n if (typeof props.state === 'object') {\n return (props.state.initial ?? Object.values(props.state)[0] ?? 'expanded') as SidebarMode;\n }\n }\n // Check defaultState\n if (typeof props?.defaultState !== 'undefined') {\n if (typeof props.defaultState === 'string') return props.defaultState as SidebarMode;\n if (typeof props.defaultState === 'object') {\n return (props.defaultState.initial ?? Object.values(props.defaultState)[0] ?? 'expanded') as SidebarMode;\n }\n }\n return 'expanded';\n };\n\n // Detect Bottom initial state from props\n const getBottomInitialState = (): PaneMode => {\n const bottomEl = initialChildren.find((el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Bottom');\n if (!bottomEl) return 'collapsed';\n const props = (bottomEl as any).props;\n // Check controlled open first\n if (typeof props?.open !== 'undefined') {\n if (typeof props.open === 'boolean') return props.open ? 'expanded' : 'collapsed';\n // Responsive object - use 'initial' breakpoint or first defined value\n if (typeof props.open === 'object') {\n const val = props.open.initial ?? Object.values(props.open)[0];\n return val ? 'expanded' : 'collapsed';\n }\n }\n // Check defaultOpen\n if (typeof props?.defaultOpen !== 'undefined') {\n return props.defaultOpen ? 'expanded' : 'collapsed';\n }\n return 'collapsed';\n };\n\n // Pane state management via reducer\n const [paneState, dispatchPane] = React.useReducer(paneReducer, {\n leftMode: hasPanelDefaultOpen || hasRailDefaultOpen ? 'expanded' : 'collapsed',\n panelMode: hasPanelDefaultOpen ? 'expanded' : 'collapsed',\n sidebarMode: getSidebarInitialState(),\n inspectorMode: hasInspectorDefaultOpen || hasInspectorOpenControlled ? 'expanded' : 'collapsed',\n bottomMode: getBottomInitialState(),\n });\n const setLeftMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_LEFT_MODE', mode }), []);\n const setPanelMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_PANEL_MODE', mode }), []);\n const setSidebarMode = React.useCallback((mode: SidebarMode) => dispatchPane({ type: 'SET_SIDEBAR_MODE', mode }), []);\n const setInspectorMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_INSPECTOR_MODE', mode }), []);\n const setBottomMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_BOTTOM_MODE', mode }), []);\n\n // Removed: defaultMode responsiveness and manual change tracking\n\n // Composition detection\n const [hasLeft, setHasLeft] = React.useState(false);\n const [hasSidebar, setHasSidebar] = React.useState(false);\n\n // Customizable sidebar toggle sequencing\n const sidebarToggleComputerRef = React.useRef<(current: SidebarMode) => SidebarMode>((current) => (current === 'collapsed' ? 'thin' : current === 'thin' ? 'expanded' : 'collapsed'));\n const setSidebarToggleComputer = React.useCallback((fn: (current: SidebarMode) => SidebarMode) => {\n sidebarToggleComputerRef.current = fn;\n }, []);\n\n // Reducer handles left\u2192panel cascade; no effect needed\n\n // Composition validation\n React.useEffect(() => {\n if (hasSidebar && hasLeft) {\n console.warn('Shell: Sidebar cannot coexist with Rail or Panel. Use either Rail+Panel OR Sidebar.');\n }\n }, [hasSidebar, hasLeft]);\n\n // Left presentation + defaults from children\n const [devLeftPres, setDevLeftPres] = React.useState<PresentationValue | undefined>(undefined);\n const onLeftPres = React.useCallback((p: PresentationValue) => setDevLeftPres(p), []);\n const railDefaultSizeRef = React.useRef<number>(64);\n const panelDefaultSizeRef = React.useRef<number>(288);\n const onRailDefaults = React.useCallback((size: number) => {\n railDefaultSizeRef.current = size;\n }, []);\n const onPanelDefaults = React.useCallback((size: number) => {\n panelDefaultSizeRef.current = size;\n }, []);\n\n // Determine children presence for left composition\n const hasLeftChildren = React.useMemo(() => {\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && (el.type === comp || (el as any).type?.displayName === comp.displayName);\n return childArray.some((el) => isType(el, Rail) || isType(el, Panel));\n }, [children]);\n\n const hasSidebarChildren = React.useMemo(() => {\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && (el.type === comp || (el as any).type?.displayName === comp.displayName);\n return childArray.some((el) => isType(el, Sidebar));\n }, [children]);\n\n const togglePane = React.useCallback(\n (target: PaneTarget) => {\n if (target === 'sidebar') {\n const next = sidebarToggleComputerRef.current(paneState.sidebarMode as SidebarMode);\n setSidebarMode(next);\n return;\n }\n dispatchPane({ type: 'TOGGLE_PANE', target });\n },\n [paneState.sidebarMode, setSidebarMode],\n );\n\n const expandPane = React.useCallback(\n (target: PaneTarget) => {\n if (target === 'sidebar') return setSidebarMode('expanded');\n dispatchPane({ type: 'EXPAND_PANE', target });\n },\n [setSidebarMode],\n );\n\n const collapsePane = React.useCallback(\n (target: PaneTarget) => {\n if (target === 'sidebar') return setSidebarMode('collapsed');\n dispatchPane({ type: 'COLLAPSE_PANE', target });\n },\n [setSidebarMode],\n );\n\n const baseContextValue = React.useMemo(\n () => ({\n leftMode: paneState.leftMode,\n setLeftMode,\n panelMode: paneState.panelMode,\n setPanelMode,\n sidebarMode: paneState.sidebarMode,\n setSidebarMode,\n inspectorMode: paneState.inspectorMode,\n setInspectorMode,\n bottomMode: paneState.bottomMode,\n setBottomMode,\n hasLeft,\n setHasLeft,\n hasSidebar,\n setHasSidebar,\n currentBreakpoint,\n currentBreakpointReady,\n leftResolvedPresentation: devLeftPres,\n togglePane,\n expandPane,\n collapsePane,\n setSidebarToggleComputer,\n onLeftPres,\n onRailDefaults,\n onPanelDefaults,\n }),\n [\n paneState.leftMode,\n setLeftMode,\n paneState.panelMode,\n setPanelMode,\n paneState.sidebarMode,\n setSidebarMode,\n paneState.inspectorMode,\n setInspectorMode,\n paneState.bottomMode,\n setBottomMode,\n hasLeft,\n hasSidebar,\n currentBreakpoint,\n currentBreakpointReady,\n devLeftPres,\n togglePane,\n expandPane,\n collapsePane,\n setSidebarToggleComputer,\n onLeftPres,\n onRailDefaults,\n onPanelDefaults,\n ],\n );\n\n // Organize children by type\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && (el.type === comp || (el as any).type?.displayName === comp.displayName);\n\n const headerEls = childArray.filter((el) => isType(el, Header));\n const railEls = childArray.filter((el) => isType(el, Rail));\n const panelEls = childArray.filter((el) => isType(el, Panel));\n const sidebarEls = childArray.filter((el) => isType(el, Sidebar));\n const contentEls = childArray.filter((el) => isType(el, Content));\n const inspectorEls = childArray.filter((el) => isType(el, Inspector));\n const bottomEls = childArray.filter((el) => isType(el, Bottom));\n\n // Controlled sync in Root: mirror first Rail.open if provided\n const firstRailOpen = (railEls[0] as any)?.props?.open;\n React.useEffect(() => {\n if (typeof firstRailOpen === 'undefined') return;\n const shouldOpen = Boolean(firstRailOpen);\n setLeftMode(shouldOpen ? 'expanded' : 'collapsed');\n }, [firstRailOpen, setLeftMode]);\n\n const heightStyle = React.useMemo(() => {\n if (height === 'full') return { height: '100vh' };\n if (height === 'auto') return { height: 'auto' };\n if (typeof height === 'string') return { height };\n if (typeof height === 'number') return { height: `${height}px` };\n return {};\n }, [height]);\n\n // Peek state (layout-only overlay without mode changes)\n const [peekTarget, setPeekTarget] = React.useState<PaneTarget | null>(null);\n const peekPane = React.useCallback((target: PaneTarget) => setPeekTarget(target), []);\n const clearPeek = React.useCallback(() => setPeekTarget(null), []);\n\n // Memoized slice context values to avoid notifying unrelated consumers\n const presentationCtxValue = React.useMemo(() => ({ currentBreakpoint, currentBreakpointReady, leftResolvedPresentation: devLeftPres }), [currentBreakpoint, currentBreakpointReady, devLeftPres]);\n const leftModeCtxValue = React.useMemo(() => ({ leftMode: paneState.leftMode, setLeftMode }), [paneState.leftMode, setLeftMode]);\n const panelModeCtxValue = React.useMemo(() => ({ panelMode: paneState.panelMode, setPanelMode }), [paneState.panelMode, setPanelMode]);\n const sidebarModeCtxValue = React.useMemo(() => ({ sidebarMode: paneState.sidebarMode, setSidebarMode }), [paneState.sidebarMode, setSidebarMode]);\n const inspectorModeCtxValue = React.useMemo(() => ({ inspectorMode: paneState.inspectorMode, setInspectorMode }), [paneState.inspectorMode, setInspectorMode]);\n const bottomModeCtxValue = React.useMemo(() => ({ bottomMode: paneState.bottomMode, setBottomMode }), [paneState.bottomMode, setBottomMode]);\n const compositionCtxValue = React.useMemo(() => ({ hasLeft, setHasLeft, hasSidebar, setHasSidebar }), [hasLeft, setHasLeft, hasSidebar, setHasSidebar]);\n\n // Inset state management\n const [insetPanes, setInsetPanes] = React.useState<Set<InsetPaneId>>(new Set());\n const registerInset = React.useCallback((id: InsetPaneId) => {\n setInsetPanes((prev) => {\n if (prev.has(id)) return prev;\n const next = new Set(prev);\n next.add(id);\n return next;\n });\n }, []);\n const unregisterInset = React.useCallback((id: InsetPaneId) => {\n setInsetPanes((prev) => {\n if (!prev.has(id)) return prev;\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n }, []);\n const hasAnyInset = insetPanes.size > 0;\n const insetCtxValue = React.useMemo(\n () => ({ insetPanes, registerInset, unregisterInset, hasAnyInset }),\n [insetPanes, registerInset, unregisterInset, hasAnyInset],\n );\n const peekCtxValue = React.useMemo(() => ({ peekTarget, setPeekTarget, peekPane, clearPeek }), [peekTarget, setPeekTarget, peekPane, clearPeek]);\n const actionsCtxValue = React.useMemo(() => ({ togglePane, expandPane, collapsePane, setSidebarToggleComputer }), [togglePane, expandPane, collapsePane, setSidebarToggleComputer]);\n\n // Memoized full context value for ShellProvider to prevent unnecessary effect re-runs\n const shellContextValue = React.useMemo(\n () => ({\n ...baseContextValue,\n peekTarget,\n setPeekTarget,\n peekPane,\n clearPeek,\n }),\n [baseContextValue, peekTarget, setPeekTarget, peekPane, clearPeek],\n );\n\n return (\n <div {...props} ref={ref} className={classNames('rt-ShellRoot', className)} style={{ ...heightStyle, ...props.style }}>\n <ShellProvider value={shellContextValue}>\n <PresentationContext.Provider value={presentationCtxValue}>\n <LeftModeContext.Provider value={leftModeCtxValue}>\n <PanelModeContext.Provider value={panelModeCtxValue}>\n <SidebarModeContext.Provider value={sidebarModeCtxValue}>\n <InspectorModeContext.Provider value={inspectorModeCtxValue}>\n <BottomModeContext.Provider value={bottomModeCtxValue}>\n <CompositionContext.Provider value={compositionCtxValue}>\n <PeekContext.Provider value={peekCtxValue}>\n <ActionsContext.Provider value={actionsCtxValue}>\n <InsetContext.Provider value={insetCtxValue}>\n {headerEls}\n <div\n className=\"rt-ShellBody\"\n data-peek-target={peekTarget ?? undefined}\n data-has-inset={hasAnyInset || undefined}\n style={\n peekTarget === 'rail' || peekTarget === 'panel'\n ? ({\n '--peek-rail-width': `${railDefaultSizeRef.current}px`,\n } as CSSPropertiesWithVars)\n : undefined\n }\n >\n {hasLeftChildren && !hasSidebarChildren\n ? (() => {\n const firstRail = railEls[0] as any;\n const firstPanel = panelEls[0] as any;\n const leftInset = Boolean(firstRail?.props?.inset) || Boolean(firstPanel?.props?.inset);\n const passthroughProps = firstRail\n ? {\n // Notification passthrough used by Left; not spread to DOM in Left\n onOpenChange: firstRail.props?.onOpenChange,\n open: firstRail.props?.open,\n defaultOpen: firstRail.props?.defaultOpen,\n presentation: firstRail.props?.presentation,\n collapsible: firstRail.props?.collapsible,\n onExpand: firstRail.props?.onExpand,\n onCollapse: firstRail.props?.onCollapse,\n inset: leftInset,\n }\n : { defaultOpen: hasPanelDefaultOpen ? true : undefined, inset: leftInset };\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 </InsetContext.Provider>\n </ActionsContext.Provider>\n </PeekContext.Provider>\n </CompositionContext.Provider>\n </BottomModeContext.Provider>\n </InspectorModeContext.Provider>\n </SidebarModeContext.Provider>\n </PanelModeContext.Provider>\n </LeftModeContext.Provider>\n </PresentationContext.Provider>\n </ShellProvider>\n </div>\n );\n}) as PanelComponent;\nRoot.displayName = 'Shell.Root';\n\n// Header\ninterface ShellHeaderProps extends React.ComponentPropsWithoutRef<'header'> {\n height?: number;\n}\n\nconst Header = React.forwardRef<HTMLElement, ShellHeaderProps>(({ className, height = 64, style, ...props }, ref) => (\n <header\n {...props}\n ref={ref}\n className={classNames('rt-ShellHeader', className)}\n style={{\n ...style,\n '--shell-header-height': `${height}px`,\n } as CSSPropertiesWithVars}\n />\n));\nHeader.displayName = 'Shell.Header';\n\n// Pane Props Interface (shared by Panel, Sidebar, Inspector, Bottom)\ntype PaneProps = PaneBaseProps;\n\n// Left container (auto-created for Rail+Panel)\ninterface LeftProps extends React.ComponentPropsWithoutRef<'div'> {\n presentation?: ResponsivePresentation;\n // New: passthrough from Rail\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean, meta: { reason: 'init' | 'toggle' | 'panel' | 'responsive' }) => void;\n collapsible?: boolean;\n onExpand?: () => void;\n onCollapse?: () => void;\n mode?: never;\n defaultMode?: never;\n onModeChange?: never;\n /** When true, adds margin and triggers gray backdrop on Shell. */\n inset?: boolean;\n}\n\n// Rail (special case)\ntype LeftOpenChangeMeta = { reason: 'init' | 'toggle' | 'responsive' | 'panel' };\n\ntype RailControlledProps = { open: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: LeftOpenChangeMeta) => void; defaultOpen?: never };\ntype RailUncontrolledProps = { defaultOpen?: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: LeftOpenChangeMeta) => void; open?: never };\n\ntype RailProps = React.ComponentPropsWithoutRef<'div'> & {\n presentation?: ResponsivePresentation;\n expandedSize?: number;\n collapsible?: boolean;\n onExpand?: () => void;\n onCollapse?: () => void;\n /** When true, adds margin to Rail+Panel and triggers gray backdrop on Shell. */\n inset?: boolean;\n} & (RailControlledProps | RailUncontrolledProps);\n\n// Left container - behaves like Inspector but contains Rail+Panel\nconst LEFT_DOM_OMIT_PROPS = ['open', 'defaultOpen', 'onOpenChange', 'mode', 'defaultMode', 'onModeChange'] as const;\n\nconst Left = React.forwardRef<HTMLDivElement, LeftProps>((initialProps, ref) => {\n const { className, presentation = { initial: 'fixed', sm: 'fixed' }, collapsible: _collapsible = true, onExpand, onCollapse, children, style, inset, ...restProps } = initialProps;\n const { registerInset, unregisterInset } = useInset();\n\n // Register/unregister inset\n React.useEffect(() => {\n if (inset) {\n registerInset('left');\n return () => unregisterInset('left');\n }\n }, [inset, registerInset, unregisterInset]);\n const propsOpen = restProps.open;\n const propsDefaultOpen = restProps.defaultOpen;\n const propsOnOpenChange = restProps.onOpenChange;\n const domProps = omitPaneProps(restProps, LEFT_DOM_OMIT_PROPS);\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.onLeftPres?.(resolvedPresentation);\n }, [shell, resolvedPresentation]);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n\n // Register with shell\n React.useEffect(() => {\n shell.setHasLeft(true);\n return () => shell.setHasLeft(false);\n }, [shell]);\n\n const lastLeftModeRef = React.useRef<PaneMode | null>(null);\n const initNotifiedRef = React.useRef(false);\n const normalizedLeftControlled = React.useMemo(() => {\n if (typeof propsOpen === 'undefined') return undefined;\n return propsOpen ? 'expanded' : 'collapsed';\n }, [propsOpen]);\n const normalizedLeftDefault = React.useMemo(() => mapResponsiveBooleanToPaneMode(propsDefaultOpen), [propsDefaultOpen]);\n useResponsiveInitialState<PaneMode>({\n controlledValue: normalizedLeftControlled,\n defaultValue: normalizedLeftDefault,\n currentValue: shell.leftMode,\n setValue: shell.setLeftMode,\n breakpointReady: shell.currentBreakpointReady,\n onInit: (initial) => propsOnOpenChange?.(initial === 'expanded', { reason: 'init' }),\n });\n\n // Emit mode changes (uncontrolled toggles + init)\n React.useEffect(() => {\n if (typeof propsOpen !== 'undefined') return; // controlled, notifications only via parent changes\n if (lastLeftModeRef.current !== null && lastLeftModeRef.current !== shell.leftMode) {\n propsOnOpenChange?.(shell.leftMode === 'expanded', { reason: 'toggle' });\n }\n lastLeftModeRef.current = shell.leftMode;\n }, [shell, propsOnOpenChange, propsOpen]);\n\n // Emit expand/collapse events\n React.useEffect(() => {\n if (shell.leftMode === 'expanded') {\n onExpand?.();\n } else {\n onCollapse?.();\n }\n }, [shell.leftMode, onExpand, onCollapse]);\n\n const _isExpanded = shell.leftMode === 'expanded';\n\n // Left is not resizable; width derives from Rail/Panel.\n\n if (isOverlay) {\n const open = shell.leftMode === 'expanded';\n // Compute overlay width from child Rail/Panel expanded sizes\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && el.type === comp;\n const railEl = childArray.find((el) => isType(el, Rail));\n const panelEl = childArray.find((el) => isType(el, Panel));\n const railSize = typeof (railEl as any)?.props?.expandedSize === 'number' ? (railEl as any).props.expandedSize : 64;\n const panelSize = typeof (panelEl as any)?.props?.expandedSize === 'number' ? (panelEl as any).props.expandedSize : 288;\n const hasRail = Boolean(railEl);\n const hasPanel = Boolean(panelEl);\n const overlayPx = (hasRail ? railSize : 0) + (shell.panelMode === 'expanded' && hasPanel ? panelSize : 0);\n return (\n <Sheet.Root open={open} onOpenChange={(o) => shell.setLeftMode(o ? 'expanded' : 'collapsed')}>\n <Sheet.Content\n side=\"start\"\n style={{ padding: 0 }}\n width={{\n initial: `${overlayPx}px`,\n }}\n >\n <VisuallyHidden>\n <Sheet.Title>Navigation</Sheet.Title>\n </VisuallyHidden>\n <div className=\"rt-ShellLeft\">{children}</div>\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n\n if (isStacked) {\n const open = shell.leftMode === 'expanded';\n // Compute floating width from child Rail/Panel expanded sizes (like overlay)\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && el.type === comp;\n const railEl = childArray.find((el) => isType(el, Rail));\n const panelEl = childArray.find((el) => isType(el, Panel));\n const _railSize = typeof (railEl as any)?.props?.expandedSize === 'number' ? (railEl as any).props.expandedSize : 64;\n const _panelSize = typeof (panelEl as any)?.props?.expandedSize === 'number' ? (panelEl as any).props.expandedSize : 288;\n const _hasRail = Boolean(railEl);\n const _hasPanel = Boolean(panelEl);\n const _includePanel = _hasPanel && (shell.panelMode === 'expanded' || shell.peekTarget === 'panel');\n\n // Strip control props from DOM spread\n return (\n <div\n {...domProps}\n ref={setRef}\n className={classNames('rt-ShellLeft', className)}\n data-mode={shell.leftMode}\n data-peek={shell.peekTarget === 'left' || shell.peekTarget === 'rail' || shell.peekTarget === 'panel' || undefined}\n data-presentation={resolvedPresentation}\n data-inset={inset || undefined}\n style={{\n ...style,\n }}\n data-open={open || undefined}\n >\n {children}\n </div>\n );\n }\n\n // Strip control/legacy props from DOM spread\n return (\n <div\n {...domProps}\n ref={setRef}\n className={classNames('rt-ShellLeft', className)}\n data-mode={shell.leftMode}\n data-peek={shell.peekTarget === 'left' || shell.peekTarget === 'rail' || shell.peekTarget === 'panel' || undefined}\n data-presentation={resolvedPresentation}\n data-inset={inset || undefined}\n style={{\n ...style,\n }}\n >\n {children}\n </div>\n );\n});\nLeft.displayName = 'Shell.Left';\nassignShellSlot(Left as any, 'Shell.Left');\n\nconst Rail = React.forwardRef<HTMLDivElement, RailProps>((initialProps, ref) => {\n const { className, presentation, expandedSize = 64, collapsible, onExpand, onCollapse, children, style, open, defaultOpen, onOpenChange, ...domProps } = initialProps;\n const shell = useShell();\n\n // Dev guards\n const wasControlledRef = React.useRef<boolean | null>(null);\n if (process.env.NODE_ENV !== 'production') {\n if (typeof open !== 'undefined' && typeof defaultOpen !== 'undefined') {\n console.error('Shell.Rail: Do not pass both `open` and `defaultOpen`. Choose one.');\n }\n }\n\n // Warn on controlled/uncontrolled mode switch\n React.useEffect(() => {\n const isControlled = typeof open !== 'undefined';\n if (wasControlledRef.current === null) {\n wasControlledRef.current = isControlled;\n return;\n }\n if (wasControlledRef.current !== isControlled) {\n console.warn('Shell.Rail: Switching between controlled and uncontrolled `open` is not supported.');\n wasControlledRef.current = isControlled;\n }\n }, [open]);\n\n // Register expanded size with Left container\n React.useEffect(() => {\n shell.onRailDefaults?.(expandedSize);\n }, [shell, expandedSize]);\n\n const isExpanded = shell.leftMode === 'expanded';\n\n // Strip unknown open/defaultOpen props from DOM by not spreading them\n return (\n <div\n {...domProps}\n ref={ref}\n className={classNames('rt-ShellRail', className)}\n data-mode={shell.leftMode}\n data-peek={(shell.currentBreakpointReady && shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'rail') || undefined}\n style={{\n ...style,\n '--rail-size': `${expandedSize}px`,\n } as CSSPropertiesWithVars}\n >\n <div className=\"rt-ShellRailContent\" data-visible={(shell.currentBreakpointReady && (isExpanded || (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'rail'))) || undefined}>\n {children}\n </div>\n </div>\n );\n});\nRail.displayName = 'Shell.Rail';\nassignShellSlot(Rail as any, 'Shell.Rail');\n\n// Panel\ntype HandleComponent = React.ForwardRefExoticComponent<React.ComponentPropsWithoutRef<'div'> & React.RefAttributes<HTMLDivElement>>;\n\ntype PanelOpenChangeMeta = { reason: 'toggle' | 'left' | 'init' | 'responsive' };\ntype PanelControlledProps = { open: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: PanelOpenChangeMeta) => void; defaultOpen?: never };\ntype PanelUncontrolledProps = { defaultOpen?: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: PanelOpenChangeMeta) => void; open?: never };\n\ntype PanelSizeControlledProps = { size: number | string; defaultSize?: never };\ntype PanelSizeUncontrolledProps = { defaultSize?: number | string; size?: never };\n\ntype PanelSizeChangeMeta = { reason: 'init' | 'resize' | 'controlled' };\ntype PanelPublicProps = Omit<PaneProps, 'presentation' | 'defaultMode'> &\n (PanelControlledProps | PanelUncontrolledProps) &\n (PanelSizeControlledProps | PanelSizeUncontrolledProps) & {\n onSizeChange?: (size: number, meta: PanelSizeChangeMeta) => void;\n sizeUpdate?: 'throttle' | 'debounce';\n sizeUpdateMs?: number;\n /** When true, adds margin to Rail+Panel and triggers gray backdrop on Shell. */\n inset?: boolean;\n };\ntype PanelComponent = React.ForwardRefExoticComponent<PanelPublicProps & React.RefAttributes<HTMLDivElement>> & {\n Handle: HandleComponent;\n};\n\ntype _SidebarComponent = React.ForwardRefExoticComponent<\n (Omit<PaneProps, 'mode' | 'defaultMode' | 'onModeChange'> & {\n state?: Responsive<SidebarMode>;\n defaultState?: SidebarMode;\n onStateChange?: (mode: SidebarMode) => void;\n thinSize?: number;\n toggleModes?: 'both' | 'single';\n }) &\n React.RefAttributes<HTMLDivElement>\n> & { Handle: HandleComponent };\n\ntype _InspectorComponent = React.ForwardRefExoticComponent<PaneProps & React.RefAttributes<HTMLDivElement>> & { Handle: HandleComponent };\n\ntype _BottomComponent = React.ForwardRefExoticComponent<PaneProps & React.RefAttributes<HTMLDivElement>> & { Handle: HandleComponent };\n\nconst PANEL_DOM_PROP_KEYS = [\n 'className',\n 'children',\n 'defaultOpen',\n 'open',\n 'onOpenChange',\n 'size',\n 'defaultSize',\n 'onSizeChange',\n 'sizeUpdate',\n 'sizeUpdateMs',\n 'style',\n] as const satisfies readonly (keyof PanelPublicProps)[];\n\nconst Panel = assignShellSlot(\n React.forwardRef<HTMLDivElement, PanelPublicProps>((initialProps, ref) => {\n const {\n className,\n defaultOpen,\n open,\n onOpenChange,\n size,\n defaultSize,\n expandedSize = 288,\n minSize,\n maxSize,\n resizable,\n collapsible = true,\n onExpand,\n onCollapse,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n paneId,\n persistence,\n children,\n style,\n onSizeChange,\n sizeUpdate,\n sizeUpdateMs = 50,\n } = initialProps;\n const panelDomProps = extractPaneDomProps(initialProps, PANEL_DOM_PROP_KEYS);\n // Ref for debounce cleanup\n const debounceTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // Cleanup debounce timeout on unmount or when dependencies change\n React.useEffect(() => {\n return () => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = null;\n }\n };\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n // Throttled/debounced emitter for onSizeChange\n const emitSizeChange = React.useMemo(() => {\n if (!onSizeChange) return () => {};\n if (sizeUpdate === 'debounce') {\n const fn = (s: number, meta: PanelSizeChangeMeta) => {\n if (debounceTimeoutRef.current) clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = setTimeout(() => {\n onSizeChange?.(s, meta);\n debounceTimeoutRef.current = null;\n }, sizeUpdateMs);\n };\n return fn;\n }\n if (sizeUpdate === 'throttle') {\n let last = 0;\n return (s: number, meta: PanelSizeChangeMeta) => {\n const now = Date.now();\n if (now - last >= sizeUpdateMs) {\n last = now;\n onSizeChange?.(s, meta);\n }\n };\n }\n return (s: number, meta: PanelSizeChangeMeta) => onSizeChange?.(s, meta);\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n const shell = useShell();\n const prevPanelModeRef = React.useRef<PaneMode | null>(null);\n const prevLeftModeRef = React.useRef<PaneMode | null>(null);\n const initNotifiedRef = React.useRef(false);\n\n // Dev-only runtime guard\n if (process.env.NODE_ENV !== 'production') {\n if (typeof open !== 'undefined' && typeof defaultOpen !== 'undefined') {\n console.error('Shell.Panel: Do not pass both `open` and `defaultOpen`. Choose one.');\n }\n if (typeof size !== 'undefined' && typeof defaultSize !== 'undefined') {\n console.error('Shell.Panel: Do not pass both `size` and `defaultSize`. Choose one.');\n }\n }\n\n // Normalize responsive open/defaultOpen to PaneMode\n const normalizedControlledOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(open), [open]);\n const normalizedDefaultOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(defaultOpen), [defaultOpen]);\n const openIsResponsive = typeof open === 'object' && open !== null;\n\n // Use responsive initial state hook for proper breakpoint handling\n useResponsiveInitialState<PaneMode>({\n controlledValue: normalizedControlledOpen,\n defaultValue: normalizedDefaultOpen,\n currentValue: shell.panelMode,\n setValue: (mode) => {\n // Ensure Left is expanded when Panel is expanded\n if (mode === 'expanded' && shell.leftMode !== 'expanded') {\n shell.setLeftMode('expanded');\n }\n shell.setPanelMode(mode);\n },\n breakpointReady: shell.currentBreakpointReady,\n controlledIsResponsive: openIsResponsive,\n onResponsiveChange: (next) => onOpenChange?.(next === 'expanded', { reason: 'responsive' }),\n onInit: (initial) => {\n if (typeof open === 'undefined') {\n onOpenChange?.(initial === 'expanded', { reason: 'init' });\n }\n },\n });\n\n // Dev-only warning if switching controlled/uncontrolled between renders\n const wasControlledRef = React.useRef<boolean | null>(null);\n React.useEffect(() => {\n const isControlled = typeof open !== 'undefined';\n if (wasControlledRef.current === null) {\n wasControlledRef.current = isControlled;\n return;\n }\n if (wasControlledRef.current !== isControlled) {\n console.warn('Shell.Panel: Switching between controlled and uncontrolled `open` is not supported.');\n wasControlledRef.current = isControlled;\n }\n }, [open]);\n\n React.useEffect(() => {\n shell.onPanelDefaults?.(expandedSize);\n }, [shell, expandedSize]);\n const localRef = React.useRef<HTMLDivElement | null>(null);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const handleChildren = childArray.filter((el: React.ReactElement) => React.isValidElement(el) && el.type === PanelHandle);\n const contentChildren = childArray.filter((el: React.ReactElement) => !(React.isValidElement(el) && el.type === PanelHandle));\n\n const isOverlay = shell.leftResolvedPresentation === 'overlay';\n\n // Normalize CSS lengths to px helper\n const normalizeSizeToPx = React.useCallback((value: number | string | undefined) => normalizeToPx(value, 'horizontal'), []);\n\n // Derive a default persistence adapter from paneId if none provided\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:panel:${paneId}`;\n const adapter: PaneSizePersistence = {\n load: () => {\n if (typeof window === 'undefined') return undefined;\n const v = window.localStorage.getItem(key);\n return v ? Number(v) : undefined;\n },\n save: (size: number) => {\n if (typeof window === 'undefined') return;\n window.localStorage.setItem(key, String(size));\n },\n };\n return adapter;\n }, [paneId, persistence]);\n\n // Load persisted size if configured (only in fixed presentation)\n React.useEffect(() => {\n let mounted = true;\n (async () => {\n if (!resizable || !persistenceAdapter?.load || isOverlay) return;\n const loaded = await persistenceAdapter.load();\n if (mounted && typeof loaded === 'number' && localRef.current) {\n localRef.current.style.setProperty('--panel-size', `${loaded}px`);\n onResize?.(loaded);\n }\n })();\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n // In overlay, ensure panel uses the fixed expandedSize, ignoring any persisted size\n React.useEffect(() => {\n if (!localRef.current) return;\n if (isOverlay) {\n localRef.current.style.setProperty('--panel-size', `${expandedSize}px`);\n }\n }, [isOverlay, expandedSize]);\n\n // Apply defaultSize on mount when uncontrolled\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof size === 'undefined' && typeof defaultSize !== 'undefined') {\n const px = normalizeSizeToPx(defaultSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n // Clamp to min/max if provided\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--panel-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'init' });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Controlled size sync\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof size === 'undefined') return;\n const px = normalizeSizeToPx(size);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--panel-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'controlled' });\n }\n }, [size, minSize, maxSize, normalizeSizeToPx, emitSizeChange]);\n\n // Ensure Left container width is auto whenever Panel is expanded in fixed presentation\n React.useEffect(() => {\n if (!localRef.current) return;\n if (shell.leftResolvedPresentation !== 'overlay' && shell.leftMode === 'expanded' && shell.panelMode === 'expanded') {\n const leftEl = (localRef.current.parentElement as HTMLElement) || null;\n try {\n leftEl?.style.removeProperty('width');\n } catch {}\n }\n }, [shell.leftResolvedPresentation, shell.leftMode, shell.panelMode]);\n\n const isExpanded = shell.leftMode === 'expanded' && shell.panelMode === 'expanded';\n\n // Notify on internal toggles and left cascade\n React.useEffect(() => {\n const prevPanel = prevPanelModeRef.current;\n const prevLeft = prevLeftModeRef.current;\n if (prevPanel !== null && prevPanel !== shell.panelMode) {\n const open = shell.panelMode === 'expanded';\n let reason: PanelOpenChangeMeta['reason'] = 'toggle';\n if (prevLeft !== shell.leftMode && shell.leftMode === 'collapsed' && !open) {\n reason = 'left';\n }\n onOpenChange?.(open, { reason });\n }\n prevPanelModeRef.current = shell.panelMode;\n prevLeftModeRef.current = shell.leftMode;\n }, [shell.panelMode, shell.leftMode, onOpenChange]);\n\n // Provide resizer handle when fixed (not overlay)\n const handleEl =\n resizable && shell.leftResolvedPresentation !== 'overlay' && isExpanded ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--panel-size',\n minSize: typeof minSize === 'number' ? minSize : 100,\n maxSize: typeof maxSize === 'number' ? maxSize : 800,\n defaultSize: expandedSize,\n orientation: 'vertical',\n edge: 'end',\n computeNext: (client, startClient, startSize) => {\n const isRtl = getComputedStyle(localRef.current!).direction === 'rtl';\n const delta = client - startClient;\n return startSize + (isRtl ? -delta : delta);\n },\n onResize,\n onResizeStart: (size) => {\n // Ensure Left container is not stuck with a fixed width in stacked\n const panelEl = localRef.current as HTMLElement | null;\n const leftEl = panelEl?.parentElement as HTMLElement | null;\n try {\n leftEl?.style.removeProperty('width');\n } catch {}\n onResizeStart?.(size);\n },\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n emitSizeChange(size, { reason: 'resize' });\n persistenceAdapter?.save?.(size);\n },\n target: 'panel',\n collapsible: Boolean(collapsible),\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => shell.setPanelMode('collapsed'),\n requestToggle: () => shell.togglePane('panel'),\n }}\n >\n {handleChildren.length > 0 ? handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i })) : <PaneHandle />}\n </PaneResizeContext.Provider>\n ) : null;\n\n return (\n <div\n {...panelDomProps}\n ref={setRef}\n className={classNames('rt-ShellPanel', className)}\n data-mode={shell.panelMode}\n data-visible={(shell.currentBreakpointReady && (isExpanded || (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'panel'))) || undefined}\n data-peek={(shell.currentBreakpointReady && shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'panel') || undefined}\n style={{\n ...style,\n '--panel-size': `${expandedSize}px`,\n } as CSSPropertiesWithVars}\n >\n <div className=\"rt-ShellPanelContent\" data-visible={isExpanded || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n }),\n 'Shell.Panel',\n) as PanelComponent;\nPanel.displayName = 'Shell.Panel';\nPanel.Handle = PanelHandle;\n\n// Sidebar moved to ./_internal/shell-sidebar\n\n// Content (always required)\ninterface ShellContentProps extends React.ComponentPropsWithoutRef<'main'> {\n /** When true, adds margin and triggers gray backdrop on Shell. */\n inset?: boolean;\n}\n\nconst Content = React.forwardRef<HTMLElement, ShellContentProps>(({ className, inset, ...props }, ref) => {\n const { registerInset, unregisterInset } = useInset();\n\n // Register/unregister inset\n React.useEffect(() => {\n if (inset) {\n registerInset('content');\n return () => unregisterInset('content');\n }\n }, [inset, registerInset, unregisterInset]);\n\n return <main {...props} ref={ref} className={classNames('rt-ShellContent', className)} data-inset={inset || undefined} />;\n});\nContent.displayName = 'Shell.Content';\nassignShellSlot(Content as any, 'Shell.Content');\n\n// Inspector moved to ./_internal/shell-inspector\n\n// Bottom\n// Bottom moved to ./_internal/shell-bottom\n// (Bottom implementation extracted)\n\n// Trigger\n// PaneTarget type moved to shell.types.ts\ntype TriggerAction = 'toggle' | 'expand' | 'collapse';\n\ninterface TriggerProps extends React.ComponentPropsWithoutRef<'button'> {\n target: PaneTarget;\n action?: TriggerAction;\n /**\n * Whether to show peek preview on hover when the target pane is collapsed.\n * Defaults to false.\n */\n peekOnHover?: boolean;\n}\n\nconst Trigger = React.forwardRef<HTMLButtonElement, TriggerProps>(({ target, action = 'toggle', peekOnHover, onClick, onMouseEnter, onMouseLeave, children, ...props }, ref) => {\n const shell = useShell();\n\n const handleClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n\n // Clear any active peek on this target before toggling to avoid sticky peek state\n if (shell.peekTarget === target) {\n shell.clearPeek();\n }\n\n switch (action) {\n case 'toggle':\n shell.togglePane(target);\n break;\n case 'expand':\n shell.expandPane(target);\n break;\n case 'collapse':\n shell.collapsePane(target);\n break;\n }\n },\n [shell, target, action, onClick],\n );\n\n const isCollapsed = (() => {\n switch (target) {\n case 'left':\n case 'rail':\n return shell.leftMode === 'collapsed';\n case 'panel':\n return shell.leftMode === 'collapsed' || shell.panelMode === 'collapsed';\n case 'sidebar':\n return shell.sidebarMode === 'collapsed';\n case 'inspector':\n return shell.inspectorMode === 'collapsed';\n case 'bottom':\n return shell.bottomMode === 'collapsed';\n }\n })();\n\n const handleMouseEnter = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseEnter?.(event);\n if (!peekOnHover || !isCollapsed) return;\n // Use the actual target for peek behavior (not mapped to left)\n shell.peekPane(target);\n },\n [onMouseEnter, peekOnHover, isCollapsed, shell, target],\n );\n\n const handleMouseLeave = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseLeave?.(event);\n if (!peekOnHover) return;\n if (shell.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 aria-expanded={!isCollapsed}\n >\n {children}\n </button>\n );\n});\nTrigger.displayName = 'Shell.Trigger';\n\n// Exports\nexport {\n Root,\n Header,\n Left,\n Rail,\n Panel,\n Sidebar,\n Content,\n Inspector,\n Bottom,\n Trigger,\n useShell,\n useResponsivePresentation,\n type PaneMode,\n type SidebarMode,\n type ResponsivePresentation,\n type PaneTarget,\n type TriggerAction,\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["React", "classNames", "Sheet", "VisuallyHidden", "useResponsivePresentation", "useResponsiveInitialState", "PaneResizeContext", "PaneHandle", "PanelHandle", "omitPaneProps", "extractPaneDomProps", "mapResponsiveBooleanToPaneMode", "Sidebar", "Bottom", "Inspector", "_BREAKPOINTS", "normalizeToPx", "ShellProvider", "useShell", "LeftModeContext", "PanelModeContext", "SidebarModeContext", "InspectorModeContext", "BottomModeContext", "PresentationContext", "PeekContext", "ActionsContext", "CompositionContext", "InsetContext", "useInset", "useBreakpoint", "currentBp", "setCurrentBp", "ready", "setReady", "mqls", "k", "q", "compute", "_e", "matched", "m", "next", "cleanups", "mm", "fn", "SHELL_SLOT", "assignShellSlot", "component", "slot", "isShellComponent", "element", "type", "targetSlot", "paneReducer", "state", "action", "Root", "className", "children", "height", "props", "ref", "currentBreakpoint", "currentBreakpointReady", "initialChildren", "hasPanelDefaultOpen", "el", "railEl", "railDefaultOpen", "hasRailDefaultOpen", "hasInspectorDefaultOpen", "hasInspectorOpenControlled", "getSidebarInitialState", "sidebarEl", "getBottomInitialState", "bottomEl", "paneState", "dispatchPane", "setLeftMode", "mode", "setPanelMode", "setSidebarMode", "setInspectorMode", "setBottomMode", "hasLeft", "setHasLeft", "hasSidebar", "setHasSidebar", "sidebarToggleComputerRef", "current", "setSidebarToggleComputer", "devLeftPres", "setDevLeftPres", "onLeftPres", "p", "railDefaultSizeRef", "panelDefaultSizeRef", "onRailDefaults", "size", "onPanelDefaults", "hasLeftChildren", "childArray", "isType", "comp", "Rail", "Panel", "hasSidebarChildren", "togglePane", "target", "expandPane", "collapsePane", "baseContextValue", "headerEls", "Header", "railEls", "panelEls", "sidebarEls", "contentEls", "Content", "inspectorEls", "bottomEls", "firstRailOpen", "heightStyle", "peekTarget", "setPeekTarget", "peekPane", "clearPeek", "presentationCtxValue", "leftModeCtxValue", "panelModeCtxValue", "sidebarModeCtxValue", "inspectorModeCtxValue", "bottomModeCtxValue", "compositionCtxValue", "insetPanes", "setInsetPanes", "registerInset", "id", "prev", "unregisterInset", "hasAnyInset", "insetCtxValue", "peekCtxValue", "actionsCtxValue", "shellContextValue", "firstRail", "firstPanel", "leftInset", "passthroughProps", "Left", "style", "LEFT_DOM_OMIT_PROPS", "initialProps", "presentation", "_collapsible", "onExpand", "onCollapse", "inset", "restProps", "propsOpen", "propsDefaultOpen", "propsOnOpenChange", "domProps", "shell", "resolvedPresentation", "isOverlay", "isStacked", "localRef", "setRef", "node", "lastLeftModeRef", "initNotifiedRef", "normalizedLeftControlled", "normalizedLeftDefault", "initial", "_isExpanded", "open", "panelEl", "railSize", "panelSize", "hasRail", "hasPanel", "overlayPx", "o", "_railSize", "_panelSize", "_hasRail", "_includePanel", "expandedSize", "collapsible", "defaultOpen", "onOpenChange", "wasControlledRef", "isControlled", "isExpanded", "PANEL_DOM_PROP_KEYS", "defaultSize", "minSize", "maxSize", "resizable", "onResize", "onResizeStart", "onResizeEnd", "snapPoints", "snapTolerance", "collapseThreshold", "paneId", "persistence", "onSizeChange", "sizeUpdate", "sizeUpdateMs", "panelDomProps", "debounceTimeoutRef", "emitSizeChange", "s", "meta", "last", "now", "prevPanelModeRef", "prevLeftModeRef", "normalizedControlledOpen", "normalizedDefaultOpen", "openIsResponsive", "handleChildren", "contentChildren", "normalizeSizeToPx", "value", "persistenceAdapter", "key", "v", "mounted", "loaded", "px", "clamped", "leftEl", "prevPanel", "prevLeft", "reason", "handleEl", "client", "startClient", "startSize", "isRtl", "delta", "i", "Trigger", "peekOnHover", "onClick", "onMouseEnter", "onMouseLeave", "handleClick", "event", "isCollapsed", "handleMouseEnter", "handleMouseLeave"]
|
|
4
|
+
"sourcesContent": ["/**\n * Shell Component - Layout Engine + Chrome\n *\n * Philosophy:\n * - Shell = layout engine + chrome\n * - Manages layout state: expanded/collapsed, fixed/overlay, sizes\n * - Does not manage content/navigation state\n * - Provides unstyled primitives (slots, triggers)\n * - Enforces composition rules (Rail \u2194 Panel dependency, Sidebar exclusivity)\n *\n * Core Slots:\n * - Header: global top bar\n * - Rail: slim nav strip\n * - Panel: sidebar next to rail\n * - Sidebar: alternative to Rail+Panel (exclusive)\n * - Content: main work area\n * - Inspector: right-side panel\n * - Bottom: bottom panel\n *\n * Composition Rules:\n * - Rail + Panel: valid together (Rail collapse \u2192 Panel collapse)\n * - Sidebar: cannot coexist with Rail or Panel\n * - Content: always required\n * - Inspector/Bottom: optional, independent\n */\n'use client';\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport * as Sheet from './sheet.js';\nimport { VisuallyHidden } from './visually-hidden.js';\nimport { useResponsivePresentation, useResponsiveInitialState } from './shell.hooks.js';\nimport { PaneResizeContext } from './_internal/shell-resize.js';\nimport { PaneHandle, PanelHandle } from './_internal/shell-handles.js';\nimport { omitPaneProps, extractPaneDomProps, mapResponsiveBooleanToPaneMode } from './_internal/shell-prop-helpers.js';\nimport { Sidebar } from './_internal/shell-sidebar.js';\nimport { Bottom } from './_internal/shell-bottom.js';\nimport { Inspector } from './_internal/shell-inspector.js';\nimport type { PresentationValue, ResponsivePresentation, PaneMode, SidebarMode, PaneSizePersistence, Breakpoint, PaneTarget, Responsive, PaneBaseProps, CSSPropertiesWithVars } from './shell.types.js';\nimport { _BREAKPOINTS } from './shell.types.js';\nimport { normalizeToPx } from '../helpers/normalize-to-px.js';\nimport {\n ShellProvider,\n useShell,\n LeftModeContext,\n PanelModeContext,\n SidebarModeContext,\n InspectorModeContext,\n BottomModeContext,\n PresentationContext,\n PeekContext,\n ActionsContext,\n CompositionContext,\n InsetContext,\n useInset,\n type InsetPaneId,\n} from './shell.context.js';\n\n// Shell context is provided via ShellProvider (see shell.context.tsx)\n\n// Pane resize context moved to ./_internal/shell-resize\n\n// Local PaneHandle moved to ./_internal/shell-handles\n// Removed local PaneHandle implementation; using internal PaneHandle\n\n// Composed Handle wrappers per pane\n// Handles moved to ./_internal/shell-handles\n\n// Hook to resolve responsive presentation\n// useResponsivePresentation moved to shell.hooks.ts\n\n// Hook to resolve responsive mode defaults\n// Removed: defaultMode responsiveness\n\n// Hook to get current breakpoint\nfunction useBreakpoint(): { bp: Breakpoint; ready: boolean } {\n const [currentBp, setCurrentBp] = React.useState<Breakpoint>('initial');\n const [ready, setReady] = React.useState(false);\n\n React.useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const queries = Object.entries(_BREAKPOINTS) as [keyof typeof _BREAKPOINTS, string][];\n const mqls = queries.map(([k, q]) => [k, window.matchMedia(q)] as const);\n\n // Accept optional event param to satisfy MediaQueryList listener signature\n const compute = (_e?: MediaQueryListEvent) => {\n // Highest matched wins\n const matched = mqls.filter(([, m]) => m.matches).map(([k]) => k);\n const next = (matched[matched.length - 1] as Breakpoint | undefined) ?? 'initial';\n setCurrentBp(next);\n setReady(true);\n };\n\n compute();\n const cleanups: Array<() => void> = [];\n mqls.forEach(([, m]) => {\n const mm = m as MediaQueryList & {\n addEventListener?: (type: 'change', listener: (e: MediaQueryListEvent) => void) => void;\n removeEventListener?: (type: 'change', listener: (e: MediaQueryListEvent) => void) => void;\n addListener?: (listener: (e: MediaQueryListEvent) => void) => void;\n removeListener?: (listener: (e: MediaQueryListEvent) => void) => void;\n };\n if (typeof mm.addEventListener === 'function' && typeof mm.removeEventListener === 'function') {\n mm.addEventListener('change', compute);\n cleanups.push(() => mm.removeEventListener?.('change', compute));\n } else if (typeof mm.addListener === 'function' && typeof mm.removeListener === 'function') {\n mm.addListener(compute);\n cleanups.push(() => mm.removeListener?.(compute));\n }\n });\n\n return () => {\n cleanups.forEach((fn) => {\n try {\n fn();\n } catch {}\n });\n };\n }, []);\n\n return { bp: currentBp, ready };\n}\n\n// Reducer-based pane state management to simplify cascading rules\ntype PaneState = {\n leftMode: PaneMode;\n panelMode: PaneMode;\n sidebarMode: SidebarMode;\n inspectorMode: PaneMode;\n bottomMode: PaneMode;\n};\n\ntype PaneAction =\n | { type: 'SET_LEFT_MODE'; mode: PaneMode }\n | { type: 'SET_PANEL_MODE'; mode: PaneMode }\n | { type: 'SET_SIDEBAR_MODE'; mode: SidebarMode }\n | { type: 'SET_INSPECTOR_MODE'; mode: PaneMode }\n | { type: 'SET_BOTTOM_MODE'; mode: PaneMode }\n | { type: 'TOGGLE_PANE'; target: PaneTarget }\n | { type: 'EXPAND_PANE'; target: PaneTarget }\n | { type: 'COLLAPSE_PANE'; target: PaneTarget };\n\nconst SHELL_SLOT = Symbol('rtShellSlot');\n\nfunction assignShellSlot<T extends React.ComponentType<any>>(component: T, slot: string): T {\n (component as any)[SHELL_SLOT] = slot;\n return component;\n}\n\nfunction isShellComponent(element: React.ReactElement, component: any): boolean {\n if (!React.isValidElement(element)) return false;\n const type: any = element.type;\n if (type === component) return true;\n const targetSlot = (component as any)?.[SHELL_SLOT];\n return Boolean(type?.[SHELL_SLOT] && targetSlot && type[SHELL_SLOT] === targetSlot);\n}\n\n// Tag imported slot components so isType remains stable after minification\nassignShellSlot(Sidebar as any, 'Shell.Sidebar');\nassignShellSlot(Inspector as any, 'Shell.Inspector');\nassignShellSlot(Bottom as any, 'Shell.Bottom');\n\nfunction paneReducer(state: PaneState, action: PaneAction): PaneState {\n switch (action.type) {\n case 'SET_LEFT_MODE': {\n // Collapsing left cascades to panel collapse\n if (action.mode === 'collapsed') {\n return { ...state, leftMode: 'collapsed', panelMode: 'collapsed' };\n }\n return { ...state, leftMode: action.mode };\n }\n case 'SET_PANEL_MODE': {\n // Expanding panel ensures left is expanded\n if (action.mode === 'expanded' && state.leftMode !== 'expanded') {\n return { ...state, leftMode: 'expanded', panelMode: 'expanded' };\n }\n return { ...state, panelMode: action.mode };\n }\n case 'SET_SIDEBAR_MODE':\n return { ...state, sidebarMode: action.mode };\n case 'SET_INSPECTOR_MODE':\n return { ...state, inspectorMode: action.mode };\n case 'SET_BOTTOM_MODE':\n return { ...state, bottomMode: action.mode };\n case 'TOGGLE_PANE': {\n switch (action.target) {\n case 'left':\n case 'rail':\n return { ...state, leftMode: state.leftMode === 'expanded' ? 'collapsed' : 'expanded', panelMode: state.leftMode === 'expanded' ? 'collapsed' : state.panelMode };\n case 'panel': {\n if (state.leftMode === 'collapsed') {\n return { ...state, leftMode: 'expanded', panelMode: 'expanded' };\n }\n return { ...state, panelMode: state.panelMode === 'expanded' ? 'collapsed' : 'expanded' };\n }\n case 'sidebar': {\n // Sidebar toggle sequencing is handled externally via setSidebarToggleComputer\n // This reducer only flips between expanded<->collapsed by default; thin is set by caller\n const next: SidebarMode = state.sidebarMode === 'collapsed' ? 'expanded' : state.sidebarMode === 'expanded' ? 'collapsed' : 'expanded';\n return { ...state, sidebarMode: next };\n }\n case 'inspector':\n return { ...state, inspectorMode: state.inspectorMode === 'expanded' ? 'collapsed' : 'expanded' };\n case 'bottom':\n return { ...state, bottomMode: state.bottomMode === 'expanded' ? 'collapsed' : 'expanded' };\n default:\n return state;\n }\n // Fallback to satisfy no-fallthrough in some environments\n return state;\n }\n case 'EXPAND_PANE': {\n switch (action.target) {\n case 'left':\n case 'rail':\n return { ...state, leftMode: 'expanded' };\n case 'panel':\n return { ...state, leftMode: 'expanded', panelMode: 'expanded' };\n case 'sidebar':\n return { ...state, sidebarMode: 'expanded' };\n case 'inspector':\n return { ...state, inspectorMode: 'expanded' };\n case 'bottom':\n return { ...state, bottomMode: 'expanded' };\n default:\n return state;\n }\n // Fallback to satisfy no-fallthrough in some environments\n return state;\n }\n case 'COLLAPSE_PANE': {\n switch (action.target) {\n case 'left':\n case 'rail':\n return { ...state, leftMode: 'collapsed', panelMode: 'collapsed' };\n case 'panel':\n return { ...state, panelMode: 'collapsed' };\n case 'sidebar':\n return { ...state, sidebarMode: 'collapsed' };\n case 'inspector':\n return { ...state, inspectorMode: 'collapsed' };\n case 'bottom':\n return { ...state, bottomMode: 'collapsed' };\n default:\n return state;\n }\n // Fallback to satisfy no-fallthrough in some environments\n return state;\n }\n }\n return state;\n}\n\n// Root Component\ninterface ShellRootProps extends React.ComponentPropsWithoutRef<'div'> {\n children: React.ReactNode;\n height?: 'full' | 'auto' | string | number;\n}\n\nconst Root = React.forwardRef<HTMLDivElement, ShellRootProps>(({ className, children, height = 'full', ...props }, ref) => {\n const { bp: currentBreakpoint, ready: currentBreakpointReady } = useBreakpoint();\n\n // Compute initial defaults from immediate children (one-time, uncontrolled defaults)\n const initialChildren = React.Children.toArray(children) as React.ReactElement[];\n const hasPanelDefaultOpen = initialChildren.some((el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Panel' && Boolean((el as any).props?.defaultOpen));\n // Rail defaults to open (true) unless explicitly set to false\n // Supports responsive objects: { initial: false, md: true }\n const railEl = initialChildren.find((el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Rail');\n const railDefaultOpen = railEl ? (railEl as any).props?.defaultOpen : undefined;\n const hasRailDefaultOpen = (() => {\n if (!railEl) return false;\n if (railDefaultOpen === undefined) return true; // Default to open\n if (typeof railDefaultOpen === 'boolean') return railDefaultOpen;\n // Responsive object - use 'initial' value, or first defined value, or default true\n if (typeof railDefaultOpen === 'object') {\n return railDefaultOpen.initial ?? Object.values(railDefaultOpen)[0] ?? true;\n }\n return true;\n })();\n const hasInspectorDefaultOpen = initialChildren.some((el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Inspector' && Boolean((el as any).props?.defaultOpen));\n const hasInspectorOpenControlled = initialChildren.some(\n (el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Inspector' && typeof (el as any).props?.open !== 'undefined' && Boolean((el as any).props?.open),\n );\n // Detect Panel controlled open state for initial reducer state\n const hasPanelOpenControlled = initialChildren.some((el) => {\n if (!React.isValidElement(el) || (el as any).type?.displayName !== 'Shell.Panel') return false;\n const openProp = (el as any).props?.open;\n if (typeof openProp === 'undefined') return false;\n if (typeof openProp === 'boolean') return openProp;\n // Responsive object - check 'initial' or first truthy value\n if (typeof openProp === 'object' && openProp !== null) {\n return openProp.initial ?? Object.values(openProp)[0] ?? false;\n }\n return false;\n });\n\n // Detect Sidebar initial state from props\n const getSidebarInitialState = (): SidebarMode => {\n const sidebarEl = initialChildren.find((el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Sidebar');\n if (!sidebarEl) return 'expanded';\n const props = (sidebarEl as any).props;\n // Check controlled state first\n if (typeof props?.state !== 'undefined') {\n if (typeof props.state === 'string') return props.state as SidebarMode;\n // Responsive object - use 'initial' breakpoint or first defined value\n if (typeof props.state === 'object') {\n return (props.state.initial ?? Object.values(props.state)[0] ?? 'expanded') as SidebarMode;\n }\n }\n // Check defaultState\n if (typeof props?.defaultState !== 'undefined') {\n if (typeof props.defaultState === 'string') return props.defaultState as SidebarMode;\n if (typeof props.defaultState === 'object') {\n return (props.defaultState.initial ?? Object.values(props.defaultState)[0] ?? 'expanded') as SidebarMode;\n }\n }\n return 'expanded';\n };\n\n // Detect Bottom initial state from props\n const getBottomInitialState = (): PaneMode => {\n const bottomEl = initialChildren.find((el) => React.isValidElement(el) && (el as any).type?.displayName === 'Shell.Bottom');\n if (!bottomEl) return 'collapsed';\n const props = (bottomEl as any).props;\n // Check controlled open first\n if (typeof props?.open !== 'undefined') {\n if (typeof props.open === 'boolean') return props.open ? 'expanded' : 'collapsed';\n // Responsive object - use 'initial' breakpoint or first defined value\n if (typeof props.open === 'object') {\n const val = props.open.initial ?? Object.values(props.open)[0];\n return val ? 'expanded' : 'collapsed';\n }\n }\n // Check defaultOpen\n if (typeof props?.defaultOpen !== 'undefined') {\n return props.defaultOpen ? 'expanded' : 'collapsed';\n }\n return 'collapsed';\n };\n\n // Pane state management via reducer\n const [paneState, dispatchPane] = React.useReducer(paneReducer, {\n leftMode: hasPanelDefaultOpen || hasPanelOpenControlled || hasRailDefaultOpen ? 'expanded' : 'collapsed',\n panelMode: hasPanelDefaultOpen || hasPanelOpenControlled ? 'expanded' : 'collapsed',\n sidebarMode: getSidebarInitialState(),\n inspectorMode: hasInspectorDefaultOpen || hasInspectorOpenControlled ? 'expanded' : 'collapsed',\n bottomMode: getBottomInitialState(),\n });\n const setLeftMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_LEFT_MODE', mode }), []);\n const setPanelMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_PANEL_MODE', mode }), []);\n const setSidebarMode = React.useCallback((mode: SidebarMode) => dispatchPane({ type: 'SET_SIDEBAR_MODE', mode }), []);\n const setInspectorMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_INSPECTOR_MODE', mode }), []);\n const setBottomMode = React.useCallback((mode: PaneMode) => dispatchPane({ type: 'SET_BOTTOM_MODE', mode }), []);\n\n // Removed: defaultMode responsiveness and manual change tracking\n\n // Composition detection\n const [hasLeft, setHasLeft] = React.useState(false);\n const [hasSidebar, setHasSidebar] = React.useState(false);\n\n // Customizable sidebar toggle sequencing\n const sidebarToggleComputerRef = React.useRef<(current: SidebarMode) => SidebarMode>((current) => (current === 'collapsed' ? 'thin' : current === 'thin' ? 'expanded' : 'collapsed'));\n const setSidebarToggleComputer = React.useCallback((fn: (current: SidebarMode) => SidebarMode) => {\n sidebarToggleComputerRef.current = fn;\n }, []);\n\n // Reducer handles left\u2192panel cascade; no effect needed\n\n // Composition validation\n React.useEffect(() => {\n if (hasSidebar && hasLeft) {\n console.warn('Shell: Sidebar cannot coexist with Rail or Panel. Use either Rail+Panel OR Sidebar.');\n }\n }, [hasSidebar, hasLeft]);\n\n // Left presentation + defaults from children\n const [devLeftPres, setDevLeftPres] = React.useState<PresentationValue | undefined>(undefined);\n const onLeftPres = React.useCallback((p: PresentationValue) => setDevLeftPres(p), []);\n const railDefaultSizeRef = React.useRef<number>(64);\n const panelDefaultSizeRef = React.useRef<number>(288);\n const onRailDefaults = React.useCallback((size: number) => {\n railDefaultSizeRef.current = size;\n }, []);\n const onPanelDefaults = React.useCallback((size: number) => {\n panelDefaultSizeRef.current = size;\n }, []);\n\n // Determine children presence for left composition\n const hasLeftChildren = React.useMemo(() => {\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && (el.type === comp || (el as any).type?.displayName === comp.displayName);\n return childArray.some((el) => isType(el, Rail) || isType(el, Panel));\n }, [children]);\n\n const hasSidebarChildren = React.useMemo(() => {\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && (el.type === comp || (el as any).type?.displayName === comp.displayName);\n return childArray.some((el) => isType(el, Sidebar));\n }, [children]);\n\n const togglePane = React.useCallback(\n (target: PaneTarget) => {\n if (target === 'sidebar') {\n const next = sidebarToggleComputerRef.current(paneState.sidebarMode as SidebarMode);\n setSidebarMode(next);\n return;\n }\n dispatchPane({ type: 'TOGGLE_PANE', target });\n },\n [paneState.sidebarMode, setSidebarMode],\n );\n\n const expandPane = React.useCallback(\n (target: PaneTarget) => {\n if (target === 'sidebar') return setSidebarMode('expanded');\n dispatchPane({ type: 'EXPAND_PANE', target });\n },\n [setSidebarMode],\n );\n\n const collapsePane = React.useCallback(\n (target: PaneTarget) => {\n if (target === 'sidebar') return setSidebarMode('collapsed');\n dispatchPane({ type: 'COLLAPSE_PANE', target });\n },\n [setSidebarMode],\n );\n\n const baseContextValue = React.useMemo(\n () => ({\n leftMode: paneState.leftMode,\n setLeftMode,\n panelMode: paneState.panelMode,\n setPanelMode,\n sidebarMode: paneState.sidebarMode,\n setSidebarMode,\n inspectorMode: paneState.inspectorMode,\n setInspectorMode,\n bottomMode: paneState.bottomMode,\n setBottomMode,\n hasLeft,\n setHasLeft,\n hasSidebar,\n setHasSidebar,\n currentBreakpoint,\n currentBreakpointReady,\n leftResolvedPresentation: devLeftPres,\n togglePane,\n expandPane,\n collapsePane,\n setSidebarToggleComputer,\n onLeftPres,\n onRailDefaults,\n onPanelDefaults,\n }),\n [\n paneState.leftMode,\n setLeftMode,\n paneState.panelMode,\n setPanelMode,\n paneState.sidebarMode,\n setSidebarMode,\n paneState.inspectorMode,\n setInspectorMode,\n paneState.bottomMode,\n setBottomMode,\n hasLeft,\n hasSidebar,\n currentBreakpoint,\n currentBreakpointReady,\n devLeftPres,\n togglePane,\n expandPane,\n collapsePane,\n setSidebarToggleComputer,\n onLeftPres,\n onRailDefaults,\n onPanelDefaults,\n ],\n );\n\n // Organize children by type\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && (el.type === comp || (el as any).type?.displayName === comp.displayName);\n\n const headerEls = childArray.filter((el) => isType(el, Header));\n const railEls = childArray.filter((el) => isType(el, Rail));\n const panelEls = childArray.filter((el) => isType(el, Panel));\n const sidebarEls = childArray.filter((el) => isType(el, Sidebar));\n const contentEls = childArray.filter((el) => isType(el, Content));\n const inspectorEls = childArray.filter((el) => isType(el, Inspector));\n const bottomEls = childArray.filter((el) => isType(el, Bottom));\n\n // Controlled sync in Root: mirror first Rail.open if provided\n const firstRailOpen = (railEls[0] as any)?.props?.open;\n React.useEffect(() => {\n if (typeof firstRailOpen === 'undefined') return;\n const shouldOpen = Boolean(firstRailOpen);\n setLeftMode(shouldOpen ? 'expanded' : 'collapsed');\n }, [firstRailOpen, setLeftMode]);\n\n const heightStyle = React.useMemo(() => {\n if (height === 'full') return { height: '100vh' };\n if (height === 'auto') return { height: 'auto' };\n if (typeof height === 'string') return { height };\n if (typeof height === 'number') return { height: `${height}px` };\n return {};\n }, [height]);\n\n // Peek state (layout-only overlay without mode changes)\n const [peekTarget, setPeekTarget] = React.useState<PaneTarget | null>(null);\n const peekPane = React.useCallback((target: PaneTarget) => setPeekTarget(target), []);\n const clearPeek = React.useCallback(() => setPeekTarget(null), []);\n\n // Memoized slice context values to avoid notifying unrelated consumers\n const presentationCtxValue = React.useMemo(() => ({ currentBreakpoint, currentBreakpointReady, leftResolvedPresentation: devLeftPres }), [currentBreakpoint, currentBreakpointReady, devLeftPres]);\n const leftModeCtxValue = React.useMemo(() => ({ leftMode: paneState.leftMode, setLeftMode }), [paneState.leftMode, setLeftMode]);\n const panelModeCtxValue = React.useMemo(() => ({ panelMode: paneState.panelMode, setPanelMode }), [paneState.panelMode, setPanelMode]);\n const sidebarModeCtxValue = React.useMemo(() => ({ sidebarMode: paneState.sidebarMode, setSidebarMode }), [paneState.sidebarMode, setSidebarMode]);\n const inspectorModeCtxValue = React.useMemo(() => ({ inspectorMode: paneState.inspectorMode, setInspectorMode }), [paneState.inspectorMode, setInspectorMode]);\n const bottomModeCtxValue = React.useMemo(() => ({ bottomMode: paneState.bottomMode, setBottomMode }), [paneState.bottomMode, setBottomMode]);\n const compositionCtxValue = React.useMemo(() => ({ hasLeft, setHasLeft, hasSidebar, setHasSidebar }), [hasLeft, setHasLeft, hasSidebar, setHasSidebar]);\n\n // Inset state management\n const [insetPanes, setInsetPanes] = React.useState<Set<InsetPaneId>>(new Set());\n const registerInset = React.useCallback((id: InsetPaneId) => {\n setInsetPanes((prev) => {\n if (prev.has(id)) return prev;\n const next = new Set(prev);\n next.add(id);\n return next;\n });\n }, []);\n const unregisterInset = React.useCallback((id: InsetPaneId) => {\n setInsetPanes((prev) => {\n if (!prev.has(id)) return prev;\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n }, []);\n const hasAnyInset = insetPanes.size > 0;\n const insetCtxValue = React.useMemo(\n () => ({ insetPanes, registerInset, unregisterInset, hasAnyInset }),\n [insetPanes, registerInset, unregisterInset, hasAnyInset],\n );\n const peekCtxValue = React.useMemo(() => ({ peekTarget, setPeekTarget, peekPane, clearPeek }), [peekTarget, setPeekTarget, peekPane, clearPeek]);\n const actionsCtxValue = React.useMemo(() => ({ togglePane, expandPane, collapsePane, setSidebarToggleComputer }), [togglePane, expandPane, collapsePane, setSidebarToggleComputer]);\n\n // Memoized full context value for ShellProvider to prevent unnecessary effect re-runs\n const shellContextValue = React.useMemo(\n () => ({\n ...baseContextValue,\n peekTarget,\n setPeekTarget,\n peekPane,\n clearPeek,\n }),\n [baseContextValue, peekTarget, setPeekTarget, peekPane, clearPeek],\n );\n\n return (\n <div {...props} ref={ref} className={classNames('rt-ShellRoot', className)} style={{ ...heightStyle, ...props.style }}>\n <ShellProvider value={shellContextValue}>\n <PresentationContext.Provider value={presentationCtxValue}>\n <LeftModeContext.Provider value={leftModeCtxValue}>\n <PanelModeContext.Provider value={panelModeCtxValue}>\n <SidebarModeContext.Provider value={sidebarModeCtxValue}>\n <InspectorModeContext.Provider value={inspectorModeCtxValue}>\n <BottomModeContext.Provider value={bottomModeCtxValue}>\n <CompositionContext.Provider value={compositionCtxValue}>\n <PeekContext.Provider value={peekCtxValue}>\n <ActionsContext.Provider value={actionsCtxValue}>\n <InsetContext.Provider value={insetCtxValue}>\n {headerEls}\n <div\n className=\"rt-ShellBody\"\n data-peek-target={peekTarget ?? undefined}\n data-has-inset={hasAnyInset || undefined}\n style={\n peekTarget === 'rail' || peekTarget === 'panel'\n ? ({\n '--peek-rail-width': `${railDefaultSizeRef.current}px`,\n } as CSSPropertiesWithVars)\n : undefined\n }\n >\n {hasLeftChildren && !hasSidebarChildren\n ? (() => {\n const firstRail = railEls[0] as any;\n const firstPanel = panelEls[0] as any;\n const leftInset = Boolean(firstRail?.props?.inset) || Boolean(firstPanel?.props?.inset);\n const passthroughProps = firstRail\n ? {\n // Notification passthrough used by Left; not spread to DOM in Left\n onOpenChange: firstRail.props?.onOpenChange,\n open: firstRail.props?.open,\n defaultOpen: firstRail.props?.defaultOpen,\n presentation: firstRail.props?.presentation,\n collapsible: firstRail.props?.collapsible,\n onExpand: firstRail.props?.onExpand,\n onCollapse: firstRail.props?.onCollapse,\n inset: leftInset,\n }\n : { defaultOpen: hasPanelDefaultOpen ? true : undefined, inset: leftInset };\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 </InsetContext.Provider>\n </ActionsContext.Provider>\n </PeekContext.Provider>\n </CompositionContext.Provider>\n </BottomModeContext.Provider>\n </InspectorModeContext.Provider>\n </SidebarModeContext.Provider>\n </PanelModeContext.Provider>\n </LeftModeContext.Provider>\n </PresentationContext.Provider>\n </ShellProvider>\n </div>\n );\n}) as PanelComponent;\nRoot.displayName = 'Shell.Root';\n\n// Header\ninterface ShellHeaderProps extends React.ComponentPropsWithoutRef<'header'> {\n height?: number;\n}\n\nconst Header = React.forwardRef<HTMLElement, ShellHeaderProps>(({ className, height = 64, style, ...props }, ref) => (\n <header\n {...props}\n ref={ref}\n className={classNames('rt-ShellHeader', className)}\n style={{\n ...style,\n '--shell-header-height': `${height}px`,\n } as CSSPropertiesWithVars}\n />\n));\nHeader.displayName = 'Shell.Header';\n\n// Pane Props Interface (shared by Panel, Sidebar, Inspector, Bottom)\ntype PaneProps = PaneBaseProps;\n\n// Left container (auto-created for Rail+Panel)\ninterface LeftProps extends React.ComponentPropsWithoutRef<'div'> {\n presentation?: ResponsivePresentation;\n // New: passthrough from Rail\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean, meta: { reason: 'init' | 'toggle' | 'panel' | 'responsive' }) => void;\n collapsible?: boolean;\n onExpand?: () => void;\n onCollapse?: () => void;\n mode?: never;\n defaultMode?: never;\n onModeChange?: never;\n /** When true, adds margin and triggers gray backdrop on Shell. */\n inset?: boolean;\n}\n\n// Rail (special case)\ntype LeftOpenChangeMeta = { reason: 'init' | 'toggle' | 'responsive' | 'panel' };\n\ntype RailControlledProps = { open: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: LeftOpenChangeMeta) => void; defaultOpen?: never };\ntype RailUncontrolledProps = { defaultOpen?: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: LeftOpenChangeMeta) => void; open?: never };\n\ntype RailProps = React.ComponentPropsWithoutRef<'div'> & {\n presentation?: ResponsivePresentation;\n expandedSize?: number;\n collapsible?: boolean;\n onExpand?: () => void;\n onCollapse?: () => void;\n /** When true, adds margin to Rail+Panel and triggers gray backdrop on Shell. */\n inset?: boolean;\n} & (RailControlledProps | RailUncontrolledProps);\n\n// Left container - behaves like Inspector but contains Rail+Panel\nconst LEFT_DOM_OMIT_PROPS = ['open', 'defaultOpen', 'onOpenChange', 'mode', 'defaultMode', 'onModeChange'] as const;\n\nconst Left = React.forwardRef<HTMLDivElement, LeftProps>((initialProps, ref) => {\n const { className, presentation = { initial: 'fixed', sm: 'fixed' }, collapsible: _collapsible = true, onExpand, onCollapse, children, style, inset, ...restProps } = initialProps;\n const { registerInset, unregisterInset } = useInset();\n\n // Register/unregister inset\n React.useEffect(() => {\n if (inset) {\n registerInset('left');\n return () => unregisterInset('left');\n }\n }, [inset, registerInset, unregisterInset]);\n const propsOpen = restProps.open;\n const propsDefaultOpen = restProps.defaultOpen;\n const propsOnOpenChange = restProps.onOpenChange;\n const domProps = omitPaneProps(restProps, LEFT_DOM_OMIT_PROPS);\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.onLeftPres?.(resolvedPresentation);\n }, [shell, resolvedPresentation]);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n\n // Register with shell\n React.useEffect(() => {\n shell.setHasLeft(true);\n return () => shell.setHasLeft(false);\n }, [shell]);\n\n const lastLeftModeRef = React.useRef<PaneMode | null>(null);\n const initNotifiedRef = React.useRef(false);\n const normalizedLeftControlled = React.useMemo(() => {\n if (typeof propsOpen === 'undefined') return undefined;\n return propsOpen ? 'expanded' : 'collapsed';\n }, [propsOpen]);\n const normalizedLeftDefault = React.useMemo(() => mapResponsiveBooleanToPaneMode(propsDefaultOpen), [propsDefaultOpen]);\n useResponsiveInitialState<PaneMode>({\n controlledValue: normalizedLeftControlled,\n defaultValue: normalizedLeftDefault,\n currentValue: shell.leftMode,\n setValue: shell.setLeftMode,\n breakpointReady: shell.currentBreakpointReady,\n onInit: (initial) => propsOnOpenChange?.(initial === 'expanded', { reason: 'init' }),\n });\n\n // Emit mode changes (uncontrolled toggles + init)\n React.useEffect(() => {\n if (typeof propsOpen !== 'undefined') return; // controlled, notifications only via parent changes\n if (lastLeftModeRef.current !== null && lastLeftModeRef.current !== shell.leftMode) {\n propsOnOpenChange?.(shell.leftMode === 'expanded', { reason: 'toggle' });\n }\n lastLeftModeRef.current = shell.leftMode;\n }, [shell, propsOnOpenChange, propsOpen]);\n\n // Emit expand/collapse events\n React.useEffect(() => {\n if (shell.leftMode === 'expanded') {\n onExpand?.();\n } else {\n onCollapse?.();\n }\n }, [shell.leftMode, onExpand, onCollapse]);\n\n const _isExpanded = shell.leftMode === 'expanded';\n\n // Left is not resizable; width derives from Rail/Panel.\n\n if (isOverlay) {\n const open = shell.leftMode === 'expanded';\n // Compute overlay width from child Rail/Panel expanded sizes\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && el.type === comp;\n const railEl = childArray.find((el) => isType(el, Rail));\n const panelEl = childArray.find((el) => isType(el, Panel));\n const railSize = typeof (railEl as any)?.props?.expandedSize === 'number' ? (railEl as any).props.expandedSize : 64;\n const panelSize = typeof (panelEl as any)?.props?.expandedSize === 'number' ? (panelEl as any).props.expandedSize : 288;\n const hasRail = Boolean(railEl);\n const hasPanel = Boolean(panelEl);\n const overlayPx = (hasRail ? railSize : 0) + (shell.panelMode === 'expanded' && hasPanel ? panelSize : 0);\n return (\n <Sheet.Root open={open} onOpenChange={(o) => shell.setLeftMode(o ? 'expanded' : 'collapsed')}>\n <Sheet.Content\n side=\"start\"\n style={{ padding: 0 }}\n width={{\n initial: `${overlayPx}px`,\n }}\n >\n <VisuallyHidden>\n <Sheet.Title>Navigation</Sheet.Title>\n </VisuallyHidden>\n <div className=\"rt-ShellLeft\">{children}</div>\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n\n if (isStacked) {\n const open = shell.leftMode === 'expanded';\n // Compute floating width from child Rail/Panel expanded sizes (like overlay)\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const isType = (el: React.ReactElement, comp: any) => React.isValidElement(el) && el.type === comp;\n const railEl = childArray.find((el) => isType(el, Rail));\n const panelEl = childArray.find((el) => isType(el, Panel));\n const _railSize = typeof (railEl as any)?.props?.expandedSize === 'number' ? (railEl as any).props.expandedSize : 64;\n const _panelSize = typeof (panelEl as any)?.props?.expandedSize === 'number' ? (panelEl as any).props.expandedSize : 288;\n const _hasRail = Boolean(railEl);\n const _hasPanel = Boolean(panelEl);\n const _includePanel = _hasPanel && (shell.panelMode === 'expanded' || shell.peekTarget === 'panel');\n\n // Strip control props from DOM spread\n return (\n <div\n {...domProps}\n ref={setRef}\n className={classNames('rt-ShellLeft', className)}\n data-mode={shell.leftMode}\n data-peek={shell.peekTarget === 'left' || shell.peekTarget === 'rail' || shell.peekTarget === 'panel' || undefined}\n data-presentation={resolvedPresentation}\n data-inset={inset || undefined}\n style={{\n ...style,\n }}\n data-open={open || undefined}\n >\n {children}\n </div>\n );\n }\n\n // Strip control/legacy props from DOM spread\n return (\n <div\n {...domProps}\n ref={setRef}\n className={classNames('rt-ShellLeft', className)}\n data-mode={shell.leftMode}\n data-peek={shell.peekTarget === 'left' || shell.peekTarget === 'rail' || shell.peekTarget === 'panel' || undefined}\n data-presentation={resolvedPresentation}\n data-inset={inset || undefined}\n style={{\n ...style,\n }}\n >\n {children}\n </div>\n );\n});\nLeft.displayName = 'Shell.Left';\nassignShellSlot(Left as any, 'Shell.Left');\n\nconst Rail = React.forwardRef<HTMLDivElement, RailProps>((initialProps, ref) => {\n const { className, presentation, expandedSize = 64, collapsible, onExpand, onCollapse, children, style, open, defaultOpen, onOpenChange, ...domProps } = initialProps;\n const shell = useShell();\n\n // Dev guards\n const wasControlledRef = React.useRef<boolean | null>(null);\n if (process.env.NODE_ENV !== 'production') {\n if (typeof open !== 'undefined' && typeof defaultOpen !== 'undefined') {\n console.error('Shell.Rail: Do not pass both `open` and `defaultOpen`. Choose one.');\n }\n }\n\n // Warn on controlled/uncontrolled mode switch\n React.useEffect(() => {\n const isControlled = typeof open !== 'undefined';\n if (wasControlledRef.current === null) {\n wasControlledRef.current = isControlled;\n return;\n }\n if (wasControlledRef.current !== isControlled) {\n console.warn('Shell.Rail: Switching between controlled and uncontrolled `open` is not supported.');\n wasControlledRef.current = isControlled;\n }\n }, [open]);\n\n // Register expanded size with Left container\n React.useEffect(() => {\n shell.onRailDefaults?.(expandedSize);\n }, [shell, expandedSize]);\n\n const isExpanded = shell.leftMode === 'expanded';\n\n // Strip unknown open/defaultOpen props from DOM by not spreading them\n return (\n <div\n {...domProps}\n ref={ref}\n className={classNames('rt-ShellRail', className)}\n data-mode={shell.leftMode}\n data-peek={(shell.currentBreakpointReady && shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'rail') || undefined}\n style={{\n ...style,\n '--rail-size': `${expandedSize}px`,\n } as CSSPropertiesWithVars}\n >\n <div className=\"rt-ShellRailContent\" data-visible={(shell.currentBreakpointReady && (isExpanded || (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'rail'))) || undefined}>\n {children}\n </div>\n </div>\n );\n});\nRail.displayName = 'Shell.Rail';\nassignShellSlot(Rail as any, 'Shell.Rail');\n\n// Panel\ntype HandleComponent = React.ForwardRefExoticComponent<React.ComponentPropsWithoutRef<'div'> & React.RefAttributes<HTMLDivElement>>;\n\ntype PanelOpenChangeMeta = { reason: 'toggle' | 'left' | 'init' | 'responsive' };\ntype PanelControlledProps = { open: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: PanelOpenChangeMeta) => void; defaultOpen?: never };\ntype PanelUncontrolledProps = { defaultOpen?: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: PanelOpenChangeMeta) => void; open?: never };\n\ntype PanelSizeControlledProps = { size: number | string; defaultSize?: never };\ntype PanelSizeUncontrolledProps = { defaultSize?: number | string; size?: never };\n\ntype PanelSizeChangeMeta = { reason: 'init' | 'resize' | 'controlled' };\ntype PanelPublicProps = Omit<PaneProps, 'presentation' | 'defaultMode'> &\n (PanelControlledProps | PanelUncontrolledProps) &\n (PanelSizeControlledProps | PanelSizeUncontrolledProps) & {\n onSizeChange?: (size: number, meta: PanelSizeChangeMeta) => void;\n sizeUpdate?: 'throttle' | 'debounce';\n sizeUpdateMs?: number;\n /** When true, adds margin to Rail+Panel and triggers gray backdrop on Shell. */\n inset?: boolean;\n };\ntype PanelComponent = React.ForwardRefExoticComponent<PanelPublicProps & React.RefAttributes<HTMLDivElement>> & {\n Handle: HandleComponent;\n};\n\ntype _SidebarComponent = React.ForwardRefExoticComponent<\n (Omit<PaneProps, 'mode' | 'defaultMode' | 'onModeChange'> & {\n state?: Responsive<SidebarMode>;\n defaultState?: SidebarMode;\n onStateChange?: (mode: SidebarMode) => void;\n thinSize?: number;\n toggleModes?: 'both' | 'single';\n }) &\n React.RefAttributes<HTMLDivElement>\n> & { Handle: HandleComponent };\n\ntype _InspectorComponent = React.ForwardRefExoticComponent<PaneProps & React.RefAttributes<HTMLDivElement>> & { Handle: HandleComponent };\n\ntype _BottomComponent = React.ForwardRefExoticComponent<PaneProps & React.RefAttributes<HTMLDivElement>> & { Handle: HandleComponent };\n\nconst PANEL_DOM_PROP_KEYS = [\n 'className',\n 'children',\n 'defaultOpen',\n 'open',\n 'onOpenChange',\n 'size',\n 'defaultSize',\n 'onSizeChange',\n 'sizeUpdate',\n 'sizeUpdateMs',\n 'style',\n] as const satisfies readonly (keyof PanelPublicProps)[];\n\nconst Panel = assignShellSlot(\n React.forwardRef<HTMLDivElement, PanelPublicProps>((initialProps, ref) => {\n const {\n className,\n defaultOpen,\n open,\n onOpenChange,\n size,\n defaultSize,\n expandedSize = 288,\n minSize,\n maxSize,\n resizable,\n collapsible = true,\n onExpand,\n onCollapse,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n paneId,\n persistence,\n children,\n style,\n onSizeChange,\n sizeUpdate,\n sizeUpdateMs = 50,\n } = initialProps;\n const panelDomProps = extractPaneDomProps(initialProps, PANEL_DOM_PROP_KEYS);\n // Ref for debounce cleanup\n const debounceTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // Cleanup debounce timeout on unmount or when dependencies change\n React.useEffect(() => {\n return () => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = null;\n }\n };\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n // Throttled/debounced emitter for onSizeChange\n const emitSizeChange = React.useMemo(() => {\n if (!onSizeChange) return () => {};\n if (sizeUpdate === 'debounce') {\n const fn = (s: number, meta: PanelSizeChangeMeta) => {\n if (debounceTimeoutRef.current) clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = setTimeout(() => {\n onSizeChange?.(s, meta);\n debounceTimeoutRef.current = null;\n }, sizeUpdateMs);\n };\n return fn;\n }\n if (sizeUpdate === 'throttle') {\n let last = 0;\n return (s: number, meta: PanelSizeChangeMeta) => {\n const now = Date.now();\n if (now - last >= sizeUpdateMs) {\n last = now;\n onSizeChange?.(s, meta);\n }\n };\n }\n return (s: number, meta: PanelSizeChangeMeta) => onSizeChange?.(s, meta);\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n const shell = useShell();\n const prevPanelModeRef = React.useRef<PaneMode | null>(null);\n const prevLeftModeRef = React.useRef<PaneMode | null>(null);\n const initNotifiedRef = React.useRef(false);\n\n // Dev-only runtime guard\n if (process.env.NODE_ENV !== 'production') {\n if (typeof open !== 'undefined' && typeof defaultOpen !== 'undefined') {\n console.error('Shell.Panel: Do not pass both `open` and `defaultOpen`. Choose one.');\n }\n if (typeof size !== 'undefined' && typeof defaultSize !== 'undefined') {\n console.error('Shell.Panel: Do not pass both `size` and `defaultSize`. Choose one.');\n }\n }\n\n // Normalize responsive open/defaultOpen to PaneMode\n const normalizedControlledOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(open), [open]);\n const normalizedDefaultOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(defaultOpen), [defaultOpen]);\n const openIsResponsive = typeof open === 'object' && open !== null;\n\n // Use responsive initial state hook for proper breakpoint handling\n useResponsiveInitialState<PaneMode>({\n controlledValue: normalizedControlledOpen,\n defaultValue: normalizedDefaultOpen,\n currentValue: shell.panelMode,\n setValue: (mode) => {\n // Ensure Left is expanded when Panel is expanded\n if (mode === 'expanded' && shell.leftMode !== 'expanded') {\n shell.setLeftMode('expanded');\n }\n shell.setPanelMode(mode);\n },\n breakpointReady: shell.currentBreakpointReady,\n controlledIsResponsive: openIsResponsive,\n onResponsiveChange: (next) => onOpenChange?.(next === 'expanded', { reason: 'responsive' }),\n onInit: (initial) => {\n if (typeof open === 'undefined') {\n onOpenChange?.(initial === 'expanded', { reason: 'init' });\n }\n },\n });\n\n // Dev-only warning if switching controlled/uncontrolled between renders\n const wasControlledRef = React.useRef<boolean | null>(null);\n React.useEffect(() => {\n const isControlled = typeof open !== 'undefined';\n if (wasControlledRef.current === null) {\n wasControlledRef.current = isControlled;\n return;\n }\n if (wasControlledRef.current !== isControlled) {\n console.warn('Shell.Panel: Switching between controlled and uncontrolled `open` is not supported.');\n wasControlledRef.current = isControlled;\n }\n }, [open]);\n\n React.useEffect(() => {\n shell.onPanelDefaults?.(expandedSize);\n }, [shell, expandedSize]);\n const localRef = React.useRef<HTMLDivElement | null>(null);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const handleChildren = childArray.filter((el: React.ReactElement) => React.isValidElement(el) && el.type === PanelHandle);\n const contentChildren = childArray.filter((el: React.ReactElement) => !(React.isValidElement(el) && el.type === PanelHandle));\n\n const isOverlay = shell.leftResolvedPresentation === 'overlay';\n\n // Normalize CSS lengths to px helper\n const normalizeSizeToPx = React.useCallback((value: number | string | undefined) => normalizeToPx(value, 'horizontal'), []);\n\n // Derive a default persistence adapter from paneId if none provided\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:panel:${paneId}`;\n const adapter: PaneSizePersistence = {\n load: () => {\n if (typeof window === 'undefined') return undefined;\n const v = window.localStorage.getItem(key);\n return v ? Number(v) : undefined;\n },\n save: (size: number) => {\n if (typeof window === 'undefined') return;\n window.localStorage.setItem(key, String(size));\n },\n };\n return adapter;\n }, [paneId, persistence]);\n\n // Load persisted size if configured (only in fixed presentation)\n React.useEffect(() => {\n let mounted = true;\n (async () => {\n if (!resizable || !persistenceAdapter?.load || isOverlay) return;\n const loaded = await persistenceAdapter.load();\n if (mounted && typeof loaded === 'number' && localRef.current) {\n localRef.current.style.setProperty('--panel-size', `${loaded}px`);\n onResize?.(loaded);\n }\n })();\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n // In overlay, ensure panel uses the fixed expandedSize, ignoring any persisted size\n React.useEffect(() => {\n if (!localRef.current) return;\n if (isOverlay) {\n localRef.current.style.setProperty('--panel-size', `${expandedSize}px`);\n }\n }, [isOverlay, expandedSize]);\n\n // Apply defaultSize on mount when uncontrolled\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof size === 'undefined' && typeof defaultSize !== 'undefined') {\n const px = normalizeSizeToPx(defaultSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n // Clamp to min/max if provided\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--panel-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'init' });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Controlled size sync\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof size === 'undefined') return;\n const px = normalizeSizeToPx(size);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--panel-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'controlled' });\n }\n }, [size, minSize, maxSize, normalizeSizeToPx, emitSizeChange]);\n\n // Ensure Left container width is auto whenever Panel is expanded in fixed presentation\n React.useEffect(() => {\n if (!localRef.current) return;\n if (shell.leftResolvedPresentation !== 'overlay' && shell.leftMode === 'expanded' && shell.panelMode === 'expanded') {\n const leftEl = (localRef.current.parentElement as HTMLElement) || null;\n try {\n leftEl?.style.removeProperty('width');\n } catch {}\n }\n }, [shell.leftResolvedPresentation, shell.leftMode, shell.panelMode]);\n\n const isExpanded = shell.leftMode === 'expanded' && shell.panelMode === 'expanded';\n\n // Notify on internal toggles and left cascade\n React.useEffect(() => {\n const prevPanel = prevPanelModeRef.current;\n const prevLeft = prevLeftModeRef.current;\n if (prevPanel !== null && prevPanel !== shell.panelMode) {\n const open = shell.panelMode === 'expanded';\n let reason: PanelOpenChangeMeta['reason'] = 'toggle';\n if (prevLeft !== shell.leftMode && shell.leftMode === 'collapsed' && !open) {\n reason = 'left';\n }\n onOpenChange?.(open, { reason });\n }\n prevPanelModeRef.current = shell.panelMode;\n prevLeftModeRef.current = shell.leftMode;\n }, [shell.panelMode, shell.leftMode, onOpenChange]);\n\n // Provide resizer handle when fixed (not overlay)\n const handleEl =\n resizable && shell.leftResolvedPresentation !== 'overlay' && isExpanded ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--panel-size',\n minSize: typeof minSize === 'number' ? minSize : 100,\n maxSize: typeof maxSize === 'number' ? maxSize : 800,\n defaultSize: expandedSize,\n orientation: 'vertical',\n edge: 'end',\n computeNext: (client, startClient, startSize) => {\n const isRtl = getComputedStyle(localRef.current!).direction === 'rtl';\n const delta = client - startClient;\n return startSize + (isRtl ? -delta : delta);\n },\n onResize,\n onResizeStart: (size) => {\n // Ensure Left container is not stuck with a fixed width in stacked\n const panelEl = localRef.current as HTMLElement | null;\n const leftEl = panelEl?.parentElement as HTMLElement | null;\n try {\n leftEl?.style.removeProperty('width');\n } catch {}\n onResizeStart?.(size);\n },\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n emitSizeChange(size, { reason: 'resize' });\n persistenceAdapter?.save?.(size);\n },\n target: 'panel',\n collapsible: Boolean(collapsible),\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => shell.setPanelMode('collapsed'),\n requestToggle: () => shell.togglePane('panel'),\n }}\n >\n {handleChildren.length > 0 ? handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i })) : <PaneHandle />}\n </PaneResizeContext.Provider>\n ) : null;\n\n return (\n <div\n {...panelDomProps}\n ref={setRef}\n className={classNames('rt-ShellPanel', className)}\n data-mode={shell.panelMode}\n data-visible={(shell.currentBreakpointReady && (isExpanded || (shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'panel'))) || undefined}\n data-peek={(shell.currentBreakpointReady && shell.leftResolvedPresentation !== 'overlay' && shell.peekTarget === 'panel') || undefined}\n style={{\n ...style,\n '--panel-size': `${expandedSize}px`,\n } as CSSPropertiesWithVars}\n >\n <div className=\"rt-ShellPanelContent\" data-visible={isExpanded || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n }),\n 'Shell.Panel',\n) as PanelComponent;\nPanel.displayName = 'Shell.Panel';\nPanel.Handle = PanelHandle;\n\n// Sidebar moved to ./_internal/shell-sidebar\n\n// Content (always required)\ninterface ShellContentProps extends React.ComponentPropsWithoutRef<'main'> {\n /** When true, adds margin and triggers gray backdrop on Shell. */\n inset?: boolean;\n}\n\nconst Content = React.forwardRef<HTMLElement, ShellContentProps>(({ className, inset, ...props }, ref) => {\n const { registerInset, unregisterInset } = useInset();\n\n // Register/unregister inset\n React.useEffect(() => {\n if (inset) {\n registerInset('content');\n return () => unregisterInset('content');\n }\n }, [inset, registerInset, unregisterInset]);\n\n return <main {...props} ref={ref} className={classNames('rt-ShellContent', className)} data-inset={inset || undefined} />;\n});\nContent.displayName = 'Shell.Content';\nassignShellSlot(Content as any, 'Shell.Content');\n\n// Inspector moved to ./_internal/shell-inspector\n\n// Bottom\n// Bottom moved to ./_internal/shell-bottom\n// (Bottom implementation extracted)\n\n// Trigger\n// PaneTarget type moved to shell.types.ts\ntype TriggerAction = 'toggle' | 'expand' | 'collapse';\n\ninterface TriggerProps extends React.ComponentPropsWithoutRef<'button'> {\n target: PaneTarget;\n action?: TriggerAction;\n /**\n * Whether to show peek preview on hover when the target pane is collapsed.\n * Defaults to false.\n */\n peekOnHover?: boolean;\n}\n\nconst Trigger = React.forwardRef<HTMLButtonElement, TriggerProps>(({ target, action = 'toggle', peekOnHover, onClick, onMouseEnter, onMouseLeave, children, ...props }, ref) => {\n const shell = useShell();\n\n const handleClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n\n // Clear any active peek on this target before toggling to avoid sticky peek state\n if (shell.peekTarget === target) {\n shell.clearPeek();\n }\n\n switch (action) {\n case 'toggle':\n shell.togglePane(target);\n break;\n case 'expand':\n shell.expandPane(target);\n break;\n case 'collapse':\n shell.collapsePane(target);\n break;\n }\n },\n [shell, target, action, onClick],\n );\n\n const isCollapsed = (() => {\n switch (target) {\n case 'left':\n case 'rail':\n return shell.leftMode === 'collapsed';\n case 'panel':\n return shell.leftMode === 'collapsed' || shell.panelMode === 'collapsed';\n case 'sidebar':\n return shell.sidebarMode === 'collapsed';\n case 'inspector':\n return shell.inspectorMode === 'collapsed';\n case 'bottom':\n return shell.bottomMode === 'collapsed';\n }\n })();\n\n const handleMouseEnter = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseEnter?.(event);\n if (!peekOnHover || !isCollapsed) return;\n // Use the actual target for peek behavior (not mapped to left)\n shell.peekPane(target);\n },\n [onMouseEnter, peekOnHover, isCollapsed, shell, target],\n );\n\n const handleMouseLeave = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onMouseLeave?.(event);\n if (!peekOnHover) return;\n if (shell.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 aria-expanded={!isCollapsed}\n >\n {children}\n </button>\n );\n});\nTrigger.displayName = 'Shell.Trigger';\n\n// Exports\nexport {\n Root,\n Header,\n Left,\n Rail,\n Panel,\n Sidebar,\n Content,\n Inspector,\n Bottom,\n Trigger,\n useShell,\n useResponsivePresentation,\n type PaneMode,\n type SidebarMode,\n type ResponsivePresentation,\n type PaneTarget,\n type TriggerAction,\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "classNames", "Sheet", "VisuallyHidden", "useResponsivePresentation", "useResponsiveInitialState", "PaneResizeContext", "PaneHandle", "PanelHandle", "omitPaneProps", "extractPaneDomProps", "mapResponsiveBooleanToPaneMode", "Sidebar", "Bottom", "Inspector", "_BREAKPOINTS", "normalizeToPx", "ShellProvider", "useShell", "LeftModeContext", "PanelModeContext", "SidebarModeContext", "InspectorModeContext", "BottomModeContext", "PresentationContext", "PeekContext", "ActionsContext", "CompositionContext", "InsetContext", "useInset", "useBreakpoint", "currentBp", "setCurrentBp", "ready", "setReady", "mqls", "k", "q", "compute", "_e", "matched", "m", "next", "cleanups", "mm", "fn", "SHELL_SLOT", "assignShellSlot", "component", "slot", "isShellComponent", "element", "type", "targetSlot", "paneReducer", "state", "action", "Root", "className", "children", "height", "props", "ref", "currentBreakpoint", "currentBreakpointReady", "initialChildren", "hasPanelDefaultOpen", "el", "railEl", "railDefaultOpen", "hasRailDefaultOpen", "hasInspectorDefaultOpen", "hasInspectorOpenControlled", "hasPanelOpenControlled", "openProp", "getSidebarInitialState", "sidebarEl", "getBottomInitialState", "bottomEl", "paneState", "dispatchPane", "setLeftMode", "mode", "setPanelMode", "setSidebarMode", "setInspectorMode", "setBottomMode", "hasLeft", "setHasLeft", "hasSidebar", "setHasSidebar", "sidebarToggleComputerRef", "current", "setSidebarToggleComputer", "devLeftPres", "setDevLeftPres", "onLeftPres", "p", "railDefaultSizeRef", "panelDefaultSizeRef", "onRailDefaults", "size", "onPanelDefaults", "hasLeftChildren", "childArray", "isType", "comp", "Rail", "Panel", "hasSidebarChildren", "togglePane", "target", "expandPane", "collapsePane", "baseContextValue", "headerEls", "Header", "railEls", "panelEls", "sidebarEls", "contentEls", "Content", "inspectorEls", "bottomEls", "firstRailOpen", "heightStyle", "peekTarget", "setPeekTarget", "peekPane", "clearPeek", "presentationCtxValue", "leftModeCtxValue", "panelModeCtxValue", "sidebarModeCtxValue", "inspectorModeCtxValue", "bottomModeCtxValue", "compositionCtxValue", "insetPanes", "setInsetPanes", "registerInset", "id", "prev", "unregisterInset", "hasAnyInset", "insetCtxValue", "peekCtxValue", "actionsCtxValue", "shellContextValue", "firstRail", "firstPanel", "leftInset", "passthroughProps", "Left", "style", "LEFT_DOM_OMIT_PROPS", "initialProps", "presentation", "_collapsible", "onExpand", "onCollapse", "inset", "restProps", "propsOpen", "propsDefaultOpen", "propsOnOpenChange", "domProps", "shell", "resolvedPresentation", "isOverlay", "isStacked", "localRef", "setRef", "node", "lastLeftModeRef", "initNotifiedRef", "normalizedLeftControlled", "normalizedLeftDefault", "initial", "_isExpanded", "open", "panelEl", "railSize", "panelSize", "hasRail", "hasPanel", "overlayPx", "o", "_railSize", "_panelSize", "_hasRail", "_includePanel", "expandedSize", "collapsible", "defaultOpen", "onOpenChange", "wasControlledRef", "isControlled", "isExpanded", "PANEL_DOM_PROP_KEYS", "defaultSize", "minSize", "maxSize", "resizable", "onResize", "onResizeStart", "onResizeEnd", "snapPoints", "snapTolerance", "collapseThreshold", "paneId", "persistence", "onSizeChange", "sizeUpdate", "sizeUpdateMs", "panelDomProps", "debounceTimeoutRef", "emitSizeChange", "s", "meta", "last", "now", "prevPanelModeRef", "prevLeftModeRef", "normalizedControlledOpen", "normalizedDefaultOpen", "openIsResponsive", "handleChildren", "contentChildren", "normalizeSizeToPx", "value", "persistenceAdapter", "key", "v", "mounted", "loaded", "px", "clamped", "leftEl", "prevPanel", "prevLeft", "reason", "handleEl", "client", "startClient", "startSize", "isRtl", "delta", "i", "Trigger", "peekOnHover", "onClick", "onMouseEnter", "onMouseLeave", "handleClick", "event", "isCollapsed", "handleMouseEnter", "handleMouseLeave"]
|
|
7
7
|
}
|
package/package.json
CHANGED
package/schemas/base-button.json
CHANGED
|
@@ -279,6 +279,6 @@
|
|
|
279
279
|
"title": "Base-button Component Props",
|
|
280
280
|
"description": "Props schema for the base-button component in Kookie UI",
|
|
281
281
|
"version": "1.0.0",
|
|
282
|
-
"generatedAt": "2026-01-
|
|
282
|
+
"generatedAt": "2026-01-14T04:51:02.583Z",
|
|
283
283
|
"source": "Zod schema"
|
|
284
284
|
}
|