chordia-ui 3.2.7 → 3.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/UploadInteraction.cjs.js +1 -1
- package/dist/UploadInteraction.cjs.js.map +1 -1
- package/dist/UploadInteraction.es.js +166 -121
- package/dist/UploadInteraction.es.js.map +1 -1
- package/dist/components/navigation.cjs.js +1 -1
- package/dist/components/navigation.cjs.js.map +1 -1
- package/dist/components/navigation.es.js +55 -51
- package/dist/components/navigation.es.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/components/navigation/Sidebar.jsx +10 -10
- package/src/components/onboarding/UploadInteraction.jsx +55 -2
- package/src/tokens/colors.css +1 -0
|
@@ -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 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;
|
|
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:o,collapsed:i,onToggleCollapse:c,header:g,footer:l,width:u=244,collapsedWidth:f=56}){const[s,y]=k.useState(!1),d=i!==void 0?i:s,h=c||(()=>y(!s)),[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:[e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:d?"center":"space-between",padding:d?"12px 0":"12px 0 0",flexShrink:0,width:"100%"},children:[g&&!d&&e.jsx("div",{style:{flexShrink:0},children:g}),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",flexShrink:0},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:o,collapsed:d}):e.jsx(T,{item:a,active:a.id===t||a.active,onNavigate:o,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:o,collapsed:i}){const c=B(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?"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:o,onToggle:i,onNavigate:c,collapsed:g}){var f;const l=B(r.icon),u=(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: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:s=>{u||(s.currentTarget.style.background="var(--Background-MonoPressed, #323232)",s.currentTarget.style.color="var(--Brand-400, #33B88B)")},onMouseLeave:s=>{u||(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: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:s=>{s.currentTarget.style.background="var(--Background-MonoPressed, #323232)",s.currentTarget.style.color="var(--Brand-400, #33B88B)"},onMouseLeave:s=>{s.currentTarget.style.background="transparent",u?s.currentTarget.style.color="var(--Brand-400, #33B88B)":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(T,{item:s,active:s.id===t||s.active,onNavigate:c,collapsed:!1},s.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 o=0;o<r.length;o++)t=(t<<5)-t+r.charCodeAt(o)|0;return m[Math.abs(t)%m.length]}function E({logo:r,title:t,userName:o,userEmail:i,userInitials:c,userRole:g,onSignOut:l,children:u,trailing:f,userMenu:s,height:y=48,style:d}){const h=o||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,s||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: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: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: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=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 ? \"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":"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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 + Collapse toggle in one row */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: collapsed ? \"center\" : \"space-between\",\n padding: collapsed ? \"12px 0\" : \"12px 0 0\",\n flexShrink: 0,\n width: \"100%\",\n }}\n >\n {header && !collapsed && (\n <div style={{ flexShrink: 0 }}>\n {header}\n </div>\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 flexShrink: 0,\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":"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"}
|
|
@@ -33,9 +33,9 @@ function oe({
|
|
|
33
33
|
onNavigate: o,
|
|
34
34
|
collapsed: i,
|
|
35
35
|
onToggleCollapse: c,
|
|
36
|
-
header:
|
|
36
|
+
header: p,
|
|
37
37
|
footer: s,
|
|
38
|
-
width:
|
|
38
|
+
width: g = 244,
|
|
39
39
|
collapsedWidth: h = 56
|
|
40
40
|
}) {
|
|
41
41
|
const [n, y] = S(!1), l = i !== void 0 ? i : n, x = c || (() => y(!n)), [b, f] = S(() => {
|
|
@@ -49,7 +49,7 @@ function oe({
|
|
|
49
49
|
}), a;
|
|
50
50
|
}), W = (a) => {
|
|
51
51
|
f((u) => ({ ...u, [a]: !u[a] }));
|
|
52
|
-
}, m = l ? h :
|
|
52
|
+
}, m = l ? h : g;
|
|
53
53
|
return /* @__PURE__ */ d(
|
|
54
54
|
"nav",
|
|
55
55
|
{
|
|
@@ -69,44 +69,48 @@ function oe({
|
|
|
69
69
|
flexShrink: 0
|
|
70
70
|
},
|
|
71
71
|
children: [
|
|
72
|
-
|
|
73
|
-
/* @__PURE__ */ t(
|
|
72
|
+
/* @__PURE__ */ d(
|
|
74
73
|
"div",
|
|
75
74
|
{
|
|
76
75
|
style: {
|
|
77
76
|
display: "flex",
|
|
78
|
-
|
|
79
|
-
|
|
77
|
+
alignItems: "center",
|
|
78
|
+
justifyContent: l ? "center" : "space-between",
|
|
79
|
+
padding: l ? "12px 0" : "12px 0 0",
|
|
80
80
|
flexShrink: 0,
|
|
81
81
|
width: "100%"
|
|
82
82
|
},
|
|
83
|
-
children:
|
|
84
|
-
"
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
83
|
+
children: [
|
|
84
|
+
p && !l && /* @__PURE__ */ t("div", { style: { flexShrink: 0 }, children: p }),
|
|
85
|
+
/* @__PURE__ */ t(
|
|
86
|
+
"button",
|
|
87
|
+
{
|
|
88
|
+
onClick: x,
|
|
89
|
+
title: l ? "Expand sidebar" : "Collapse sidebar",
|
|
90
|
+
style: {
|
|
91
|
+
display: "flex",
|
|
92
|
+
alignItems: "center",
|
|
93
|
+
justifyContent: "center",
|
|
94
|
+
width: 28,
|
|
95
|
+
height: 28,
|
|
96
|
+
borderRadius: "var(--radius-sm)",
|
|
97
|
+
border: "none",
|
|
98
|
+
background: "transparent",
|
|
99
|
+
color: "rgba(255, 255, 255, 0.5)",
|
|
100
|
+
cursor: "pointer",
|
|
101
|
+
transition: "background 0.15s ease, color 0.15s ease",
|
|
102
|
+
flexShrink: 0
|
|
103
|
+
},
|
|
104
|
+
onMouseEnter: (a) => {
|
|
105
|
+
a.currentTarget.style.background = "rgba(255, 255, 255, 0.08)", a.currentTarget.style.color = "rgba(255, 255, 255, 0.8)";
|
|
106
|
+
},
|
|
107
|
+
onMouseLeave: (a) => {
|
|
108
|
+
a.currentTarget.style.background = "transparent", a.currentTarget.style.color = "rgba(255, 255, 255, 0.5)";
|
|
109
|
+
},
|
|
110
|
+
children: l ? /* @__PURE__ */ t(P, { size: 16 }) : /* @__PURE__ */ t(H, { size: 16 })
|
|
111
|
+
}
|
|
112
|
+
)
|
|
113
|
+
]
|
|
110
114
|
}
|
|
111
115
|
),
|
|
112
116
|
/* @__PURE__ */ t(
|
|
@@ -177,7 +181,7 @@ function oe({
|
|
|
177
181
|
);
|
|
178
182
|
}
|
|
179
183
|
function R({ item: e, active: r, onNavigate: o, collapsed: i }) {
|
|
180
|
-
const c = L(e.icon),
|
|
184
|
+
const c = L(e.icon), p = typeof e.icon != "string" && typeof e.icon < "u";
|
|
181
185
|
return /* @__PURE__ */ d(
|
|
182
186
|
"button",
|
|
183
187
|
{
|
|
@@ -215,7 +219,7 @@ function R({ item: e, active: r, onNavigate: o, collapsed: i }) {
|
|
|
215
219
|
r || (s.currentTarget.style.background = "transparent", s.currentTarget.style.color = "var(--Content-TertiaryInverse, #B2AEA8)");
|
|
216
220
|
},
|
|
217
221
|
children: [
|
|
218
|
-
|
|
222
|
+
p ? /* @__PURE__ */ t("span", { style: { flexShrink: 0, display: "flex" }, children: e.icon }) : /* @__PURE__ */ t(
|
|
219
223
|
c,
|
|
220
224
|
{
|
|
221
225
|
size: 18,
|
|
@@ -240,10 +244,10 @@ function R({ item: e, active: r, onNavigate: o, collapsed: i }) {
|
|
|
240
244
|
}
|
|
241
245
|
);
|
|
242
246
|
}
|
|
243
|
-
function Q({ item: e, activeId: r, expanded: o, onToggle: i, onNavigate: c, collapsed:
|
|
247
|
+
function Q({ item: e, activeId: r, expanded: o, onToggle: i, onNavigate: c, collapsed: p }) {
|
|
244
248
|
var h;
|
|
245
|
-
const s = L(e.icon),
|
|
246
|
-
return
|
|
249
|
+
const s = L(e.icon), g = (h = e.children) == null ? void 0 : h.some((n) => n.id === r || n.active);
|
|
250
|
+
return p ? /* @__PURE__ */ t(
|
|
247
251
|
"button",
|
|
248
252
|
{
|
|
249
253
|
onClick: i,
|
|
@@ -256,17 +260,17 @@ function Q({ item: e, activeId: r, expanded: o, onToggle: i, onNavigate: c, coll
|
|
|
256
260
|
padding: "10px 0",
|
|
257
261
|
borderRadius: "4px",
|
|
258
262
|
border: "none",
|
|
259
|
-
background:
|
|
260
|
-
color:
|
|
263
|
+
background: g ? "var(--Background-MonoPressed, #323232)" : "transparent",
|
|
264
|
+
color: g ? "var(--Brand-400, #33B88B)" : "var(--Content-TertiaryInverse, #B2AEA8)",
|
|
261
265
|
cursor: "pointer",
|
|
262
266
|
marginBottom: 2,
|
|
263
267
|
transition: "background 0.15s ease"
|
|
264
268
|
},
|
|
265
269
|
onMouseEnter: (n) => {
|
|
266
|
-
|
|
270
|
+
g || (n.currentTarget.style.background = "var(--Background-MonoPressed, #323232)", n.currentTarget.style.color = "var(--Brand-400, #33B88B)");
|
|
267
271
|
},
|
|
268
272
|
onMouseLeave: (n) => {
|
|
269
|
-
|
|
273
|
+
g || (n.currentTarget.style.background = "transparent", n.currentTarget.style.color = "var(--Content-TertiaryInverse, #B2AEA8)");
|
|
270
274
|
},
|
|
271
275
|
children: /* @__PURE__ */ t(
|
|
272
276
|
s,
|
|
@@ -290,7 +294,7 @@ function Q({ item: e, activeId: r, expanded: o, onToggle: i, onNavigate: c, coll
|
|
|
290
294
|
borderRadius: "4px",
|
|
291
295
|
border: "none",
|
|
292
296
|
background: "transparent",
|
|
293
|
-
color:
|
|
297
|
+
color: g ? "var(--Brand-400, #33B88B)" : "var(--Content-TertiaryInverse, #B2AEA8)",
|
|
294
298
|
fontWeight: 700,
|
|
295
299
|
fontSize: "12px",
|
|
296
300
|
fontStyle: "normal",
|
|
@@ -305,7 +309,7 @@ function Q({ item: e, activeId: r, expanded: o, onToggle: i, onNavigate: c, coll
|
|
|
305
309
|
n.currentTarget.style.background = "var(--Background-MonoPressed, #323232)", n.currentTarget.style.color = "var(--Brand-400, #33B88B)";
|
|
306
310
|
},
|
|
307
311
|
onMouseLeave: (n) => {
|
|
308
|
-
n.currentTarget.style.background = "transparent",
|
|
312
|
+
n.currentTarget.style.background = "transparent", g ? n.currentTarget.style.color = "var(--Brand-400, #33B88B)" : n.currentTarget.style.color = "var(--Content-TertiaryInverse, #B2AEA8)";
|
|
309
313
|
},
|
|
310
314
|
children: [
|
|
311
315
|
/* @__PURE__ */ t(
|
|
@@ -390,9 +394,9 @@ function ae({
|
|
|
390
394
|
userName: o,
|
|
391
395
|
userEmail: i,
|
|
392
396
|
userInitials: c,
|
|
393
|
-
userRole:
|
|
397
|
+
userRole: p,
|
|
394
398
|
onSignOut: s,
|
|
395
|
-
children:
|
|
399
|
+
children: g,
|
|
396
400
|
trailing: h,
|
|
397
401
|
userMenu: n,
|
|
398
402
|
height: y = 48,
|
|
@@ -440,14 +444,14 @@ function ae({
|
|
|
440
444
|
}, children: r })
|
|
441
445
|
] })
|
|
442
446
|
] }),
|
|
443
|
-
|
|
447
|
+
g && /* @__PURE__ */ t("div", { style: {
|
|
444
448
|
display: "flex",
|
|
445
449
|
alignItems: "center",
|
|
446
450
|
gap: 8,
|
|
447
451
|
flex: 1,
|
|
448
452
|
justifyContent: "center",
|
|
449
453
|
minWidth: 0
|
|
450
|
-
}, children:
|
|
454
|
+
}, children: g }),
|
|
451
455
|
/* @__PURE__ */ d(
|
|
452
456
|
"div",
|
|
453
457
|
{
|
|
@@ -483,11 +487,11 @@ function ae({
|
|
|
483
487
|
color: "var(--text-strong)",
|
|
484
488
|
lineHeight: 1.2
|
|
485
489
|
}, children: x }),
|
|
486
|
-
|
|
490
|
+
p && /* @__PURE__ */ t("span", { style: {
|
|
487
491
|
fontSize: "var(--text-xs)",
|
|
488
492
|
color: "var(--text-muted)",
|
|
489
493
|
lineHeight: 1.2
|
|
490
|
-
}, children:
|
|
494
|
+
}, children: p })
|
|
491
495
|
] }),
|
|
492
496
|
s && /* @__PURE__ */ t(
|
|
493
497
|
"button",
|