chordia-ui 3.9.5 → 3.9.6

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.
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),h=require("react"),v=require("lucide-react"),ge=require("../useMediaQuery.cjs.js"),u={ink:"var(--Grey-Strong, #2E3236)",muted:"var(--Grey-Muted, #808183)",cardBorder:"var(--neutral-300, #B2B2B0)",white:"var(--Grey-White, #FFFFFF)",btnBorder:"var(--Grey-absent, #D9D9D9)",dark:"var(--neutral-850, #272727)",onDark:"var(--neutral-50, #F2F2F0)",menuHover:"var(--neutral-100, #E6E6E6)"},L="var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)",ye=t=>({display:"-webkit-box",WebkitLineClamp:t,WebkitBoxOrient:"vertical",overflow:"hidden"}),me=t=>/disabled|inactive|off|available/i.test(String(t||""));function ie({children:t,onClick:r}){return e.jsx("button",{type:"button",onClick:r,style:{display:"inline-flex",alignItems:"center",justifyContent:"center",height:28,padding:"0 10px",borderRadius:10,border:`1px solid ${u.btnBorder}`,background:u.white,color:u.ink,fontFamily:L,fontSize:14,fontWeight:600,cursor:"pointer",whiteSpace:"nowrap"},children:t})}function ne({children:t,onClick:r}){return e.jsx("button",{type:"button",onClick:r,style:{display:"inline-flex",alignItems:"center",justifyContent:"center",height:28,padding:"0 16px",borderRadius:10,border:"none",background:u.dark,color:u.onDark,fontFamily:L,fontSize:14,fontWeight:500,cursor:"pointer",whiteSpace:"nowrap"},children:t})}function be({items:t,onClose:r}){const a=h.useRef(null);return h.useEffect(()=>{const s=d=>{a.current&&!a.current.contains(d.target)&&(r==null||r())},o=d=>{d.key==="Escape"&&(r==null||r())};return document.addEventListener("mousedown",s),document.addEventListener("keydown",o),()=>{document.removeEventListener("mousedown",s),document.removeEventListener("keydown",o)}},[r]),e.jsx("div",{ref:a,role:"menu",style:{position:"absolute",top:"calc(100% + 4px)",right:0,zIndex:50,minWidth:168,display:"flex",flexDirection:"column",background:u.white,border:`1px solid ${u.btnBorder}`,borderRadius:8,boxShadow:"var(--shadow-popover, 0 12px 32px rgba(11,11,11,0.12))",overflow:"hidden"},children:t.map((s,o)=>e.jsx("button",{type:"button",role:"menuitem",onClick:s.onClick,style:{display:"flex",alignItems:"center",width:"100%",padding:"10px 12px",border:"none",borderTop:o===0?"none":"1px solid var(--color-divider, #E5E7EB)",background:"transparent",cursor:"pointer",textAlign:"left",fontFamily:L,fontSize:13,color:u.ink,lineHeight:1.2,whiteSpace:"nowrap"},onMouseEnter:d=>{d.currentTarget.style.background=u.menuHover},onMouseLeave:d=>{d.currentTarget.style.background="transparent"},children:s.label},s.label))})}function A({policy:t={},variant:r="active",onTest:a,onViewDetails:s,onApply:o,onToggleStatus:d,onEdit:c}){const x=r==="browse",f=t.status||(x?"Disabled":"Active"),g=me(f),z=g?v.CloudOff:v.CloudCheck,[F,w]=h.useState(!1),y=[];d&&y.push({label:g?"Enable Policy":"Disable Policy",onClick:()=>{w(!1),d(t)}}),c&&y.push({label:"Edit definition",onClick:()=>{w(!1),c(t)}});const W=y.length>0;return e.jsxs("article",{style:{display:"flex",flexDirection:"column",gap:12,alignItems:"flex-start",minHeight:82,padding:16,borderRadius:8,border:`1px solid ${u.cardBorder}`,background:u.white,boxSizing:"border-box",width:"100%",fontFamily:L},children:[e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:8,width:"100%"},children:[e.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center",width:"100%"},children:[e.jsx("p",{style:{flex:1,minWidth:0,margin:0,fontSize:14,fontWeight:600,color:u.ink,lineHeight:"normal"},children:t.name||"Untitled policy"}),W&&e.jsxs("div",{style:{position:"relative",display:"inline-flex",flexShrink:0},children:[e.jsx("button",{type:"button","aria-label":"More actions","aria-haspopup":"menu","aria-expanded":F,onClick:()=>w(j=>!j),style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:16,height:16,padding:0,border:"none",background:"transparent",color:u.ink,cursor:"pointer"},children:e.jsx(v.MoreHorizontal,{size:16,strokeWidth:2})}),F&&e.jsx(be,{items:y,onClose:()=>w(!1)})]})]}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:5,width:"100%"},children:[!x&&e.jsx("p",{style:{margin:0,fontSize:13,color:u.ink,lineHeight:"normal",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",width:"100%"},children:t.paradigms||"All paradigms"}),e.jsx("p",{style:{margin:0,fontSize:13,color:u.muted,lineHeight:"normal",minHeight:32,width:"100%",...ye(2)},children:t.description||""})]})]}),e.jsx("div",{style:{display:"flex",flexDirection:"column",width:"100%"},children:x?e.jsx(O,{label:"Policy Count",value:t.policyCount??"—"}):e.jsxs(e.Fragment,{children:[e.jsx(O,{label:"Updated",value:t.updatedLabel||"—"}),e.jsx(O,{label:"Updated By",value:t.updatedBy||"—"})]})}),e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:12,width:"100%"},children:[e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4,fontSize:12,color:u.ink,lineHeight:"16px"},children:[e.jsx(z,{size:20,strokeWidth:1.5,style:{color:u.ink}}),f]}),e.jsx("div",{style:{display:"flex",alignItems:"center",gap:12},children:x?e.jsxs(e.Fragment,{children:[s&&e.jsx(ie,{onClick:()=>s(t),children:"View Details"}),o&&e.jsx(ne,{onClick:()=>o(t),children:"Apply"})]}):e.jsxs(e.Fragment,{children:[a&&e.jsx(ie,{onClick:()=>a(t),children:"Test"}),s&&e.jsx(ne,{onClick:()=>s(t),children:"View Details"})]})})]})]})}function O({label:t,value:r}){return e.jsxs("div",{style:{display:"flex",flexWrap:"wrap",alignItems:"center",gap:24,padding:"8px 8px 12px 0",fontSize:13,lineHeight:1.2},children:[e.jsx("span",{style:{width:80,color:u.ink},children:t}),e.jsx("span",{style:{color:u.muted},children:r})]})}const I={ink:"var(--Grey-Strong, #2E3236)",border:"var(--Grey-absent, #D9D9D9)",white:"var(--Grey-White, #FFFFFF)"},re="var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)";function ce({options:t=[],value:r="all",onChange:a,onClose:s}){const o=h.useRef(null);h.useEffect(()=>{const c=f=>{o.current&&!o.current.contains(f.target)&&(s==null||s())},x=f=>{f.key==="Escape"&&(s==null||s())};return document.addEventListener("mousedown",c),document.addEventListener("keydown",x),()=>{document.removeEventListener("mousedown",c),document.removeEventListener("keydown",x)}},[s]);const d=[{id:"all",label:"All"},...t];return e.jsxs("div",{ref:o,role:"listbox",style:{position:"absolute",top:"calc(100% + 6px)",left:0,zIndex:50,minWidth:200,display:"flex",flexDirection:"column",alignItems:"stretch",background:I.white,border:`1px solid ${I.border}`,borderRadius:4,boxShadow:"var(--shadow-dropdown, -2px 2px 1px rgba(0,0,0,0.25))",fontFamily:re,overflow:"hidden"},children:[e.jsx("div",{style:{padding:12},children:e.jsx("p",{style:{margin:0,fontSize:13,fontWeight:700,color:I.ink,lineHeight:1.2},children:"Filter by"})}),d.map(c=>{const x=c.id===r;return e.jsxs("button",{type:"button",role:"option","aria-selected":x,onClick:()=>a==null?void 0:a(c.id),style:{display:"flex",alignItems:"center",gap:8,width:"100%",padding:x?"12px":"12px 12px 12px 40px",borderTop:`1px solid ${I.border}`,background:"transparent",cursor:"pointer",textAlign:"left",fontFamily:re,fontSize:13,color:I.ink,lineHeight:1.2},children:[x&&e.jsx(v.Check,{size:20,strokeWidth:2,style:{color:I.ink,flexShrink:0}}),c.label]},c.id)})]})}const l={ink:"var(--Grey-Strong, #2E3236)",muted:"var(--Grey-Muted, #808183)",cardBorder:"var(--neutral-300, #B2B2B0)",white:"var(--Grey-White, #FFFFFF)",btnBorder:"var(--Grey-absent, #D9D9D9)",editBorder:"var(--neutral-250, #BFBFBF)",editText:"var(--neutral-800, #323232)",dark:"var(--neutral-850, #272727)",onDark:"var(--neutral-50, #F2F2F0)",iconBg:"var(--surface-hover, #F3F7F7)",line:"var(--color-divider, #E5E7EB)"},R="var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)",M=()=>e.jsx("div",{style:{width:"100%",height:1,background:l.line,flexShrink:0}});function le({label:t,value:r}){return e.jsxs("div",{style:{display:"flex",flexWrap:"wrap",alignItems:"center",gap:24,padding:"8px 8px 12px 0",fontSize:13,lineHeight:1.2},children:[e.jsx("span",{style:{width:80,color:l.ink},children:t}),e.jsx("span",{style:{color:l.muted},children:r})]})}function pe({open:t,onClose:r,mode:a="browse",title:s,paradigms:o,description:d,definition:c,updatedLabel:x,updatedBy:f,onEdit:g,items:z=[],primaryLabel:F,onPrimary:w,primaryDisabled:y=!1,secondaryLabel:W="Cancel",topOffset:j}){const D=ge.useMediaQuery("(max-width: 640px)"),k=j!=null,E=typeof j=="number"?`${j}px`:j,C=a==="active";return h.useEffect(()=>{if(!t)return;const m=i=>{i.key==="Escape"&&(r==null||r())};return document.addEventListener("keydown",m),()=>document.removeEventListener("keydown",m)},[t,r]),t?e.jsxs(e.Fragment,{children:[e.jsx("div",{onClick:r,style:{position:"fixed",inset:0,zIndex:1200,background:"rgba(0,0,0,0.20)"}}),e.jsxs("div",{style:{position:"fixed",top:D?0:k?E:0,right:0,zIndex:1201,display:"flex",flexDirection:"column",gap:16,width:D?"100vw":490,maxWidth:"100vw",height:D?"100dvh":k?`calc(100vh - ${E})`:"100vh",padding:20,boxSizing:"border-box",background:l.white,borderRadius:D?0:"12px 0 0 12px",boxShadow:"-8px 0 40px rgba(0,0,0,0.18)",fontFamily:R},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,width:"100%",flexShrink:0},children:[e.jsxs("div",{style:{display:"flex",flex:1,minWidth:0,gap:8,alignItems:"center"},children:[e.jsx("span",{style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:34,height:34,borderRadius:9999,background:l.iconBg,flexShrink:0},children:e.jsx(v.ScrollText,{size:20,strokeWidth:1.75,style:{color:l.ink}})}),e.jsx("p",{style:{margin:0,fontSize:16,fontWeight:550,color:l.ink,lineHeight:1.2,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:s})]}),e.jsx("button",{type:"button","aria-label":"Close",onClick:r,style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:20,height:20,padding:0,border:"none",background:"transparent",color:l.ink,cursor:"pointer",flexShrink:0},children:e.jsx(v.X,{size:20,strokeWidth:2})})]}),e.jsx(M,{}),e.jsx("div",{className:"custom-thin-scrollbar",style:{flex:1,minHeight:0,width:"100%",overflowY:"auto",display:"flex",flexDirection:"column",gap:16},children:C?e.jsxs(e.Fragment,{children:[e.jsx("p",{style:{margin:0,fontSize:14,fontWeight:600,color:l.ink,lineHeight:"normal"},children:o||"All Paradigms"}),d&&e.jsx("p",{style:{margin:0,fontSize:13,color:l.muted,lineHeight:"normal"},children:d}),e.jsx(M,{}),e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:24,width:"100%"},children:[e.jsx("span",{style:{fontSize:13,color:l.ink,lineHeight:1.5},children:"Definition"}),g&&e.jsxs("button",{type:"button",onClick:g,style:{display:"inline-flex",alignItems:"center",justifyContent:"center",gap:8,height:28,padding:"0 10px",borderRadius:10,border:`1px solid ${l.editBorder}`,background:l.white,color:l.editText,fontFamily:R,fontSize:14,cursor:"pointer"},children:[e.jsx(v.Pencil,{size:16,strokeWidth:1.75,style:{color:l.editText}}),"Edit"]})]}),c&&e.jsx("p",{style:{margin:0,fontSize:13,color:l.muted,lineHeight:"normal",whiteSpace:"pre-wrap"},children:c}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",width:"100%"},children:[e.jsx(le,{label:"Updated",value:x||"—"}),e.jsx(le,{label:"Updated By",value:f||"—"})]})]}):e.jsxs(e.Fragment,{children:[d&&e.jsx("p",{style:{margin:0,fontSize:13,color:l.muted,lineHeight:"normal"},children:d}),e.jsx(M,{}),z.length===0&&e.jsx("p",{style:{margin:0,fontSize:13,color:l.muted},children:"No details available."}),z.map((m,i)=>e.jsx("div",{style:{display:"flex",alignItems:"center",padding:16,borderRadius:8,border:`1px solid ${l.cardBorder}`,background:l.white,width:"100%",boxSizing:"border-box"},children:e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:8,width:"100%"},children:[e.jsx("p",{style:{margin:0,fontSize:14,fontWeight:600,color:l.ink,lineHeight:"normal"},children:m.title}),m.description&&e.jsx("p",{style:{margin:0,fontSize:13,color:l.muted,lineHeight:"normal"},children:m.description})]})},m.id||`${m.title}-${i}`))]})}),e.jsx(M,{}),e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"flex-end",gap:12,width:"100%",flexShrink:0},children:[e.jsx("button",{type:"button",onClick:r,style:{display:"inline-flex",alignItems:"center",justifyContent:"center",height:32,padding:"0 16px",borderRadius:10,border:`1px solid ${l.btnBorder}`,background:l.white,color:l.ink,fontFamily:R,fontSize:14,fontWeight:600,cursor:"pointer"},children:W}),F&&e.jsx("button",{type:"button",onClick:w,disabled:y,style:{display:"inline-flex",alignItems:"center",justifyContent:"center",height:32,padding:"0 16px",borderRadius:10,border:"none",background:l.dark,color:l.onDark,fontFamily:R,fontSize:14,fontWeight:550,cursor:y?"default":"pointer",opacity:y?.5:1},children:F})]})]})]}):null}const p={ink:"var(--Grey-Strong, #2E3236)",muted:"var(--Grey-Muted, #808183)",white:"var(--Grey-White, #FFFFFF)",border:"var(--Grey-absent, #D9D9D9)",tabBorder:"var(--color-divider, #F2F1EF)",tabActive:"var(--neutral-900, #0B0B0B)",pillActive:"var(--neutral-900, #0B0B0B)",pillIdle:"var(--rail-surface-2, #E3E1D7)",searchTrack:"var(--neutral-150, #D8D8D8)",searchText:"var(--neutral-400, #989898)",accent:"var(--rail-orange, #C98A5A)",dark:"var(--neutral-850, #272727)",onDark:"var(--neutral-50, #F2F2F0)"},S="var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)",ve=t=>String(t).padStart(2,"0"),se=(t,r)=>r?`${(t==null?void 0:t.name)||""} ${(t==null?void 0:t.description)||""} ${(t==null?void 0:t.paradigms)||""}`.toLowerCase().includes(r):!0;function je({activePolicies:t=[],activeSectionLabel:r="Custom Policies",browseCategories:a=[],defaultTab:s="active",isAdmin:o=!1,onTest:d,onApplyPolicy:c,onAddPolicy:x,onEditPolicy:f,onToggleStatus:g,topOffset:z,emptyActiveMessage:F="No active policies yet.",emptyBrowseMessage:w="No policies available to browse."}){var K,Q,V,X,Y,J,Z,_,ee,te;const[y,W]=h.useState(s==="browse"?"browse":"active"),[j,D]=h.useState(""),[k,E]=h.useState("all"),[C,m]=h.useState(!1),[i,T]=h.useState(null),B=j.trim().toLowerCase(),ue=h.useMemo(()=>a.reduce((n,b)=>{var H;return n+(((H=b.policies)==null?void 0:H.length)||0)},0),[a]),P=h.useMemo(()=>a.map(n=>({id:n.id,label:n.name})),[a]),xe=k==="all"?"All":((K=P.find(n=>n.id===k))==null?void 0:K.label)||"All",N=h.useMemo(()=>t.filter(n=>se(n,B)),[t,B]),U=h.useMemo(()=>a.filter(n=>k==="all"||n.id===k).map(n=>({...n,policies:(n.policies||[]).filter(b=>se(b,B))})).filter(n=>n.policies.length>0),[a,B,k]),he=n=>T({policy:n,mode:"active"}),fe=n=>T({policy:n,mode:"browse"}),G=()=>T(null),q=({id:n,label:b,count:H})=>{const $=y===n;return e.jsxs("button",{type:"button",onClick:()=>W(n),style:{display:"inline-flex",alignItems:"center",justifyContent:"center",gap:4,padding:"4px 4px 12px",border:"none",borderBottom:$?`2px solid ${p.tabActive}`:"2px solid transparent",borderRadius:"4px 4px 0 0",background:"transparent",cursor:"pointer",fontFamily:S},children:[e.jsx("span",{style:{fontSize:14,color:$?"#1E1E1E":"#313131",lineHeight:1.2},children:b}),e.jsx("span",{style:{display:"inline-flex",alignItems:"center",justifyContent:"center",minWidth:18,height:18,padding:"2px 6px",borderRadius:9,background:$?p.pillActive:p.pillIdle,color:$?"#FFFFFF":"#313131",fontSize:12,lineHeight:1.2},children:H})]})};return e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:16,fontFamily:S},children:[e.jsxs("div",{style:{display:"flex",flexWrap:"wrap",alignItems:"center",gap:12,width:"100%"},children:[e.jsx("h1",{style:{flex:1,minWidth:160,margin:0,fontSize:24,fontWeight:400,color:p.ink},children:"Policies"}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:16},children:[y==="active"?x&&e.jsxs("button",{type:"button",onClick:()=>x(),style:{display:"inline-flex",alignItems:"center",gap:8,height:32,padding:"0 16px 0 12px",borderRadius:10,border:"none",background:p.dark,color:p.onDark,fontFamily:S,fontSize:14,fontWeight:500,cursor:"pointer"},children:[e.jsx(v.Plus,{size:20,strokeWidth:2,style:{color:p.onDark}}),"Policy"]}):e.jsxs("div",{style:{position:"relative",display:"inline-flex"},children:[e.jsxs("button",{type:"button",onClick:()=>m(n=>!n),"aria-haspopup":"listbox","aria-expanded":C,style:{display:"inline-flex",alignItems:"center",gap:10,height:32,padding:"0 16px",borderRadius:10,border:`1px solid ${p.border}`,background:p.white,color:p.ink,fontFamily:S,fontSize:14,fontWeight:600,cursor:"pointer"},children:[e.jsx(v.Filter,{size:20,strokeWidth:1.75,style:{color:p.ink}}),xe]}),C&&e.jsx(ce,{options:P,value:k,onChange:n=>{E(n),m(!1)},onClose:()=>m(!1)})]}),e.jsx("div",{style:{display:"flex",alignItems:"center",height:32,width:260,padding:2,borderRadius:11,background:p.searchTrack,boxSizing:"border-box"},children:e.jsxs("div",{style:{display:"flex",flex:1,minWidth:0,alignItems:"center",gap:8,height:28,padding:"0 8px",borderRadius:10,background:p.white},children:[e.jsx(v.Search,{size:18,strokeWidth:2,style:{color:p.searchText,flexShrink:0}}),e.jsx("input",{value:j,onChange:n=>D(n.target.value),placeholder:"Search",style:{flex:1,minWidth:0,border:"none",outline:"none",background:"transparent",fontFamily:S,fontSize:14,color:p.ink}})]})})]})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,width:"100%",borderBottom:`1px solid ${p.tabBorder}`},children:[e.jsx(q,{id:"active",label:"Active Policies",count:ve(t.length)}),e.jsx(q,{id:"browse",label:"Browse Policies",count:ue})]}),y==="active"?e.jsx(ae,{icon:!0,label:r,children:N.length===0?e.jsx(de,{text:B?"No policies match your search.":F}):e.jsx(oe,{children:N.map(n=>e.jsx(A,{policy:n,variant:"active",onTest:d?()=>d(n):void 0,onViewDetails:()=>he(n),onToggleStatus:o&&g?g:void 0,onEdit:o&&f?f:void 0},n.id))})}):U.length===0?e.jsx(de,{text:B||k!=="all"?"No policies match your search.":w}):e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:24},children:U.map(n=>e.jsx(ae,{icon:!0,label:n.name,children:e.jsx(oe,{children:n.policies.map(b=>e.jsx(A,{policy:b,variant:"browse",onViewDetails:()=>fe(b),onApply:o&&!b.alreadyApplied?()=>c==null?void 0:c(b):void 0},b.id))})},n.id))}),e.jsx(pe,{open:!!i,onClose:G,mode:i==null?void 0:i.mode,title:(Q=i==null?void 0:i.policy)==null?void 0:Q.name,paradigms:(V=i==null?void 0:i.policy)==null?void 0:V.paradigms,description:(X=i==null?void 0:i.policy)==null?void 0:X.description,definition:(Y=i==null?void 0:i.policy)==null?void 0:Y.definition,updatedLabel:(J=i==null?void 0:i.policy)==null?void 0:J.updatedLabel,updatedBy:(Z=i==null?void 0:i.policy)==null?void 0:Z.updatedBy,items:((_=i==null?void 0:i.policy)==null?void 0:_.items)||[],topOffset:z,onEdit:(i==null?void 0:i.mode)==="active"&&o&&f?()=>{const n=i.policy;G(),f(n)}:void 0,primaryLabel:(i==null?void 0:i.mode)==="browse"?o&&!((ee=i==null?void 0:i.policy)!=null&&ee.alreadyApplied)?"Apply Policy":void 0:o&&g?((te=i==null?void 0:i.policy)==null?void 0:te.status)==="Active"?"Disable Policy":"Enable Policy":void 0,onPrimary:()=>{const n=i==null?void 0:i.policy;n&&(G(),i.mode==="browse"?c==null||c(n):g==null||g(n))}})]})}function ae({label:t,icon:r,children:a}){return e.jsxs("section",{style:{display:"flex",flexDirection:"column",gap:16,width:"100%"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,height:40},children:[r&&e.jsx(v.ScrollText,{size:24,strokeWidth:1.75,style:{color:p.accent}}),e.jsx("span",{style:{fontFamily:S,fontSize:16,fontWeight:600,color:p.ink,textTransform:"uppercase",lineHeight:1.2},children:t})]}),a]})}function oe({children:t}){return e.jsx("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(320px, 360px))",gap:24,width:"100%"},children:t})}function de({text:t}){return e.jsx("p",{style:{margin:0,fontSize:14,color:p.muted,fontFamily:S},children:t})}exports.FilterDropdown=ce;exports.PoliciesPage=je;exports.PolicyCard=A;exports.PolicyDetailsDrawer=pe;
2
+ //# sourceMappingURL=policies.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policies.cjs.js","sources":["../../src/components/policies/PolicyCard.jsx","../../src/components/policies/FilterDropdown.jsx","../../src/components/policies/PolicyDetailsDrawer.jsx","../../src/components/policies/PoliciesPage.jsx"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { CloudCheck, CloudOff, MoreHorizontal } from \"lucide-react\";\n\n// Color values resolve to CSS variables declared in `src/tokens/colors.css`.\n// Anything new added here MUST first be added to that file as a `--*` token.\nconst C = {\n ink: \"var(--Grey-Strong, #2E3236)\",\n muted: \"var(--Grey-Muted, #808183)\",\n cardBorder: \"var(--neutral-300, #B2B2B0)\",\n white: \"var(--Grey-White, #FFFFFF)\",\n btnBorder: \"var(--Grey-absent, #D9D9D9)\",\n dark: \"var(--neutral-850, #272727)\",\n onDark: \"var(--neutral-50, #F2F2F0)\",\n menuHover: \"var(--neutral-100, #E6E6E6)\",\n};\n\nconst FONT = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\n// Two-line clamp helper (used for the policy description).\nconst clampStyle = (lines) => ({\n display: \"-webkit-box\",\n WebkitLineClamp: lines,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n});\n\n// Status that reads as \"off\" gets the slashed-cloud icon (Figma: Disabled).\nconst isDisabledStatus = (status) => /disabled|inactive|off|available/i.test(String(status || \"\"));\n\nfunction OutlineButton({ children, onClick }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 28,\n padding: \"0 10px\",\n borderRadius: 10,\n border: `1px solid ${C.btnBorder}`,\n background: C.white,\n color: C.ink,\n fontFamily: FONT,\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction PrimaryButton({ children, onClick }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 28,\n padding: \"0 16px\",\n borderRadius: 10,\n border: \"none\",\n background: C.dark,\n color: C.onDark,\n fontFamily: FONT,\n fontSize: 14,\n fontWeight: 500,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n }}\n >\n {children}\n </button>\n );\n}\n\n// Kebab (⋯) popover menu — outside-click / Escape to close. `items` is a list\n// of { label, onClick }; empty items render nothing.\nfunction KebabMenu({ items, onClose }) {\n const ref = useRef(null);\n\n useEffect(() => {\n const handleClick = (e) => {\n if (ref.current && !ref.current.contains(e.target)) onClose?.();\n };\n const handleKey = (e) => {\n if (e.key === \"Escape\") onClose?.();\n };\n document.addEventListener(\"mousedown\", handleClick);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [onClose]);\n\n return (\n <div\n ref={ref}\n role=\"menu\"\n style={{\n position: \"absolute\",\n top: \"calc(100% + 4px)\",\n right: 0,\n zIndex: 50,\n minWidth: 168,\n display: \"flex\",\n flexDirection: \"column\",\n background: C.white,\n border: `1px solid ${C.btnBorder}`,\n borderRadius: 8,\n boxShadow: \"var(--shadow-popover, 0 12px 32px rgba(11,11,11,0.12))\",\n overflow: \"hidden\",\n }}\n >\n {items.map((item, idx) => (\n <button\n key={item.label}\n type=\"button\"\n role=\"menuitem\"\n onClick={item.onClick}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n padding: \"10px 12px\",\n border: \"none\",\n borderTop: idx === 0 ? \"none\" : `1px solid var(--color-divider, #E5E7EB)`,\n background: \"transparent\",\n cursor: \"pointer\",\n textAlign: \"left\",\n fontFamily: FONT,\n fontSize: 13,\n color: C.ink,\n lineHeight: 1.2,\n whiteSpace: \"nowrap\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = C.menuHover;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n {item.label}\n </button>\n ))}\n </div>\n );\n}\n\n/**\n * PolicyCard — single policy / template card used on both the Active and\n * Browse tabs of the Policies page. Purely presentational; all actions are\n * delegated to the host via callbacks.\n *\n * The two variants (Figma nodes 66:1849 / 73:1099 / 73:1259 vs 73:1150):\n * - \"active\": paradigms line, Updated meta, footer = Test + View Details, and\n * a kebab (⋯) menu with Enable/Disable + Edit definition.\n * - \"browse\": no paradigms line, Policy Count meta, footer = View Details +\n * Apply.\n *\n * Props:\n * - policy { id, name, paradigms, description, updatedLabel, updated_by, status, policyCount }\n * - variant \"active\" | \"browse\" Default \"active\"\n * - onTest function(policy) active — renders the \"Test\" button when provided\n * - onViewDetails function(policy) renders the \"View Details\" button when provided\n * - onApply function(policy) browse — renders the \"Apply\" button when provided\n * - onToggleStatus function(policy) active — kebab \"Enable/Disable Policy\" item\n * - onEdit function(policy) active — kebab \"Edit definition\" item\n */\nexport default function PolicyCard({\n policy = {},\n variant = \"active\",\n onTest,\n onViewDetails,\n onApply,\n onToggleStatus,\n onEdit,\n}) {\n const isBrowse = variant === \"browse\";\n const status = policy.status || (isBrowse ? \"Disabled\" : \"Active\");\n const disabled = isDisabledStatus(status);\n const StatusIcon = disabled ? CloudOff : CloudCheck;\n\n const [menuOpen, setMenuOpen] = useState(false);\n\n const menuItems = [];\n if (onToggleStatus) {\n menuItems.push({\n label: disabled ? \"Enable Policy\" : \"Disable Policy\",\n onClick: () => {\n setMenuOpen(false);\n onToggleStatus(policy);\n },\n });\n }\n if (onEdit) {\n menuItems.push({\n label: \"Edit definition\",\n onClick: () => {\n setMenuOpen(false);\n onEdit(policy);\n },\n });\n }\n const hasMenu = menuItems.length > 0;\n\n return (\n <article\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n alignItems: \"flex-start\",\n minHeight: 82,\n padding: 16,\n borderRadius: 8,\n border: `1px solid ${C.cardBorder}`,\n background: C.white,\n boxSizing: \"border-box\",\n width: \"100%\",\n fontFamily: FONT,\n }}\n >\n {/* Content */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8, width: \"100%\" }}>\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\", width: \"100%\" }}>\n <p\n style={{\n flex: 1,\n minWidth: 0,\n margin: 0,\n fontSize: 14,\n fontWeight: 600,\n color: C.ink,\n lineHeight: \"normal\",\n }}\n >\n {policy.name || \"Untitled policy\"}\n </p>\n {hasMenu && (\n <div style={{ position: \"relative\", display: \"inline-flex\", flexShrink: 0 }}>\n <button\n type=\"button\"\n aria-label=\"More actions\"\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n onClick={() => setMenuOpen((v) => !v)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 16,\n height: 16,\n padding: 0,\n border: \"none\",\n background: \"transparent\",\n color: C.ink,\n cursor: \"pointer\",\n }}\n >\n <MoreHorizontal size={16} strokeWidth={2} />\n </button>\n {menuOpen && <KebabMenu items={menuItems} onClose={() => setMenuOpen(false)} />}\n </div>\n )}\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 5, width: \"100%\" }}>\n {!isBrowse && (\n <p\n style={{\n margin: 0,\n fontSize: 13,\n color: C.ink,\n lineHeight: \"normal\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n width: \"100%\",\n }}\n >\n {policy.paradigms || \"All paradigms\"}\n </p>\n )}\n <p\n style={{\n margin: 0,\n fontSize: 13,\n color: C.muted,\n lineHeight: \"normal\",\n minHeight: 32,\n width: \"100%\",\n ...clampStyle(2),\n }}\n >\n {policy.description || \"\"}\n </p>\n </div>\n </div>\n\n {/* Meta */}\n <div style={{ display: \"flex\", flexDirection: \"column\", width: \"100%\" }}>\n {isBrowse ? (\n <MetaRow label=\"Policy Count\" value={policy.policyCount ?? \"—\"} />\n ) : (\n <>\n <MetaRow label=\"Updated\" value={policy.updatedLabel || \"—\"} />\n <MetaRow label=\"Updated By\" value={policy.updatedBy || \"—\"} />\n </>\n )}\n </div>\n\n {/* Footer — status + actions */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n width: \"100%\",\n }}\n >\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n fontSize: 12,\n color: C.ink,\n lineHeight: \"16px\",\n }}\n >\n <StatusIcon size={20} strokeWidth={1.5} style={{ color: C.ink }} />\n {status}\n </span>\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n {isBrowse ? (\n <>\n {onViewDetails && (\n <OutlineButton onClick={() => onViewDetails(policy)}>View Details</OutlineButton>\n )}\n {onApply && <PrimaryButton onClick={() => onApply(policy)}>Apply</PrimaryButton>}\n </>\n ) : (\n <>\n {onTest && <OutlineButton onClick={() => onTest(policy)}>Test</OutlineButton>}\n {onViewDetails && (\n <PrimaryButton onClick={() => onViewDetails(policy)}>View Details</PrimaryButton>\n )}\n </>\n )}\n </div>\n </div>\n </article>\n );\n}\n\nfunction MetaRow({ label, value }) {\n return (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: 24,\n padding: \"8px 8px 12px 0\",\n fontSize: 13,\n lineHeight: 1.2,\n }}\n >\n <span style={{ width: 80, color: C.ink }}>{label}</span>\n <span style={{ color: C.muted }}>{value}</span>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport { Check } from \"lucide-react\";\n\nconst C = {\n ink: \"var(--Grey-Strong, #2E3236)\",\n border: \"var(--Grey-absent, #D9D9D9)\",\n white: \"var(--Grey-White, #FFFFFF)\",\n};\n\nconst FONT = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\n/**\n * FilterDropdown — \"Filter by\" category popover (Figma node 74:3118).\n *\n * Props:\n * - options [{ id, label }] Category options (an \"All\" row is always prepended)\n * - value string Currently selected option id (\"all\" by default)\n * - onChange function(id)\n * - onClose function Called on outside-click / Escape\n */\nexport default function FilterDropdown({ options = [], value = \"all\", onChange, onClose }) {\n const ref = useRef(null);\n\n useEffect(() => {\n const handleClick = (e) => {\n if (ref.current && !ref.current.contains(e.target)) onClose?.();\n };\n const handleKey = (e) => {\n if (e.key === \"Escape\") onClose?.();\n };\n document.addEventListener(\"mousedown\", handleClick);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [onClose]);\n\n const rows = [{ id: \"all\", label: \"All\" }, ...options];\n\n return (\n <div\n ref={ref}\n role=\"listbox\"\n style={{\n position: \"absolute\",\n top: \"calc(100% + 6px)\",\n left: 0,\n zIndex: 50,\n minWidth: 200,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"stretch\",\n background: C.white,\n border: `1px solid ${C.border}`,\n borderRadius: 4,\n boxShadow: \"var(--shadow-dropdown, -2px 2px 1px rgba(0,0,0,0.25))\",\n fontFamily: FONT,\n overflow: \"hidden\",\n }}\n >\n <div style={{ padding: 12 }}>\n <p style={{ margin: 0, fontSize: 13, fontWeight: 700, color: C.ink, lineHeight: 1.2 }}>\n Filter by\n </p>\n </div>\n {rows.map((row) => {\n const selected = row.id === value;\n return (\n <button\n key={row.id}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n onClick={() => onChange?.(row.id)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n width: \"100%\",\n // Selected row shows the check at pl-12; unselected rows indent to\n // pl-40 (12 + 20 check + 8 gap) so their labels line up.\n padding: selected ? \"12px\" : \"12px 12px 12px 40px\",\n borderTop: `1px solid ${C.border}`,\n background: \"transparent\",\n cursor: \"pointer\",\n textAlign: \"left\",\n fontFamily: FONT,\n fontSize: 13,\n color: C.ink,\n lineHeight: 1.2,\n }}\n >\n {selected && <Check size={20} strokeWidth={2} style={{ color: C.ink, flexShrink: 0 }} />}\n {row.label}\n </button>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect } from \"react\";\nimport { X, ScrollText, Pencil } from \"lucide-react\";\nimport { useMediaQuery } from \"../../utils/useMediaQuery\";\n\nconst C = {\n ink: \"var(--Grey-Strong, #2E3236)\",\n muted: \"var(--Grey-Muted, #808183)\",\n cardBorder: \"var(--neutral-300, #B2B2B0)\",\n white: \"var(--Grey-White, #FFFFFF)\",\n btnBorder: \"var(--Grey-absent, #D9D9D9)\",\n editBorder: \"var(--neutral-250, #BFBFBF)\",\n editText: \"var(--neutral-800, #323232)\",\n dark: \"var(--neutral-850, #272727)\",\n onDark: \"var(--neutral-50, #F2F2F0)\",\n iconBg: \"var(--surface-hover, #F3F7F7)\",\n line: \"var(--color-divider, #E5E7EB)\",\n};\n\nconst FONT = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\nconst Divider = () => <div style={{ width: \"100%\", height: 1, background: C.line, flexShrink: 0 }} />;\n\nfunction MetaRow({ label, value }) {\n return (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: 24,\n padding: \"8px 8px 12px 0\",\n fontSize: 13,\n lineHeight: 1.2,\n }}\n >\n <span style={{ width: 80, color: C.ink }}>{label}</span>\n <span style={{ color: C.muted }}>{value}</span>\n </div>\n );\n}\n\n/**\n * PolicyDetailsDrawer — slide-in \"View Details\" panel.\n *\n * Two layouts (Figma nodes 73:1111 vs 74:2974):\n * - mode=\"active\": paradigms title → description → Definition section (with\n * optional Edit button) → definition text → Updated / Created By meta.\n * Footer primary action is the enable/disable toggle.\n * - mode=\"browse\": description → list of constituent policy items. Footer\n * primary action is \"Apply Policy\".\n *\n * Props:\n * - open, onClose\n * - mode \"active\" | \"browse\" Default \"browse\"\n * - title string\n * - paradigms string (active)\n * - description string\n * - definition string (active)\n * - updatedLabel string (active)\n * - updatedBy string (active)\n * - onEdit function (active — renders the Edit button when provided)\n * - items [{ title, description }] (browse)\n * - primaryLabel string Optional — renders the primary footer button when set\n * - onPrimary function\n * - primaryDisabled boolean\n * - secondaryLabel string Default \"Cancel\"\n * - topOffset number|string\n */\nexport default function PolicyDetailsDrawer({\n open,\n onClose,\n mode = \"browse\",\n title,\n paradigms,\n description,\n definition,\n updatedLabel,\n updatedBy,\n onEdit,\n items = [],\n primaryLabel,\n onPrimary,\n primaryDisabled = false,\n secondaryLabel = \"Cancel\",\n topOffset,\n}) {\n const isPhone = useMediaQuery(\"(max-width: 640px)\");\n const hasTopOffset = topOffset !== undefined && topOffset !== null;\n const normalizedTopOffset = typeof topOffset === \"number\" ? `${topOffset}px` : topOffset;\n const isActive = mode === \"active\";\n\n useEffect(() => {\n if (!open) return undefined;\n const handleKey = (e) => {\n if (e.key === \"Escape\") onClose?.();\n };\n document.addEventListener(\"keydown\", handleKey);\n return () => document.removeEventListener(\"keydown\", handleKey);\n }, [open, onClose]);\n\n if (!open) return null;\n\n return (\n <>\n <div\n onClick={onClose}\n style={{ position: \"fixed\", inset: 0, zIndex: 1200, background: \"rgba(0,0,0,0.20)\" }}\n />\n <div\n style={{\n position: \"fixed\",\n top: isPhone ? 0 : hasTopOffset ? normalizedTopOffset : 0,\n right: 0,\n zIndex: 1201,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n width: isPhone ? \"100vw\" : 490,\n maxWidth: \"100vw\",\n height: isPhone ? \"100dvh\" : hasTopOffset ? `calc(100vh - ${normalizedTopOffset})` : \"100vh\",\n padding: 20,\n boxSizing: \"border-box\",\n background: C.white,\n borderRadius: isPhone ? 0 : \"12px 0 0 12px\",\n boxShadow: \"-8px 0 40px rgba(0,0,0,0.18)\",\n fontFamily: FONT,\n }}\n >\n {/* Header */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, width: \"100%\", flexShrink: 0 }}>\n <div style={{ display: \"flex\", flex: 1, minWidth: 0, gap: 8, alignItems: \"center\" }}>\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 34,\n height: 34,\n borderRadius: 9999,\n background: C.iconBg,\n flexShrink: 0,\n }}\n >\n <ScrollText size={20} strokeWidth={1.75} style={{ color: C.ink }} />\n </span>\n <p\n style={{\n margin: 0,\n fontSize: 16,\n fontWeight: 550,\n color: C.ink,\n lineHeight: 1.2,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {title}\n </p>\n </div>\n <button\n type=\"button\"\n aria-label=\"Close\"\n onClick={onClose}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 20,\n height: 20,\n padding: 0,\n border: \"none\",\n background: \"transparent\",\n color: C.ink,\n cursor: \"pointer\",\n flexShrink: 0,\n }}\n >\n <X size={20} strokeWidth={2} />\n </button>\n </div>\n\n <Divider />\n\n {/* Body — scrollable */}\n <div\n className=\"custom-thin-scrollbar\"\n style={{\n flex: 1,\n minHeight: 0,\n width: \"100%\",\n overflowY: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n }}\n >\n {isActive ? (\n <>\n <p style={{ margin: 0, fontSize: 14, fontWeight: 600, color: C.ink, lineHeight: \"normal\" }}>\n {paradigms || \"All Paradigms\"}\n </p>\n {description && (\n <p style={{ margin: 0, fontSize: 13, color: C.muted, lineHeight: \"normal\" }}>\n {description}\n </p>\n )}\n\n <Divider />\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 24,\n width: \"100%\",\n }}\n >\n <span style={{ fontSize: 13, color: C.ink, lineHeight: 1.5 }}>Definition</span>\n {onEdit && (\n <button\n type=\"button\"\n onClick={onEdit}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n height: 28,\n padding: \"0 10px\",\n borderRadius: 10,\n border: `1px solid ${C.editBorder}`,\n background: C.white,\n color: C.editText,\n fontFamily: FONT,\n fontSize: 14,\n cursor: \"pointer\",\n }}\n >\n <Pencil size={16} strokeWidth={1.75} style={{ color: C.editText }} />\n Edit\n </button>\n )}\n </div>\n\n {definition && (\n <p\n style={{\n margin: 0,\n fontSize: 13,\n color: C.muted,\n lineHeight: \"normal\",\n whiteSpace: \"pre-wrap\",\n }}\n >\n {definition}\n </p>\n )}\n\n <div style={{ display: \"flex\", flexDirection: \"column\", width: \"100%\" }}>\n <MetaRow label=\"Updated\" value={updatedLabel || \"—\"} />\n <MetaRow label=\"Updated By\" value={updatedBy || \"—\"} />\n </div>\n </>\n ) : (\n <>\n {description && (\n <p style={{ margin: 0, fontSize: 13, color: C.muted, lineHeight: \"normal\" }}>\n {description}\n </p>\n )}\n <Divider />\n {items.length === 0 && (\n <p style={{ margin: 0, fontSize: 13, color: C.muted }}>No details available.</p>\n )}\n {items.map((item, idx) => (\n <div\n key={item.id || `${item.title}-${idx}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n padding: 16,\n borderRadius: 8,\n border: `1px solid ${C.cardBorder}`,\n background: C.white,\n width: \"100%\",\n boxSizing: \"border-box\",\n }}\n >\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8, width: \"100%\" }}>\n <p style={{ margin: 0, fontSize: 14, fontWeight: 600, color: C.ink, lineHeight: \"normal\" }}>\n {item.title}\n </p>\n {item.description && (\n <p style={{ margin: 0, fontSize: 13, color: C.muted, lineHeight: \"normal\" }}>\n {item.description}\n </p>\n )}\n </div>\n </div>\n ))}\n </>\n )}\n </div>\n\n <Divider />\n\n {/* Footer */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n gap: 12,\n width: \"100%\",\n flexShrink: 0,\n }}\n >\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 32,\n padding: \"0 16px\",\n borderRadius: 10,\n border: `1px solid ${C.btnBorder}`,\n background: C.white,\n color: C.ink,\n fontFamily: FONT,\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n }}\n >\n {secondaryLabel}\n </button>\n {primaryLabel && (\n <button\n type=\"button\"\n onClick={onPrimary}\n disabled={primaryDisabled}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 32,\n padding: \"0 16px\",\n borderRadius: 10,\n border: \"none\",\n background: C.dark,\n color: C.onDark,\n fontFamily: FONT,\n fontSize: 14,\n fontWeight: 550,\n cursor: primaryDisabled ? \"default\" : \"pointer\",\n opacity: primaryDisabled ? 0.5 : 1,\n }}\n >\n {primaryLabel}\n </button>\n )}\n </div>\n </div>\n </>\n );\n}\n","\"use client\";\n\nimport React, { useMemo, useState } from \"react\";\nimport { Filter, Search, ScrollText, Plus } from \"lucide-react\";\nimport PolicyCard from \"./PolicyCard\";\nimport FilterDropdown from \"./FilterDropdown\";\nimport PolicyDetailsDrawer from \"./PolicyDetailsDrawer\";\n\nconst C = {\n ink: \"var(--Grey-Strong, #2E3236)\",\n muted: \"var(--Grey-Muted, #808183)\",\n white: \"var(--Grey-White, #FFFFFF)\",\n border: \"var(--Grey-absent, #D9D9D9)\",\n tabBorder: \"var(--color-divider, #F2F1EF)\",\n tabActive: \"var(--neutral-900, #0B0B0B)\",\n pillActive: \"var(--neutral-900, #0B0B0B)\",\n pillIdle: \"var(--rail-surface-2, #E3E1D7)\",\n searchTrack: \"var(--neutral-150, #D8D8D8)\",\n searchText: \"var(--neutral-400, #989898)\",\n accent: \"var(--rail-orange, #C98A5A)\",\n dark: \"var(--neutral-850, #272727)\",\n onDark: \"var(--neutral-50, #F2F2F0)\",\n};\n\nconst FONT = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\nconst pad2 = (n) => String(n).padStart(2, \"0\");\n\nconst matchesSearch = (policy, term) => {\n if (!term) return true;\n const haystack = `${policy?.name || \"\"} ${policy?.description || \"\"} ${policy?.paradigms || \"\"}`.toLowerCase();\n return haystack.includes(term);\n};\n\n/**\n * PoliciesPage — full Policies page (Figma: Active Policies, Browse Policies,\n * filter + search, filter dropdown, view-details drawer).\n *\n * Presentational: data arrives via props, all mutations are delegated to the\n * host via callbacks. Tab / search / filter / drawer state is owned here.\n *\n * Props:\n * - activePolicies [{ id, name, paradigms, description, updatedLabel, updatedBy, status, category, definition }]\n * - activeSectionLabel string Default \"Custom Policies\"\n * - browseCategories [{ id, name, policies: [...] }]\n * - defaultTab \"active\" | \"browse\"\n * - isAdmin boolean\n * - onTest function(policy) Renders the card \"Test\" button when provided\n * - onApplyPolicy function(policy) Apply action in the browse details drawer\n * - topOffset number|string Drawer top offset (e.g. below a navbar)\n * - emptyActiveMessage string\n * - emptyBrowseMessage string\n */\nexport default function PoliciesPage({\n activePolicies = [],\n activeSectionLabel = \"Custom Policies\",\n browseCategories = [],\n defaultTab = \"active\",\n isAdmin = false,\n onTest,\n onApplyPolicy,\n onAddPolicy,\n onEditPolicy,\n onToggleStatus,\n topOffset,\n emptyActiveMessage = \"No active policies yet.\",\n emptyBrowseMessage = \"No policies available to browse.\",\n}) {\n const [tab, setTab] = useState(defaultTab === \"browse\" ? \"browse\" : \"active\");\n const [search, setSearch] = useState(\"\");\n const [filterCategory, setFilterCategory] = useState(\"all\");\n const [filterOpen, setFilterOpen] = useState(false);\n const [details, setDetails] = useState(null); // { policy, mode }\n\n const term = search.trim().toLowerCase();\n\n const browseCount = useMemo(\n () => browseCategories.reduce((sum, cat) => sum + (cat.policies?.length || 0), 0),\n [browseCategories]\n );\n\n const filterOptions = useMemo(\n () => browseCategories.map((cat) => ({ id: cat.id, label: cat.name })),\n [browseCategories]\n );\n\n // The Filters button shows the active selection (defaults to \"All\").\n const selectedFilterLabel =\n filterCategory === \"all\"\n ? \"All\"\n : filterOptions.find((o) => o.id === filterCategory)?.label || \"All\";\n\n // Active tab supports search only (the category filter belongs to Browse).\n const filteredActive = useMemo(\n () => activePolicies.filter((p) => matchesSearch(p, term)),\n [activePolicies, term]\n );\n\n const filteredBrowse = useMemo(\n () =>\n browseCategories\n .filter((cat) => filterCategory === \"all\" || cat.id === filterCategory)\n .map((cat) => ({\n ...cat,\n policies: (cat.policies || []).filter((p) => matchesSearch(p, term)),\n }))\n .filter((cat) => cat.policies.length > 0),\n [browseCategories, term, filterCategory]\n );\n\n const openActiveDetails = (policy) => setDetails({ policy, mode: \"active\" });\n const openBrowseDetails = (policy) => setDetails({ policy, mode: \"browse\" });\n const closeDetails = () => setDetails(null);\n\n const TabCell = ({ id, label, count }) => {\n const active = tab === id;\n return (\n <button\n type=\"button\"\n onClick={() => setTab(id)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 4,\n padding: \"4px 4px 12px\",\n border: \"none\",\n borderBottom: active ? `2px solid ${C.tabActive}` : \"2px solid transparent\",\n borderRadius: \"4px 4px 0 0\",\n background: \"transparent\",\n cursor: \"pointer\",\n fontFamily: FONT,\n }}\n >\n <span style={{ fontSize: 14, color: active ? \"#1E1E1E\" : \"#313131\", lineHeight: 1.2 }}>\n {label}\n </span>\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minWidth: 18,\n height: 18,\n padding: \"2px 6px\",\n borderRadius: 9,\n background: active ? C.pillActive : C.pillIdle,\n color: active ? \"#FFFFFF\" : \"#313131\",\n fontSize: 12,\n lineHeight: 1.2,\n }}\n >\n {count}\n </span>\n </button>\n );\n };\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16, fontFamily: FONT }}>\n {/* Heading row: title + filters + search */}\n <div style={{ display: \"flex\", flexWrap: \"wrap\", alignItems: \"center\", gap: 12, width: \"100%\" }}>\n <h1 style={{ flex: 1, minWidth: 160, margin: 0, fontSize: 24, fontWeight: 400, color: C.ink }}>\n Policies\n </h1>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 16 }}>\n {tab === \"active\"\n ? onAddPolicy && (\n <button\n type=\"button\"\n onClick={() => onAddPolicy()}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n height: 32,\n padding: \"0 16px 0 12px\",\n borderRadius: 10,\n border: \"none\",\n background: C.dark,\n color: C.onDark,\n fontFamily: FONT,\n fontSize: 14,\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n <Plus size={20} strokeWidth={2} style={{ color: C.onDark }} />\n Policy\n </button>\n )\n : (\n <div style={{ position: \"relative\", display: \"inline-flex\" }}>\n <button\n type=\"button\"\n onClick={() => setFilterOpen((v) => !v)}\n aria-haspopup=\"listbox\"\n aria-expanded={filterOpen}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 10,\n height: 32,\n padding: \"0 16px\",\n borderRadius: 10,\n border: `1px solid ${C.border}`,\n background: C.white,\n color: C.ink,\n fontFamily: FONT,\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n }}\n >\n <Filter size={20} strokeWidth={1.75} style={{ color: C.ink }} />\n {selectedFilterLabel}\n </button>\n\n {filterOpen && (\n <FilterDropdown\n options={filterOptions}\n value={filterCategory}\n onChange={(id) => {\n setFilterCategory(id);\n setFilterOpen(false);\n }}\n onClose={() => setFilterOpen(false)}\n />\n )}\n </div>\n )}\n\n {/* Search — shared by both tabs */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n height: 32,\n width: 260,\n padding: 2,\n borderRadius: 11,\n background: C.searchTrack,\n boxSizing: \"border-box\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n flex: 1,\n minWidth: 0,\n alignItems: \"center\",\n gap: 8,\n height: 28,\n padding: \"0 8px\",\n borderRadius: 10,\n background: C.white,\n }}\n >\n <Search size={18} strokeWidth={2} style={{ color: C.searchText, flexShrink: 0 }} />\n <input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search\"\n style={{\n flex: 1,\n minWidth: 0,\n border: \"none\",\n outline: \"none\",\n background: \"transparent\",\n fontFamily: FONT,\n fontSize: 14,\n color: C.ink,\n }}\n />\n </div>\n </div>\n </div>\n </div>\n\n {/* Primary tabs */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n width: \"100%\",\n borderBottom: `1px solid ${C.tabBorder}`,\n }}\n >\n <TabCell id=\"active\" label=\"Active Policies\" count={pad2(activePolicies.length)} />\n <TabCell id=\"browse\" label=\"Browse Policies\" count={browseCount} />\n </div>\n\n {/* Content */}\n {tab === \"active\" ? (\n <Section icon label={activeSectionLabel}>\n {filteredActive.length === 0 ? (\n <EmptyMessage text={term ? \"No policies match your search.\" : emptyActiveMessage} />\n ) : (\n <CardGrid>\n {filteredActive.map((policy) => (\n <PolicyCard\n key={policy.id}\n policy={policy}\n variant=\"active\"\n onTest={onTest ? () => onTest(policy) : undefined}\n onViewDetails={() => openActiveDetails(policy)}\n onToggleStatus={isAdmin && onToggleStatus ? onToggleStatus : undefined}\n onEdit={isAdmin && onEditPolicy ? onEditPolicy : undefined}\n />\n ))}\n </CardGrid>\n )}\n </Section>\n ) : filteredBrowse.length === 0 ? (\n <EmptyMessage text={term || filterCategory !== \"all\" ? \"No policies match your search.\" : emptyBrowseMessage} />\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 24 }}>\n {filteredBrowse.map((cat) => (\n <Section key={cat.id} icon label={cat.name}>\n <CardGrid>\n {cat.policies.map((policy) => (\n <PolicyCard\n key={policy.id}\n policy={policy}\n variant=\"browse\"\n onViewDetails={() => openBrowseDetails(policy)}\n onApply={\n isAdmin && !policy.alreadyApplied ? () => onApplyPolicy?.(policy) : undefined\n }\n />\n ))}\n </CardGrid>\n </Section>\n ))}\n </div>\n )}\n\n <PolicyDetailsDrawer\n open={Boolean(details)}\n onClose={closeDetails}\n mode={details?.mode}\n title={details?.policy?.name}\n paradigms={details?.policy?.paradigms}\n description={details?.policy?.description}\n definition={details?.policy?.definition}\n updatedLabel={details?.policy?.updatedLabel}\n updatedBy={details?.policy?.updatedBy}\n items={details?.policy?.items || []}\n topOffset={topOffset}\n onEdit={\n details?.mode === \"active\" && isAdmin && onEditPolicy\n ? () => {\n const p = details.policy;\n closeDetails();\n onEditPolicy(p);\n }\n : undefined\n }\n primaryLabel={\n details?.mode === \"browse\"\n ? isAdmin && !details?.policy?.alreadyApplied\n ? \"Apply Policy\"\n : undefined\n : isAdmin && onToggleStatus\n ? details?.policy?.status === \"Active\"\n ? \"Disable Policy\"\n : \"Enable Policy\"\n : undefined\n }\n onPrimary={() => {\n const p = details?.policy;\n if (!p) return;\n closeDetails();\n if (details.mode === \"browse\") onApplyPolicy?.(p);\n else onToggleStatus?.(p);\n }}\n />\n </div>\n );\n}\n\nfunction Section({ label, icon, children }) {\n return (\n <section style={{ display: \"flex\", flexDirection: \"column\", gap: 16, width: \"100%\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, height: 40 }}>\n {icon && <ScrollText size={24} strokeWidth={1.75} style={{ color: C.accent }} />}\n <span\n style={{\n fontFamily: FONT,\n fontSize: 16,\n fontWeight: 600,\n color: C.ink,\n textTransform: \"uppercase\",\n lineHeight: 1.2,\n }}\n >\n {label}\n </span>\n </div>\n {children}\n </section>\n );\n}\n\nfunction CardGrid({ children }) {\n return (\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(320px, 360px))\",\n gap: 24,\n width: \"100%\",\n }}\n >\n {children}\n </div>\n );\n}\n\nfunction EmptyMessage({ text }) {\n return <p style={{ margin: 0, fontSize: 14, color: C.muted, fontFamily: FONT }}>{text}</p>;\n}\n"],"names":["C","FONT","clampStyle","lines","isDisabledStatus","status","OutlineButton","children","onClick","jsx","PrimaryButton","KebabMenu","items","onClose","ref","useRef","useEffect","handleClick","e","handleKey","item","idx","PolicyCard","policy","variant","onTest","onViewDetails","onApply","onToggleStatus","onEdit","isBrowse","disabled","StatusIcon","CloudOff","CloudCheck","menuOpen","setMenuOpen","useState","menuItems","hasMenu","jsxs","v","MoreHorizontal","MetaRow","Fragment","label","value","FilterDropdown","options","onChange","rows","row","selected","Check","Divider","PolicyDetailsDrawer","open","mode","title","paradigms","description","definition","updatedLabel","updatedBy","primaryLabel","onPrimary","primaryDisabled","secondaryLabel","topOffset","isPhone","useMediaQuery","hasTopOffset","normalizedTopOffset","isActive","ScrollText","X","Pencil","pad2","n","matchesSearch","term","PoliciesPage","activePolicies","activeSectionLabel","browseCategories","defaultTab","isAdmin","onApplyPolicy","onAddPolicy","onEditPolicy","emptyActiveMessage","emptyBrowseMessage","tab","setTab","search","setSearch","filterCategory","setFilterCategory","filterOpen","setFilterOpen","details","setDetails","browseCount","useMemo","sum","cat","_a","filterOptions","selectedFilterLabel","o","filteredActive","p","filteredBrowse","openActiveDetails","openBrowseDetails","closeDetails","TabCell","id","count","active","Plus","Filter","Search","Section","EmptyMessage","CardGrid","_b","_c","_d","_e","_f","_g","_h","_i","_j","icon","text"],"mappings":"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"}