chordia-ui 3.2.6 → 3.2.7
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.
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),k=require("react"),n=require("lucide-react"),I={home:n.Home,projects:n.FolderClosed,folder:n.FolderClosed,organization:n.Users,users:n.Users,dashboard:n.LayoutDashboard,history:n.Clock3,sessions:n.Clock3,monitoring:n.Activity,activity:n.Activity,insights:n.Lightbulb,notifications:n.Bell,integrations:n.Plug,settings:n.Settings,usage:n.BarChart3,docs:n.FileText,documentation:n.FileText,agents:n.Headphones,security:n.Shield,configuration:n.Sliders,workflow:n.Workflow};function w(r){return r?typeof r=="string"?I[r.toLowerCase()]||n.SquareDot:r:n.SquareDot}function B({menuItems:r=[],activeId:t,onNavigate:o,collapsed:i,onToggleCollapse:u,header:g,footer:l,width:c=244,collapsedWidth:f=56}){const[s,y]=k.useState(!1),d=i!==void 0?i:s,h=u||(()=>y(!s)),[b,p]=k.useState(()=>{const a={};return r.forEach(x=>{var v;if((v=x.children)!=null&&v.length){const A=x.children.some(S=>S.id===t||S.active);a[x.id]=A}}),a}),T=a=>{p(x=>({...x,[a]:!x[a]}))},m=d?f:c;return e.jsxs("nav",{style:{width:m,minWidth:m,height:"100%",display:"flex",flexDirection:"column",alignItems:"flex-start",padding:d?"0":"0 0 24px 24px",gap:24,background:"var(--Background-Inverse, #0B0B0B)",fontFamily:"var(--font-sans)",transition:"width 0.2s ease, min-width 0.2s ease",overflow:"hidden",flexShrink:0},children:[g&&!d&&e.jsx("div",{style:{padding:"16px 16px 8px",flexShrink:0,width:"100%"},children:g}),e.jsx("div",{style:{display:"flex",justifyContent:d?"center":"flex-end",padding:d?"12px 0":"8px 0 0",flexShrink:0,width:"100%"},children:e.jsx("button",{onClick:h,title:d?"Expand sidebar":"Collapse sidebar",style:{display:"flex",alignItems:"center",justifyContent:"center",width:28,height:28,borderRadius:"var(--radius-sm)",border:"none",background:"transparent",color:"rgba(255, 255, 255, 0.5)",cursor:"pointer",transition:"background 0.15s ease, color 0.15s ease"},onMouseEnter:a=>{a.currentTarget.style.background="rgba(255, 255, 255, 0.08)",a.currentTarget.style.color="rgba(255, 255, 255, 0.8)"},onMouseLeave:a=>{a.currentTarget.style.background="transparent",a.currentTarget.style.color="rgba(255, 255, 255, 0.5)"},children:d?e.jsx(n.PanelLeft,{size:16}):e.jsx(n.PanelLeftClose,{size:16})})}),e.jsx("div",{style:{flex:1,overflowY:"auto",overflowX:"hidden",padding:d?"0 8px":"0",width:"100%"},children:r.map((a,x)=>{var v;return e.jsxs(k.Fragment,{children:[a.section&&!d&&e.jsx("div",{style:{fontSize:"var(--text-xs)",fontWeight:650,letterSpacing:"0.08em",textTransform:"uppercase",color:"rgba(255, 255, 255, 0.35)",padding:"16px 8px 6px",lineHeight:1},children:a.section}),(v=a.children)!=null&&v.length?e.jsx(E,{item:a,activeId:t,expanded:!!b[a.id],onToggle:()=>T(a.id),onNavigate:o,collapsed:d}):e.jsx(C,{item:a,active:a.id===t||a.active,onNavigate:o,collapsed:d})]},a.id||x)})}),l&&!d&&e.jsx("div",{style:{padding:"12px 16px",borderTop:"1px solid rgba(255, 255, 255, 0.08)",flexShrink:0,width:"100%"},children:l})]})}function C({item:r,active:t,onNavigate:o,collapsed:i}){const u=w(r.icon),g=typeof r.icon!="string"&&typeof r.icon<"u";return e.jsxs("button",{onClick:()=>o==null?void 0:o(r.href||r.id),title:i?r.label:void 0,style:{display:"flex",alignItems:"center",gap:i?0:12,justifyContent:i?"center":"flex-start",width:"100%",padding:i?"10px 0":"12px 24px 12px 12px",borderRadius:t?"4px 0 0 4px":"4px",borderRight:t?"2px solid #00A66E":"2px solid transparent",borderTop:"none",borderBottom:"none",borderLeft:"none",background:t?"var(--Background-MonoPressed, #323232)":"transparent",color:t?"#00A66E":"var(--Content-TertiaryInverse, #B2AEA8)",fontWeight:t?550:400,fontSize:"var(--text-sm)",fontFamily:"var(--font-sans)",cursor:"pointer",textAlign:"left",transition:"background 0.15s ease, color 0.1s ease, border-color 0.15s ease",marginBottom:2},onMouseEnter:l=>{t||(l.currentTarget.style.background="var(--Background-MonoPressed, #323232)",l.currentTarget.style.color="#00A66E")},onMouseLeave:l=>{t||(l.currentTarget.style.background="transparent",l.currentTarget.style.color="var(--Content-TertiaryInverse, #B2AEA8)")},children:[g?e.jsx("span",{style:{flexShrink:0,display:"flex"},children:r.icon}):e.jsx(u,{size:18,style:{flexShrink:0,color:"inherit"}}),!i&&e.jsx("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:r.label})]})}function E({item:r,activeId:t,expanded:o,onToggle:i,onNavigate:u,collapsed:g}){var f;const l=w(r.icon),c=(f=r.children)==null?void 0:f.some(s=>s.id===t||s.active);return g?e.jsx("button",{onClick:i,title:r.label,style:{display:"flex",alignItems:"center",justifyContent:"center",width:"100%",padding:"10px 0",borderRadius:"4px",border:"none",background:c?"var(--Background-MonoPressed, #323232)":"transparent",color:c?"#00A66E":"var(--Content-TertiaryInverse, #B2AEA8)",cursor:"pointer",marginBottom:2,transition:"background 0.15s ease"},onMouseEnter:s=>{c||(s.currentTarget.style.background="var(--Background-MonoPressed, #323232)",s.currentTarget.style.color="#00A66E")},onMouseLeave:s=>{c||(s.currentTarget.style.background="transparent",s.currentTarget.style.color="var(--Content-TertiaryInverse, #B2AEA8)")},children:e.jsx(l,{size:18,style:{color:"inherit"}})}):e.jsxs("div",{style:{marginBottom:2},children:[e.jsxs("button",{onClick:i,style:{display:"flex",alignItems:"center",gap:12,width:"100%",padding:"12px 24px 12px 12px",borderRadius:"4px",border:"none",background:"transparent",color:c?"#00A66E":"var(--Content-TertiaryInverse, #B2AEA8)",fontWeight:c?550:400,fontSize:"var(--text-sm)",fontFamily:"var(--font-sans)",cursor:"pointer",textAlign:"left",transition:"background 0.15s ease, color 0.15s ease"},onMouseEnter:s=>{s.currentTarget.style.background="var(--Background-MonoPressed, #323232)",s.currentTarget.style.color="#00A66E"},onMouseLeave:s=>{s.currentTarget.style.background="transparent",c?s.currentTarget.style.color="#00A66E":s.currentTarget.style.color="var(--Content-TertiaryInverse, #B2AEA8)"},children:[e.jsx(l,{size:18,style:{flexShrink:0,color:"inherit"}}),e.jsx("span",{style:{flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:r.label}),e.jsx(n.ChevronDown,{size:14,style:{flexShrink:0,color:"inherit",opacity:.7,transform:o?"rotate(0deg)":"rotate(-90deg)",transition:"transform 0.2s ease"}})]}),o&&e.jsx("div",{style:{paddingLeft:18,marginTop:2},children:r.children.map((s,y)=>e.jsx(C,{item:s,active:s.id===t||s.active,onNavigate:u,collapsed:!1},s.id||y))})]})}const j=["#5a8a6e","#b07d4f","#7a8fa6","#c47a5a","#6a9a8a","#a0785a","#5a7a9a","#9a7a5a"];function z(r){if(!r)return j[0];let t=0;for(let o=0;o<r.length;o++)t=(t<<5)-t+r.charCodeAt(o)|0;return j[Math.abs(t)%j.length]}function M({logo:r,title:t,userName:o,userEmail:i,userInitials:u,userRole:g,onSignOut:l,children:c,trailing:f,userMenu:s,height:y=48,style:d}){const h=o||i||"",b=u||D(h);return e.jsxs("header",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"0 20px",height:y,borderBottom:"1px solid var(--border)",background:"var(--paper-elevated)",flexShrink:0,fontFamily:"var(--font-sans)",position:"sticky",top:0,zIndex:1e3,...d},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexShrink:0},children:[r!==void 0?r:e.jsx("span",{style:{fontSize:"var(--text-lg)",fontWeight:700,fontFamily:"var(--font-display)",color:"var(--text-ink)",letterSpacing:"-0.01em"},children:"Chordia"}),t&&e.jsxs(e.Fragment,{children:[e.jsx("span",{style:{width:1,height:18,background:"var(--border)",flexShrink:0}}),e.jsx("span",{style:{fontSize:"var(--text-md)",fontWeight:500,color:"var(--text-muted)"},children:t})]})]}),c&&e.jsx("div",{style:{display:"flex",alignItems:"center",gap:8,flex:1,justifyContent:"center",minWidth:0},children:c}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexShrink:0},children:[f,s||h&&e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[e.jsx("div",{style:{width:30,height:30,borderRadius:"50%",background:z(h),display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:e.jsx("span",{style:{fontSize:11,fontWeight:600,color:"#fff",letterSpacing:"0.02em",lineHeight:1},children:b})}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:1},children:[e.jsx("span",{style:{fontSize:"var(--text-sm)",fontWeight:550,color:"var(--text-strong)",lineHeight:1.2},children:h}),g&&e.jsx("span",{style:{fontSize:"var(--text-xs)",color:"var(--text-muted)",lineHeight:1.2},children:g})]}),l&&e.jsx("button",{onClick:l,title:"Sign out",style:{display:"flex",alignItems:"center",justifyContent:"center",width:28,height:28,borderRadius:"var(--radius-sm)",border:"none",background:"transparent",color:"var(--text-faint)",cursor:"pointer",transition:"background 0.15s ease, color 0.15s ease"},onMouseEnter:p=>{p.currentTarget.style.background="var(--hover-warm)",p.currentTarget.style.color="var(--text-muted)"},onMouseLeave:p=>{p.currentTarget.style.background="transparent",p.currentTarget.style.color="var(--text-faint)"},children:e.jsx(n.LogOut,{size:14})})]})]})]})}function L({label:r,color:t="var(--text-muted)",active:o,onClick:i}){return e.jsxs("button",{onClick:i,style:{display:"flex",alignItems:"center",gap:4,fontSize:"var(--text-sm)",fontWeight:500,fontFamily:"var(--font-sans)",padding:"4px 10px",borderRadius:"var(--radius-sm)",border:`1px solid color-mix(in srgb, ${t} 30%, transparent)`,background:`color-mix(in srgb, ${t} 10%, transparent)`,color:t,cursor:"pointer",transition:"background 0.15s ease, border-color 0.15s ease"},onMouseEnter:u=>{u.currentTarget.style.background=`color-mix(in srgb, ${t} 18%, transparent)`},onMouseLeave:u=>{u.currentTarget.style.background=`color-mix(in srgb, ${t} 10%, transparent)`},children:[r,e.jsx(n.ChevronDown,{size:12,style:{transform:o?"rotate(180deg)":"rotate(0deg)",transition:"transform 0.2s ease",opacity:.7}})]})}function R({open:r,onClose:t,children:o,align:i="left"}){return r?e.jsxs(e.Fragment,{children:[e.jsx("div",{onClick:t,style:{position:"fixed",inset:0,zIndex:99,background:"rgba(0,0,0,0.03)"}}),e.jsx("div",{style:{position:"absolute",top:"100%",[i==="right"?"right":"left"]:0,marginTop:4,zIndex:100,background:"#fff",border:"1px solid var(--border)",borderRadius:"var(--radius)",padding:4,minWidth:200,maxHeight:280,overflowY:"auto",boxShadow:"0 8px 24px rgba(0,0,0,0.12)"},children:o})]}):null}function F({label:r,active:t,onClick:o}){return e.jsx("div",{onClick:o,style:{padding:"8px 10px",borderRadius:"var(--radius-sm)",cursor:"pointer",fontSize:"var(--text-sm)",color:t?"var(--text-ink)":"var(--text-base)",fontWeight:t?600:400,fontFamily:"var(--font-sans)",background:t?"var(--hover-warm)":"transparent",transition:"background 0.1s ease"},onMouseEnter:i=>{t||(i.currentTarget.style.background="var(--hover-warm-subtle)")},onMouseLeave:i=>{t||(i.currentTarget.style.background="transparent")},children:r})}function W({connected:r,label:t}){const o=t||(r?"Connected":"Disconnected");return e.jsx("span",{style:{fontSize:"var(--text-xs)",fontFamily:"var(--font-sans)",padding:"3px 10px",borderRadius:12,border:`1px solid ${r?"var(--state-present)":"var(--border)"}`,color:r?"var(--state-present)":"var(--text-faint)",background:r?"rgba(37,163,114,0.08)":"transparent",transition:"all 0.2s ease"},children:o})}function D(r){if(!r)return"?";const t=r.trim().split(/\s+/);return t.length>=2?(t[0][0]+t[t.length-1][0]).toUpperCase():r.slice(0,2).toUpperCase()}exports.NavDropdown=R;exports.NavDropdownItem=F;exports.NavPill=L;exports.NavigationBar=M;exports.Sidebar=B;exports.StatusIndicator=W;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),k=require("react"),n=require("lucide-react"),I={home:n.Home,projects:n.FolderClosed,folder:n.FolderClosed,organization:n.Users,users:n.Users,dashboard:n.LayoutDashboard,history:n.Clock3,sessions:n.Clock3,monitoring:n.Activity,activity:n.Activity,insights:n.Lightbulb,notifications:n.Bell,integrations:n.Plug,settings:n.Settings,usage:n.BarChart3,docs:n.FileText,documentation:n.FileText,agents:n.Headphones,security:n.Shield,configuration:n.Sliders,workflow:n.Workflow};function B(r){return r?typeof r=="string"?I[r.toLowerCase()]||n.SquareDot:r:n.SquareDot}function A({menuItems:r=[],activeId:t,onNavigate:s,collapsed:i,onToggleCollapse:c,header:g,footer:l,width:u=244,collapsedWidth:f=56}){const[o,y]=k.useState(!1),d=i!==void 0?i:o,h=c||(()=>y(!o)),[b,x]=k.useState(()=>{const a={};return r.forEach(p=>{var v;if((v=p.children)!=null&&v.length){const C=p.children.some(S=>S.id===t||S.active);a[p.id]=C}}),a}),w=a=>{x(p=>({...p,[a]:!p[a]}))},j=d?f:u;return e.jsxs("nav",{style:{width:j,minWidth:j,height:"100%",display:"flex",flexDirection:"column",alignItems:"flex-start",padding:d?"0":"0 0 24px 24px",gap:24,background:"var(--Background-Inverse, #0B0B0B)",fontFamily:"var(--font-sans)",transition:"width 0.2s ease, min-width 0.2s ease",overflow:"hidden",flexShrink:0},children:[g&&!d&&e.jsx("div",{style:{padding:"16px 16px 8px",flexShrink:0,width:"100%"},children:g}),e.jsx("div",{style:{display:"flex",justifyContent:d?"center":"flex-end",padding:d?"12px 0":"8px 0 0",flexShrink:0,width:"100%"},children:e.jsx("button",{onClick:h,title:d?"Expand sidebar":"Collapse sidebar",style:{display:"flex",alignItems:"center",justifyContent:"center",width:28,height:28,borderRadius:"var(--radius-sm)",border:"none",background:"transparent",color:"rgba(255, 255, 255, 0.5)",cursor:"pointer",transition:"background 0.15s ease, color 0.15s ease"},onMouseEnter:a=>{a.currentTarget.style.background="rgba(255, 255, 255, 0.08)",a.currentTarget.style.color="rgba(255, 255, 255, 0.8)"},onMouseLeave:a=>{a.currentTarget.style.background="transparent",a.currentTarget.style.color="rgba(255, 255, 255, 0.5)"},children:d?e.jsx(n.PanelLeft,{size:16}):e.jsx(n.PanelLeftClose,{size:16})})}),e.jsx("div",{style:{flex:1,overflowY:"auto",overflowX:"hidden",padding:d?"0 8px":"0",width:"100%"},children:r.map((a,p)=>{var v;return e.jsxs(k.Fragment,{children:[a.section&&!d&&e.jsx("div",{style:{fontSize:"var(--text-xs)",fontWeight:650,letterSpacing:"0.08em",textTransform:"uppercase",color:"rgba(255, 255, 255, 0.35)",padding:"16px 8px 6px",lineHeight:1},children:a.section}),(v=a.children)!=null&&v.length?e.jsx(z,{item:a,activeId:t,expanded:!!b[a.id],onToggle:()=>w(a.id),onNavigate:s,collapsed:d}):e.jsx(T,{item:a,active:a.id===t||a.active,onNavigate:s,collapsed:d})]},a.id||p)})}),l&&!d&&e.jsx("div",{style:{padding:"12px 16px",borderTop:"1px solid rgba(255, 255, 255, 0.08)",flexShrink:0,width:"100%"},children:l})]})}function T({item:r,active:t,onNavigate:s,collapsed:i}){const c=B(r.icon),g=typeof r.icon!="string"&&typeof r.icon<"u";return e.jsxs("button",{onClick:()=>s==null?void 0:s(r.href||r.id),title:i?r.label:void 0,style:{display:"flex",alignItems:"center",gap:i?0:12,justifyContent:i?"center":"flex-start",width:"100%",padding:i?"10px 0":"12px 24px 12px 12px",borderRadius:t?"4px 0 0 4px":"4px",borderRight:t?"2px solid #00A66E":"2px solid transparent",borderTop:"none",borderBottom:"none",borderLeft:"none",background:t?"var(--Background-MonoPressed, #323232)":"transparent",color:t?"var(--Brand-400, #33B88B)":"var(--Content-TertiaryInverse, #B2AEA8)",fontWeight:500,fontSize:"12px",fontStyle:"normal",lineHeight:"120%",textTransform:"uppercase",fontFamily:"var(--font-sans)",cursor:"pointer",textAlign:"left",transition:"background 0.15s ease, color 0.1s ease, border-color 0.15s ease",marginBottom:2},onMouseEnter:l=>{t||(l.currentTarget.style.background="var(--Background-MonoPressed, #323232)",l.currentTarget.style.color="var(--Brand-400, #33B88B)")},onMouseLeave:l=>{t||(l.currentTarget.style.background="transparent",l.currentTarget.style.color="var(--Content-TertiaryInverse, #B2AEA8)")},children:[g?e.jsx("span",{style:{flexShrink:0,display:"flex"},children:r.icon}):e.jsx(c,{size:18,style:{flexShrink:0,color:"inherit"}}),!i&&e.jsx("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:r.label})]})}function z({item:r,activeId:t,expanded:s,onToggle:i,onNavigate:c,collapsed:g}){var f;const l=B(r.icon),u=(f=r.children)==null?void 0:f.some(o=>o.id===t||o.active);return g?e.jsx("button",{onClick:i,title:r.label,style:{display:"flex",alignItems:"center",justifyContent:"center",width:"100%",padding:"10px 0",borderRadius:"4px",border:"none",background:u?"var(--Background-MonoPressed, #323232)":"transparent",color:u?"var(--Brand-400, #33B88B)":"var(--Content-TertiaryInverse, #B2AEA8)",cursor:"pointer",marginBottom:2,transition:"background 0.15s ease"},onMouseEnter:o=>{u||(o.currentTarget.style.background="var(--Background-MonoPressed, #323232)",o.currentTarget.style.color="var(--Brand-400, #33B88B)")},onMouseLeave:o=>{u||(o.currentTarget.style.background="transparent",o.currentTarget.style.color="var(--Content-TertiaryInverse, #B2AEA8)")},children:e.jsx(l,{size:18,style:{color:"inherit"}})}):e.jsxs("div",{style:{marginBottom:2},children:[e.jsxs("button",{onClick:i,style:{display:"flex",alignItems:"center",gap:12,width:"100%",padding:"12px 24px 12px 12px",borderRadius:"4px",border:"none",background:"transparent",color:u?"var(--Brand-400, #33B88B)":"var(--Content-TertiaryInverse, #B2AEA8)",fontWeight:700,fontSize:"12px",fontStyle:"normal",lineHeight:"120%",textTransform:"uppercase",fontFamily:"var(--font-sans)",cursor:"pointer",textAlign:"left",transition:"background 0.15s ease, color 0.15s ease"},onMouseEnter:o=>{o.currentTarget.style.background="var(--Background-MonoPressed, #323232)",o.currentTarget.style.color="var(--Brand-400, #33B88B)"},onMouseLeave:o=>{o.currentTarget.style.background="transparent",u?o.currentTarget.style.color="var(--Brand-400, #33B88B)":o.currentTarget.style.color="var(--Content-TertiaryInverse, #B2AEA8)"},children:[e.jsx(l,{size:18,style:{flexShrink:0,color:"inherit"}}),e.jsx("span",{style:{flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:r.label}),e.jsx(n.ChevronDown,{size:14,style:{flexShrink:0,color:"inherit",opacity:.7,transform:s?"rotate(0deg)":"rotate(-90deg)",transition:"transform 0.2s ease"}})]}),s&&e.jsx("div",{style:{paddingLeft:18,marginTop:2},children:r.children.map((o,y)=>e.jsx(T,{item:o,active:o.id===t||o.active,onNavigate:c,collapsed:!1},o.id||y))})]})}const m=["#5a8a6e","#b07d4f","#7a8fa6","#c47a5a","#6a9a8a","#a0785a","#5a7a9a","#9a7a5a"];function M(r){if(!r)return m[0];let t=0;for(let s=0;s<r.length;s++)t=(t<<5)-t+r.charCodeAt(s)|0;return m[Math.abs(t)%m.length]}function E({logo:r,title:t,userName:s,userEmail:i,userInitials:c,userRole:g,onSignOut:l,children:u,trailing:f,userMenu:o,height:y=48,style:d}){const h=s||i||"",b=c||D(h);return e.jsxs("header",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"0 20px",height:y,borderBottom:"1px solid var(--border)",background:"var(--paper-elevated)",flexShrink:0,fontFamily:"var(--font-sans)",position:"sticky",top:0,zIndex:1e3,...d},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexShrink:0},children:[r!==void 0?r:e.jsx("span",{style:{fontSize:"var(--text-lg)",fontWeight:700,fontFamily:"var(--font-display)",color:"var(--text-ink)",letterSpacing:"-0.01em"},children:"Chordia"}),t&&e.jsxs(e.Fragment,{children:[e.jsx("span",{style:{width:1,height:18,background:"var(--border)",flexShrink:0}}),e.jsx("span",{style:{fontSize:"var(--text-md)",fontWeight:500,color:"var(--text-muted)"},children:t})]})]}),u&&e.jsx("div",{style:{display:"flex",alignItems:"center",gap:8,flex:1,justifyContent:"center",minWidth:0},children:u}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexShrink:0},children:[f,o||h&&e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[e.jsx("div",{style:{width:30,height:30,borderRadius:"50%",background:M(h),display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:e.jsx("span",{style:{fontSize:11,fontWeight:600,color:"#fff",letterSpacing:"0.02em",lineHeight:1},children:b})}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:1},children:[e.jsx("span",{style:{fontSize:"var(--text-sm)",fontWeight:550,color:"var(--text-strong)",lineHeight:1.2},children:h}),g&&e.jsx("span",{style:{fontSize:"var(--text-xs)",color:"var(--text-muted)",lineHeight:1.2},children:g})]}),l&&e.jsx("button",{onClick:l,title:"Sign out",style:{display:"flex",alignItems:"center",justifyContent:"center",width:28,height:28,borderRadius:"var(--radius-sm)",border:"none",background:"transparent",color:"var(--text-faint)",cursor:"pointer",transition:"background 0.15s ease, color 0.15s ease"},onMouseEnter:x=>{x.currentTarget.style.background="var(--hover-warm)",x.currentTarget.style.color="var(--text-muted)"},onMouseLeave:x=>{x.currentTarget.style.background="transparent",x.currentTarget.style.color="var(--text-faint)"},children:e.jsx(n.LogOut,{size:14})})]})]})]})}function L({label:r,color:t="var(--text-muted)",active:s,onClick:i}){return e.jsxs("button",{onClick:i,style:{display:"flex",alignItems:"center",gap:4,fontSize:"var(--text-sm)",fontWeight:500,fontFamily:"var(--font-sans)",padding:"4px 10px",borderRadius:"var(--radius-sm)",border:`1px solid color-mix(in srgb, ${t} 30%, transparent)`,background:`color-mix(in srgb, ${t} 10%, transparent)`,color:t,cursor:"pointer",transition:"background 0.15s ease, border-color 0.15s ease"},onMouseEnter:c=>{c.currentTarget.style.background=`color-mix(in srgb, ${t} 18%, transparent)`},onMouseLeave:c=>{c.currentTarget.style.background=`color-mix(in srgb, ${t} 10%, transparent)`},children:[r,e.jsx(n.ChevronDown,{size:12,style:{transform:s?"rotate(180deg)":"rotate(0deg)",transition:"transform 0.2s ease",opacity:.7}})]})}function R({open:r,onClose:t,children:s,align:i="left"}){return r?e.jsxs(e.Fragment,{children:[e.jsx("div",{onClick:t,style:{position:"fixed",inset:0,zIndex:99,background:"rgba(0,0,0,0.03)"}}),e.jsx("div",{style:{position:"absolute",top:"100%",[i==="right"?"right":"left"]:0,marginTop:4,zIndex:100,background:"#fff",border:"1px solid var(--border)",borderRadius:"var(--radius)",padding:4,minWidth:200,maxHeight:280,overflowY:"auto",boxShadow:"0 8px 24px rgba(0,0,0,0.12)"},children:s})]}):null}function F({label:r,active:t,onClick:s}){return e.jsx("div",{onClick:s,style:{padding:"8px 10px",borderRadius:"var(--radius-sm)",cursor:"pointer",fontSize:"var(--text-sm)",color:t?"var(--text-ink)":"var(--text-base)",fontWeight:t?600:400,fontFamily:"var(--font-sans)",background:t?"var(--hover-warm)":"transparent",transition:"background 0.1s ease"},onMouseEnter:i=>{t||(i.currentTarget.style.background="var(--hover-warm-subtle)")},onMouseLeave:i=>{t||(i.currentTarget.style.background="transparent")},children:r})}function W({connected:r,label:t}){const s=t||(r?"Connected":"Disconnected");return e.jsx("span",{style:{fontSize:"var(--text-xs)",fontFamily:"var(--font-sans)",padding:"3px 10px",borderRadius:12,border:`1px solid ${r?"var(--state-present)":"var(--border)"}`,color:r?"var(--state-present)":"var(--text-faint)",background:r?"rgba(37,163,114,0.08)":"transparent",transition:"all 0.2s ease"},children:s})}function D(r){if(!r)return"?";const t=r.trim().split(/\s+/);return t.length>=2?(t[0][0]+t[t.length-1][0]).toUpperCase():r.slice(0,2).toUpperCase()}exports.NavDropdown=R;exports.NavDropdownItem=F;exports.NavPill=L;exports.NavigationBar=E;exports.Sidebar=A;exports.StatusIndicator=W;
|
|
2
2
|
//# sourceMappingURL=navigation.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.cjs.js","sources":["../../src/components/navigation/Sidebar.jsx","../../src/components/navigation/NavigationBar.jsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState } from \"react\";\nimport {\n Home, FolderClosed, Users, Settings, ChevronDown,\n LayoutDashboard, Clock3, Activity, Lightbulb, Bell, Plug, BarChart3,\n FileText, Headphones, Shield, Sliders, Workflow, SquareDot,\n PanelLeftClose, PanelLeft,\n} from \"lucide-react\";\n\n/**\n * Sidebar — collapsible navigation sidebar.\n *\n * Slot-based: pass menuItems as data, component handles rendering + expand/collapse.\n * No framework dependencies (no router, no auth, no API calls).\n *\n * Props:\n * - menuItems Array<MenuItem> Navigation items (see shape below)\n * - activeId string Currently active item id\n * - onNavigate function(href) Navigation callback\n * - collapsed boolean External collapsed state (controlled)\n * - onToggleCollapse function Toggle callback\n * - header ReactNode Optional header slot (logo, brand)\n * - footer ReactNode Optional footer slot (user, settings)\n * - width number Expanded width (default 240)\n * - collapsedWidth number Collapsed width (default 56)\n *\n * MenuItem shape:\n * - id string\n * - label string\n * - icon string (key from ICON_MAP) or ReactNode\n * - href string\n * - active boolean (override)\n * - children Array<MenuItem> (nested group)\n * - section string (section label above this item)\n */\n\nconst ICON_MAP = {\n home: Home,\n projects: FolderClosed,\n folder: FolderClosed,\n organization: Users,\n users: Users,\n dashboard: LayoutDashboard,\n history: Clock3,\n sessions: Clock3,\n monitoring: Activity,\n activity: Activity,\n insights: Lightbulb,\n notifications: Bell,\n integrations: Plug,\n settings: Settings,\n usage: BarChart3,\n docs: FileText,\n documentation: FileText,\n agents: Headphones,\n security: Shield,\n configuration: Sliders,\n workflow: Workflow,\n};\n\nfunction resolveIcon(icon) {\n if (!icon) return SquareDot;\n if (typeof icon === \"string\") return ICON_MAP[icon.toLowerCase()] || SquareDot;\n return icon;\n}\n\nexport default function Sidebar({\n menuItems = [],\n activeId,\n onNavigate,\n collapsed: controlledCollapsed,\n onToggleCollapse,\n header,\n footer,\n width = 244,\n collapsedWidth = 56,\n}) {\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const collapsed = controlledCollapsed !== undefined ? controlledCollapsed : internalCollapsed;\n const toggleCollapse = onToggleCollapse || (() => setInternalCollapsed(!internalCollapsed));\n\n const [expandedGroups, setExpandedGroups] = useState(() => {\n const initial = {};\n menuItems.forEach((item) => {\n if (item.children?.length) {\n // Auto-expand groups that contain the active item\n const hasActive = item.children.some((c) => c.id === activeId || c.active);\n initial[item.id] = hasActive;\n }\n });\n return initial;\n });\n\n const toggleGroup = (id) => {\n setExpandedGroups((prev) => ({ ...prev, [id]: !prev[id] }));\n };\n\n const currentWidth = collapsed ? collapsedWidth : width;\n\n return (\n <nav\n style={{\n width: currentWidth,\n minWidth: currentWidth,\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n padding: collapsed ? \"0\" : \"0 0 24px 24px\",\n gap: 24,\n background: \"var(--Background-Inverse, #0B0B0B)\",\n fontFamily: \"var(--font-sans)\",\n transition: \"width 0.2s ease, min-width 0.2s ease\",\n overflow: \"hidden\",\n flexShrink: 0,\n }}\n >\n {/* Header slot */}\n {header && !collapsed && (\n <div style={{ padding: \"16px 16px 8px\", flexShrink: 0, width: \"100%\" }}>\n {header}\n </div>\n )}\n\n {/* Collapse toggle */}\n <div\n style={{\n display: \"flex\",\n justifyContent: collapsed ? \"center\" : \"flex-end\",\n padding: collapsed ? \"12px 0\" : \"8px 0 0\",\n flexShrink: 0,\n width: \"100%\",\n }}\n >\n <button\n onClick={toggleCollapse}\n title={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 28,\n height: 28,\n borderRadius: \"var(--radius-sm)\",\n border: \"none\",\n background: \"transparent\",\n color: \"rgba(255, 255, 255, 0.5)\",\n cursor: \"pointer\",\n transition: \"background 0.15s ease, color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(255, 255, 255, 0.08)\";\n e.currentTarget.style.color = \"rgba(255, 255, 255, 0.8)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"rgba(255, 255, 255, 0.5)\";\n }}\n >\n {collapsed ? <PanelLeft size={16} /> : <PanelLeftClose size={16} />}\n </button>\n </div>\n\n {/* Menu items */}\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n overflowX: \"hidden\",\n padding: collapsed ? \"0 8px\" : \"0\",\n width: \"100%\",\n }}\n >\n {menuItems.map((item, idx) => (\n <React.Fragment key={item.id || idx}>\n {/* Section label */}\n {item.section && !collapsed && (\n <div\n style={{\n fontSize: \"var(--text-xs)\",\n fontWeight: 650,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: \"rgba(255, 255, 255, 0.35)\",\n padding: \"16px 8px 6px\",\n lineHeight: 1,\n }}\n >\n {item.section}\n </div>\n )}\n\n {item.children?.length ? (\n <SidebarGroup\n item={item}\n activeId={activeId}\n expanded={!!expandedGroups[item.id]}\n onToggle={() => toggleGroup(item.id)}\n onNavigate={onNavigate}\n collapsed={collapsed}\n />\n ) : (\n <SidebarItem\n item={item}\n active={item.id === activeId || item.active}\n onNavigate={onNavigate}\n collapsed={collapsed}\n />\n )}\n </React.Fragment>\n ))}\n </div>\n\n {/* Footer slot */}\n {footer && !collapsed && (\n <div\n style={{\n padding: \"12px 16px\",\n borderTop: \"1px solid rgba(255, 255, 255, 0.08)\",\n flexShrink: 0,\n width: \"100%\",\n }}\n >\n {footer}\n </div>\n )}\n </nav>\n );\n}\n\nfunction SidebarItem({ item, active, onNavigate, collapsed }) {\n const Icon = resolveIcon(item.icon);\n const isReactIcon = typeof item.icon !== \"string\" && typeof item.icon !== \"undefined\";\n\n return (\n <button\n onClick={() => onNavigate?.(item.href || item.id)}\n title={collapsed ? item.label : undefined}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: collapsed ? 0 : 12,\n justifyContent: collapsed ? \"center\" : \"flex-start\",\n width: \"100%\",\n padding: collapsed ? \"10px 0\" : \"12px 24px 12px 12px\",\n borderRadius: active ? \"4px 0 0 4px\" : \"4px\",\n borderRight: active ? \"2px solid #00A66E\" : \"2px solid transparent\",\n borderTop: \"none\",\n borderBottom: \"none\",\n borderLeft: \"none\",\n background: active ? \"var(--Background-MonoPressed, #323232)\" : \"transparent\",\n color: active ? \"#00A66E\" : \"var(--Content-TertiaryInverse, #B2AEA8)\",\n fontWeight: active ? 550 : 400,\n fontSize: \"var(--text-sm)\",\n fontFamily: \"var(--font-sans)\",\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"background 0.15s ease, color 0.1s ease, border-color 0.15s ease\",\n marginBottom: 2,\n }}\n onMouseEnter={(e) => {\n if (!active) {\n e.currentTarget.style.background = \"var(--Background-MonoPressed, #323232)\";\n e.currentTarget.style.color = \"#00A66E\";\n }\n }}\n onMouseLeave={(e) => {\n if (!active) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"var(--Content-TertiaryInverse, #B2AEA8)\";\n }\n }}\n >\n {isReactIcon ? (\n <span style={{ flexShrink: 0, display: \"flex\" }}>{item.icon}</span>\n ) : (\n <Icon\n size={18}\n style={{\n flexShrink: 0,\n color: \"inherit\",\n }}\n />\n )}\n {!collapsed && (\n <span\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {item.label}\n </span>\n )}\n </button>\n );\n}\n\nfunction SidebarGroup({ item, activeId, expanded, onToggle, onNavigate, collapsed }) {\n const Icon = resolveIcon(item.icon);\n const hasActiveChild = item.children?.some((c) => c.id === activeId || c.active);\n\n if (collapsed) {\n // In collapsed mode, show just the group icon\n return (\n <button\n onClick={onToggle}\n title={item.label}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"100%\",\n padding: \"10px 0\",\n borderRadius: \"4px\",\n border: \"none\",\n background: hasActiveChild ? \"var(--Background-MonoPressed, #323232)\" : \"transparent\",\n color: hasActiveChild ? \"#00A66E\" : \"var(--Content-TertiaryInverse, #B2AEA8)\",\n cursor: \"pointer\",\n marginBottom: 2,\n transition: \"background 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (!hasActiveChild) {\n e.currentTarget.style.background = \"var(--Background-MonoPressed, #323232)\";\n e.currentTarget.style.color = \"#00A66E\";\n }\n }}\n onMouseLeave={(e) => {\n if (!hasActiveChild) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"var(--Content-TertiaryInverse, #B2AEA8)\";\n }\n }}\n >\n <Icon\n size={18}\n style={{ color: \"inherit\" }}\n />\n </button>\n );\n }\n\n return (\n <div style={{ marginBottom: 2 }}>\n {/* Group header */}\n <button\n onClick={onToggle}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n width: \"100%\",\n padding: \"12px 24px 12px 12px\",\n borderRadius: \"4px\",\n border: \"none\",\n background: \"transparent\",\n color: hasActiveChild ? \"#00A66E\" : \"var(--Content-TertiaryInverse, #B2AEA8)\",\n fontWeight: hasActiveChild ? 550 : 400,\n fontSize: \"var(--text-sm)\",\n fontFamily: \"var(--font-sans)\",\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"background 0.15s ease, color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"var(--Background-MonoPressed, #323232)\";\n e.currentTarget.style.color = \"#00A66E\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n if (!hasActiveChild) e.currentTarget.style.color = \"var(--Content-TertiaryInverse, #B2AEA8)\";\n else e.currentTarget.style.color = \"#00A66E\";\n }}\n >\n <Icon\n size={18}\n style={{\n flexShrink: 0,\n color: \"inherit\",\n }}\n />\n <span\n style={{\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {item.label}\n </span>\n <ChevronDown\n size={14}\n style={{\n flexShrink: 0,\n color: \"inherit\",\n opacity: 0.7,\n transform: expanded ? \"rotate(0deg)\" : \"rotate(-90deg)\",\n transition: \"transform 0.2s ease\",\n }}\n />\n </button>\n\n {/* Children */}\n {expanded && (\n <div style={{ paddingLeft: 18, marginTop: 2 }}>\n {item.children.map((child, idx) => (\n <SidebarItem\n key={child.id || idx}\n item={child}\n active={child.id === activeId || child.active}\n onNavigate={onNavigate}\n collapsed={false}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { LogOut, ChevronDown } from 'lucide-react';\n\n// Stable avatar colors — warm/neutral palette, no purple\nconst AVATAR_COLORS = [\n '#5a8a6e', // sage green\n '#b07d4f', // warm amber\n '#7a8fa6', // slate blue\n '#c47a5a', // terracotta\n '#6a9a8a', // teal\n '#a0785a', // clay\n '#5a7a9a', // steel blue\n '#9a7a5a', // caramel\n];\n\nfunction avatarColor(name) {\n if (!name) return AVATAR_COLORS[0];\n let hash = 0;\n for (let i = 0; i < name.length; i++) hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;\n return AVATAR_COLORS[Math.abs(hash) % AVATAR_COLORS.length];\n}\n\n/**\n * NavigationBar — top-level app header bar.\n *\n * Slot-based composition: pass children for center content, trailing for right content,\n * or use the built-in user/switcher/actions props for the standard Chordia layout.\n *\n * Props:\n * - logo ReactNode Left-side branding (defaults to \"Chordia\" wordmark)\n * - title string App title shown after logo\n * - userName string User's display name\n * - userEmail string Fallback if no userName\n * - userRole string Role badge (e.g. \"Admin\")\n * - onSignOut function Sign out callback (renders sign out button)\n * - children ReactNode Center slot — switchers, breadcrumbs, tabs, anything\n * - trailing ReactNode Right slot — status indicators, extra actions\n * - userMenu ReactNode Optional custom user menu (replaces built-in user block)\n * - height number Bar height in px (default 48)\n * - style object Style overrides on the root element\n */\nexport default function NavigationBar({\n logo,\n title,\n userName,\n userEmail,\n userInitials,\n userRole,\n onSignOut,\n children,\n trailing,\n userMenu,\n height = 48,\n style,\n}) {\n const displayName = userName || userEmail || '';\n const initials = userInitials || getInitials(displayName);\n\n return (\n <header\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '0 20px',\n height,\n borderBottom: '1px solid var(--border)',\n background: 'var(--paper-elevated)',\n flexShrink: 0,\n fontFamily: 'var(--font-sans)',\n position: 'sticky',\n top: 0,\n zIndex: 1000,\n ...style,\n }}\n >\n {/* ─── Left: Logo + Title ─── */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, flexShrink: 0 }}>\n {logo !== undefined ? logo : (\n <span style={{\n fontSize: 'var(--text-lg)',\n fontWeight: 700,\n fontFamily: 'var(--font-display)',\n color: 'var(--text-ink)',\n letterSpacing: '-0.01em',\n }}>\n Chordia\n </span>\n )}\n {title && (\n <>\n <span style={{\n width: 1,\n height: 18,\n background: 'var(--border)',\n flexShrink: 0,\n }} />\n <span style={{\n fontSize: 'var(--text-md)',\n fontWeight: 500,\n color: 'var(--text-muted)',\n }}>\n {title}\n </span>\n </>\n )}\n </div>\n\n {/* ─── Center: Slot for switchers, breadcrumbs, tabs ─── */}\n {children && (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n flex: 1,\n justifyContent: 'center',\n minWidth: 0,\n }}>\n {children}\n </div>\n )}\n\n {/* ─── Right: User + trailing ─── */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n flexShrink: 0,\n }}\n >\n {trailing}\n\n {userMenu\n ? userMenu\n : displayName && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {/* Initials avatar */}\n <div style={{\n width: 30,\n height: 30,\n borderRadius: '50%',\n background: avatarColor(displayName),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}>\n <span style={{\n fontSize: 11,\n fontWeight: 600,\n color: '#fff',\n letterSpacing: '0.02em',\n lineHeight: 1,\n }}>\n {initials}\n </span>\n </div>\n\n {/* Name + role */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n <span style={{\n fontSize: 'var(--text-sm)',\n fontWeight: 550,\n color: 'var(--text-strong)',\n lineHeight: 1.2,\n }}>\n {displayName}\n </span>\n {userRole && (\n <span style={{\n fontSize: 'var(--text-xs)',\n color: 'var(--text-muted)',\n lineHeight: 1.2,\n }}>\n {userRole}\n </span>\n )}\n </div>\n\n {/* Sign out */}\n {onSignOut && (\n <button\n onClick={onSignOut}\n title=\"Sign out\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 28,\n height: 28,\n borderRadius: 'var(--radius-sm)',\n border: 'none',\n background: 'transparent',\n color: 'var(--text-faint)',\n cursor: 'pointer',\n transition: 'background 0.15s ease, color 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'var(--hover-warm)';\n e.currentTarget.style.color = 'var(--text-muted)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n e.currentTarget.style.color = 'var(--text-faint)';\n }}\n >\n <LogOut size={14} />\n </button>\n )}\n </div>\n )}\n </div>\n </header>\n );\n}\n\n/**\n * NavPill — compact switcher button for use inside NavigationBar.\n *\n * Props:\n * - label string Display text\n * - color string Rail color token (e.g. \"var(--rail-discovery)\")\n * - active boolean Whether dropdown is open\n * - onClick function Toggle callback\n */\nexport function NavPill({ label, color = 'var(--text-muted)', active, onClick }) {\n return (\n <button\n onClick={onClick}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n fontSize: 'var(--text-sm)',\n fontWeight: 500,\n fontFamily: 'var(--font-sans)',\n padding: '4px 10px',\n borderRadius: 'var(--radius-sm)',\n border: `1px solid color-mix(in srgb, ${color} 30%, transparent)`,\n background: `color-mix(in srgb, ${color} 10%, transparent)`,\n color: color,\n cursor: 'pointer',\n transition: 'background 0.15s ease, border-color 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = `color-mix(in srgb, ${color} 18%, transparent)`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = `color-mix(in srgb, ${color} 10%, transparent)`;\n }}\n >\n {label}\n <ChevronDown\n size={12}\n style={{\n transform: active ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease',\n opacity: 0.7,\n }}\n />\n </button>\n );\n}\n\n/**\n * NavDropdown — dropdown panel that attaches to a NavPill.\n * Wrap around NavPill and the dropdown content.\n *\n * Props:\n * - open boolean Whether dropdown is visible\n * - onClose function Close callback\n * - children ReactNode Dropdown items\n * - align string \"left\" | \"right\" (default \"left\")\n */\nexport function NavDropdown({ open, onClose, children, align = 'left' }) {\n if (!open) return null;\n return (\n <>\n <div\n onClick={onClose}\n style={{ position: 'fixed', inset: 0, zIndex: 99, background: 'rgba(0,0,0,0.03)' }}\n />\n <div style={{\n position: 'absolute',\n top: '100%',\n [align === 'right' ? 'right' : 'left']: 0,\n marginTop: 4,\n zIndex: 100,\n background: '#fff',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n padding: 4,\n minWidth: 200,\n maxHeight: 280,\n overflowY: 'auto',\n boxShadow: '0 8px 24px rgba(0,0,0,0.12)',\n }}>\n {children}\n </div>\n </>\n );\n}\n\n/**\n * NavDropdownItem — single item inside NavDropdown.\n *\n * Props:\n * - label string\n * - active boolean\n * - onClick function\n */\nexport function NavDropdownItem({ label, active, onClick }) {\n return (\n <div\n onClick={onClick}\n style={{\n padding: '8px 10px',\n borderRadius: 'var(--radius-sm)',\n cursor: 'pointer',\n fontSize: 'var(--text-sm)',\n color: active ? 'var(--text-ink)' : 'var(--text-base)',\n fontWeight: active ? 600 : 400,\n fontFamily: 'var(--font-sans)',\n background: active ? 'var(--hover-warm)' : 'transparent',\n transition: 'background 0.1s ease',\n }}\n onMouseEnter={(e) => {\n if (!active) e.currentTarget.style.background = 'var(--hover-warm-subtle)';\n }}\n onMouseLeave={(e) => {\n if (!active) e.currentTarget.style.background = 'transparent';\n }}\n >\n {label}\n </div>\n );\n}\n\n/**\n * StatusIndicator — connection/status pill for trailing slot.\n *\n * Props:\n * - connected boolean\n * - label string (optional, defaults to Connected/Disconnected)\n */\nexport function StatusIndicator({ connected, label }) {\n const text = label || (connected ? 'Connected' : 'Disconnected');\n return (\n <span style={{\n fontSize: 'var(--text-xs)',\n fontFamily: 'var(--font-sans)',\n padding: '3px 10px',\n borderRadius: 12,\n border: `1px solid ${connected ? 'var(--state-present)' : 'var(--border)'}`,\n color: connected ? 'var(--state-present)' : 'var(--text-faint)',\n background: connected ? 'rgba(37,163,114,0.08)' : 'transparent',\n transition: 'all 0.2s ease',\n }}>\n {text}\n </span>\n );\n}\n\nfunction getInitials(name) {\n if (!name) return '?';\n const parts = name.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n return name.slice(0, 2).toUpperCase();\n}\n"],"names":["ICON_MAP","Home","FolderClosed","Users","LayoutDashboard","Clock3","Activity","Lightbulb","Bell","Plug","Settings","BarChart3","FileText","Headphones","Shield","Sliders","Workflow","resolveIcon","icon","SquareDot","Sidebar","menuItems","activeId","onNavigate","controlledCollapsed","onToggleCollapse","header","footer","width","collapsedWidth","internalCollapsed","setInternalCollapsed","useState","collapsed","toggleCollapse","expandedGroups","setExpandedGroups","initial","item","_a","hasActive","c","toggleGroup","id","prev","currentWidth","jsxs","jsx","e","PanelLeft","PanelLeftClose","idx","React","SidebarGroup","SidebarItem","active","Icon","isReactIcon","expanded","onToggle","hasActiveChild","ChevronDown","child","AVATAR_COLORS","avatarColor","name","hash","i","NavigationBar","logo","title","userName","userEmail","userInitials","userRole","onSignOut","children","trailing","userMenu","height","style","displayName","initials","getInitials","Fragment","LogOut","NavPill","label","color","onClick","NavDropdown","open","onClose","align","NavDropdownItem","StatusIndicator","connected","text","parts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"navigation.cjs.js","sources":["../../src/components/navigation/Sidebar.jsx","../../src/components/navigation/NavigationBar.jsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState } from \"react\";\nimport {\n Home, FolderClosed, Users, Settings, ChevronDown,\n LayoutDashboard, Clock3, Activity, Lightbulb, Bell, Plug, BarChart3,\n FileText, Headphones, Shield, Sliders, Workflow, SquareDot,\n PanelLeftClose, PanelLeft,\n} from \"lucide-react\";\n\n/**\n * Sidebar — collapsible navigation sidebar.\n *\n * Slot-based: pass menuItems as data, component handles rendering + expand/collapse.\n * No framework dependencies (no router, no auth, no API calls).\n *\n * Props:\n * - menuItems Array<MenuItem> Navigation items (see shape below)\n * - activeId string Currently active item id\n * - onNavigate function(href) Navigation callback\n * - collapsed boolean External collapsed state (controlled)\n * - onToggleCollapse function Toggle callback\n * - header ReactNode Optional header slot (logo, brand)\n * - footer ReactNode Optional footer slot (user, settings)\n * - width number Expanded width (default 240)\n * - collapsedWidth number Collapsed width (default 56)\n *\n * MenuItem shape:\n * - id string\n * - label string\n * - icon string (key from ICON_MAP) or ReactNode\n * - href string\n * - active boolean (override)\n * - children Array<MenuItem> (nested group)\n * - section string (section label above this item)\n */\n\nconst ICON_MAP = {\n home: Home,\n projects: FolderClosed,\n folder: FolderClosed,\n organization: Users,\n users: Users,\n dashboard: LayoutDashboard,\n history: Clock3,\n sessions: Clock3,\n monitoring: Activity,\n activity: Activity,\n insights: Lightbulb,\n notifications: Bell,\n integrations: Plug,\n settings: Settings,\n usage: BarChart3,\n docs: FileText,\n documentation: FileText,\n agents: Headphones,\n security: Shield,\n configuration: Sliders,\n workflow: Workflow,\n};\n\nfunction resolveIcon(icon) {\n if (!icon) return SquareDot;\n if (typeof icon === \"string\") return ICON_MAP[icon.toLowerCase()] || SquareDot;\n return icon;\n}\n\nexport default function Sidebar({\n menuItems = [],\n activeId,\n onNavigate,\n collapsed: controlledCollapsed,\n onToggleCollapse,\n header,\n footer,\n width = 244,\n collapsedWidth = 56,\n}) {\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const collapsed = controlledCollapsed !== undefined ? controlledCollapsed : internalCollapsed;\n const toggleCollapse = onToggleCollapse || (() => setInternalCollapsed(!internalCollapsed));\n\n const [expandedGroups, setExpandedGroups] = useState(() => {\n const initial = {};\n menuItems.forEach((item) => {\n if (item.children?.length) {\n // Auto-expand groups that contain the active item\n const hasActive = item.children.some((c) => c.id === activeId || c.active);\n initial[item.id] = hasActive;\n }\n });\n return initial;\n });\n\n const toggleGroup = (id) => {\n setExpandedGroups((prev) => ({ ...prev, [id]: !prev[id] }));\n };\n\n const currentWidth = collapsed ? collapsedWidth : width;\n\n return (\n <nav\n style={{\n width: currentWidth,\n minWidth: currentWidth,\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n padding: collapsed ? \"0\" : \"0 0 24px 24px\",\n gap: 24,\n background: \"var(--Background-Inverse, #0B0B0B)\",\n fontFamily: \"var(--font-sans)\",\n transition: \"width 0.2s ease, min-width 0.2s ease\",\n overflow: \"hidden\",\n flexShrink: 0,\n }}\n >\n {/* Header slot */}\n {header && !collapsed && (\n <div style={{ padding: \"16px 16px 8px\", flexShrink: 0, width: \"100%\" }}>\n {header}\n </div>\n )}\n\n {/* Collapse toggle */}\n <div\n style={{\n display: \"flex\",\n justifyContent: collapsed ? \"center\" : \"flex-end\",\n padding: collapsed ? \"12px 0\" : \"8px 0 0\",\n flexShrink: 0,\n width: \"100%\",\n }}\n >\n <button\n onClick={toggleCollapse}\n title={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 28,\n height: 28,\n borderRadius: \"var(--radius-sm)\",\n border: \"none\",\n background: \"transparent\",\n color: \"rgba(255, 255, 255, 0.5)\",\n cursor: \"pointer\",\n transition: \"background 0.15s ease, color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(255, 255, 255, 0.08)\";\n e.currentTarget.style.color = \"rgba(255, 255, 255, 0.8)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"rgba(255, 255, 255, 0.5)\";\n }}\n >\n {collapsed ? <PanelLeft size={16} /> : <PanelLeftClose size={16} />}\n </button>\n </div>\n\n {/* Menu items */}\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n overflowX: \"hidden\",\n padding: collapsed ? \"0 8px\" : \"0\",\n width: \"100%\",\n }}\n >\n {menuItems.map((item, idx) => (\n <React.Fragment key={item.id || idx}>\n {/* Section label */}\n {item.section && !collapsed && (\n <div\n style={{\n fontSize: \"var(--text-xs)\",\n fontWeight: 650,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: \"rgba(255, 255, 255, 0.35)\",\n padding: \"16px 8px 6px\",\n lineHeight: 1,\n }}\n >\n {item.section}\n </div>\n )}\n\n {item.children?.length ? (\n <SidebarGroup\n item={item}\n activeId={activeId}\n expanded={!!expandedGroups[item.id]}\n onToggle={() => toggleGroup(item.id)}\n onNavigate={onNavigate}\n collapsed={collapsed}\n />\n ) : (\n <SidebarItem\n item={item}\n active={item.id === activeId || item.active}\n onNavigate={onNavigate}\n collapsed={collapsed}\n />\n )}\n </React.Fragment>\n ))}\n </div>\n\n {/* Footer slot */}\n {footer && !collapsed && (\n <div\n style={{\n padding: \"12px 16px\",\n borderTop: \"1px solid rgba(255, 255, 255, 0.08)\",\n flexShrink: 0,\n width: \"100%\",\n }}\n >\n {footer}\n </div>\n )}\n </nav>\n );\n}\n\nfunction SidebarItem({ item, active, onNavigate, collapsed }) {\n const Icon = resolveIcon(item.icon);\n const isReactIcon = typeof item.icon !== \"string\" && typeof item.icon !== \"undefined\";\n\n return (\n <button\n onClick={() => onNavigate?.(item.href || item.id)}\n title={collapsed ? item.label : undefined}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: collapsed ? 0 : 12,\n justifyContent: collapsed ? \"center\" : \"flex-start\",\n width: \"100%\",\n padding: collapsed ? \"10px 0\" : \"12px 24px 12px 12px\",\n borderRadius: active ? \"4px 0 0 4px\" : \"4px\",\n borderRight: active ? \"2px solid #00A66E\" : \"2px solid transparent\",\n borderTop: \"none\",\n borderBottom: \"none\",\n borderLeft: \"none\",\n background: active ? \"var(--Background-MonoPressed, #323232)\" : \"transparent\",\n color: active ? \"var(--Brand-400, #33B88B)\" : \"var(--Content-TertiaryInverse, #B2AEA8)\",\n fontWeight: 500,\n fontSize: \"12px\",\n fontStyle: \"normal\",\n lineHeight: \"120%\",\n textTransform: \"uppercase\",\n fontFamily: \"var(--font-sans)\",\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"background 0.15s ease, color 0.1s ease, border-color 0.15s ease\",\n marginBottom: 2,\n }}\n onMouseEnter={(e) => {\n if (!active) {\n e.currentTarget.style.background = \"var(--Background-MonoPressed, #323232)\";\n e.currentTarget.style.color = \"var(--Brand-400, #33B88B)\";\n }\n }}\n onMouseLeave={(e) => {\n if (!active) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"var(--Content-TertiaryInverse, #B2AEA8)\";\n }\n }}\n >\n {isReactIcon ? (\n <span style={{ flexShrink: 0, display: \"flex\" }}>{item.icon}</span>\n ) : (\n <Icon\n size={18}\n style={{\n flexShrink: 0,\n color: \"inherit\",\n }}\n />\n )}\n {!collapsed && (\n <span\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {item.label}\n </span>\n )}\n </button>\n );\n}\n\nfunction SidebarGroup({ item, activeId, expanded, onToggle, onNavigate, collapsed }) {\n const Icon = resolveIcon(item.icon);\n const hasActiveChild = item.children?.some((c) => c.id === activeId || c.active);\n\n if (collapsed) {\n // In collapsed mode, show just the group icon\n return (\n <button\n onClick={onToggle}\n title={item.label}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"100%\",\n padding: \"10px 0\",\n borderRadius: \"4px\",\n border: \"none\",\n background: hasActiveChild ? \"var(--Background-MonoPressed, #323232)\" : \"transparent\",\n color: hasActiveChild ? \"var(--Brand-400, #33B88B)\" : \"var(--Content-TertiaryInverse, #B2AEA8)\",\n cursor: \"pointer\",\n marginBottom: 2,\n transition: \"background 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (!hasActiveChild) {\n e.currentTarget.style.background = \"var(--Background-MonoPressed, #323232)\";\n e.currentTarget.style.color = \"var(--Brand-400, #33B88B)\";\n }\n }}\n onMouseLeave={(e) => {\n if (!hasActiveChild) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"var(--Content-TertiaryInverse, #B2AEA8)\";\n }\n }}\n >\n <Icon\n size={18}\n style={{ color: \"inherit\" }}\n />\n </button>\n );\n }\n\n return (\n <div style={{ marginBottom: 2 }}>\n {/* Group header */}\n <button\n onClick={onToggle}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n width: \"100%\",\n padding: \"12px 24px 12px 12px\",\n borderRadius: \"4px\",\n border: \"none\",\n background: \"transparent\",\n color: hasActiveChild ? \"var(--Brand-400, #33B88B)\" : \"var(--Content-TertiaryInverse, #B2AEA8)\",\n fontWeight: 700,\n fontSize: \"12px\",\n fontStyle: \"normal\",\n lineHeight: \"120%\",\n textTransform: \"uppercase\",\n fontFamily: \"var(--font-sans)\",\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"background 0.15s ease, color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"var(--Background-MonoPressed, #323232)\";\n e.currentTarget.style.color = \"var(--Brand-400, #33B88B)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n if (!hasActiveChild) e.currentTarget.style.color = \"var(--Content-TertiaryInverse, #B2AEA8)\";\n else e.currentTarget.style.color = \"var(--Brand-400, #33B88B)\";\n }}\n >\n <Icon\n size={18}\n style={{\n flexShrink: 0,\n color: \"inherit\",\n }}\n />\n <span\n style={{\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {item.label}\n </span>\n <ChevronDown\n size={14}\n style={{\n flexShrink: 0,\n color: \"inherit\",\n opacity: 0.7,\n transform: expanded ? \"rotate(0deg)\" : \"rotate(-90deg)\",\n transition: \"transform 0.2s ease\",\n }}\n />\n </button>\n\n {/* Children */}\n {expanded && (\n <div style={{ paddingLeft: 18, marginTop: 2 }}>\n {item.children.map((child, idx) => (\n <SidebarItem\n key={child.id || idx}\n item={child}\n active={child.id === activeId || child.active}\n onNavigate={onNavigate}\n collapsed={false}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { LogOut, ChevronDown } from 'lucide-react';\n\n// Stable avatar colors — warm/neutral palette, no purple\nconst AVATAR_COLORS = [\n '#5a8a6e', // sage green\n '#b07d4f', // warm amber\n '#7a8fa6', // slate blue\n '#c47a5a', // terracotta\n '#6a9a8a', // teal\n '#a0785a', // clay\n '#5a7a9a', // steel blue\n '#9a7a5a', // caramel\n];\n\nfunction avatarColor(name) {\n if (!name) return AVATAR_COLORS[0];\n let hash = 0;\n for (let i = 0; i < name.length; i++) hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;\n return AVATAR_COLORS[Math.abs(hash) % AVATAR_COLORS.length];\n}\n\n/**\n * NavigationBar — top-level app header bar.\n *\n * Slot-based composition: pass children for center content, trailing for right content,\n * or use the built-in user/switcher/actions props for the standard Chordia layout.\n *\n * Props:\n * - logo ReactNode Left-side branding (defaults to \"Chordia\" wordmark)\n * - title string App title shown after logo\n * - userName string User's display name\n * - userEmail string Fallback if no userName\n * - userRole string Role badge (e.g. \"Admin\")\n * - onSignOut function Sign out callback (renders sign out button)\n * - children ReactNode Center slot — switchers, breadcrumbs, tabs, anything\n * - trailing ReactNode Right slot — status indicators, extra actions\n * - userMenu ReactNode Optional custom user menu (replaces built-in user block)\n * - height number Bar height in px (default 48)\n * - style object Style overrides on the root element\n */\nexport default function NavigationBar({\n logo,\n title,\n userName,\n userEmail,\n userInitials,\n userRole,\n onSignOut,\n children,\n trailing,\n userMenu,\n height = 48,\n style,\n}) {\n const displayName = userName || userEmail || '';\n const initials = userInitials || getInitials(displayName);\n\n return (\n <header\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '0 20px',\n height,\n borderBottom: '1px solid var(--border)',\n background: 'var(--paper-elevated)',\n flexShrink: 0,\n fontFamily: 'var(--font-sans)',\n position: 'sticky',\n top: 0,\n zIndex: 1000,\n ...style,\n }}\n >\n {/* ─── Left: Logo + Title ─── */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, flexShrink: 0 }}>\n {logo !== undefined ? logo : (\n <span style={{\n fontSize: 'var(--text-lg)',\n fontWeight: 700,\n fontFamily: 'var(--font-display)',\n color: 'var(--text-ink)',\n letterSpacing: '-0.01em',\n }}>\n Chordia\n </span>\n )}\n {title && (\n <>\n <span style={{\n width: 1,\n height: 18,\n background: 'var(--border)',\n flexShrink: 0,\n }} />\n <span style={{\n fontSize: 'var(--text-md)',\n fontWeight: 500,\n color: 'var(--text-muted)',\n }}>\n {title}\n </span>\n </>\n )}\n </div>\n\n {/* ─── Center: Slot for switchers, breadcrumbs, tabs ─── */}\n {children && (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n flex: 1,\n justifyContent: 'center',\n minWidth: 0,\n }}>\n {children}\n </div>\n )}\n\n {/* ─── Right: User + trailing ─── */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n flexShrink: 0,\n }}\n >\n {trailing}\n\n {userMenu\n ? userMenu\n : displayName && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {/* Initials avatar */}\n <div style={{\n width: 30,\n height: 30,\n borderRadius: '50%',\n background: avatarColor(displayName),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}>\n <span style={{\n fontSize: 11,\n fontWeight: 600,\n color: '#fff',\n letterSpacing: '0.02em',\n lineHeight: 1,\n }}>\n {initials}\n </span>\n </div>\n\n {/* Name + role */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n <span style={{\n fontSize: 'var(--text-sm)',\n fontWeight: 550,\n color: 'var(--text-strong)',\n lineHeight: 1.2,\n }}>\n {displayName}\n </span>\n {userRole && (\n <span style={{\n fontSize: 'var(--text-xs)',\n color: 'var(--text-muted)',\n lineHeight: 1.2,\n }}>\n {userRole}\n </span>\n )}\n </div>\n\n {/* Sign out */}\n {onSignOut && (\n <button\n onClick={onSignOut}\n title=\"Sign out\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 28,\n height: 28,\n borderRadius: 'var(--radius-sm)',\n border: 'none',\n background: 'transparent',\n color: 'var(--text-faint)',\n cursor: 'pointer',\n transition: 'background 0.15s ease, color 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'var(--hover-warm)';\n e.currentTarget.style.color = 'var(--text-muted)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n e.currentTarget.style.color = 'var(--text-faint)';\n }}\n >\n <LogOut size={14} />\n </button>\n )}\n </div>\n )}\n </div>\n </header>\n );\n}\n\n/**\n * NavPill — compact switcher button for use inside NavigationBar.\n *\n * Props:\n * - label string Display text\n * - color string Rail color token (e.g. \"var(--rail-discovery)\")\n * - active boolean Whether dropdown is open\n * - onClick function Toggle callback\n */\nexport function NavPill({ label, color = 'var(--text-muted)', active, onClick }) {\n return (\n <button\n onClick={onClick}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n fontSize: 'var(--text-sm)',\n fontWeight: 500,\n fontFamily: 'var(--font-sans)',\n padding: '4px 10px',\n borderRadius: 'var(--radius-sm)',\n border: `1px solid color-mix(in srgb, ${color} 30%, transparent)`,\n background: `color-mix(in srgb, ${color} 10%, transparent)`,\n color: color,\n cursor: 'pointer',\n transition: 'background 0.15s ease, border-color 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = `color-mix(in srgb, ${color} 18%, transparent)`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = `color-mix(in srgb, ${color} 10%, transparent)`;\n }}\n >\n {label}\n <ChevronDown\n size={12}\n style={{\n transform: active ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease',\n opacity: 0.7,\n }}\n />\n </button>\n );\n}\n\n/**\n * NavDropdown — dropdown panel that attaches to a NavPill.\n * Wrap around NavPill and the dropdown content.\n *\n * Props:\n * - open boolean Whether dropdown is visible\n * - onClose function Close callback\n * - children ReactNode Dropdown items\n * - align string \"left\" | \"right\" (default \"left\")\n */\nexport function NavDropdown({ open, onClose, children, align = 'left' }) {\n if (!open) return null;\n return (\n <>\n <div\n onClick={onClose}\n style={{ position: 'fixed', inset: 0, zIndex: 99, background: 'rgba(0,0,0,0.03)' }}\n />\n <div style={{\n position: 'absolute',\n top: '100%',\n [align === 'right' ? 'right' : 'left']: 0,\n marginTop: 4,\n zIndex: 100,\n background: '#fff',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n padding: 4,\n minWidth: 200,\n maxHeight: 280,\n overflowY: 'auto',\n boxShadow: '0 8px 24px rgba(0,0,0,0.12)',\n }}>\n {children}\n </div>\n </>\n );\n}\n\n/**\n * NavDropdownItem — single item inside NavDropdown.\n *\n * Props:\n * - label string\n * - active boolean\n * - onClick function\n */\nexport function NavDropdownItem({ label, active, onClick }) {\n return (\n <div\n onClick={onClick}\n style={{\n padding: '8px 10px',\n borderRadius: 'var(--radius-sm)',\n cursor: 'pointer',\n fontSize: 'var(--text-sm)',\n color: active ? 'var(--text-ink)' : 'var(--text-base)',\n fontWeight: active ? 600 : 400,\n fontFamily: 'var(--font-sans)',\n background: active ? 'var(--hover-warm)' : 'transparent',\n transition: 'background 0.1s ease',\n }}\n onMouseEnter={(e) => {\n if (!active) e.currentTarget.style.background = 'var(--hover-warm-subtle)';\n }}\n onMouseLeave={(e) => {\n if (!active) e.currentTarget.style.background = 'transparent';\n }}\n >\n {label}\n </div>\n );\n}\n\n/**\n * StatusIndicator — connection/status pill for trailing slot.\n *\n * Props:\n * - connected boolean\n * - label string (optional, defaults to Connected/Disconnected)\n */\nexport function StatusIndicator({ connected, label }) {\n const text = label || (connected ? 'Connected' : 'Disconnected');\n return (\n <span style={{\n fontSize: 'var(--text-xs)',\n fontFamily: 'var(--font-sans)',\n padding: '3px 10px',\n borderRadius: 12,\n border: `1px solid ${connected ? 'var(--state-present)' : 'var(--border)'}`,\n color: connected ? 'var(--state-present)' : 'var(--text-faint)',\n background: connected ? 'rgba(37,163,114,0.08)' : 'transparent',\n transition: 'all 0.2s ease',\n }}>\n {text}\n </span>\n );\n}\n\nfunction getInitials(name) {\n if (!name) return '?';\n const parts = name.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n return name.slice(0, 2).toUpperCase();\n}\n"],"names":["ICON_MAP","Home","FolderClosed","Users","LayoutDashboard","Clock3","Activity","Lightbulb","Bell","Plug","Settings","BarChart3","FileText","Headphones","Shield","Sliders","Workflow","resolveIcon","icon","SquareDot","Sidebar","menuItems","activeId","onNavigate","controlledCollapsed","onToggleCollapse","header","footer","width","collapsedWidth","internalCollapsed","setInternalCollapsed","useState","collapsed","toggleCollapse","expandedGroups","setExpandedGroups","initial","item","_a","hasActive","c","toggleGroup","id","prev","currentWidth","jsxs","jsx","e","PanelLeft","PanelLeftClose","idx","React","SidebarGroup","SidebarItem","active","Icon","isReactIcon","expanded","onToggle","hasActiveChild","ChevronDown","child","AVATAR_COLORS","avatarColor","name","hash","i","NavigationBar","logo","title","userName","userEmail","userInitials","userRole","onSignOut","children","trailing","userMenu","height","style","displayName","initials","getInitials","Fragment","LogOut","NavPill","label","color","onClick","NavDropdown","open","onClose","align","NavDropdownItem","StatusIndicator","connected","text","parts"],"mappings":"kKAqCMA,EAAW,CACf,KAAMC,EAAA,KACN,SAAUC,EAAA,aACV,OAAQA,EAAA,aACR,aAAcC,EAAA,MACd,MAAOA,EAAA,MACP,UAAWC,EAAA,gBACX,QAASC,EAAA,OACT,SAAUA,EAAA,OACV,WAAYC,EAAA,SACZ,SAAUA,EAAA,SACV,SAAUC,EAAA,UACV,cAAeC,EAAA,KACf,aAAcC,EAAA,KACd,SAAUC,EAAA,SACV,MAAOC,EAAA,UACP,KAAMC,EAAA,SACN,cAAeA,EAAA,SACf,OAAQC,EAAA,WACR,SAAUC,EAAA,OACV,cAAeC,EAAA,QACf,SAAUC,EAAA,QACZ,EAEA,SAASC,EAAYC,EAAM,CACzB,OAAKA,EACD,OAAOA,GAAS,SAAiBlB,EAASkB,EAAK,YAAa,CAAA,GAAKC,EAAAA,UAC9DD,EAFWC,WAGpB,CAEA,SAAwBC,EAAQ,CAC9B,UAAAC,EAAY,CAAC,EACb,SAAAC,EACA,WAAAC,EACA,UAAWC,EACX,iBAAAC,EACA,OAAAC,EACA,OAAAC,EACA,MAAAC,EAAQ,IACR,eAAAC,EAAiB,EACnB,EAAG,CACD,KAAM,CAACC,EAAmBC,CAAoB,EAAIC,WAAS,EAAK,EAC1DC,EAAYT,IAAwB,OAAYA,EAAsBM,EACtEI,EAAiBT,IAAqB,IAAMM,EAAqB,CAACD,CAAiB,GAEnF,CAACK,EAAgBC,CAAiB,EAAIJ,WAAS,IAAM,CACzD,MAAMK,EAAU,CAAA,EACN,OAAAhB,EAAA,QAASiB,GAAS,OACtB,IAAAC,EAAAD,EAAK,WAAL,MAAAC,EAAe,OAAQ,CAEnB,MAAAC,EAAYF,EAAK,SAAS,KAAMG,GAAMA,EAAE,KAAOnB,GAAYmB,EAAE,MAAM,EACjEJ,EAAAC,EAAK,EAAE,EAAIE,CACrB,CAAA,CACD,EACMH,CAAA,CACR,EAEKK,EAAeC,GAAO,CAC1BP,EAAmBQ,IAAU,CAAE,GAAGA,EAAM,CAACD,CAAE,EAAG,CAACC,EAAKD,CAAE,CAAI,EAAA,CAAA,EAGtDE,EAAeZ,EAAYJ,EAAiBD,EAGhD,OAAAkB,EAAA,KAAC,MAAA,CACC,MAAO,CACL,MAAOD,EACP,SAAUA,EACV,OAAQ,OACR,QAAS,OACT,cAAe,SACf,WAAY,aACZ,QAASZ,EAAY,IAAM,gBAC3B,IAAK,GACL,WAAY,qCACZ,WAAY,mBACZ,WAAY,uCACZ,SAAU,SACV,WAAY,CACd,EAGC,SAAA,CAAAP,GAAU,CAACO,GACTc,EAAAA,IAAA,MAAA,CAAI,MAAO,CAAE,QAAS,gBAAiB,WAAY,EAAG,MAAO,MAAA,EAC3D,SACHrB,EAAA,EAIFqB,EAAA,IAAC,MAAA,CACC,MAAO,CACL,QAAS,OACT,eAAgBd,EAAY,SAAW,WACvC,QAASA,EAAY,SAAW,UAChC,WAAY,EACZ,MAAO,MACT,EAEA,SAAAc,EAAA,IAAC,SAAA,CACC,QAASb,EACT,MAAOD,EAAY,iBAAmB,mBACtC,MAAO,CACL,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,MAAO,GACP,OAAQ,GACR,aAAc,mBACd,OAAQ,OACR,WAAY,cACZ,MAAO,2BACP,OAAQ,UACR,WAAY,yCACd,EACA,aAAee,GAAM,CACjBA,EAAA,cAAc,MAAM,WAAa,4BACjCA,EAAA,cAAc,MAAM,MAAQ,0BAChC,EACA,aAAeA,GAAM,CACjBA,EAAA,cAAc,MAAM,WAAa,cACjCA,EAAA,cAAc,MAAM,MAAQ,0BAChC,EAEC,SAAAf,QAAagB,EAAU,UAAA,CAAA,KAAM,GAAI,EAAKF,EAAA,IAACG,EAAe,eAAA,CAAA,KAAM,EAAI,CAAA,CAAA,CACnE,CAAA,CACF,EAGAH,EAAA,IAAC,MAAA,CACC,MAAO,CACL,KAAM,EACN,UAAW,OACX,UAAW,SACX,QAASd,EAAY,QAAU,IAC/B,MAAO,MACT,EAEC,SAAAZ,EAAU,IAAI,CAACiB,EAAMa,IACnBL,OAAAA,OAAAA,EAAAA,KAAAM,EAAM,SAAN,CAEE,SAAA,CAAKd,EAAA,SAAW,CAACL,GAChBc,EAAA,IAAC,MAAA,CACC,MAAO,CACL,SAAU,iBACV,WAAY,IACZ,cAAe,SACf,cAAe,YACf,MAAO,4BACP,QAAS,eACT,WAAY,CACd,EAEC,SAAKT,EAAA,OAAA,CACR,GAGDC,EAAAD,EAAK,WAAL,MAAAC,EAAe,OACdQ,EAAA,IAACM,EAAA,CACC,KAAAf,EACA,SAAAhB,EACA,SAAU,CAAC,CAACa,EAAeG,EAAK,EAAE,EAClC,SAAU,IAAMI,EAAYJ,EAAK,EAAE,EACnC,WAAAf,EACA,UAAAU,CAAA,CAAA,EAGFc,EAAA,IAACO,EAAA,CACC,KAAAhB,EACA,OAAQA,EAAK,KAAOhB,GAAYgB,EAAK,OACrC,WAAAf,EACA,UAAAU,CAAA,CACF,CAjCiB,CAAA,EAAAK,EAAK,IAAMa,CAmChC,EACD,CAAA,CACH,EAGCxB,GAAU,CAACM,GACVc,EAAA,IAAC,MAAA,CACC,MAAO,CACL,QAAS,YACT,UAAW,sCACX,WAAY,EACZ,MAAO,MACT,EAEC,SAAApB,CAAA,CACH,CAAA,CAAA,CAAA,CAIR,CAEA,SAAS2B,EAAY,CAAE,KAAAhB,EAAM,OAAAiB,EAAQ,WAAAhC,EAAY,UAAAU,GAAa,CACtD,MAAAuB,EAAOvC,EAAYqB,EAAK,IAAI,EAC5BmB,EAAc,OAAOnB,EAAK,MAAS,UAAY,OAAOA,EAAK,KAAS,IAGxE,OAAAQ,EAAA,KAAC,SAAA,CACC,QAAS,IAAMvB,GAAA,YAAAA,EAAae,EAAK,MAAQA,EAAK,IAC9C,MAAOL,EAAYK,EAAK,MAAQ,OAChC,MAAO,CACL,QAAS,OACT,WAAY,SACZ,IAAKL,EAAY,EAAI,GACrB,eAAgBA,EAAY,SAAW,aACvC,MAAO,OACP,QAASA,EAAY,SAAW,sBAChC,aAAcsB,EAAS,cAAgB,MACvC,YAAaA,EAAS,oBAAsB,wBAC5C,UAAW,OACX,aAAc,OACd,WAAY,OACZ,WAAYA,EAAS,yCAA2C,cAChE,MAAOA,EAAS,4BAA8B,0CAC9C,WAAY,IACZ,SAAU,OACV,UAAW,SACX,WAAY,OACZ,cAAe,YACf,WAAY,mBACZ,OAAQ,UACR,UAAW,OACX,WAAY,kEACZ,aAAc,CAChB,EACA,aAAeP,GAAM,CACdO,IACDP,EAAA,cAAc,MAAM,WAAa,yCACjCA,EAAA,cAAc,MAAM,MAAQ,4BAElC,EACA,aAAeA,GAAM,CACdO,IACDP,EAAA,cAAc,MAAM,WAAa,cACjCA,EAAA,cAAc,MAAM,MAAQ,0CAElC,EAEC,SAAA,CACCS,EAAAV,EAAAA,IAAC,OAAK,CAAA,MAAO,CAAE,WAAY,EAAG,QAAS,MAAO,EAAI,SAAKT,EAAA,IAAA,CAAK,EAE5DS,EAAA,IAACS,EAAA,CACC,KAAM,GACN,MAAO,CACL,WAAY,EACZ,MAAO,SACT,CAAA,CACF,EAED,CAACvB,GACAc,EAAA,IAAC,OAAA,CACC,MAAO,CACL,SAAU,SACV,aAAc,WACd,WAAY,QACd,EAEC,SAAKT,EAAA,KAAA,CACR,CAAA,CAAA,CAAA,CAIR,CAEA,SAASe,EAAa,CAAE,KAAAf,EAAM,SAAAhB,EAAU,SAAAoC,EAAU,SAAAC,EAAU,WAAApC,EAAY,UAAAU,GAAa,OAC7E,MAAAuB,EAAOvC,EAAYqB,EAAK,IAAI,EAC5BsB,GAAiBrB,EAAAD,EAAK,WAAL,YAAAC,EAAe,KAAME,GAAMA,EAAE,KAAOnB,GAAYmB,EAAE,QAEzE,OAAIR,EAGAc,EAAA,IAAC,SAAA,CACC,QAASY,EACT,MAAOrB,EAAK,MACZ,MAAO,CACL,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,MAAO,OACP,QAAS,SACT,aAAc,MACd,OAAQ,OACR,WAAYsB,EAAiB,yCAA2C,cACxE,MAAOA,EAAiB,4BAA8B,0CACtD,OAAQ,UACR,aAAc,EACd,WAAY,uBACd,EACA,aAAeZ,GAAM,CACdY,IACDZ,EAAA,cAAc,MAAM,WAAa,yCACjCA,EAAA,cAAc,MAAM,MAAQ,4BAElC,EACA,aAAeA,GAAM,CACdY,IACDZ,EAAA,cAAc,MAAM,WAAa,cACjCA,EAAA,cAAc,MAAM,MAAQ,0CAElC,EAEA,SAAAD,EAAA,IAACS,EAAA,CACC,KAAM,GACN,MAAO,CAAE,MAAO,SAAU,CAAA,CAC5B,CAAA,CAAA,SAMH,MAAI,CAAA,MAAO,CAAE,aAAc,CAE1B,EAAA,SAAA,CAAAV,EAAA,KAAC,SAAA,CACC,QAASa,EACT,MAAO,CACL,QAAS,OACT,WAAY,SACZ,IAAK,GACL,MAAO,OACP,QAAS,sBACT,aAAc,MACd,OAAQ,OACR,WAAY,cACZ,MAAOC,EAAiB,4BAA8B,0CACtD,WAAY,IACZ,SAAU,OACV,UAAW,SACX,WAAY,OACZ,cAAe,YACf,WAAY,mBACZ,OAAQ,UACR,UAAW,OACX,WAAY,yCACd,EACA,aAAeZ,GAAM,CACjBA,EAAA,cAAc,MAAM,WAAa,yCACjCA,EAAA,cAAc,MAAM,MAAQ,2BAChC,EACA,aAAeA,GAAM,CACjBA,EAAA,cAAc,MAAM,WAAa,cAC9BY,EACEZ,EAAA,cAAc,MAAM,MAAQ,4BADZA,EAAA,cAAc,MAAM,MAAQ,yCAErD,EAEA,SAAA,CAAAD,EAAA,IAACS,EAAA,CACC,KAAM,GACN,MAAO,CACL,WAAY,EACZ,MAAO,SACT,CAAA,CACF,EACAT,EAAA,IAAC,OAAA,CACC,MAAO,CACL,KAAM,EACN,SAAU,SACV,aAAc,WACd,WAAY,QACd,EAEC,SAAKT,EAAA,KAAA,CACR,EACAS,EAAA,IAACc,EAAA,YAAA,CACC,KAAM,GACN,MAAO,CACL,WAAY,EACZ,MAAO,UACP,QAAS,GACT,UAAWH,EAAW,eAAiB,iBACvC,WAAY,qBACd,CAAA,CACF,CAAA,CAAA,CACF,EAGCA,GACCX,EAAA,IAAC,MAAI,CAAA,MAAO,CAAE,YAAa,GAAI,UAAW,CAAA,EACvC,SAAKT,EAAA,SAAS,IAAI,CAACwB,EAAOX,IACzBJ,EAAA,IAACO,EAAA,CAEC,KAAMQ,EACN,OAAQA,EAAM,KAAOxC,GAAYwC,EAAM,OACvC,WAAAvC,EACA,UAAW,EAAA,EAJNuC,EAAM,IAAMX,CAMpB,CAAA,EACH,CAEJ,CAAA,CAAA,CAEJ,CCxaA,MAAMY,EAAgB,CACpB,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EAEA,SAASC,EAAYC,EAAM,CACzB,GAAI,CAACA,EAAM,OAAOF,EAAc,CAAC,EACjC,IAAIG,EAAO,EACX,QAASC,EAAI,EAAGA,EAAIF,EAAK,OAAQE,IAAKD,GAASA,GAAQ,GAAKA,EAAOD,EAAK,WAAWE,CAAC,EAAK,EACzF,OAAOJ,EAAc,KAAK,IAAIG,CAAI,EAAIH,EAAc,MAAM,CAC5D,CAqBA,SAAwBK,EAAc,CACpC,KAAAC,EACA,MAAAC,EACA,SAAAC,EACA,UAAAC,EACA,aAAAC,EACA,SAAAC,EACA,UAAAC,EACA,SAAAC,EACA,SAAAC,EACA,SAAAC,EACA,OAAAC,EAAS,GACT,MAAAC,CACF,EAAG,CACK,MAAAC,EAAcV,GAAYC,GAAa,GACvCU,EAAWT,GAAgBU,EAAYF,CAAW,EAGtD,OAAAnC,EAAA,KAAC,SAAA,CACC,MAAO,CACL,QAAS,OACT,WAAY,SACZ,eAAgB,gBAChB,QAAS,SACT,OAAAiC,EACA,aAAc,0BACd,WAAY,wBACZ,WAAY,EACZ,WAAY,mBACZ,SAAU,SACV,IAAK,EACL,OAAQ,IACR,GAAGC,CACL,EAGA,SAAA,CAAClC,EAAAA,KAAA,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,GAAI,WAAY,CAAA,EACvE,SAAA,CAAAuB,IAAS,OAAYA,EACnBtB,EAAAA,IAAA,OAAA,CAAK,MAAO,CACX,SAAU,iBACV,WAAY,IACZ,WAAY,sBACZ,MAAO,kBACP,cAAe,SAAA,EACd,SAEH,UAAA,EAEDuB,GAEGxB,EAAA,KAAAsC,WAAA,CAAA,SAAA,CAAArC,MAAC,QAAK,MAAO,CACX,MAAO,EACP,OAAQ,GACR,WAAY,gBACZ,WAAY,CAAA,EACX,EACHA,MAAC,QAAK,MAAO,CACX,SAAU,iBACV,WAAY,IACZ,MAAO,mBAAA,EAEN,SACHuB,EAAA,CAAA,EACF,CAAA,EAEJ,EAGCM,GACE7B,EAAA,IAAA,MAAA,CAAI,MAAO,CACV,QAAS,OACT,WAAY,SACZ,IAAK,EACL,KAAM,EACN,eAAgB,SAChB,SAAU,GAET,SAAA6B,CACH,CAAA,EAIF9B,EAAA,KAAC,MAAA,CACC,MAAO,CACL,QAAS,OACT,WAAY,SACZ,IAAK,GACL,WAAY,CACd,EAEC,SAAA,CAAA+B,EAEAC,GAEGG,GACFnC,EAAA,KAAC,MAAI,CAAA,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,GAExD,SAAA,CAAAC,MAAC,OAAI,MAAO,CACV,MAAO,GACP,OAAQ,GACR,aAAc,MACd,WAAYiB,EAAYiB,CAAW,EACnC,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,WAAY,CACd,EACE,SAAClC,EAAAA,IAAA,OAAA,CAAK,MAAO,CACX,SAAU,GACV,WAAY,IACZ,MAAO,OACP,cAAe,SACf,WAAY,CAAA,EAEX,UACH,CAAA,EACF,EAGAD,EAAAA,KAAC,MAAI,CAAA,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,CAAA,EAC3D,SAAA,CAAAC,MAAC,QAAK,MAAO,CACX,SAAU,iBACV,WAAY,IACZ,MAAO,qBACP,WAAY,GAAA,EAEX,SACHkC,EAAA,EACCP,GACE3B,EAAA,IAAA,OAAA,CAAK,MAAO,CACX,SAAU,iBACV,MAAO,oBACP,WAAY,GAAA,EAEX,SACH2B,EAAA,CAAA,EAEJ,EAGCC,GACC5B,EAAA,IAAC,SAAA,CACC,QAAS4B,EACT,MAAM,WACN,MAAO,CACL,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,MAAO,GACP,OAAQ,GACR,aAAc,mBACd,OAAQ,OACR,WAAY,cACZ,MAAO,oBACP,OAAQ,UACR,WAAY,yCACd,EACA,aAAe3B,GAAM,CACjBA,EAAA,cAAc,MAAM,WAAa,oBACjCA,EAAA,cAAc,MAAM,MAAQ,mBAChC,EACA,aAAeA,GAAM,CACjBA,EAAA,cAAc,MAAM,WAAa,cACjCA,EAAA,cAAc,MAAM,MAAQ,mBAChC,EAEA,SAAAD,EAAAA,IAACsC,EAAAA,OAAO,CAAA,KAAM,EAAI,CAAA,CAAA,CACpB,CAAA,EAEJ,CAAA,CAAA,CAEJ,CAAA,CAAA,CAAA,CAGN,CAWO,SAASC,EAAQ,CAAE,MAAAC,EAAO,MAAAC,EAAQ,oBAAqB,OAAAjC,EAAQ,QAAAkC,GAAW,CAE7E,OAAA3C,EAAA,KAAC,SAAA,CACC,QAAA2C,EACA,MAAO,CACL,QAAS,OACT,WAAY,SACZ,IAAK,EACL,SAAU,iBACV,WAAY,IACZ,WAAY,mBACZ,QAAS,WACT,aAAc,mBACd,OAAQ,gCAAgCD,CAAK,qBAC7C,WAAY,sBAAsBA,CAAK,qBACvC,MAAAA,EACA,OAAQ,UACR,WAAY,gDACd,EACA,aAAexC,GAAM,CACnBA,EAAE,cAAc,MAAM,WAAa,sBAAsBwC,CAAK,oBAChE,EACA,aAAexC,GAAM,CACnBA,EAAE,cAAc,MAAM,WAAa,sBAAsBwC,CAAK,oBAChE,EAEC,SAAA,CAAAD,EACDxC,EAAA,IAACc,EAAA,YAAA,CACC,KAAM,GACN,MAAO,CACL,UAAWN,EAAS,iBAAmB,eACvC,WAAY,sBACZ,QAAS,EACX,CAAA,CACF,CAAA,CAAA,CAAA,CAGN,CAYO,SAASmC,EAAY,CAAE,KAAAC,EAAM,QAAAC,EAAS,SAAAhB,EAAU,MAAAiB,EAAQ,QAAU,CACvE,OAAKF,EAGD7C,EAAA,KAAAsC,WAAA,CAAA,SAAA,CAAArC,EAAA,IAAC,MAAA,CACC,QAAS6C,EACT,MAAO,CAAE,SAAU,QAAS,MAAO,EAAG,OAAQ,GAAI,WAAY,kBAAmB,CAAA,CACnF,EACA7C,MAAC,OAAI,MAAO,CACV,SAAU,WACV,IAAK,OACL,CAAC8C,IAAU,QAAU,QAAU,MAAM,EAAG,EACxC,UAAW,EACX,OAAQ,IACR,WAAY,OACZ,OAAQ,0BACR,aAAc,gBACd,QAAS,EACT,SAAU,IACV,UAAW,IACX,UAAW,OACX,UAAW,+BAEV,SAAAjB,CACH,CAAA,CACF,CAAA,CAAA,EAxBgB,IA0BpB,CAUO,SAASkB,EAAgB,CAAE,MAAAP,EAAO,OAAAhC,EAAQ,QAAAkC,GAAW,CAExD,OAAA1C,EAAA,IAAC,MAAA,CACC,QAAA0C,EACA,MAAO,CACL,QAAS,WACT,aAAc,mBACd,OAAQ,UACR,SAAU,iBACV,MAAOlC,EAAS,kBAAoB,mBACpC,WAAYA,EAAS,IAAM,IAC3B,WAAY,mBACZ,WAAYA,EAAS,oBAAsB,cAC3C,WAAY,sBACd,EACA,aAAeP,GAAM,CACdO,IAAUP,EAAA,cAAc,MAAM,WAAa,2BAClD,EACA,aAAeA,GAAM,CACdO,IAAUP,EAAA,cAAc,MAAM,WAAa,cAClD,EAEC,SAAAuC,CAAA,CAAA,CAGP,CASO,SAASQ,EAAgB,CAAE,UAAAC,EAAW,MAAAT,GAAS,CAC9C,MAAAU,EAAOV,IAAUS,EAAY,YAAc,gBAE/C,OAAAjD,EAAA,IAAC,QAAK,MAAO,CACX,SAAU,iBACV,WAAY,mBACZ,QAAS,WACT,aAAc,GACd,OAAQ,aAAaiD,EAAY,uBAAyB,eAAe,GACzE,MAAOA,EAAY,uBAAyB,oBAC5C,WAAYA,EAAY,wBAA0B,cAClD,WAAY,eAAA,EAEX,SACHC,CAAA,CAAA,CAEJ,CAEA,SAASd,EAAYlB,EAAM,CACzB,GAAI,CAACA,EAAa,MAAA,IAClB,MAAMiC,EAAQjC,EAAK,KAAK,EAAE,MAAM,KAAK,EACjC,OAAAiC,EAAM,QAAU,GACVA,EAAM,CAAC,EAAE,CAAC,EAAIA,EAAMA,EAAM,OAAS,CAAC,EAAE,CAAC,GAAG,YAAY,EAEzDjC,EAAK,MAAM,EAAG,CAAC,EAAE,YAAY,CACtC"}
|
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
import { jsxs as d, jsx as t, Fragment as
|
|
2
|
-
import j, { useState as
|
|
3
|
-
import { PanelLeft as P, PanelLeftClose as
|
|
1
|
+
import { jsxs as d, jsx as t, Fragment as M } from "react/jsx-runtime";
|
|
2
|
+
import j, { useState as S } from "react";
|
|
3
|
+
import { PanelLeft as P, PanelLeftClose as H, ChevronDown as E, SquareDot as T, Home as D, FolderClosed as w, Users as C, LayoutDashboard as O, Clock3 as I, Activity as z, Lightbulb as $, Bell as G, Plug as _, Settings as U, BarChart3 as Y, FileText as A, Headphones as q, Shield as N, Sliders as V, Workflow as X, LogOut as J } from "lucide-react";
|
|
4
4
|
const K = {
|
|
5
|
-
home:
|
|
6
|
-
projects:
|
|
7
|
-
folder:
|
|
8
|
-
organization:
|
|
9
|
-
users:
|
|
5
|
+
home: D,
|
|
6
|
+
projects: w,
|
|
7
|
+
folder: w,
|
|
8
|
+
organization: C,
|
|
9
|
+
users: C,
|
|
10
10
|
dashboard: O,
|
|
11
11
|
history: I,
|
|
12
12
|
sessions: I,
|
|
13
|
-
monitoring:
|
|
14
|
-
activity:
|
|
13
|
+
monitoring: z,
|
|
14
|
+
activity: z,
|
|
15
15
|
insights: $,
|
|
16
16
|
notifications: G,
|
|
17
17
|
integrations: _,
|
|
18
18
|
settings: U,
|
|
19
19
|
usage: Y,
|
|
20
|
-
docs:
|
|
21
|
-
documentation:
|
|
20
|
+
docs: A,
|
|
21
|
+
documentation: A,
|
|
22
22
|
agents: q,
|
|
23
23
|
security: N,
|
|
24
24
|
configuration: V,
|
|
25
25
|
workflow: X
|
|
26
26
|
};
|
|
27
27
|
function L(e) {
|
|
28
|
-
return e ? typeof e == "string" ? K[e.toLowerCase()] ||
|
|
28
|
+
return e ? typeof e == "string" ? K[e.toLowerCase()] || T : e : T;
|
|
29
29
|
}
|
|
30
30
|
function oe({
|
|
31
31
|
menuItems: e = [],
|
|
32
32
|
activeId: r,
|
|
33
33
|
onNavigate: o,
|
|
34
34
|
collapsed: i,
|
|
35
|
-
onToggleCollapse:
|
|
36
|
-
header:
|
|
35
|
+
onToggleCollapse: c,
|
|
36
|
+
header: g,
|
|
37
37
|
footer: s,
|
|
38
|
-
width:
|
|
38
|
+
width: p = 244,
|
|
39
39
|
collapsedWidth: h = 56
|
|
40
40
|
}) {
|
|
41
|
-
const [n, y] =
|
|
41
|
+
const [n, y] = S(!1), l = i !== void 0 ? i : n, x = c || (() => y(!n)), [b, f] = S(() => {
|
|
42
42
|
const a = {};
|
|
43
43
|
return e.forEach((u) => {
|
|
44
|
-
var
|
|
45
|
-
if ((
|
|
46
|
-
const F = u.children.some((
|
|
44
|
+
var v;
|
|
45
|
+
if ((v = u.children) != null && v.length) {
|
|
46
|
+
const F = u.children.some((B) => B.id === r || B.active);
|
|
47
47
|
a[u.id] = F;
|
|
48
48
|
}
|
|
49
49
|
}), a;
|
|
50
50
|
}), W = (a) => {
|
|
51
51
|
f((u) => ({ ...u, [a]: !u[a] }));
|
|
52
|
-
}, m = l ? h :
|
|
52
|
+
}, m = l ? h : p;
|
|
53
53
|
return /* @__PURE__ */ d(
|
|
54
54
|
"nav",
|
|
55
55
|
{
|
|
@@ -69,7 +69,7 @@ function oe({
|
|
|
69
69
|
flexShrink: 0
|
|
70
70
|
},
|
|
71
71
|
children: [
|
|
72
|
-
|
|
72
|
+
g && !l && /* @__PURE__ */ t("div", { style: { padding: "16px 16px 8px", flexShrink: 0, width: "100%" }, children: g }),
|
|
73
73
|
/* @__PURE__ */ t(
|
|
74
74
|
"div",
|
|
75
75
|
{
|
|
@@ -104,7 +104,7 @@ function oe({
|
|
|
104
104
|
onMouseLeave: (a) => {
|
|
105
105
|
a.currentTarget.style.background = "transparent", a.currentTarget.style.color = "rgba(255, 255, 255, 0.5)";
|
|
106
106
|
},
|
|
107
|
-
children: l ? /* @__PURE__ */ t(P, { size: 16 }) : /* @__PURE__ */ t(
|
|
107
|
+
children: l ? /* @__PURE__ */ t(P, { size: 16 }) : /* @__PURE__ */ t(H, { size: 16 })
|
|
108
108
|
}
|
|
109
109
|
)
|
|
110
110
|
}
|
|
@@ -120,7 +120,7 @@ function oe({
|
|
|
120
120
|
width: "100%"
|
|
121
121
|
},
|
|
122
122
|
children: e.map((a, u) => {
|
|
123
|
-
var
|
|
123
|
+
var v;
|
|
124
124
|
return /* @__PURE__ */ d(j.Fragment, { children: [
|
|
125
125
|
a.section && !l && /* @__PURE__ */ t(
|
|
126
126
|
"div",
|
|
@@ -137,12 +137,12 @@ function oe({
|
|
|
137
137
|
children: a.section
|
|
138
138
|
}
|
|
139
139
|
),
|
|
140
|
-
(
|
|
140
|
+
(v = a.children) != null && v.length ? /* @__PURE__ */ t(
|
|
141
141
|
Q,
|
|
142
142
|
{
|
|
143
143
|
item: a,
|
|
144
144
|
activeId: r,
|
|
145
|
-
expanded: !!
|
|
145
|
+
expanded: !!b[a.id],
|
|
146
146
|
onToggle: () => W(a.id),
|
|
147
147
|
onNavigate: o,
|
|
148
148
|
collapsed: l
|
|
@@ -177,7 +177,7 @@ function oe({
|
|
|
177
177
|
);
|
|
178
178
|
}
|
|
179
179
|
function R({ item: e, active: r, onNavigate: o, collapsed: i }) {
|
|
180
|
-
const
|
|
180
|
+
const c = L(e.icon), g = typeof e.icon != "string" && typeof e.icon < "u";
|
|
181
181
|
return /* @__PURE__ */ d(
|
|
182
182
|
"button",
|
|
183
183
|
{
|
|
@@ -196,9 +196,12 @@ function R({ item: e, active: r, onNavigate: o, collapsed: i }) {
|
|
|
196
196
|
borderBottom: "none",
|
|
197
197
|
borderLeft: "none",
|
|
198
198
|
background: r ? "var(--Background-MonoPressed, #323232)" : "transparent",
|
|
199
|
-
color: r ? "#
|
|
200
|
-
fontWeight:
|
|
201
|
-
fontSize: "
|
|
199
|
+
color: r ? "var(--Brand-400, #33B88B)" : "var(--Content-TertiaryInverse, #B2AEA8)",
|
|
200
|
+
fontWeight: 500,
|
|
201
|
+
fontSize: "12px",
|
|
202
|
+
fontStyle: "normal",
|
|
203
|
+
lineHeight: "120%",
|
|
204
|
+
textTransform: "uppercase",
|
|
202
205
|
fontFamily: "var(--font-sans)",
|
|
203
206
|
cursor: "pointer",
|
|
204
207
|
textAlign: "left",
|
|
@@ -206,14 +209,14 @@ function R({ item: e, active: r, onNavigate: o, collapsed: i }) {
|
|
|
206
209
|
marginBottom: 2
|
|
207
210
|
},
|
|
208
211
|
onMouseEnter: (s) => {
|
|
209
|
-
r || (s.currentTarget.style.background = "var(--Background-MonoPressed, #323232)", s.currentTarget.style.color = "#
|
|
212
|
+
r || (s.currentTarget.style.background = "var(--Background-MonoPressed, #323232)", s.currentTarget.style.color = "var(--Brand-400, #33B88B)");
|
|
210
213
|
},
|
|
211
214
|
onMouseLeave: (s) => {
|
|
212
215
|
r || (s.currentTarget.style.background = "transparent", s.currentTarget.style.color = "var(--Content-TertiaryInverse, #B2AEA8)");
|
|
213
216
|
},
|
|
214
217
|
children: [
|
|
215
|
-
|
|
216
|
-
|
|
218
|
+
g ? /* @__PURE__ */ t("span", { style: { flexShrink: 0, display: "flex" }, children: e.icon }) : /* @__PURE__ */ t(
|
|
219
|
+
c,
|
|
217
220
|
{
|
|
218
221
|
size: 18,
|
|
219
222
|
style: {
|
|
@@ -237,10 +240,10 @@ function R({ item: e, active: r, onNavigate: o, collapsed: i }) {
|
|
|
237
240
|
}
|
|
238
241
|
);
|
|
239
242
|
}
|
|
240
|
-
function Q({ item: e, activeId: r, expanded: o, onToggle: i, onNavigate:
|
|
243
|
+
function Q({ item: e, activeId: r, expanded: o, onToggle: i, onNavigate: c, collapsed: g }) {
|
|
241
244
|
var h;
|
|
242
|
-
const s = L(e.icon),
|
|
243
|
-
return
|
|
245
|
+
const s = L(e.icon), p = (h = e.children) == null ? void 0 : h.some((n) => n.id === r || n.active);
|
|
246
|
+
return g ? /* @__PURE__ */ t(
|
|
244
247
|
"button",
|
|
245
248
|
{
|
|
246
249
|
onClick: i,
|
|
@@ -253,17 +256,17 @@ function Q({ item: e, activeId: r, expanded: o, onToggle: i, onNavigate: g, coll
|
|
|
253
256
|
padding: "10px 0",
|
|
254
257
|
borderRadius: "4px",
|
|
255
258
|
border: "none",
|
|
256
|
-
background:
|
|
257
|
-
color:
|
|
259
|
+
background: p ? "var(--Background-MonoPressed, #323232)" : "transparent",
|
|
260
|
+
color: p ? "var(--Brand-400, #33B88B)" : "var(--Content-TertiaryInverse, #B2AEA8)",
|
|
258
261
|
cursor: "pointer",
|
|
259
262
|
marginBottom: 2,
|
|
260
263
|
transition: "background 0.15s ease"
|
|
261
264
|
},
|
|
262
265
|
onMouseEnter: (n) => {
|
|
263
|
-
|
|
266
|
+
p || (n.currentTarget.style.background = "var(--Background-MonoPressed, #323232)", n.currentTarget.style.color = "var(--Brand-400, #33B88B)");
|
|
264
267
|
},
|
|
265
268
|
onMouseLeave: (n) => {
|
|
266
|
-
|
|
269
|
+
p || (n.currentTarget.style.background = "transparent", n.currentTarget.style.color = "var(--Content-TertiaryInverse, #B2AEA8)");
|
|
267
270
|
},
|
|
268
271
|
children: /* @__PURE__ */ t(
|
|
269
272
|
s,
|
|
@@ -287,19 +290,22 @@ function Q({ item: e, activeId: r, expanded: o, onToggle: i, onNavigate: g, coll
|
|
|
287
290
|
borderRadius: "4px",
|
|
288
291
|
border: "none",
|
|
289
292
|
background: "transparent",
|
|
290
|
-
color:
|
|
291
|
-
fontWeight:
|
|
292
|
-
fontSize: "
|
|
293
|
+
color: p ? "var(--Brand-400, #33B88B)" : "var(--Content-TertiaryInverse, #B2AEA8)",
|
|
294
|
+
fontWeight: 700,
|
|
295
|
+
fontSize: "12px",
|
|
296
|
+
fontStyle: "normal",
|
|
297
|
+
lineHeight: "120%",
|
|
298
|
+
textTransform: "uppercase",
|
|
293
299
|
fontFamily: "var(--font-sans)",
|
|
294
300
|
cursor: "pointer",
|
|
295
301
|
textAlign: "left",
|
|
296
302
|
transition: "background 0.15s ease, color 0.15s ease"
|
|
297
303
|
},
|
|
298
304
|
onMouseEnter: (n) => {
|
|
299
|
-
n.currentTarget.style.background = "var(--Background-MonoPressed, #323232)", n.currentTarget.style.color = "#
|
|
305
|
+
n.currentTarget.style.background = "var(--Background-MonoPressed, #323232)", n.currentTarget.style.color = "var(--Brand-400, #33B88B)";
|
|
300
306
|
},
|
|
301
307
|
onMouseLeave: (n) => {
|
|
302
|
-
n.currentTarget.style.background = "transparent",
|
|
308
|
+
n.currentTarget.style.background = "transparent", p ? n.currentTarget.style.color = "var(--Brand-400, #33B88B)" : n.currentTarget.style.color = "var(--Content-TertiaryInverse, #B2AEA8)";
|
|
303
309
|
},
|
|
304
310
|
children: [
|
|
305
311
|
/* @__PURE__ */ t(
|
|
@@ -325,7 +331,7 @@ function Q({ item: e, activeId: r, expanded: o, onToggle: i, onNavigate: g, coll
|
|
|
325
331
|
}
|
|
326
332
|
),
|
|
327
333
|
/* @__PURE__ */ t(
|
|
328
|
-
|
|
334
|
+
E,
|
|
329
335
|
{
|
|
330
336
|
size: 14,
|
|
331
337
|
style: {
|
|
@@ -345,7 +351,7 @@ function Q({ item: e, activeId: r, expanded: o, onToggle: i, onNavigate: g, coll
|
|
|
345
351
|
{
|
|
346
352
|
item: n,
|
|
347
353
|
active: n.id === r || n.active,
|
|
348
|
-
onNavigate:
|
|
354
|
+
onNavigate: c,
|
|
349
355
|
collapsed: !1
|
|
350
356
|
},
|
|
351
357
|
n.id || y
|
|
@@ -383,16 +389,16 @@ function ae({
|
|
|
383
389
|
title: r,
|
|
384
390
|
userName: o,
|
|
385
391
|
userEmail: i,
|
|
386
|
-
userInitials:
|
|
387
|
-
userRole:
|
|
392
|
+
userInitials: c,
|
|
393
|
+
userRole: g,
|
|
388
394
|
onSignOut: s,
|
|
389
|
-
children:
|
|
395
|
+
children: p,
|
|
390
396
|
trailing: h,
|
|
391
397
|
userMenu: n,
|
|
392
398
|
height: y = 48,
|
|
393
399
|
style: l
|
|
394
400
|
}) {
|
|
395
|
-
const x = o || i || "",
|
|
401
|
+
const x = o || i || "", b = c || ee(x);
|
|
396
402
|
return /* @__PURE__ */ d(
|
|
397
403
|
"header",
|
|
398
404
|
{
|
|
@@ -420,7 +426,7 @@ function ae({
|
|
|
420
426
|
color: "var(--text-ink)",
|
|
421
427
|
letterSpacing: "-0.01em"
|
|
422
428
|
}, children: "Chordia" }),
|
|
423
|
-
r && /* @__PURE__ */ d(
|
|
429
|
+
r && /* @__PURE__ */ d(M, { children: [
|
|
424
430
|
/* @__PURE__ */ t("span", { style: {
|
|
425
431
|
width: 1,
|
|
426
432
|
height: 18,
|
|
@@ -434,14 +440,14 @@ function ae({
|
|
|
434
440
|
}, children: r })
|
|
435
441
|
] })
|
|
436
442
|
] }),
|
|
437
|
-
|
|
443
|
+
p && /* @__PURE__ */ t("div", { style: {
|
|
438
444
|
display: "flex",
|
|
439
445
|
alignItems: "center",
|
|
440
446
|
gap: 8,
|
|
441
447
|
flex: 1,
|
|
442
448
|
justifyContent: "center",
|
|
443
449
|
minWidth: 0
|
|
444
|
-
}, children:
|
|
450
|
+
}, children: p }),
|
|
445
451
|
/* @__PURE__ */ d(
|
|
446
452
|
"div",
|
|
447
453
|
{
|
|
@@ -469,7 +475,7 @@ function ae({
|
|
|
469
475
|
color: "#fff",
|
|
470
476
|
letterSpacing: "0.02em",
|
|
471
477
|
lineHeight: 1
|
|
472
|
-
}, children:
|
|
478
|
+
}, children: b }) }),
|
|
473
479
|
/* @__PURE__ */ d("div", { style: { display: "flex", flexDirection: "column", gap: 1 }, children: [
|
|
474
480
|
/* @__PURE__ */ t("span", { style: {
|
|
475
481
|
fontSize: "var(--text-sm)",
|
|
@@ -477,11 +483,11 @@ function ae({
|
|
|
477
483
|
color: "var(--text-strong)",
|
|
478
484
|
lineHeight: 1.2
|
|
479
485
|
}, children: x }),
|
|
480
|
-
|
|
486
|
+
g && /* @__PURE__ */ t("span", { style: {
|
|
481
487
|
fontSize: "var(--text-xs)",
|
|
482
488
|
color: "var(--text-muted)",
|
|
483
489
|
lineHeight: 1.2
|
|
484
|
-
}, children:
|
|
490
|
+
}, children: g })
|
|
485
491
|
] }),
|
|
486
492
|
s && /* @__PURE__ */ t(
|
|
487
493
|
"button",
|
|
@@ -538,16 +544,16 @@ function ie({ label: e, color: r = "var(--text-muted)", active: o, onClick: i })
|
|
|
538
544
|
cursor: "pointer",
|
|
539
545
|
transition: "background 0.15s ease, border-color 0.15s ease"
|
|
540
546
|
},
|
|
541
|
-
onMouseEnter: (
|
|
542
|
-
|
|
547
|
+
onMouseEnter: (c) => {
|
|
548
|
+
c.currentTarget.style.background = `color-mix(in srgb, ${r} 18%, transparent)`;
|
|
543
549
|
},
|
|
544
|
-
onMouseLeave: (
|
|
545
|
-
|
|
550
|
+
onMouseLeave: (c) => {
|
|
551
|
+
c.currentTarget.style.background = `color-mix(in srgb, ${r} 10%, transparent)`;
|
|
546
552
|
},
|
|
547
553
|
children: [
|
|
548
554
|
e,
|
|
549
555
|
/* @__PURE__ */ t(
|
|
550
|
-
|
|
556
|
+
E,
|
|
551
557
|
{
|
|
552
558
|
size: 12,
|
|
553
559
|
style: {
|
|
@@ -562,7 +568,7 @@ function ie({ label: e, color: r = "var(--text-muted)", active: o, onClick: i })
|
|
|
562
568
|
);
|
|
563
569
|
}
|
|
564
570
|
function se({ open: e, onClose: r, children: o, align: i = "left" }) {
|
|
565
|
-
return e ? /* @__PURE__ */ d(
|
|
571
|
+
return e ? /* @__PURE__ */ d(M, { children: [
|
|
566
572
|
/* @__PURE__ */ t(
|
|
567
573
|
"div",
|
|
568
574
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.es.js","sources":["../../src/components/navigation/Sidebar.jsx","../../src/components/navigation/NavigationBar.jsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState } from \"react\";\nimport {\n Home, FolderClosed, Users, Settings, ChevronDown,\n LayoutDashboard, Clock3, Activity, Lightbulb, Bell, Plug, BarChart3,\n FileText, Headphones, Shield, Sliders, Workflow, SquareDot,\n PanelLeftClose, PanelLeft,\n} from \"lucide-react\";\n\n/**\n * Sidebar — collapsible navigation sidebar.\n *\n * Slot-based: pass menuItems as data, component handles rendering + expand/collapse.\n * No framework dependencies (no router, no auth, no API calls).\n *\n * Props:\n * - menuItems Array<MenuItem> Navigation items (see shape below)\n * - activeId string Currently active item id\n * - onNavigate function(href) Navigation callback\n * - collapsed boolean External collapsed state (controlled)\n * - onToggleCollapse function Toggle callback\n * - header ReactNode Optional header slot (logo, brand)\n * - footer ReactNode Optional footer slot (user, settings)\n * - width number Expanded width (default 240)\n * - collapsedWidth number Collapsed width (default 56)\n *\n * MenuItem shape:\n * - id string\n * - label string\n * - icon string (key from ICON_MAP) or ReactNode\n * - href string\n * - active boolean (override)\n * - children Array<MenuItem> (nested group)\n * - section string (section label above this item)\n */\n\nconst ICON_MAP = {\n home: Home,\n projects: FolderClosed,\n folder: FolderClosed,\n organization: Users,\n users: Users,\n dashboard: LayoutDashboard,\n history: Clock3,\n sessions: Clock3,\n monitoring: Activity,\n activity: Activity,\n insights: Lightbulb,\n notifications: Bell,\n integrations: Plug,\n settings: Settings,\n usage: BarChart3,\n docs: FileText,\n documentation: FileText,\n agents: Headphones,\n security: Shield,\n configuration: Sliders,\n workflow: Workflow,\n};\n\nfunction resolveIcon(icon) {\n if (!icon) return SquareDot;\n if (typeof icon === \"string\") return ICON_MAP[icon.toLowerCase()] || SquareDot;\n return icon;\n}\n\nexport default function Sidebar({\n menuItems = [],\n activeId,\n onNavigate,\n collapsed: controlledCollapsed,\n onToggleCollapse,\n header,\n footer,\n width = 244,\n collapsedWidth = 56,\n}) {\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const collapsed = controlledCollapsed !== undefined ? controlledCollapsed : internalCollapsed;\n const toggleCollapse = onToggleCollapse || (() => setInternalCollapsed(!internalCollapsed));\n\n const [expandedGroups, setExpandedGroups] = useState(() => {\n const initial = {};\n menuItems.forEach((item) => {\n if (item.children?.length) {\n // Auto-expand groups that contain the active item\n const hasActive = item.children.some((c) => c.id === activeId || c.active);\n initial[item.id] = hasActive;\n }\n });\n return initial;\n });\n\n const toggleGroup = (id) => {\n setExpandedGroups((prev) => ({ ...prev, [id]: !prev[id] }));\n };\n\n const currentWidth = collapsed ? collapsedWidth : width;\n\n return (\n <nav\n style={{\n width: currentWidth,\n minWidth: currentWidth,\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n padding: collapsed ? \"0\" : \"0 0 24px 24px\",\n gap: 24,\n background: \"var(--Background-Inverse, #0B0B0B)\",\n fontFamily: \"var(--font-sans)\",\n transition: \"width 0.2s ease, min-width 0.2s ease\",\n overflow: \"hidden\",\n flexShrink: 0,\n }}\n >\n {/* Header slot */}\n {header && !collapsed && (\n <div style={{ padding: \"16px 16px 8px\", flexShrink: 0, width: \"100%\" }}>\n {header}\n </div>\n )}\n\n {/* Collapse toggle */}\n <div\n style={{\n display: \"flex\",\n justifyContent: collapsed ? \"center\" : \"flex-end\",\n padding: collapsed ? \"12px 0\" : \"8px 0 0\",\n flexShrink: 0,\n width: \"100%\",\n }}\n >\n <button\n onClick={toggleCollapse}\n title={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 28,\n height: 28,\n borderRadius: \"var(--radius-sm)\",\n border: \"none\",\n background: \"transparent\",\n color: \"rgba(255, 255, 255, 0.5)\",\n cursor: \"pointer\",\n transition: \"background 0.15s ease, color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(255, 255, 255, 0.08)\";\n e.currentTarget.style.color = \"rgba(255, 255, 255, 0.8)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"rgba(255, 255, 255, 0.5)\";\n }}\n >\n {collapsed ? <PanelLeft size={16} /> : <PanelLeftClose size={16} />}\n </button>\n </div>\n\n {/* Menu items */}\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n overflowX: \"hidden\",\n padding: collapsed ? \"0 8px\" : \"0\",\n width: \"100%\",\n }}\n >\n {menuItems.map((item, idx) => (\n <React.Fragment key={item.id || idx}>\n {/* Section label */}\n {item.section && !collapsed && (\n <div\n style={{\n fontSize: \"var(--text-xs)\",\n fontWeight: 650,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: \"rgba(255, 255, 255, 0.35)\",\n padding: \"16px 8px 6px\",\n lineHeight: 1,\n }}\n >\n {item.section}\n </div>\n )}\n\n {item.children?.length ? (\n <SidebarGroup\n item={item}\n activeId={activeId}\n expanded={!!expandedGroups[item.id]}\n onToggle={() => toggleGroup(item.id)}\n onNavigate={onNavigate}\n collapsed={collapsed}\n />\n ) : (\n <SidebarItem\n item={item}\n active={item.id === activeId || item.active}\n onNavigate={onNavigate}\n collapsed={collapsed}\n />\n )}\n </React.Fragment>\n ))}\n </div>\n\n {/* Footer slot */}\n {footer && !collapsed && (\n <div\n style={{\n padding: \"12px 16px\",\n borderTop: \"1px solid rgba(255, 255, 255, 0.08)\",\n flexShrink: 0,\n width: \"100%\",\n }}\n >\n {footer}\n </div>\n )}\n </nav>\n );\n}\n\nfunction SidebarItem({ item, active, onNavigate, collapsed }) {\n const Icon = resolveIcon(item.icon);\n const isReactIcon = typeof item.icon !== \"string\" && typeof item.icon !== \"undefined\";\n\n return (\n <button\n onClick={() => onNavigate?.(item.href || item.id)}\n title={collapsed ? item.label : undefined}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: collapsed ? 0 : 12,\n justifyContent: collapsed ? \"center\" : \"flex-start\",\n width: \"100%\",\n padding: collapsed ? \"10px 0\" : \"12px 24px 12px 12px\",\n borderRadius: active ? \"4px 0 0 4px\" : \"4px\",\n borderRight: active ? \"2px solid #00A66E\" : \"2px solid transparent\",\n borderTop: \"none\",\n borderBottom: \"none\",\n borderLeft: \"none\",\n background: active ? \"var(--Background-MonoPressed, #323232)\" : \"transparent\",\n color: active ? \"#00A66E\" : \"var(--Content-TertiaryInverse, #B2AEA8)\",\n fontWeight: active ? 550 : 400,\n fontSize: \"var(--text-sm)\",\n fontFamily: \"var(--font-sans)\",\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"background 0.15s ease, color 0.1s ease, border-color 0.15s ease\",\n marginBottom: 2,\n }}\n onMouseEnter={(e) => {\n if (!active) {\n e.currentTarget.style.background = \"var(--Background-MonoPressed, #323232)\";\n e.currentTarget.style.color = \"#00A66E\";\n }\n }}\n onMouseLeave={(e) => {\n if (!active) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"var(--Content-TertiaryInverse, #B2AEA8)\";\n }\n }}\n >\n {isReactIcon ? (\n <span style={{ flexShrink: 0, display: \"flex\" }}>{item.icon}</span>\n ) : (\n <Icon\n size={18}\n style={{\n flexShrink: 0,\n color: \"inherit\",\n }}\n />\n )}\n {!collapsed && (\n <span\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {item.label}\n </span>\n )}\n </button>\n );\n}\n\nfunction SidebarGroup({ item, activeId, expanded, onToggle, onNavigate, collapsed }) {\n const Icon = resolveIcon(item.icon);\n const hasActiveChild = item.children?.some((c) => c.id === activeId || c.active);\n\n if (collapsed) {\n // In collapsed mode, show just the group icon\n return (\n <button\n onClick={onToggle}\n title={item.label}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"100%\",\n padding: \"10px 0\",\n borderRadius: \"4px\",\n border: \"none\",\n background: hasActiveChild ? \"var(--Background-MonoPressed, #323232)\" : \"transparent\",\n color: hasActiveChild ? \"#00A66E\" : \"var(--Content-TertiaryInverse, #B2AEA8)\",\n cursor: \"pointer\",\n marginBottom: 2,\n transition: \"background 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (!hasActiveChild) {\n e.currentTarget.style.background = \"var(--Background-MonoPressed, #323232)\";\n e.currentTarget.style.color = \"#00A66E\";\n }\n }}\n onMouseLeave={(e) => {\n if (!hasActiveChild) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"var(--Content-TertiaryInverse, #B2AEA8)\";\n }\n }}\n >\n <Icon\n size={18}\n style={{ color: \"inherit\" }}\n />\n </button>\n );\n }\n\n return (\n <div style={{ marginBottom: 2 }}>\n {/* Group header */}\n <button\n onClick={onToggle}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n width: \"100%\",\n padding: \"12px 24px 12px 12px\",\n borderRadius: \"4px\",\n border: \"none\",\n background: \"transparent\",\n color: hasActiveChild ? \"#00A66E\" : \"var(--Content-TertiaryInverse, #B2AEA8)\",\n fontWeight: hasActiveChild ? 550 : 400,\n fontSize: \"var(--text-sm)\",\n fontFamily: \"var(--font-sans)\",\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"background 0.15s ease, color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"var(--Background-MonoPressed, #323232)\";\n e.currentTarget.style.color = \"#00A66E\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n if (!hasActiveChild) e.currentTarget.style.color = \"var(--Content-TertiaryInverse, #B2AEA8)\";\n else e.currentTarget.style.color = \"#00A66E\";\n }}\n >\n <Icon\n size={18}\n style={{\n flexShrink: 0,\n color: \"inherit\",\n }}\n />\n <span\n style={{\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {item.label}\n </span>\n <ChevronDown\n size={14}\n style={{\n flexShrink: 0,\n color: \"inherit\",\n opacity: 0.7,\n transform: expanded ? \"rotate(0deg)\" : \"rotate(-90deg)\",\n transition: \"transform 0.2s ease\",\n }}\n />\n </button>\n\n {/* Children */}\n {expanded && (\n <div style={{ paddingLeft: 18, marginTop: 2 }}>\n {item.children.map((child, idx) => (\n <SidebarItem\n key={child.id || idx}\n item={child}\n active={child.id === activeId || child.active}\n onNavigate={onNavigate}\n collapsed={false}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { LogOut, ChevronDown } from 'lucide-react';\n\n// Stable avatar colors — warm/neutral palette, no purple\nconst AVATAR_COLORS = [\n '#5a8a6e', // sage green\n '#b07d4f', // warm amber\n '#7a8fa6', // slate blue\n '#c47a5a', // terracotta\n '#6a9a8a', // teal\n '#a0785a', // clay\n '#5a7a9a', // steel blue\n '#9a7a5a', // caramel\n];\n\nfunction avatarColor(name) {\n if (!name) return AVATAR_COLORS[0];\n let hash = 0;\n for (let i = 0; i < name.length; i++) hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;\n return AVATAR_COLORS[Math.abs(hash) % AVATAR_COLORS.length];\n}\n\n/**\n * NavigationBar — top-level app header bar.\n *\n * Slot-based composition: pass children for center content, trailing for right content,\n * or use the built-in user/switcher/actions props for the standard Chordia layout.\n *\n * Props:\n * - logo ReactNode Left-side branding (defaults to \"Chordia\" wordmark)\n * - title string App title shown after logo\n * - userName string User's display name\n * - userEmail string Fallback if no userName\n * - userRole string Role badge (e.g. \"Admin\")\n * - onSignOut function Sign out callback (renders sign out button)\n * - children ReactNode Center slot — switchers, breadcrumbs, tabs, anything\n * - trailing ReactNode Right slot — status indicators, extra actions\n * - userMenu ReactNode Optional custom user menu (replaces built-in user block)\n * - height number Bar height in px (default 48)\n * - style object Style overrides on the root element\n */\nexport default function NavigationBar({\n logo,\n title,\n userName,\n userEmail,\n userInitials,\n userRole,\n onSignOut,\n children,\n trailing,\n userMenu,\n height = 48,\n style,\n}) {\n const displayName = userName || userEmail || '';\n const initials = userInitials || getInitials(displayName);\n\n return (\n <header\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '0 20px',\n height,\n borderBottom: '1px solid var(--border)',\n background: 'var(--paper-elevated)',\n flexShrink: 0,\n fontFamily: 'var(--font-sans)',\n position: 'sticky',\n top: 0,\n zIndex: 1000,\n ...style,\n }}\n >\n {/* ─── Left: Logo + Title ─── */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, flexShrink: 0 }}>\n {logo !== undefined ? logo : (\n <span style={{\n fontSize: 'var(--text-lg)',\n fontWeight: 700,\n fontFamily: 'var(--font-display)',\n color: 'var(--text-ink)',\n letterSpacing: '-0.01em',\n }}>\n Chordia\n </span>\n )}\n {title && (\n <>\n <span style={{\n width: 1,\n height: 18,\n background: 'var(--border)',\n flexShrink: 0,\n }} />\n <span style={{\n fontSize: 'var(--text-md)',\n fontWeight: 500,\n color: 'var(--text-muted)',\n }}>\n {title}\n </span>\n </>\n )}\n </div>\n\n {/* ─── Center: Slot for switchers, breadcrumbs, tabs ─── */}\n {children && (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n flex: 1,\n justifyContent: 'center',\n minWidth: 0,\n }}>\n {children}\n </div>\n )}\n\n {/* ─── Right: User + trailing ─── */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n flexShrink: 0,\n }}\n >\n {trailing}\n\n {userMenu\n ? userMenu\n : displayName && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {/* Initials avatar */}\n <div style={{\n width: 30,\n height: 30,\n borderRadius: '50%',\n background: avatarColor(displayName),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}>\n <span style={{\n fontSize: 11,\n fontWeight: 600,\n color: '#fff',\n letterSpacing: '0.02em',\n lineHeight: 1,\n }}>\n {initials}\n </span>\n </div>\n\n {/* Name + role */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n <span style={{\n fontSize: 'var(--text-sm)',\n fontWeight: 550,\n color: 'var(--text-strong)',\n lineHeight: 1.2,\n }}>\n {displayName}\n </span>\n {userRole && (\n <span style={{\n fontSize: 'var(--text-xs)',\n color: 'var(--text-muted)',\n lineHeight: 1.2,\n }}>\n {userRole}\n </span>\n )}\n </div>\n\n {/* Sign out */}\n {onSignOut && (\n <button\n onClick={onSignOut}\n title=\"Sign out\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 28,\n height: 28,\n borderRadius: 'var(--radius-sm)',\n border: 'none',\n background: 'transparent',\n color: 'var(--text-faint)',\n cursor: 'pointer',\n transition: 'background 0.15s ease, color 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'var(--hover-warm)';\n e.currentTarget.style.color = 'var(--text-muted)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n e.currentTarget.style.color = 'var(--text-faint)';\n }}\n >\n <LogOut size={14} />\n </button>\n )}\n </div>\n )}\n </div>\n </header>\n );\n}\n\n/**\n * NavPill — compact switcher button for use inside NavigationBar.\n *\n * Props:\n * - label string Display text\n * - color string Rail color token (e.g. \"var(--rail-discovery)\")\n * - active boolean Whether dropdown is open\n * - onClick function Toggle callback\n */\nexport function NavPill({ label, color = 'var(--text-muted)', active, onClick }) {\n return (\n <button\n onClick={onClick}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n fontSize: 'var(--text-sm)',\n fontWeight: 500,\n fontFamily: 'var(--font-sans)',\n padding: '4px 10px',\n borderRadius: 'var(--radius-sm)',\n border: `1px solid color-mix(in srgb, ${color} 30%, transparent)`,\n background: `color-mix(in srgb, ${color} 10%, transparent)`,\n color: color,\n cursor: 'pointer',\n transition: 'background 0.15s ease, border-color 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = `color-mix(in srgb, ${color} 18%, transparent)`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = `color-mix(in srgb, ${color} 10%, transparent)`;\n }}\n >\n {label}\n <ChevronDown\n size={12}\n style={{\n transform: active ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease',\n opacity: 0.7,\n }}\n />\n </button>\n );\n}\n\n/**\n * NavDropdown — dropdown panel that attaches to a NavPill.\n * Wrap around NavPill and the dropdown content.\n *\n * Props:\n * - open boolean Whether dropdown is visible\n * - onClose function Close callback\n * - children ReactNode Dropdown items\n * - align string \"left\" | \"right\" (default \"left\")\n */\nexport function NavDropdown({ open, onClose, children, align = 'left' }) {\n if (!open) return null;\n return (\n <>\n <div\n onClick={onClose}\n style={{ position: 'fixed', inset: 0, zIndex: 99, background: 'rgba(0,0,0,0.03)' }}\n />\n <div style={{\n position: 'absolute',\n top: '100%',\n [align === 'right' ? 'right' : 'left']: 0,\n marginTop: 4,\n zIndex: 100,\n background: '#fff',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n padding: 4,\n minWidth: 200,\n maxHeight: 280,\n overflowY: 'auto',\n boxShadow: '0 8px 24px rgba(0,0,0,0.12)',\n }}>\n {children}\n </div>\n </>\n );\n}\n\n/**\n * NavDropdownItem — single item inside NavDropdown.\n *\n * Props:\n * - label string\n * - active boolean\n * - onClick function\n */\nexport function NavDropdownItem({ label, active, onClick }) {\n return (\n <div\n onClick={onClick}\n style={{\n padding: '8px 10px',\n borderRadius: 'var(--radius-sm)',\n cursor: 'pointer',\n fontSize: 'var(--text-sm)',\n color: active ? 'var(--text-ink)' : 'var(--text-base)',\n fontWeight: active ? 600 : 400,\n fontFamily: 'var(--font-sans)',\n background: active ? 'var(--hover-warm)' : 'transparent',\n transition: 'background 0.1s ease',\n }}\n onMouseEnter={(e) => {\n if (!active) e.currentTarget.style.background = 'var(--hover-warm-subtle)';\n }}\n onMouseLeave={(e) => {\n if (!active) e.currentTarget.style.background = 'transparent';\n }}\n >\n {label}\n </div>\n );\n}\n\n/**\n * StatusIndicator — connection/status pill for trailing slot.\n *\n * Props:\n * - connected boolean\n * - label string (optional, defaults to Connected/Disconnected)\n */\nexport function StatusIndicator({ connected, label }) {\n const text = label || (connected ? 'Connected' : 'Disconnected');\n return (\n <span style={{\n fontSize: 'var(--text-xs)',\n fontFamily: 'var(--font-sans)',\n padding: '3px 10px',\n borderRadius: 12,\n border: `1px solid ${connected ? 'var(--state-present)' : 'var(--border)'}`,\n color: connected ? 'var(--state-present)' : 'var(--text-faint)',\n background: connected ? 'rgba(37,163,114,0.08)' : 'transparent',\n transition: 'all 0.2s ease',\n }}>\n {text}\n </span>\n );\n}\n\nfunction getInitials(name) {\n if (!name) return '?';\n const parts = name.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n return name.slice(0, 2).toUpperCase();\n}\n"],"names":["ICON_MAP","Home","FolderClosed","Users","LayoutDashboard","Clock3","Activity","Lightbulb","Bell","Plug","Settings","BarChart3","FileText","Headphones","Shield","Sliders","Workflow","resolveIcon","icon","SquareDot","Sidebar","menuItems","activeId","onNavigate","controlledCollapsed","onToggleCollapse","header","footer","width","collapsedWidth","internalCollapsed","setInternalCollapsed","useState","collapsed","toggleCollapse","expandedGroups","setExpandedGroups","initial","item","_a","hasActive","c","toggleGroup","id","prev","currentWidth","jsxs","jsx","e","PanelLeft","PanelLeftClose","idx","React","SidebarGroup","SidebarItem","active","Icon","isReactIcon","expanded","onToggle","hasActiveChild","ChevronDown","child","AVATAR_COLORS","avatarColor","name","hash","i","NavigationBar","logo","title","userName","userEmail","userInitials","userRole","onSignOut","children","trailing","userMenu","height","style","displayName","initials","getInitials","Fragment","LogOut","NavPill","label","color","onClick","NavDropdown","open","onClose","align","NavDropdownItem","StatusIndicator","connected","parts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"navigation.es.js","sources":["../../src/components/navigation/Sidebar.jsx","../../src/components/navigation/NavigationBar.jsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState } from \"react\";\nimport {\n Home, FolderClosed, Users, Settings, ChevronDown,\n LayoutDashboard, Clock3, Activity, Lightbulb, Bell, Plug, BarChart3,\n FileText, Headphones, Shield, Sliders, Workflow, SquareDot,\n PanelLeftClose, PanelLeft,\n} from \"lucide-react\";\n\n/**\n * Sidebar — collapsible navigation sidebar.\n *\n * Slot-based: pass menuItems as data, component handles rendering + expand/collapse.\n * No framework dependencies (no router, no auth, no API calls).\n *\n * Props:\n * - menuItems Array<MenuItem> Navigation items (see shape below)\n * - activeId string Currently active item id\n * - onNavigate function(href) Navigation callback\n * - collapsed boolean External collapsed state (controlled)\n * - onToggleCollapse function Toggle callback\n * - header ReactNode Optional header slot (logo, brand)\n * - footer ReactNode Optional footer slot (user, settings)\n * - width number Expanded width (default 240)\n * - collapsedWidth number Collapsed width (default 56)\n *\n * MenuItem shape:\n * - id string\n * - label string\n * - icon string (key from ICON_MAP) or ReactNode\n * - href string\n * - active boolean (override)\n * - children Array<MenuItem> (nested group)\n * - section string (section label above this item)\n */\n\nconst ICON_MAP = {\n home: Home,\n projects: FolderClosed,\n folder: FolderClosed,\n organization: Users,\n users: Users,\n dashboard: LayoutDashboard,\n history: Clock3,\n sessions: Clock3,\n monitoring: Activity,\n activity: Activity,\n insights: Lightbulb,\n notifications: Bell,\n integrations: Plug,\n settings: Settings,\n usage: BarChart3,\n docs: FileText,\n documentation: FileText,\n agents: Headphones,\n security: Shield,\n configuration: Sliders,\n workflow: Workflow,\n};\n\nfunction resolveIcon(icon) {\n if (!icon) return SquareDot;\n if (typeof icon === \"string\") return ICON_MAP[icon.toLowerCase()] || SquareDot;\n return icon;\n}\n\nexport default function Sidebar({\n menuItems = [],\n activeId,\n onNavigate,\n collapsed: controlledCollapsed,\n onToggleCollapse,\n header,\n footer,\n width = 244,\n collapsedWidth = 56,\n}) {\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const collapsed = controlledCollapsed !== undefined ? controlledCollapsed : internalCollapsed;\n const toggleCollapse = onToggleCollapse || (() => setInternalCollapsed(!internalCollapsed));\n\n const [expandedGroups, setExpandedGroups] = useState(() => {\n const initial = {};\n menuItems.forEach((item) => {\n if (item.children?.length) {\n // Auto-expand groups that contain the active item\n const hasActive = item.children.some((c) => c.id === activeId || c.active);\n initial[item.id] = hasActive;\n }\n });\n return initial;\n });\n\n const toggleGroup = (id) => {\n setExpandedGroups((prev) => ({ ...prev, [id]: !prev[id] }));\n };\n\n const currentWidth = collapsed ? collapsedWidth : width;\n\n return (\n <nav\n style={{\n width: currentWidth,\n minWidth: currentWidth,\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n padding: collapsed ? \"0\" : \"0 0 24px 24px\",\n gap: 24,\n background: \"var(--Background-Inverse, #0B0B0B)\",\n fontFamily: \"var(--font-sans)\",\n transition: \"width 0.2s ease, min-width 0.2s ease\",\n overflow: \"hidden\",\n flexShrink: 0,\n }}\n >\n {/* Header slot */}\n {header && !collapsed && (\n <div style={{ padding: \"16px 16px 8px\", flexShrink: 0, width: \"100%\" }}>\n {header}\n </div>\n )}\n\n {/* Collapse toggle */}\n <div\n style={{\n display: \"flex\",\n justifyContent: collapsed ? \"center\" : \"flex-end\",\n padding: collapsed ? \"12px 0\" : \"8px 0 0\",\n flexShrink: 0,\n width: \"100%\",\n }}\n >\n <button\n onClick={toggleCollapse}\n title={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 28,\n height: 28,\n borderRadius: \"var(--radius-sm)\",\n border: \"none\",\n background: \"transparent\",\n color: \"rgba(255, 255, 255, 0.5)\",\n cursor: \"pointer\",\n transition: \"background 0.15s ease, color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(255, 255, 255, 0.08)\";\n e.currentTarget.style.color = \"rgba(255, 255, 255, 0.8)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"rgba(255, 255, 255, 0.5)\";\n }}\n >\n {collapsed ? <PanelLeft size={16} /> : <PanelLeftClose size={16} />}\n </button>\n </div>\n\n {/* Menu items */}\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n overflowX: \"hidden\",\n padding: collapsed ? \"0 8px\" : \"0\",\n width: \"100%\",\n }}\n >\n {menuItems.map((item, idx) => (\n <React.Fragment key={item.id || idx}>\n {/* Section label */}\n {item.section && !collapsed && (\n <div\n style={{\n fontSize: \"var(--text-xs)\",\n fontWeight: 650,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: \"rgba(255, 255, 255, 0.35)\",\n padding: \"16px 8px 6px\",\n lineHeight: 1,\n }}\n >\n {item.section}\n </div>\n )}\n\n {item.children?.length ? (\n <SidebarGroup\n item={item}\n activeId={activeId}\n expanded={!!expandedGroups[item.id]}\n onToggle={() => toggleGroup(item.id)}\n onNavigate={onNavigate}\n collapsed={collapsed}\n />\n ) : (\n <SidebarItem\n item={item}\n active={item.id === activeId || item.active}\n onNavigate={onNavigate}\n collapsed={collapsed}\n />\n )}\n </React.Fragment>\n ))}\n </div>\n\n {/* Footer slot */}\n {footer && !collapsed && (\n <div\n style={{\n padding: \"12px 16px\",\n borderTop: \"1px solid rgba(255, 255, 255, 0.08)\",\n flexShrink: 0,\n width: \"100%\",\n }}\n >\n {footer}\n </div>\n )}\n </nav>\n );\n}\n\nfunction SidebarItem({ item, active, onNavigate, collapsed }) {\n const Icon = resolveIcon(item.icon);\n const isReactIcon = typeof item.icon !== \"string\" && typeof item.icon !== \"undefined\";\n\n return (\n <button\n onClick={() => onNavigate?.(item.href || item.id)}\n title={collapsed ? item.label : undefined}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: collapsed ? 0 : 12,\n justifyContent: collapsed ? \"center\" : \"flex-start\",\n width: \"100%\",\n padding: collapsed ? \"10px 0\" : \"12px 24px 12px 12px\",\n borderRadius: active ? \"4px 0 0 4px\" : \"4px\",\n borderRight: active ? \"2px solid #00A66E\" : \"2px solid transparent\",\n borderTop: \"none\",\n borderBottom: \"none\",\n borderLeft: \"none\",\n background: active ? \"var(--Background-MonoPressed, #323232)\" : \"transparent\",\n color: active ? \"var(--Brand-400, #33B88B)\" : \"var(--Content-TertiaryInverse, #B2AEA8)\",\n fontWeight: 500,\n fontSize: \"12px\",\n fontStyle: \"normal\",\n lineHeight: \"120%\",\n textTransform: \"uppercase\",\n fontFamily: \"var(--font-sans)\",\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"background 0.15s ease, color 0.1s ease, border-color 0.15s ease\",\n marginBottom: 2,\n }}\n onMouseEnter={(e) => {\n if (!active) {\n e.currentTarget.style.background = \"var(--Background-MonoPressed, #323232)\";\n e.currentTarget.style.color = \"var(--Brand-400, #33B88B)\";\n }\n }}\n onMouseLeave={(e) => {\n if (!active) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"var(--Content-TertiaryInverse, #B2AEA8)\";\n }\n }}\n >\n {isReactIcon ? (\n <span style={{ flexShrink: 0, display: \"flex\" }}>{item.icon}</span>\n ) : (\n <Icon\n size={18}\n style={{\n flexShrink: 0,\n color: \"inherit\",\n }}\n />\n )}\n {!collapsed && (\n <span\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {item.label}\n </span>\n )}\n </button>\n );\n}\n\nfunction SidebarGroup({ item, activeId, expanded, onToggle, onNavigate, collapsed }) {\n const Icon = resolveIcon(item.icon);\n const hasActiveChild = item.children?.some((c) => c.id === activeId || c.active);\n\n if (collapsed) {\n // In collapsed mode, show just the group icon\n return (\n <button\n onClick={onToggle}\n title={item.label}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"100%\",\n padding: \"10px 0\",\n borderRadius: \"4px\",\n border: \"none\",\n background: hasActiveChild ? \"var(--Background-MonoPressed, #323232)\" : \"transparent\",\n color: hasActiveChild ? \"var(--Brand-400, #33B88B)\" : \"var(--Content-TertiaryInverse, #B2AEA8)\",\n cursor: \"pointer\",\n marginBottom: 2,\n transition: \"background 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (!hasActiveChild) {\n e.currentTarget.style.background = \"var(--Background-MonoPressed, #323232)\";\n e.currentTarget.style.color = \"var(--Brand-400, #33B88B)\";\n }\n }}\n onMouseLeave={(e) => {\n if (!hasActiveChild) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"var(--Content-TertiaryInverse, #B2AEA8)\";\n }\n }}\n >\n <Icon\n size={18}\n style={{ color: \"inherit\" }}\n />\n </button>\n );\n }\n\n return (\n <div style={{ marginBottom: 2 }}>\n {/* Group header */}\n <button\n onClick={onToggle}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n width: \"100%\",\n padding: \"12px 24px 12px 12px\",\n borderRadius: \"4px\",\n border: \"none\",\n background: \"transparent\",\n color: hasActiveChild ? \"var(--Brand-400, #33B88B)\" : \"var(--Content-TertiaryInverse, #B2AEA8)\",\n fontWeight: 700,\n fontSize: \"12px\",\n fontStyle: \"normal\",\n lineHeight: \"120%\",\n textTransform: \"uppercase\",\n fontFamily: \"var(--font-sans)\",\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"background 0.15s ease, color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"var(--Background-MonoPressed, #323232)\";\n e.currentTarget.style.color = \"var(--Brand-400, #33B88B)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n if (!hasActiveChild) e.currentTarget.style.color = \"var(--Content-TertiaryInverse, #B2AEA8)\";\n else e.currentTarget.style.color = \"var(--Brand-400, #33B88B)\";\n }}\n >\n <Icon\n size={18}\n style={{\n flexShrink: 0,\n color: \"inherit\",\n }}\n />\n <span\n style={{\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {item.label}\n </span>\n <ChevronDown\n size={14}\n style={{\n flexShrink: 0,\n color: \"inherit\",\n opacity: 0.7,\n transform: expanded ? \"rotate(0deg)\" : \"rotate(-90deg)\",\n transition: \"transform 0.2s ease\",\n }}\n />\n </button>\n\n {/* Children */}\n {expanded && (\n <div style={{ paddingLeft: 18, marginTop: 2 }}>\n {item.children.map((child, idx) => (\n <SidebarItem\n key={child.id || idx}\n item={child}\n active={child.id === activeId || child.active}\n onNavigate={onNavigate}\n collapsed={false}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { LogOut, ChevronDown } from 'lucide-react';\n\n// Stable avatar colors — warm/neutral palette, no purple\nconst AVATAR_COLORS = [\n '#5a8a6e', // sage green\n '#b07d4f', // warm amber\n '#7a8fa6', // slate blue\n '#c47a5a', // terracotta\n '#6a9a8a', // teal\n '#a0785a', // clay\n '#5a7a9a', // steel blue\n '#9a7a5a', // caramel\n];\n\nfunction avatarColor(name) {\n if (!name) return AVATAR_COLORS[0];\n let hash = 0;\n for (let i = 0; i < name.length; i++) hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;\n return AVATAR_COLORS[Math.abs(hash) % AVATAR_COLORS.length];\n}\n\n/**\n * NavigationBar — top-level app header bar.\n *\n * Slot-based composition: pass children for center content, trailing for right content,\n * or use the built-in user/switcher/actions props for the standard Chordia layout.\n *\n * Props:\n * - logo ReactNode Left-side branding (defaults to \"Chordia\" wordmark)\n * - title string App title shown after logo\n * - userName string User's display name\n * - userEmail string Fallback if no userName\n * - userRole string Role badge (e.g. \"Admin\")\n * - onSignOut function Sign out callback (renders sign out button)\n * - children ReactNode Center slot — switchers, breadcrumbs, tabs, anything\n * - trailing ReactNode Right slot — status indicators, extra actions\n * - userMenu ReactNode Optional custom user menu (replaces built-in user block)\n * - height number Bar height in px (default 48)\n * - style object Style overrides on the root element\n */\nexport default function NavigationBar({\n logo,\n title,\n userName,\n userEmail,\n userInitials,\n userRole,\n onSignOut,\n children,\n trailing,\n userMenu,\n height = 48,\n style,\n}) {\n const displayName = userName || userEmail || '';\n const initials = userInitials || getInitials(displayName);\n\n return (\n <header\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '0 20px',\n height,\n borderBottom: '1px solid var(--border)',\n background: 'var(--paper-elevated)',\n flexShrink: 0,\n fontFamily: 'var(--font-sans)',\n position: 'sticky',\n top: 0,\n zIndex: 1000,\n ...style,\n }}\n >\n {/* ─── Left: Logo + Title ─── */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, flexShrink: 0 }}>\n {logo !== undefined ? logo : (\n <span style={{\n fontSize: 'var(--text-lg)',\n fontWeight: 700,\n fontFamily: 'var(--font-display)',\n color: 'var(--text-ink)',\n letterSpacing: '-0.01em',\n }}>\n Chordia\n </span>\n )}\n {title && (\n <>\n <span style={{\n width: 1,\n height: 18,\n background: 'var(--border)',\n flexShrink: 0,\n }} />\n <span style={{\n fontSize: 'var(--text-md)',\n fontWeight: 500,\n color: 'var(--text-muted)',\n }}>\n {title}\n </span>\n </>\n )}\n </div>\n\n {/* ─── Center: Slot for switchers, breadcrumbs, tabs ─── */}\n {children && (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n flex: 1,\n justifyContent: 'center',\n minWidth: 0,\n }}>\n {children}\n </div>\n )}\n\n {/* ─── Right: User + trailing ─── */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n flexShrink: 0,\n }}\n >\n {trailing}\n\n {userMenu\n ? userMenu\n : displayName && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {/* Initials avatar */}\n <div style={{\n width: 30,\n height: 30,\n borderRadius: '50%',\n background: avatarColor(displayName),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}>\n <span style={{\n fontSize: 11,\n fontWeight: 600,\n color: '#fff',\n letterSpacing: '0.02em',\n lineHeight: 1,\n }}>\n {initials}\n </span>\n </div>\n\n {/* Name + role */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n <span style={{\n fontSize: 'var(--text-sm)',\n fontWeight: 550,\n color: 'var(--text-strong)',\n lineHeight: 1.2,\n }}>\n {displayName}\n </span>\n {userRole && (\n <span style={{\n fontSize: 'var(--text-xs)',\n color: 'var(--text-muted)',\n lineHeight: 1.2,\n }}>\n {userRole}\n </span>\n )}\n </div>\n\n {/* Sign out */}\n {onSignOut && (\n <button\n onClick={onSignOut}\n title=\"Sign out\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 28,\n height: 28,\n borderRadius: 'var(--radius-sm)',\n border: 'none',\n background: 'transparent',\n color: 'var(--text-faint)',\n cursor: 'pointer',\n transition: 'background 0.15s ease, color 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'var(--hover-warm)';\n e.currentTarget.style.color = 'var(--text-muted)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n e.currentTarget.style.color = 'var(--text-faint)';\n }}\n >\n <LogOut size={14} />\n </button>\n )}\n </div>\n )}\n </div>\n </header>\n );\n}\n\n/**\n * NavPill — compact switcher button for use inside NavigationBar.\n *\n * Props:\n * - label string Display text\n * - color string Rail color token (e.g. \"var(--rail-discovery)\")\n * - active boolean Whether dropdown is open\n * - onClick function Toggle callback\n */\nexport function NavPill({ label, color = 'var(--text-muted)', active, onClick }) {\n return (\n <button\n onClick={onClick}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n fontSize: 'var(--text-sm)',\n fontWeight: 500,\n fontFamily: 'var(--font-sans)',\n padding: '4px 10px',\n borderRadius: 'var(--radius-sm)',\n border: `1px solid color-mix(in srgb, ${color} 30%, transparent)`,\n background: `color-mix(in srgb, ${color} 10%, transparent)`,\n color: color,\n cursor: 'pointer',\n transition: 'background 0.15s ease, border-color 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = `color-mix(in srgb, ${color} 18%, transparent)`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = `color-mix(in srgb, ${color} 10%, transparent)`;\n }}\n >\n {label}\n <ChevronDown\n size={12}\n style={{\n transform: active ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease',\n opacity: 0.7,\n }}\n />\n </button>\n );\n}\n\n/**\n * NavDropdown — dropdown panel that attaches to a NavPill.\n * Wrap around NavPill and the dropdown content.\n *\n * Props:\n * - open boolean Whether dropdown is visible\n * - onClose function Close callback\n * - children ReactNode Dropdown items\n * - align string \"left\" | \"right\" (default \"left\")\n */\nexport function NavDropdown({ open, onClose, children, align = 'left' }) {\n if (!open) return null;\n return (\n <>\n <div\n onClick={onClose}\n style={{ position: 'fixed', inset: 0, zIndex: 99, background: 'rgba(0,0,0,0.03)' }}\n />\n <div style={{\n position: 'absolute',\n top: '100%',\n [align === 'right' ? 'right' : 'left']: 0,\n marginTop: 4,\n zIndex: 100,\n background: '#fff',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n padding: 4,\n minWidth: 200,\n maxHeight: 280,\n overflowY: 'auto',\n boxShadow: '0 8px 24px rgba(0,0,0,0.12)',\n }}>\n {children}\n </div>\n </>\n );\n}\n\n/**\n * NavDropdownItem — single item inside NavDropdown.\n *\n * Props:\n * - label string\n * - active boolean\n * - onClick function\n */\nexport function NavDropdownItem({ label, active, onClick }) {\n return (\n <div\n onClick={onClick}\n style={{\n padding: '8px 10px',\n borderRadius: 'var(--radius-sm)',\n cursor: 'pointer',\n fontSize: 'var(--text-sm)',\n color: active ? 'var(--text-ink)' : 'var(--text-base)',\n fontWeight: active ? 600 : 400,\n fontFamily: 'var(--font-sans)',\n background: active ? 'var(--hover-warm)' : 'transparent',\n transition: 'background 0.1s ease',\n }}\n onMouseEnter={(e) => {\n if (!active) e.currentTarget.style.background = 'var(--hover-warm-subtle)';\n }}\n onMouseLeave={(e) => {\n if (!active) e.currentTarget.style.background = 'transparent';\n }}\n >\n {label}\n </div>\n );\n}\n\n/**\n * StatusIndicator — connection/status pill for trailing slot.\n *\n * Props:\n * - connected boolean\n * - label string (optional, defaults to Connected/Disconnected)\n */\nexport function StatusIndicator({ connected, label }) {\n const text = label || (connected ? 'Connected' : 'Disconnected');\n return (\n <span style={{\n fontSize: 'var(--text-xs)',\n fontFamily: 'var(--font-sans)',\n padding: '3px 10px',\n borderRadius: 12,\n border: `1px solid ${connected ? 'var(--state-present)' : 'var(--border)'}`,\n color: connected ? 'var(--state-present)' : 'var(--text-faint)',\n background: connected ? 'rgba(37,163,114,0.08)' : 'transparent',\n transition: 'all 0.2s ease',\n }}>\n {text}\n </span>\n );\n}\n\nfunction getInitials(name) {\n if (!name) return '?';\n const parts = name.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n return name.slice(0, 2).toUpperCase();\n}\n"],"names":["ICON_MAP","Home","FolderClosed","Users","LayoutDashboard","Clock3","Activity","Lightbulb","Bell","Plug","Settings","BarChart3","FileText","Headphones","Shield","Sliders","Workflow","resolveIcon","icon","SquareDot","Sidebar","menuItems","activeId","onNavigate","controlledCollapsed","onToggleCollapse","header","footer","width","collapsedWidth","internalCollapsed","setInternalCollapsed","useState","collapsed","toggleCollapse","expandedGroups","setExpandedGroups","initial","item","_a","hasActive","c","toggleGroup","id","prev","currentWidth","jsxs","jsx","e","PanelLeft","PanelLeftClose","idx","React","SidebarGroup","SidebarItem","active","Icon","isReactIcon","expanded","onToggle","hasActiveChild","ChevronDown","child","AVATAR_COLORS","avatarColor","name","hash","i","NavigationBar","logo","title","userName","userEmail","userInitials","userRole","onSignOut","children","trailing","userMenu","height","style","displayName","initials","getInitials","Fragment","LogOut","NavPill","label","color","onClick","NavDropdown","open","onClose","align","NavDropdownItem","StatusIndicator","connected","parts"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -250,9 +250,12 @@ function SidebarItem({ item, active, onNavigate, collapsed }) {
|
|
|
250
250
|
borderBottom: "none",
|
|
251
251
|
borderLeft: "none",
|
|
252
252
|
background: active ? "var(--Background-MonoPressed, #323232)" : "transparent",
|
|
253
|
-
color: active ? "#
|
|
254
|
-
fontWeight:
|
|
255
|
-
fontSize: "
|
|
253
|
+
color: active ? "var(--Brand-400, #33B88B)" : "var(--Content-TertiaryInverse, #B2AEA8)",
|
|
254
|
+
fontWeight: 500,
|
|
255
|
+
fontSize: "12px",
|
|
256
|
+
fontStyle: "normal",
|
|
257
|
+
lineHeight: "120%",
|
|
258
|
+
textTransform: "uppercase",
|
|
256
259
|
fontFamily: "var(--font-sans)",
|
|
257
260
|
cursor: "pointer",
|
|
258
261
|
textAlign: "left",
|
|
@@ -262,7 +265,7 @@ function SidebarItem({ item, active, onNavigate, collapsed }) {
|
|
|
262
265
|
onMouseEnter={(e) => {
|
|
263
266
|
if (!active) {
|
|
264
267
|
e.currentTarget.style.background = "var(--Background-MonoPressed, #323232)";
|
|
265
|
-
e.currentTarget.style.color = "#
|
|
268
|
+
e.currentTarget.style.color = "var(--Brand-400, #33B88B)";
|
|
266
269
|
}
|
|
267
270
|
}}
|
|
268
271
|
onMouseLeave={(e) => {
|
|
@@ -317,7 +320,7 @@ function SidebarGroup({ item, activeId, expanded, onToggle, onNavigate, collapse
|
|
|
317
320
|
borderRadius: "4px",
|
|
318
321
|
border: "none",
|
|
319
322
|
background: hasActiveChild ? "var(--Background-MonoPressed, #323232)" : "transparent",
|
|
320
|
-
color: hasActiveChild ? "#
|
|
323
|
+
color: hasActiveChild ? "var(--Brand-400, #33B88B)" : "var(--Content-TertiaryInverse, #B2AEA8)",
|
|
321
324
|
cursor: "pointer",
|
|
322
325
|
marginBottom: 2,
|
|
323
326
|
transition: "background 0.15s ease",
|
|
@@ -325,7 +328,7 @@ function SidebarGroup({ item, activeId, expanded, onToggle, onNavigate, collapse
|
|
|
325
328
|
onMouseEnter={(e) => {
|
|
326
329
|
if (!hasActiveChild) {
|
|
327
330
|
e.currentTarget.style.background = "var(--Background-MonoPressed, #323232)";
|
|
328
|
-
e.currentTarget.style.color = "#
|
|
331
|
+
e.currentTarget.style.color = "var(--Brand-400, #33B88B)";
|
|
329
332
|
}
|
|
330
333
|
}}
|
|
331
334
|
onMouseLeave={(e) => {
|
|
@@ -357,9 +360,12 @@ function SidebarGroup({ item, activeId, expanded, onToggle, onNavigate, collapse
|
|
|
357
360
|
borderRadius: "4px",
|
|
358
361
|
border: "none",
|
|
359
362
|
background: "transparent",
|
|
360
|
-
color: hasActiveChild ? "#
|
|
361
|
-
fontWeight:
|
|
362
|
-
fontSize: "
|
|
363
|
+
color: hasActiveChild ? "var(--Brand-400, #33B88B)" : "var(--Content-TertiaryInverse, #B2AEA8)",
|
|
364
|
+
fontWeight: 700,
|
|
365
|
+
fontSize: "12px",
|
|
366
|
+
fontStyle: "normal",
|
|
367
|
+
lineHeight: "120%",
|
|
368
|
+
textTransform: "uppercase",
|
|
363
369
|
fontFamily: "var(--font-sans)",
|
|
364
370
|
cursor: "pointer",
|
|
365
371
|
textAlign: "left",
|
|
@@ -367,12 +373,12 @@ function SidebarGroup({ item, activeId, expanded, onToggle, onNavigate, collapse
|
|
|
367
373
|
}}
|
|
368
374
|
onMouseEnter={(e) => {
|
|
369
375
|
e.currentTarget.style.background = "var(--Background-MonoPressed, #323232)";
|
|
370
|
-
e.currentTarget.style.color = "#
|
|
376
|
+
e.currentTarget.style.color = "var(--Brand-400, #33B88B)";
|
|
371
377
|
}}
|
|
372
378
|
onMouseLeave={(e) => {
|
|
373
379
|
e.currentTarget.style.background = "transparent";
|
|
374
380
|
if (!hasActiveChild) e.currentTarget.style.color = "var(--Content-TertiaryInverse, #B2AEA8)";
|
|
375
|
-
else e.currentTarget.style.color = "#
|
|
381
|
+
else e.currentTarget.style.color = "var(--Brand-400, #33B88B)";
|
|
376
382
|
}}
|
|
377
383
|
>
|
|
378
384
|
<Icon
|