chordia-ui 4.0.7 → 4.0.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/DataTable2.cjs.js +1 -1
- package/dist/DataTable2.cjs.js.map +1 -1
- package/dist/DataTable2.es.js +936 -814
- package/dist/DataTable2.es.js.map +1 -1
- package/dist/components/policies.cjs.js +1 -1
- package/dist/components/policies.cjs.js.map +1 -1
- package/dist/components/policies.es.js +48 -49
- package/dist/components/policies.es.js.map +1 -1
- package/package.json +1 -1
- package/src/components/data/DataTable2.jsx +168 -6
- package/src/components/policies/PoliciesPage.jsx +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),h=require("react"),m=require("lucide-react"),ge=require("../useMediaQuery.cjs.js"),c={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)"},P="var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)",ye=t=>({display:"-webkit-box",WebkitLineClamp:t,WebkitBoxOrient:"vertical",overflow:"hidden"}),be=t=>/disabled|inactive|off|available/i.test(String(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 10px",borderRadius:10,border:`1px solid ${c.btnBorder}`,background:c.white,color:c.ink,fontFamily:P,fontSize:14,fontWeight:600,cursor:"pointer",whiteSpace:"nowrap"},children:t})}function re({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:c.dark,color:c.onDark,fontFamily:P,fontSize:14,fontWeight:500,cursor:"pointer",whiteSpace:"nowrap"},children:t})}function me({items:t,onClose:r}){const a=h.useRef(null);return h.useEffect(()=>{const o=p=>{a.current&&!a.current.contains(p.target)&&(r==null||r())},d=p=>{p.key==="Escape"&&(r==null||r())};return document.addEventListener("mousedown",o),document.addEventListener("keydown",d),()=>{document.removeEventListener("mousedown",o),document.removeEventListener("keydown",d)}},[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:c.white,border:`1px solid ${c.btnBorder}`,borderRadius:8,boxShadow:"var(--shadow-popover, 0 12px 32px rgba(11,11,11,0.12))",overflow:"hidden"},children:t.map((o,d)=>e.jsx("button",{type:"button",role:"menuitem",onClick:o.onClick,style:{display:"flex",alignItems:"center",width:"100%",padding:"10px 12px",border:"none",borderTop:d===0?"none":"1px solid var(--color-divider, #E5E7EB)",background:"transparent",cursor:"pointer",textAlign:"left",fontFamily:P,fontSize:13,color:c.ink,lineHeight:1.2,whiteSpace:"nowrap"},onMouseEnter:p=>{p.currentTarget.style.background=c.menuHover},onMouseLeave:p=>{p.currentTarget.style.background="transparent"},children:o.label},o.label))})}function U({policy:t={},variant:r="active",onTest:a,onViewDetails:o,onApply:d,onToggleStatus:p,onEdit:x}){const f=r==="browse",g=t.status||(f?"Available":"Active"),v=/available/i.test(String(g||"")),F=!v&&be(g),$=v?m.CloudDownload:F?m.CloudOff:m.CloudCheck,[w,j]=h.useState(!1),D=[];p&&D.push({label:F?"Enable Policy":"Disable Policy",onClick:()=>{j(!1),p(t)}}),x&&D.push({label:"Edit definition",onClick:()=>{j(!1),x(t)}});const S=D.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 ${c.cardBorder}`,background:c.white,boxSizing:"border-box",width:"100%",fontFamily:P},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:c.ink,lineHeight:"normal"},children:t.name||"Untitled policy"}),S&&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":w,onClick:()=>j(I=>!I),style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:16,height:16,padding:0,border:"none",background:"transparent",color:c.ink,cursor:"pointer"},children:e.jsx(m.MoreHorizontal,{size:16,strokeWidth:2})}),w&&e.jsx(me,{items:D,onClose:()=>j(!1)})]})]}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:5,width:"100%"},children:[!f&&e.jsx("p",{style:{margin:0,fontSize:13,color:c.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:c.muted,lineHeight:"normal",minHeight:32,width:"100%",...ye(2)},children:t.description||""})]})]}),e.jsx("div",{style:{display:"flex",flexDirection:"column",width:"100%"},children:f?e.jsx(ve,{count:t.policyCount}):e.jsxs(e.Fragment,{children:[e.jsx(le,{label:"Updated",value:t.updatedLabel||"—"}),e.jsx(le,{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:c.ink,lineHeight:"16px"},children:[e.jsx($,{size:20,strokeWidth:1.5,style:{color:c.ink}}),g]}),e.jsx("div",{style:{display:"flex",alignItems:"center",gap:12},children:f?e.jsxs(e.Fragment,{children:[o&&e.jsx(ne,{onClick:()=>o(t),children:"View Details"}),d&&e.jsx(re,{onClick:()=>d(t),children:"Apply"})]}):e.jsxs(e.Fragment,{children:[a&&e.jsx(ne,{onClick:()=>a(t),children:"Test"}),o&&e.jsx(re,{onClick:()=>o(t),children:"View Details"})]})})]})]})}function ve({count:t}){const r=parseInt(t,10),a=Number.isFinite(r),o=a?r:t??"—",d=a&&r===1?"Policy":"Policies";return e.jsxs("div",{style:{display:"inline-flex",alignItems:"center",gap:8,padding:"8px 8px 12px 0",fontSize:13,lineHeight:"20px",color:c.ink},children:[e.jsx(m.FileStack,{size:18,strokeWidth:2,style:{color:c.ink,flexShrink:0}}),e.jsxs("span",{children:[o," ",d]})]})}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:c.ink},children:t}),e.jsx("span",{style:{color:c.muted},children:r})]})}const A={ink:"var(--Grey-Strong, #2E3236)",border:"var(--Grey-absent, #D9D9D9)",white:"var(--Grey-White, #FFFFFF)"},se="var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)";function xe({options:t=[],value:r="all",onChange:a,onClose:o}){const d=h.useRef(null);h.useEffect(()=>{const x=g=>{d.current&&!d.current.contains(g.target)&&(o==null||o())},f=g=>{g.key==="Escape"&&(o==null||o())};return document.addEventListener("mousedown",x),document.addEventListener("keydown",f),()=>{document.removeEventListener("mousedown",x),document.removeEventListener("keydown",f)}},[o]);const p=[{id:"all",label:"All"},...t];return e.jsxs("div",{ref:d,role:"listbox",style:{position:"absolute",top:"calc(100% + 6px)",left:0,zIndex:50,minWidth:200,display:"flex",flexDirection:"column",alignItems:"stretch",background:A.white,border:`1px solid ${A.border}`,borderRadius:4,boxShadow:"var(--shadow-dropdown, -2px 2px 1px rgba(0,0,0,0.25))",fontFamily:se,overflow:"hidden"},children:[e.jsx("div",{style:{padding:12},children:e.jsx("p",{style:{margin:0,fontSize:13,fontWeight:700,color:A.ink,lineHeight:1.2},children:"Filter by"})}),p.map(x=>{const f=x.id===r;return e.jsxs("button",{type:"button",role:"option","aria-selected":f,onClick:()=>a==null?void 0:a(x.id),style:{display:"flex",alignItems:"center",gap:8,width:"100%",padding:f?"12px":"12px 12px 12px 40px",borderTop:`1px solid ${A.border}`,background:"transparent",cursor:"pointer",textAlign:"left",fontFamily:se,fontSize:13,color:A.ink,lineHeight:1.2},children:[f&&e.jsx(m.Check,{size:20,strokeWidth:2,style:{color:A.ink,flexShrink:0}}),x.label]},x.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)"},L="var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)",N=()=>e.jsx("div",{style:{width:"100%",height:1,background:l.line,flexShrink:0}});function oe({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 he({open:t,onClose:r,mode:a="browse",title:o,paradigms:d,description:p,definition:x,updatedLabel:f,updatedBy:g,onEdit:v,items:F=[],primaryLabel:$,onPrimary:w,primaryDisabled:j=!1,secondaryLabel:D="Cancel",topOffset:S}){const I=ge.useMediaQuery("(max-width: 640px)"),z=S!=null,G=typeof S=="number"?`${S}px`:S,B=a==="active",R=(s,y)=>(s==null?void 0:s.id)??y,[i,M]=h.useState(()=>new Set);h.useEffect(()=>{t&&!B&&M(new Set(F.map((s,y)=>s!=null&&s.defaultChecked?R(s,y):null).filter(s=>s!==null)))},[t,B]);const W=s=>M(y=>{const k=new Set(y);return k.has(s)?k.delete(s):k.add(s),k}),E=i.size;return h.useEffect(()=>{if(!t)return;const s=y=>{y.key==="Escape"&&(r==null||r())};return document.addEventListener("keydown",s),()=>document.removeEventListener("keydown",s)},[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:I?0:z?G:0,right:0,zIndex:1201,display:"flex",flexDirection:"column",gap:16,width:I?"100vw":490,maxWidth:"100vw",height:I?"100dvh":z?`calc(100vh - ${G})`:"100vh",padding:20,boxSizing:"border-box",background:l.white,borderRadius:I?0:"12px 0 0 12px",boxShadow:"-8px 0 40px rgba(0,0,0,0.18)",fontFamily:L},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(m.SquareChartGantt,{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:o})]}),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(m.X,{size:20,strokeWidth:2})})]}),e.jsx(N,{}),e.jsx("div",{className:"custom-thin-scrollbar",style:{flex:1,minHeight:0,width:"100%",overflowY:"auto",display:"flex",flexDirection:"column",gap:16},children:B?e.jsxs(e.Fragment,{children:[e.jsx("p",{style:{margin:0,fontSize:14,fontWeight:600,color:l.ink,lineHeight:"normal"},children:d||"All Paradigms"}),p&&e.jsx("p",{style:{margin:0,fontSize:13,color:l.muted,lineHeight:"normal"},children:p}),e.jsx(N,{}),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"}),v&&e.jsxs("button",{type:"button",onClick:v,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:L,fontSize:14,cursor:"pointer"},children:[e.jsx(m.Pencil,{size:16,strokeWidth:1.75,style:{color:l.editText}}),"Edit"]})]}),x&&e.jsx("p",{style:{margin:0,fontSize:13,color:l.muted,lineHeight:"normal",whiteSpace:"pre-wrap"},children:x}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",width:"100%"},children:[e.jsx(oe,{label:"Updated",value:f||"—"}),e.jsx(oe,{label:"Updated By",value:g||"—"})]})]}):e.jsxs(e.Fragment,{children:[p&&e.jsx("p",{style:{margin:0,fontSize:13,color:l.muted,lineHeight:"normal"},children:p}),e.jsx(N,{}),F.length===0?e.jsx("p",{style:{margin:0,fontSize:13,color:l.muted},children:"No details available."}):e.jsxs("p",{style:{margin:0,fontSize:13,color:l.ink,lineHeight:"normal"},children:[E," of ",F.length," ",F.length===1?"Policy":"Policies"," Selected"]}),F.map((s,y)=>{const k=R(s,y),C=i.has(k);return e.jsxs("button",{type:"button",onClick:()=>W(k),"aria-pressed":C,style:{display:"flex",alignItems:"flex-start",gap:12,padding:16,borderRadius:8,border:`1px solid ${C?l.ink:l.cardBorder}`,background:l.white,width:"100%",boxSizing:"border-box",textAlign:"left",cursor:"pointer",fontFamily:L},children:[e.jsx("span",{"aria-hidden":"true",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:16,height:16,marginTop:2,borderRadius:5,flexShrink:0,border:`1px solid ${C?"#0B0B0B":"#676767"}`,background:C?"#0B0B0B":"#FFFFFF"},children:C&&e.jsx(m.Check,{size:11,color:"#FFFFFF",strokeWidth:3})}),e.jsxs("span",{style:{display:"flex",flexDirection:"column",gap:8,minWidth:0},children:[e.jsx("span",{style:{fontSize:14,fontWeight:600,color:l.ink,lineHeight:"normal"},children:s.title}),s.description&&e.jsx("span",{style:{fontSize:13,color:l.muted,lineHeight:"normal"},children:s.description})]})]},s.id||`${s.title}-${y}`)})]})}),e.jsx(N,{}),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:L,fontSize:14,fontWeight:600,cursor:"pointer"},children:D}),$&&e.jsx("button",{type:"button",onClick:()=>B?w==null?void 0:w():w==null?void 0:w(Array.from(i)),disabled:j||!B&&E===0,style:{display:"inline-flex",alignItems:"center",justifyContent:"center",height:32,padding:"0 16px",borderRadius:10,border:"none",background:l.dark,color:l.onDark,fontFamily:L,fontSize:14,fontWeight:550,cursor:j||!B&&E===0?"default":"pointer",opacity:j||!B&&E===0?.5:1},children:$})]})]})]}):null}const u={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)"},H="var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)",ae=t=>String(t).padStart(2,"0"),de=(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:o="active",isAdmin:d=!1,onTest:p,onApplyPolicy:x,onAddPolicy:f,onEditPolicy:g,onToggleStatus:v,topOffset:F,emptyActiveMessage:$="No active policies yet.",emptyBrowseMessage:w="No policies available to browse."}){var V,X,Y,J,Z,_,ee,te,ie;const[j,D]=h.useState(o==="browse"?"browse":"active"),[S,I]=h.useState(""),[z,G]=h.useState("all"),[B,R]=h.useState(!1),[i,M]=h.useState(null),W=S.trim().toLowerCase(),E=h.useMemo(()=>a.map(n=>({id:n.id,label:n.name})),[a]),s=z==="all"?"All":((V=E.find(n=>n.id===z))==null?void 0:V.label)||"All",y=h.useMemo(()=>t.filter(n=>de(n,W)),[t,W]),k=h.useMemo(()=>a.filter(n=>z==="all"||n.id===z).map(n=>({...n,policies:(n.policies||[]).filter(b=>de(b,W))})).filter(n=>n.policies.length>0),[a,W,z]),C=h.useMemo(()=>k.reduce((n,b)=>{var T;return n+(((T=b.policies)==null?void 0:T.length)||0)},0),[k]),fe=n=>M({policy:n,mode:"active"}),K=n=>M({policy:n,mode:"browse"}),q=()=>M(null),Q=({id:n,label:b,count:T})=>{const O=j===n;return e.jsxs("button",{type:"button",onClick:()=>D(n),style:{display:"inline-flex",alignItems:"center",justifyContent:"center",gap:4,padding:"4px 4px 12px",border:"none",borderBottom:O?`2px solid ${u.tabActive}`:"2px solid transparent",borderRadius:"4px 4px 0 0",background:"transparent",cursor:"pointer",fontFamily:H},children:[e.jsx("span",{style:{fontSize:14,color:O?"#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:O?u.pillActive:u.pillIdle,color:O?"#FFFFFF":"#313131",fontSize:12,lineHeight:1.2},children:T})]})};return e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:16,fontFamily:H},children:[e.jsxs("div",{style:{display:"flex",flexWrap:"wrap",alignItems:"center",gap:12,width:"100%"},children:[e.jsx("div",{style:{flex:1,minWidth:160}}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:16},children:[j==="active"?f&&e.jsxs("button",{type:"button",onClick:()=>f(),style:{display:"inline-flex",alignItems:"center",gap:8,height:32,padding:"0 16px 0 12px",borderRadius:10,border:"none",background:u.dark,color:u.onDark,fontFamily:H,fontSize:14,fontWeight:500,cursor:"pointer"},children:[e.jsx(m.Plus,{size:20,strokeWidth:2,style:{color:u.onDark}}),"Policy"]}):e.jsxs("div",{style:{position:"relative",display:"inline-flex"},children:[e.jsxs("button",{type:"button",onClick:()=>R(n=>!n),"aria-haspopup":"listbox","aria-expanded":B,style:{display:"inline-flex",alignItems:"center",gap:10,height:32,padding:"0 16px",borderRadius:10,border:`1px solid ${u.border}`,background:u.white,color:u.ink,fontFamily:H,fontSize:14,fontWeight:600,cursor:"pointer"},children:[e.jsx(m.Filter,{size:20,strokeWidth:1.75,style:{color:u.ink}}),s]}),B&&e.jsx(xe,{options:E,value:z,onChange:n=>{G(n),R(!1)},onClose:()=>R(!1)})]}),e.jsx("div",{style:{display:"flex",alignItems:"center",height:32,width:260,padding:2,borderRadius:11,background:u.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:u.white},children:[e.jsx(m.Search,{size:18,strokeWidth:2,style:{color:u.searchText,flexShrink:0}}),e.jsx("input",{value:S,onChange:n=>I(n.target.value),placeholder:"Search",style:{flex:1,minWidth:0,border:"none",outline:"none",background:"transparent",fontFamily:H,fontSize:14,color:u.ink}})]})})]})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,width:"100%",borderBottom:`1px solid ${u.tabBorder}`},children:[e.jsx(Q,{id:"active",label:"Active Policies",count:ae(y.length)}),e.jsx(Q,{id:"browse",label:"Browse Policies",count:ae(C)})]}),j==="active"?e.jsx(ce,{icon:!0,label:r,children:y.length===0?e.jsx(ue,{text:W?"No policies match your search.":$}):e.jsx(pe,{children:y.map(n=>e.jsx(U,{policy:n,variant:"active",onTest:p?()=>p(n):void 0,onViewDetails:()=>fe(n),onToggleStatus:d&&v?v:void 0,onEdit:d&&g?g:void 0},n.id))})}):k.length===0?e.jsx(ue,{text:W||z!=="all"?"No policies match your search.":w}):e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:24},children:k.map(n=>e.jsx(ce,{icon:!0,label:n.name,children:e.jsx(pe,{children:n.policies.map(b=>e.jsx(U,{policy:b,variant:"browse",onViewDetails:()=>K(b),onApply:d?()=>K(b):void 0},b.id))})},n.id))}),e.jsx(he,{open:!!i,onClose:q,mode:i==null?void 0:i.mode,title:(X=i==null?void 0:i.policy)==null?void 0:X.name,paradigms:(Y=i==null?void 0:i.policy)==null?void 0:Y.paradigms,description:(J=i==null?void 0:i.policy)==null?void 0:J.description,definition:(Z=i==null?void 0:i.policy)==null?void 0:Z.definition,updatedLabel:(_=i==null?void 0:i.policy)==null?void 0:_.updatedLabel,updatedBy:(ee=i==null?void 0:i.policy)==null?void 0:ee.updatedBy,items:((te=i==null?void 0:i.policy)==null?void 0:te.items)||[],topOffset:F,onEdit:(i==null?void 0:i.mode)==="active"&&d&&g?()=>{const n=i.policy;q(),g(n)}:void 0,primaryLabel:(i==null?void 0:i.mode)==="browse"?d?"Apply Policy":void 0:d&&v?((ie=i==null?void 0:i.policy)==null?void 0:ie.status)==="Active"?"Disable Policy":"Enable Policy":void 0,onPrimary:n=>{const b=i==null?void 0:i.policy;b&&(q(),i.mode==="browse"?x==null||x(b,n):v==null||v(b))}})]})}function ce({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(m.ScrollText,{size:24,strokeWidth:1.75,style:{color:u.accent}}),e.jsx("span",{style:{fontFamily:H,fontSize:16,fontWeight:600,color:u.ink,textTransform:"uppercase",lineHeight:1.2},children:t})]}),a]})}function pe({children:t}){return e.jsx("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(320px, 360px))",gap:24,width:"100%"},children:t})}function ue({text:t}){return e.jsx("p",{style:{margin:0,fontSize:14,color:u.muted,fontFamily:H},children:t})}exports.FilterDropdown=xe;exports.PoliciesPage=je;exports.PolicyCard=U;exports.PolicyDetailsDrawer=he;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),h=require("react"),b=require("lucide-react"),ge=require("../useMediaQuery.cjs.js"),c={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)"},P="var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)",ye=t=>({display:"-webkit-box",WebkitLineClamp:t,WebkitBoxOrient:"vertical",overflow:"hidden"}),be=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 ${c.btnBorder}`,background:c.white,color:c.ink,fontFamily:P,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:c.dark,color:c.onDark,fontFamily:P,fontSize:14,fontWeight:500,cursor:"pointer",whiteSpace:"nowrap"},children:t})}function me({items:t,onClose:r}){const a=h.useRef(null);return h.useEffect(()=>{const o=p=>{a.current&&!a.current.contains(p.target)&&(r==null||r())},d=p=>{p.key==="Escape"&&(r==null||r())};return document.addEventListener("mousedown",o),document.addEventListener("keydown",d),()=>{document.removeEventListener("mousedown",o),document.removeEventListener("keydown",d)}},[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:c.white,border:`1px solid ${c.btnBorder}`,borderRadius:8,boxShadow:"var(--shadow-popover, 0 12px 32px rgba(11,11,11,0.12))",overflow:"hidden"},children:t.map((o,d)=>e.jsx("button",{type:"button",role:"menuitem",onClick:o.onClick,style:{display:"flex",alignItems:"center",width:"100%",padding:"10px 12px",border:"none",borderTop:d===0?"none":"1px solid var(--color-divider, #E5E7EB)",background:"transparent",cursor:"pointer",textAlign:"left",fontFamily:P,fontSize:13,color:c.ink,lineHeight:1.2,whiteSpace:"nowrap"},onMouseEnter:p=>{p.currentTarget.style.background=c.menuHover},onMouseLeave:p=>{p.currentTarget.style.background="transparent"},children:o.label},o.label))})}function U({policy:t={},variant:r="active",onTest:a,onViewDetails:o,onApply:d,onToggleStatus:p,onEdit:x}){const f=r==="browse",g=t.status||(f?"Available":"Active"),v=/available/i.test(String(g||"")),F=!v&&be(g),$=v?b.CloudDownload:F?b.CloudOff:b.CloudCheck,[w,j]=h.useState(!1),D=[];p&&D.push({label:F?"Enable Policy":"Disable Policy",onClick:()=>{j(!1),p(t)}}),x&&D.push({label:"Edit definition",onClick:()=>{j(!1),x(t)}});const S=D.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 ${c.cardBorder}`,background:c.white,boxSizing:"border-box",width:"100%",fontFamily:P},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:c.ink,lineHeight:"normal"},children:t.name||"Untitled policy"}),S&&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":w,onClick:()=>j(I=>!I),style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:16,height:16,padding:0,border:"none",background:"transparent",color:c.ink,cursor:"pointer"},children:e.jsx(b.MoreHorizontal,{size:16,strokeWidth:2})}),w&&e.jsx(me,{items:D,onClose:()=>j(!1)})]})]}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:5,width:"100%"},children:[!f&&e.jsx("p",{style:{margin:0,fontSize:13,color:c.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:c.muted,lineHeight:"normal",minHeight:32,width:"100%",...ye(2)},children:t.description||""})]})]}),e.jsx("div",{style:{display:"flex",flexDirection:"column",width:"100%"},children:f?e.jsx(ve,{count:t.policyCount}):e.jsxs(e.Fragment,{children:[e.jsx(re,{label:"Updated",value:t.updatedLabel||"—"}),e.jsx(re,{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:c.ink,lineHeight:"16px"},children:[e.jsx($,{size:20,strokeWidth:1.5,style:{color:c.ink}}),g]}),e.jsx("div",{style:{display:"flex",alignItems:"center",gap:12},children:f?e.jsxs(e.Fragment,{children:[o&&e.jsx(ie,{onClick:()=>o(t),children:"View Details"}),d&&e.jsx(ne,{onClick:()=>d(t),children:"Apply"})]}):e.jsxs(e.Fragment,{children:[a&&e.jsx(ie,{onClick:()=>a(t),children:"Test"}),o&&e.jsx(ne,{onClick:()=>o(t),children:"View Details"})]})})]})]})}function ve({count:t}){const r=parseInt(t,10),a=Number.isFinite(r),o=a?r:t??"—",d=a&&r===1?"Policy":"Policies";return e.jsxs("div",{style:{display:"inline-flex",alignItems:"center",gap:8,padding:"8px 8px 12px 0",fontSize:13,lineHeight:"20px",color:c.ink},children:[e.jsx(b.FileStack,{size:18,strokeWidth:2,style:{color:c.ink,flexShrink:0}}),e.jsxs("span",{children:[o," ",d]})]})}function re({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:c.ink},children:t}),e.jsx("span",{style:{color:c.muted},children:r})]})}const A={ink:"var(--Grey-Strong, #2E3236)",border:"var(--Grey-absent, #D9D9D9)",white:"var(--Grey-White, #FFFFFF)"},le="var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)";function ue({options:t=[],value:r="all",onChange:a,onClose:o}){const d=h.useRef(null);h.useEffect(()=>{const x=g=>{d.current&&!d.current.contains(g.target)&&(o==null||o())},f=g=>{g.key==="Escape"&&(o==null||o())};return document.addEventListener("mousedown",x),document.addEventListener("keydown",f),()=>{document.removeEventListener("mousedown",x),document.removeEventListener("keydown",f)}},[o]);const p=[{id:"all",label:"All"},...t];return e.jsxs("div",{ref:d,role:"listbox",style:{position:"absolute",top:"calc(100% + 6px)",left:0,zIndex:50,minWidth:200,display:"flex",flexDirection:"column",alignItems:"stretch",background:A.white,border:`1px solid ${A.border}`,borderRadius:4,boxShadow:"var(--shadow-dropdown, -2px 2px 1px rgba(0,0,0,0.25))",fontFamily:le,overflow:"hidden"},children:[e.jsx("div",{style:{padding:12},children:e.jsx("p",{style:{margin:0,fontSize:13,fontWeight:700,color:A.ink,lineHeight:1.2},children:"Filter by"})}),p.map(x=>{const f=x.id===r;return e.jsxs("button",{type:"button",role:"option","aria-selected":f,onClick:()=>a==null?void 0:a(x.id),style:{display:"flex",alignItems:"center",gap:8,width:"100%",padding:f?"12px":"12px 12px 12px 40px",borderTop:`1px solid ${A.border}`,background:"transparent",cursor:"pointer",textAlign:"left",fontFamily:le,fontSize:13,color:A.ink,lineHeight:1.2},children:[f&&e.jsx(b.Check,{size:20,strokeWidth:2,style:{color:A.ink,flexShrink:0}}),x.label]},x.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)"},L="var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)",N=()=>e.jsx("div",{style:{width:"100%",height:1,background:l.line,flexShrink:0}});function se({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 xe({open:t,onClose:r,mode:a="browse",title:o,paradigms:d,description:p,definition:x,updatedLabel:f,updatedBy:g,onEdit:v,items:F=[],primaryLabel:$,onPrimary:w,primaryDisabled:j=!1,secondaryLabel:D="Cancel",topOffset:S}){const I=ge.useMediaQuery("(max-width: 640px)"),z=S!=null,G=typeof S=="number"?`${S}px`:S,B=a==="active",R=(s,y)=>(s==null?void 0:s.id)??y,[i,M]=h.useState(()=>new Set);h.useEffect(()=>{t&&!B&&M(new Set(F.map((s,y)=>s!=null&&s.defaultChecked?R(s,y):null).filter(s=>s!==null)))},[t,B]);const W=s=>M(y=>{const k=new Set(y);return k.has(s)?k.delete(s):k.add(s),k}),E=i.size;return h.useEffect(()=>{if(!t)return;const s=y=>{y.key==="Escape"&&(r==null||r())};return document.addEventListener("keydown",s),()=>document.removeEventListener("keydown",s)},[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:I?0:z?G:0,right:0,zIndex:1201,display:"flex",flexDirection:"column",gap:16,width:I?"100vw":490,maxWidth:"100vw",height:I?"100dvh":z?`calc(100vh - ${G})`:"100vh",padding:20,boxSizing:"border-box",background:l.white,borderRadius:I?0:"12px 0 0 12px",boxShadow:"-8px 0 40px rgba(0,0,0,0.18)",fontFamily:L},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(b.SquareChartGantt,{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:o})]}),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(b.X,{size:20,strokeWidth:2})})]}),e.jsx(N,{}),e.jsx("div",{className:"custom-thin-scrollbar",style:{flex:1,minHeight:0,width:"100%",overflowY:"auto",display:"flex",flexDirection:"column",gap:16},children:B?e.jsxs(e.Fragment,{children:[e.jsx("p",{style:{margin:0,fontSize:14,fontWeight:600,color:l.ink,lineHeight:"normal"},children:d||"All Paradigms"}),p&&e.jsx("p",{style:{margin:0,fontSize:13,color:l.muted,lineHeight:"normal"},children:p}),e.jsx(N,{}),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"}),v&&e.jsxs("button",{type:"button",onClick:v,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:L,fontSize:14,cursor:"pointer"},children:[e.jsx(b.Pencil,{size:16,strokeWidth:1.75,style:{color:l.editText}}),"Edit"]})]}),x&&e.jsx("p",{style:{margin:0,fontSize:13,color:l.muted,lineHeight:"normal",whiteSpace:"pre-wrap"},children:x}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",width:"100%"},children:[e.jsx(se,{label:"Updated",value:f||"—"}),e.jsx(se,{label:"Updated By",value:g||"—"})]})]}):e.jsxs(e.Fragment,{children:[p&&e.jsx("p",{style:{margin:0,fontSize:13,color:l.muted,lineHeight:"normal"},children:p}),e.jsx(N,{}),F.length===0?e.jsx("p",{style:{margin:0,fontSize:13,color:l.muted},children:"No details available."}):e.jsxs("p",{style:{margin:0,fontSize:13,color:l.ink,lineHeight:"normal"},children:[E," of ",F.length," ",F.length===1?"Policy":"Policies"," Selected"]}),F.map((s,y)=>{const k=R(s,y),C=i.has(k);return e.jsxs("button",{type:"button",onClick:()=>W(k),"aria-pressed":C,style:{display:"flex",alignItems:"flex-start",gap:12,padding:16,borderRadius:8,border:`1px solid ${C?l.ink:l.cardBorder}`,background:l.white,width:"100%",boxSizing:"border-box",textAlign:"left",cursor:"pointer",fontFamily:L},children:[e.jsx("span",{"aria-hidden":"true",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:16,height:16,marginTop:2,borderRadius:5,flexShrink:0,border:`1px solid ${C?"#0B0B0B":"#676767"}`,background:C?"#0B0B0B":"#FFFFFF"},children:C&&e.jsx(b.Check,{size:11,color:"#FFFFFF",strokeWidth:3})}),e.jsxs("span",{style:{display:"flex",flexDirection:"column",gap:8,minWidth:0},children:[e.jsx("span",{style:{fontSize:14,fontWeight:600,color:l.ink,lineHeight:"normal"},children:s.title}),s.description&&e.jsx("span",{style:{fontSize:13,color:l.muted,lineHeight:"normal"},children:s.description})]})]},s.id||`${s.title}-${y}`)})]})}),e.jsx(N,{}),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:L,fontSize:14,fontWeight:600,cursor:"pointer"},children:D}),$&&e.jsx("button",{type:"button",onClick:()=>B?w==null?void 0:w():w==null?void 0:w(Array.from(i)),disabled:j||!B&&E===0,style:{display:"inline-flex",alignItems:"center",justifyContent:"center",height:32,padding:"0 16px",borderRadius:10,border:"none",background:l.dark,color:l.onDark,fontFamily:L,fontSize:14,fontWeight:550,cursor:j||!B&&E===0?"default":"pointer",opacity:j||!B&&E===0?.5:1},children:$})]})]})]}):null}const u={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)"},H="var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)",oe=t=>String(t).padStart(2,"0"),ae=(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:o="active",isAdmin:d=!1,onTest:p,onApplyPolicy:x,onAddPolicy:f,onEditPolicy:g,onToggleStatus:v,topOffset:F,emptyActiveMessage:$="No active policies yet.",emptyBrowseMessage:w="No policies available to browse."}){var Q,V,X,Y,J,Z,_,ee,te;const[j,D]=h.useState(o==="browse"?"browse":"active"),[S,I]=h.useState(""),[z,G]=h.useState("all"),[B,R]=h.useState(!1),[i,M]=h.useState(null),W=S.trim().toLowerCase(),E=h.useMemo(()=>a.map(n=>({id:n.id,label:n.name})),[a]),s=z==="all"?"All":((Q=E.find(n=>n.id===z))==null?void 0:Q.label)||"All",y=h.useMemo(()=>t.filter(n=>ae(n,W)),[t,W]),k=h.useMemo(()=>a.filter(n=>z==="all"||n.id===z).map(n=>({...n,policies:(n.policies||[]).filter(m=>ae(m,W))})).filter(n=>n.policies.length>0),[a,W,z]),C=h.useMemo(()=>k.reduce((n,m)=>{var T;return n+(((T=m.policies)==null?void 0:T.length)||0)},0),[k]),he=n=>M({policy:n,mode:"active"}),fe=n=>M({policy:n,mode:"browse"}),q=()=>M(null),K=({id:n,label:m,count:T})=>{const O=j===n;return e.jsxs("button",{type:"button",onClick:()=>D(n),style:{display:"inline-flex",alignItems:"center",justifyContent:"center",gap:4,padding:"4px 4px 12px",border:"none",borderBottom:O?`2px solid ${u.tabActive}`:"2px solid transparent",borderRadius:"4px 4px 0 0",background:"transparent",cursor:"pointer",fontFamily:H},children:[e.jsx("span",{style:{fontSize:14,color:O?"#1E1E1E":"#313131",lineHeight:1.2},children:m}),e.jsx("span",{style:{display:"inline-flex",alignItems:"center",justifyContent:"center",minWidth:18,height:18,padding:"2px 6px",borderRadius:9,background:O?u.pillActive:u.pillIdle,color:O?"#FFFFFF":"#313131",fontSize:12,lineHeight:1.2},children:T})]})};return e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:16,fontFamily:H},children:[e.jsxs("div",{style:{display:"flex",flexWrap:"wrap",alignItems:"center",gap:12,width:"100%"},children:[e.jsx("div",{style:{flex:1,minWidth:160}}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:16},children:[j==="active"?f&&e.jsxs("button",{type:"button",onClick:()=>f(),style:{display:"inline-flex",alignItems:"center",gap:8,height:32,padding:"0 16px 0 12px",borderRadius:10,border:"none",background:u.dark,color:u.onDark,fontFamily:H,fontSize:14,fontWeight:500,cursor:"pointer"},children:[e.jsx(b.Plus,{size:20,strokeWidth:2,style:{color:u.onDark}}),"Policy"]}):e.jsxs("div",{style:{position:"relative",display:"inline-flex"},children:[e.jsxs("button",{type:"button",onClick:()=>R(n=>!n),"aria-haspopup":"listbox","aria-expanded":B,style:{display:"inline-flex",alignItems:"center",gap:10,height:32,padding:"0 16px",borderRadius:10,border:`1px solid ${u.border}`,background:u.white,color:u.ink,fontFamily:H,fontSize:14,fontWeight:600,cursor:"pointer"},children:[e.jsx(b.Filter,{size:20,strokeWidth:1.75,style:{color:u.ink}}),s]}),B&&e.jsx(ue,{options:E,value:z,onChange:n=>{G(n),R(!1)},onClose:()=>R(!1)})]}),e.jsx("div",{style:{display:"flex",alignItems:"center",height:32,width:260,padding:2,borderRadius:11,background:u.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:u.white},children:[e.jsx(b.Search,{size:18,strokeWidth:2,style:{color:u.searchText,flexShrink:0}}),e.jsx("input",{value:S,onChange:n=>I(n.target.value),placeholder:"Search",style:{flex:1,minWidth:0,border:"none",outline:"none",background:"transparent",fontFamily:H,fontSize:14,color:u.ink}})]})})]})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,width:"100%",borderBottom:`1px solid ${u.tabBorder}`},children:[e.jsx(K,{id:"active",label:"Active Policies",count:oe(y.length)}),e.jsx(K,{id:"browse",label:"Browse Policies",count:oe(C)})]}),j==="active"?e.jsx(de,{icon:!0,label:r,children:y.length===0?e.jsx(pe,{text:W?"No policies match your search.":$}):e.jsx(ce,{children:y.map(n=>e.jsx(U,{policy:n,variant:"active",onTest:p?()=>p(n):void 0,onViewDetails:()=>he(n),onToggleStatus:d&&v?v:void 0,onEdit:d&&g?g:void 0},n.id))})}):k.length===0?e.jsx(pe,{text:W||z!=="all"?"No policies match your search.":w}):e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:24},children:k.map(n=>e.jsx(de,{icon:!0,label:n.name,children:e.jsx(ce,{children:n.policies.map(m=>e.jsx(U,{policy:m,variant:"browse",onViewDetails:()=>fe(m)},m.id))})},n.id))}),e.jsx(xe,{open:!!i,onClose:q,mode:i==null?void 0:i.mode,title:(V=i==null?void 0:i.policy)==null?void 0:V.name,paradigms:(X=i==null?void 0:i.policy)==null?void 0:X.paradigms,description:(Y=i==null?void 0:i.policy)==null?void 0:Y.description,definition:(J=i==null?void 0:i.policy)==null?void 0:J.definition,updatedLabel:(Z=i==null?void 0:i.policy)==null?void 0:Z.updatedLabel,updatedBy:(_=i==null?void 0:i.policy)==null?void 0:_.updatedBy,items:((ee=i==null?void 0:i.policy)==null?void 0:ee.items)||[],topOffset:F,onEdit:(i==null?void 0:i.mode)==="active"&&d&&g?()=>{const n=i.policy;q(),g(n)}:void 0,primaryLabel:(i==null?void 0:i.mode)==="browse"?d?"Apply Policy":void 0:d&&v?((te=i==null?void 0:i.policy)==null?void 0:te.status)==="Active"?"Disable Policy":"Enable Policy":void 0,onPrimary:n=>{const m=i==null?void 0:i.policy;m&&(q(),i.mode==="browse"?x==null||x(m,n):v==null||v(m))}})]})}function de({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(b.ScrollText,{size:24,strokeWidth:1.75,style:{color:u.accent}}),e.jsx("span",{style:{fontFamily:H,fontSize:16,fontWeight:600,color:u.ink,textTransform:"uppercase",lineHeight:1.2},children:t})]}),a]})}function ce({children:t}){return e.jsx("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(320px, 360px))",gap:24,width:"100%"},children:t})}function pe({text:t}){return e.jsx("p",{style:{margin:0,fontSize:14,color:u.muted,fontFamily:H},children:t})}exports.FilterDropdown=ue;exports.PoliciesPage=je;exports.PolicyCard=U;exports.PolicyDetailsDrawer=xe;
|
|
2
2
|
//# sourceMappingURL=policies.cjs.js.map
|
|
@@ -1 +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, CloudDownload, FileStack, 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 // Browse templates aren't \"disabled\" — they're available to apply. Default\n // their status to \"Available\" and give it its own (non-slashed) icon.\n const status = policy.status || (isBrowse ? \"Available\" : \"Active\");\n const isAvailable = /available/i.test(String(status || \"\"));\n const disabled = !isAvailable && isDisabledStatus(status);\n const StatusIcon = isAvailable ? CloudDownload : 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 <PolicyCountChip count={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\n// Browse-template meta: a chip showing how many policies the template groups,\n// e.g. a stacked-documents icon + \"5 Policies\".\nfunction PolicyCountChip({ count }) {\n const n = parseInt(count, 10);\n const hasCount = Number.isFinite(n);\n const label = hasCount ? n : count ?? \"—\";\n const noun = hasCount && n === 1 ? \"Policy\" : \"Policies\";\n return (\n <div\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"8px 8px 12px 0\",\n fontSize: 13,\n lineHeight: \"20px\",\n color: C.ink,\n }}\n >\n <FileStack size={18} strokeWidth={2} style={{ color: C.ink, flexShrink: 0 }} />\n <span>\n {label} {noun}\n </span>\n </div>\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, useState } from \"react\";\nimport { X, SquareChartGantt, Pencil, Check } 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 const itemId = (item, idx) => item?.id ?? idx;\n\n // Browse mode: the user picks which policies from the template to apply.\n // Checkboxes are seeded from each item's `defaultChecked` (the project's\n // current enabled state for that policy); Apply stays disabled until at\n // least one is checked.\n const [selectedIds, setSelectedIds] = useState(() => new Set());\n useEffect(() => {\n if (open && !isActive) {\n setSelectedIds(\n new Set(\n items\n .map((it, idx) => (it?.defaultChecked ? itemId(it, idx) : null))\n .filter((id) => id !== null)\n )\n );\n }\n // Reset only when the drawer opens (or the mode flips) — not on every\n // parent re-render, so the user's checks aren't wiped out mid-interaction.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, isActive]);\n\n const toggleItem = (id) =>\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n\n const selectedCount = selectedIds.size;\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 <SquareChartGantt 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 <p style={{ margin: 0, fontSize: 13, color: C.ink, lineHeight: \"normal\" }}>\n {selectedCount} of {items.length} {items.length === 1 ? \"Policy\" : \"Policies\"} Selected\n </p>\n )}\n {items.map((item, idx) => {\n const id = itemId(item, idx);\n const checked = selectedIds.has(id);\n return (\n <button\n type=\"button\"\n key={item.id || `${item.title}-${idx}`}\n onClick={() => toggleItem(id)}\n aria-pressed={checked}\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 12,\n padding: 16,\n borderRadius: 8,\n border: `1px solid ${checked ? C.ink : C.cardBorder}`,\n background: C.white,\n width: \"100%\",\n boxSizing: \"border-box\",\n textAlign: \"left\",\n cursor: \"pointer\",\n fontFamily: FONT,\n }}\n >\n <span\n aria-hidden=\"true\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 16,\n height: 16,\n marginTop: 2,\n borderRadius: 5,\n flexShrink: 0,\n border: `1px solid ${checked ? \"#0B0B0B\" : \"#676767\"}`,\n background: checked ? \"#0B0B0B\" : \"#FFFFFF\",\n }}\n >\n {checked && <Check size={11} color=\"#FFFFFF\" strokeWidth={3} />}\n </span>\n <span style={{ display: \"flex\", flexDirection: \"column\", gap: 8, minWidth: 0 }}>\n <span style={{ fontSize: 14, fontWeight: 600, color: C.ink, lineHeight: \"normal\" }}>\n {item.title}\n </span>\n {item.description && (\n <span style={{ fontSize: 13, color: C.muted, lineHeight: \"normal\" }}>\n {item.description}\n </span>\n )}\n </span>\n </button>\n );\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={() =>\n isActive ? onPrimary?.() : onPrimary?.(Array.from(selectedIds))\n }\n disabled={primaryDisabled || (!isActive && selectedCount === 0)}\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:\n primaryDisabled || (!isActive && selectedCount === 0) ? \"default\" : \"pointer\",\n opacity: primaryDisabled || (!isActive && selectedCount === 0) ? 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 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 // Count of browse templates after the current search / category filter, so\n // the tab badge reflects what's actually shown.\n const filteredBrowseCount = useMemo(\n () => filteredBrowse.reduce((sum, cat) => sum + (cat.policies?.length || 0), 0),\n [filteredBrowse]\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 {/* The host app renders the page title (via its PageHeader). This flex\n spacer keeps the filters + search right-aligned in this row. */}\n <div style={{ flex: 1, minWidth: 160 }} />\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(filteredActive.length)} />\n <TabCell id=\"browse\" label=\"Browse Policies\" count={pad2(filteredBrowseCount)} />\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={isAdmin ? () => openBrowseDetails(policy) : undefined}\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\n ? \"Apply Policy\"\n : undefined\n : isAdmin && onToggleStatus\n ? details?.policy?.status === \"Active\"\n ? \"Disable Policy\"\n : \"Enable Policy\"\n : undefined\n }\n onPrimary={(selectedIds) => {\n const p = details?.policy;\n if (!p) return;\n closeDetails();\n // Browse mode passes the ids of the policies the user checked so the\n // host applies just those, not the whole template.\n if (details.mode === \"browse\") onApplyPolicy?.(p, selectedIds);\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","isAvailable","disabled","StatusIcon","CloudDownload","CloudOff","CloudCheck","menuOpen","setMenuOpen","useState","menuItems","hasMenu","jsxs","v","MoreHorizontal","PolicyCountChip","Fragment","MetaRow","count","n","hasCount","label","noun","FileStack","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","itemId","selectedIds","setSelectedIds","it","id","toggleItem","prev","next","selectedCount","SquareChartGantt","X","Pencil","checked","pad2","matchesSearch","term","PoliciesPage","activePolicies","activeSectionLabel","browseCategories","defaultTab","isAdmin","onApplyPolicy","onAddPolicy","onEditPolicy","emptyActiveMessage","emptyBrowseMessage","tab","setTab","search","setSearch","filterCategory","setFilterCategory","filterOpen","setFilterOpen","details","setDetails","filterOptions","useMemo","cat","selectedFilterLabel","_a","o","filteredActive","p","filteredBrowse","filteredBrowseCount","sum","openActiveDetails","openBrowseDetails","closeDetails","TabCell","active","Plus","Filter","Search","Section","EmptyMessage","CardGrid","_b","_c","_d","_e","_f","_g","_h","_i","icon","ScrollText","text"],"mappings":"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"}
|
|
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, CloudDownload, FileStack, 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 // Browse templates aren't \"disabled\" — they're available to apply. Default\n // their status to \"Available\" and give it its own (non-slashed) icon.\n const status = policy.status || (isBrowse ? \"Available\" : \"Active\");\n const isAvailable = /available/i.test(String(status || \"\"));\n const disabled = !isAvailable && isDisabledStatus(status);\n const StatusIcon = isAvailable ? CloudDownload : 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 <PolicyCountChip count={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\n// Browse-template meta: a chip showing how many policies the template groups,\n// e.g. a stacked-documents icon + \"5 Policies\".\nfunction PolicyCountChip({ count }) {\n const n = parseInt(count, 10);\n const hasCount = Number.isFinite(n);\n const label = hasCount ? n : count ?? \"—\";\n const noun = hasCount && n === 1 ? \"Policy\" : \"Policies\";\n return (\n <div\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"8px 8px 12px 0\",\n fontSize: 13,\n lineHeight: \"20px\",\n color: C.ink,\n }}\n >\n <FileStack size={18} strokeWidth={2} style={{ color: C.ink, flexShrink: 0 }} />\n <span>\n {label} {noun}\n </span>\n </div>\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, useState } from \"react\";\nimport { X, SquareChartGantt, Pencil, Check } 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 const itemId = (item, idx) => item?.id ?? idx;\n\n // Browse mode: the user picks which policies from the template to apply.\n // Checkboxes are seeded from each item's `defaultChecked` (the project's\n // current enabled state for that policy); Apply stays disabled until at\n // least one is checked.\n const [selectedIds, setSelectedIds] = useState(() => new Set());\n useEffect(() => {\n if (open && !isActive) {\n setSelectedIds(\n new Set(\n items\n .map((it, idx) => (it?.defaultChecked ? itemId(it, idx) : null))\n .filter((id) => id !== null)\n )\n );\n }\n // Reset only when the drawer opens (or the mode flips) — not on every\n // parent re-render, so the user's checks aren't wiped out mid-interaction.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, isActive]);\n\n const toggleItem = (id) =>\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n\n const selectedCount = selectedIds.size;\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 <SquareChartGantt 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 <p style={{ margin: 0, fontSize: 13, color: C.ink, lineHeight: \"normal\" }}>\n {selectedCount} of {items.length} {items.length === 1 ? \"Policy\" : \"Policies\"} Selected\n </p>\n )}\n {items.map((item, idx) => {\n const id = itemId(item, idx);\n const checked = selectedIds.has(id);\n return (\n <button\n type=\"button\"\n key={item.id || `${item.title}-${idx}`}\n onClick={() => toggleItem(id)}\n aria-pressed={checked}\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 12,\n padding: 16,\n borderRadius: 8,\n border: `1px solid ${checked ? C.ink : C.cardBorder}`,\n background: C.white,\n width: \"100%\",\n boxSizing: \"border-box\",\n textAlign: \"left\",\n cursor: \"pointer\",\n fontFamily: FONT,\n }}\n >\n <span\n aria-hidden=\"true\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 16,\n height: 16,\n marginTop: 2,\n borderRadius: 5,\n flexShrink: 0,\n border: `1px solid ${checked ? \"#0B0B0B\" : \"#676767\"}`,\n background: checked ? \"#0B0B0B\" : \"#FFFFFF\",\n }}\n >\n {checked && <Check size={11} color=\"#FFFFFF\" strokeWidth={3} />}\n </span>\n <span style={{ display: \"flex\", flexDirection: \"column\", gap: 8, minWidth: 0 }}>\n <span style={{ fontSize: 14, fontWeight: 600, color: C.ink, lineHeight: \"normal\" }}>\n {item.title}\n </span>\n {item.description && (\n <span style={{ fontSize: 13, color: C.muted, lineHeight: \"normal\" }}>\n {item.description}\n </span>\n )}\n </span>\n </button>\n );\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={() =>\n isActive ? onPrimary?.() : onPrimary?.(Array.from(selectedIds))\n }\n disabled={primaryDisabled || (!isActive && selectedCount === 0)}\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:\n primaryDisabled || (!isActive && selectedCount === 0) ? \"default\" : \"pointer\",\n opacity: primaryDisabled || (!isActive && selectedCount === 0) ? 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 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 // Count of browse templates after the current search / category filter, so\n // the tab badge reflects what's actually shown.\n const filteredBrowseCount = useMemo(\n () => filteredBrowse.reduce((sum, cat) => sum + (cat.policies?.length || 0), 0),\n [filteredBrowse]\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 {/* The host app renders the page title (via its PageHeader). This flex\n spacer keeps the filters + search right-aligned in this row. */}\n <div style={{ flex: 1, minWidth: 160 }} />\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(filteredActive.length)} />\n <TabCell id=\"browse\" label=\"Browse Policies\" count={pad2(filteredBrowseCount)} />\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 />\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\n ? \"Apply Policy\"\n : undefined\n : isAdmin && onToggleStatus\n ? details?.policy?.status === \"Active\"\n ? \"Disable Policy\"\n : \"Enable Policy\"\n : undefined\n }\n onPrimary={(selectedIds) => {\n const p = details?.policy;\n if (!p) return;\n closeDetails();\n // Browse mode passes the ids of the policies the user checked so the\n // host applies just those, not the whole template.\n if (details.mode === \"browse\") onApplyPolicy?.(p, selectedIds);\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","isAvailable","disabled","StatusIcon","CloudDownload","CloudOff","CloudCheck","menuOpen","setMenuOpen","useState","menuItems","hasMenu","jsxs","v","MoreHorizontal","PolicyCountChip","Fragment","MetaRow","count","n","hasCount","label","noun","FileStack","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","itemId","selectedIds","setSelectedIds","it","id","toggleItem","prev","next","selectedCount","SquareChartGantt","X","Pencil","checked","pad2","matchesSearch","term","PoliciesPage","activePolicies","activeSectionLabel","browseCategories","defaultTab","isAdmin","onApplyPolicy","onAddPolicy","onEditPolicy","emptyActiveMessage","emptyBrowseMessage","tab","setTab","search","setSearch","filterCategory","setFilterCategory","filterOpen","setFilterOpen","details","setDetails","filterOptions","useMemo","cat","selectedFilterLabel","_a","o","filteredActive","p","filteredBrowse","filteredBrowseCount","sum","openActiveDetails","openBrowseDetails","closeDetails","TabCell","active","Plus","Filter","Search","Section","EmptyMessage","CardGrid","_b","_c","_d","_e","_f","_g","_h","_i","icon","ScrollText","text"],"mappings":"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"}
|