@package-broker/dist-cloudflare 2.0.0-rc.2 → 2.0.0-rc.4

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.
Files changed (48) hide show
  1. package/cloudflare/assets/access.62e9484517a0.js +1 -0
  2. package/cloudflare/assets/app.45b156168495.css +2 -0
  3. package/cloudflare/assets/app.c064670cdc0d.js +9 -0
  4. package/cloudflare/assets/audit.b7c40b9dc998.js +1 -0
  5. package/cloudflare/assets/chunk.28a4d8aab337.js +1 -0
  6. package/cloudflare/assets/chunk.3fcd6998795a.js +1 -0
  7. package/cloudflare/assets/chunk.51497edc7697.js +4 -0
  8. package/cloudflare/assets/chunk.56d473a1587d.js +1 -0
  9. package/cloudflare/assets/chunk.675b635d9462.js +1 -0
  10. package/cloudflare/assets/chunk.6ea6bdcaa465.js +1 -0
  11. package/cloudflare/assets/chunk.741aec8d1ff9.js +1 -0
  12. package/cloudflare/assets/chunk.815f9a91c741.js +1 -0
  13. package/cloudflare/assets/chunk.8442124f6802.js +1 -0
  14. package/cloudflare/assets/chunk.965b76812604.js +2 -0
  15. package/cloudflare/assets/chunk.a6d755a9789f.js +1 -0
  16. package/cloudflare/assets/chunk.d18497920e4d.js +1 -0
  17. package/cloudflare/assets/chunk.d813fefb410d.js +1 -0
  18. package/cloudflare/assets/chunk.e3b0c44298fc.js +0 -0
  19. package/cloudflare/assets/chunk.f54ea1378c8c.js +1 -0
  20. package/cloudflare/assets/chunk.fd375c54b526.js +1 -0
  21. package/cloudflare/assets/import.e7a1e5834631.js +1 -0
  22. package/cloudflare/assets/index.html +9 -2
  23. package/cloudflare/assets/manifest.json +108 -8
  24. package/cloudflare/assets/notifications.19225fe12044.js +1 -0
  25. package/cloudflare/assets/npm-login.e059678af13d.js +1 -0
  26. package/cloudflare/assets/packages.ab5ab25b1c75.js +2 -0
  27. package/cloudflare/assets/projects.927fe18c785c.js +1 -0
  28. package/cloudflare/assets/setup.8e977608d413.js +1 -0
  29. package/cloudflare/assets/setup.html +3 -3
  30. package/cloudflare/assets/sources.ae50f239f80f.js +1 -0
  31. package/cloudflare/assets/tokens.6b86d8d97e07.js +4 -0
  32. package/cloudflare/assets.json +2 -2
  33. package/cloudflare/build-info.json +4 -4
  34. package/cloudflare/generated/manifest.json +53 -2
  35. package/cloudflare/migrations/core/0002_npm_publish.sql +88 -0
  36. package/cloudflare/migrations/core/0003_npm_identity.sql +96 -0
  37. package/cloudflare/migrations/core/0004_source_revision.sql +1 -0
  38. package/cloudflare/migrations/core/0005_package_settings_revision.sql +1 -0
  39. package/cloudflare/migrations/core/0006_npm_login_handoff.sql +39 -0
  40. package/cloudflare/migrations/core/0007_npm_vcs_build_outcomes.sql +10 -0
  41. package/cloudflare/migrations/core/0008_registry_policy.sql +49 -0
  42. package/cloudflare/migrations/core/0009_npm_notifications.sql +108 -0
  43. package/cloudflare/worker.js +70475 -51313
  44. package/package.json +1 -1
  45. package/prebuilt.json +48 -15
  46. package/cloudflare/assets/app.b2abf3c46f6e.js +0 -15
  47. package/cloudflare/assets/app.e8cea8b32d3a.css +0 -2
  48. package/cloudflare/assets/setup.98343039898f.js +0 -1
@@ -0,0 +1 @@
1
+ import{a as X,b as Z,c as C,d as ee,e as N,f as T,g as S,h as re,i as te,j as oe}from"./chunk.6ea6bdcaa465.js";import"./chunk.28a4d8aab337.js";import{a as U}from"./chunk.a6d755a9789f.js";import{a as V,b as E,c as J}from"./chunk.965b76812604.js";import"./chunk.3fcd6998795a.js";import{a as ae}from"./chunk.d813fefb410d.js";import{a as q}from"./chunk.741aec8d1ff9.js";import{D,E as F,F as $,K as Y,c as z,d as K,g as _,j as O,p as R}from"./chunk.fd375c54b526.js";var x=z(K(),1);var se={"org:read":"Read organization details","org:settings:write":"Change organization settings","org:users:read":"Read organization users","org:users:write":"Manage organization users","org:roles:read":"Read organization roles","org:roles:write":"Manage organization roles","org:grants:read":"Read organization grants","org:grants:write":"Manage organization grants","org:projects:create":"Add projects","org:projects:archive":"Archive projects","org:sources:read":"Read organization sources","org:sources:write":"Manage organization sources","org:tokens:read":"Read organization tokens","org:tokens:revoke":"Revoke organization tokens","org:service-principals:write":"Manage service principals","org:packages:manage":"Manage all packages","org:import:write":"Import runs: create and read","org:import:approve":"Approve and apply import runs","org:audit:read":"Read organization audit records","project:read":"Read project details","project:settings:write":"Change project settings","project:grants:read":"Read project grants","project:grants:write":"Manage project grants","project:packages:read":"Read project packages","project:packages:write":"Publish project packages","project:packages:manage":"Manage project packages","project:sources:read":"Read project sources","project:sources:write":"Manage project sources","project:service-principals:write":"Manage project service principals","project:tokens:create":"Issue project tokens","project:tokens:read":"Read project tokens","project:tokens:revoke":"Revoke project tokens","project:audit:read":"Read project audit records"};async function ie(e){let t=[],s=new Set,n;do{let r=await e.request("get","/_pb/roles",{query:{limit:"50",after:n}});if(!r.ok)return{roles:[],status:r.status===403?"forbidden":"error"};if(t.push(...r.data.items),n=r.data.next??void 0,n&&s.has(n))return{roles:[],status:"error"};n&&s.add(n)}while(n);return{roles:t,status:"ready"}}var H=["project_developer","project_auditor","project_owner","organization_auditor","organization_admin"],B=(e,t)=>e.filter(s=>s.scope===(t===null?"organization":"project")).sort((s,n)=>{let r=c=>c.isSystem&&H.includes(c.key)?H.indexOf(c.key):H.length;return r(s)-r(n)||s.name.localeCompare(n.name)}),ge={project_developer:"Read packages, view sources and issue project tokens; includes publish permission.",project_auditor:"View project details, grants, packages, sources, tokens and audit records.",project_owner:"Manage project settings, access, packages, sources, service principals and tokens.",organization_auditor:"View organization records and project records across the organization.",organization_admin:"Manage the organization and all projects, including users, roles, grants and packages."},ne=e=>e.isSystem&&ge[e.key]||`Custom role \xB7 ${e.permissions.length} permissions`;var o=z(_(),1);function me(e){let t={},s=e.email.trim().toLowerCase();if(e.type==="email"){let n=s.slice(s.indexOf("@")+1);(s.length>254||!/^[\x21-\x7e]+$/.test(s)||!/^[^@]+@[^@]+$/.test(s)||!/^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(n)||!/[a-z]/.test(n.slice(n.lastIndexOf(".")+1)))&&(t.email="Enter a valid sign-in email address.")}else e.provider||(t.provider="Choose a sign-in provider."),e.group?e.group!==e.group.trim()?t.group="Remove spaces at the start or end. Keep the group's spelling and capitalization.":(e.group.length>256||/[\p{Cc}\p{Cf}\p{Cs}]/u.test(e.group))&&(t.group="Enter the group value sent by your provider."):t.group="Enter the group value sent by your provider.";return e.roleId||(t.roleId="Choose a role to review this grant."),Object.keys(t).length?{errors:t}:{body:{roleId:e.roleId,subject:e.type==="email"?{type:"email",value:s}:{type:"group",provider:e.provider,value:e.group}}}}function Q(e,t,s,n,r){if(e.type==="email"&&!e.email.trim())return"Enter an email address to review this grant.";if(e.type==="group"&&(!s||!e.group))return"Choose a provider and enter a group value to review this grant.";if(!e.roleId)return"Choose a role to review this grant.";let c=e.type==="email"?e.email.trim().toLowerCase():`Members of ${e.group} signing in with ${s.displayName}`,f=n===null?`for ${r}${t?.key==="organization_auditor"?", including read access across projects":t?.permissions.some(m=>m.startsWith("project:"))?", including access across projects":""}`:`on project ${n}`;return`${c} will get ${t?.name??"the selected role"} ${f}.`}function A({id:e,label:t,help:s,error:n,note:r,children:c}){return(0,o.jsxs)("div",{className:"grid min-w-0 gap-1",children:[(0,o.jsx)($,{htmlFor:e,children:t}),c,s?(0,o.jsx)("p",{id:`${e}-help`,className:"text-sm text-neutral-600",children:s}):null,r?(0,o.jsx)("p",{className:"text-sm text-neutral-600",children:r}):null,n?(0,o.jsx)("p",{id:`${e}-error`,role:"alert",children:n}):null]})}function le({catalogue:e,project:t,value:s,onChange:n,id:r,error:c,retry:f}){let m=B(e.roles,t),v=m.find(a=>a.id===s),j=`${r}-help${c?` ${r}-error`:""}`;return e.status==="forbidden"?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("p",{className:"lg:col-span-2",children:"Role choices are unavailable for your account. Ask an organization administrator to grant access."}),(0,o.jsx)(A,{id:r,label:"Enter a role ID",help:"Ask an organization administrator for the role ID.",error:c,children:(0,o.jsx)(F,{id:r,name:"roleId",value:s,onChange:a=>n(a.target.value),"aria-invalid":!!c,"aria-describedby":j})})]}):(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)("div",{className:"grid min-w-0 gap-2",children:[(0,o.jsx)(A,{id:r,label:"Role",error:c,children:(0,o.jsxs)(q,{id:r,name:"roleId",value:v?s:"",onChange:a=>n(a.target.value),disabled:e.status!=="ready"||!m.length,"aria-invalid":!!c,"aria-describedby":j,children:[(0,o.jsx)("option",{value:"",children:"Choose a role"}),m.map(a=>(0,o.jsx)("option",{value:a.id,children:a.name},a.id))]})}),(0,o.jsxs)("div",{id:`${r}-help`,className:"grid gap-2 text-sm",children:[e.status==="loading"?(0,o.jsx)("p",{children:"Loading roles\u2026"}):e.status==="error"?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("p",{role:"alert",children:"Roles could not be loaded. Try again."}),(0,o.jsx)(R,{type:"button",variant:"outline",onClick:f,children:"Retry roles"})]}):m.length?null:(0,o.jsx)("p",{children:"No roles are available to grant at this scope."}),v?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("p",{children:ne(v)}),(0,o.jsx)("p",{children:v.isSystem?"System role":"Custom role"}),v.isSystem&&v.key==="project_developer"?(0,o.jsx)("p",{children:"Suggested for developers; includes package read and publish permissions."}):null,v.permissions.includes("project:packages:write")?(0,o.jsx)("p",{children:"This role includes permission to publish npm packages to admitted hosted sources."}):null]}):null]})]}),v?(0,o.jsxs)("details",{className:"min-w-0 lg:col-span-2",children:[(0,o.jsxs)("summary",{className:"cursor-pointer underline",children:["View permissions (",v.permissions.length,")"]}),(0,o.jsx)("ul",{children:v.permissions.map(a=>(0,o.jsxs)("li",{className:"my-2",children:[(0,o.jsx)("span",{children:se[a]})," ",(0,o.jsx)("code",{className:"break-all",children:a})]},a))})]},v.id):null]})}function pe(e){let t=(0,x.useId)(),[s,n]=(0,x.useState)({type:"email",email:"",group:"",provider:"",roleId:""}),[r,c]=(0,x.useState)({}),[f,m]=(0,x.useState)(!1),v=B(e.catalogue.roles,e.project),j=e.project===null?"":v.find(p=>p.isSystem&&p.key==="project_developer")?.id??"",a=f?s.roleId:j,l=e.providers.length===1?e.providers[0].id:s.provider,d={...s,roleId:a,provider:l},u=v.find(p=>p.id===a),h=e.providers.find(p=>p.id===l),b=p=>({id:`${t}-${p}`,"aria-invalid":!!r[p],"aria-describedby":`${t}-${p}-help${r[p]?` ${t}-${p}-error`:""}`}),k=p=>{n({...s,...p}),c({})},I=e.catalogue.status==="forbidden"||e.catalogue.status==="ready"&&v.length>0;return(0,o.jsxs)("form",{noValidate:!0,className:"my-6 grid max-w-5xl items-start gap-x-6 gap-y-4 lg:grid-cols-2",onSubmit:p=>{if(p.preventDefault(),e.busy||!I)return;let P=me(d),w=P.errors??{};s.type==="email"&&p.currentTarget.querySelector('[name="email"]')?.validity.typeMismatch&&(w.email="Enter a valid sign-in email address."),s.type==="group"&&!h&&(w.provider=l?"This provider is no longer available. Choose another provider.":"Choose a sign-in provider."),e.catalogue.status==="ready"&&!u&&(w.roleId="Choose a role to review this grant."),c(w);let g=["email","provider","group","roleId"].find(y=>w[y]);if(g){p.currentTarget.querySelector(`[id="${t}-${g}"]`)?.focus();return}P.body&&e.submit(P.body)},children:[(0,o.jsx)("p",{className:"lg:col-span-2",children:"Give a person or a sign-in group a role."}),(0,o.jsxs)("div",{className:"lg:col-span-2",children:[(0,o.jsxs)("p",{className:"font-semibold",children:["Access to:"," ",e.project===null?`Organization \xB7 ${e.organization}`:`Project \xB7 ${e.project}`]}),(0,o.jsx)("p",{className:"text-sm text-neutral-600",children:e.project===null?"Organization roles can give access across projects. To give a development group access, choose a project.":"This grant applies to this project."}),e.project===null?(0,o.jsx)("a",{className:"underline",href:"#/projects",children:"Choose a project"}):null]}),(0,o.jsxs)("fieldset",{className:"grid min-w-0 gap-2 lg:col-span-2",children:[(0,o.jsx)("legend",{className:"font-semibold",children:"Who gets access"}),["email","group"].map(p=>(0,o.jsxs)("div",{className:"flex items-center gap-2",children:[(0,o.jsx)("input",{id:`${t}-${p}-radio`,type:"radio",name:"type",value:p,checked:s.type===p,disabled:p==="group"&&(e.providerStatus!=="ready"||!e.providers.length),"aria-describedby":p==="group"?`${t}-provider-status`:void 0,onChange:()=>k({type:p})}),(0,o.jsx)($,{htmlFor:`${t}-${p}-radio`,children:p==="email"?"Person (email)":"Group (from your sign-in provider)"})]},p))]}),(0,o.jsx)("div",{id:`${t}-provider-status`,className:"lg:col-span-2",children:e.providerStatus==="error"?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("p",{role:"alert",children:"Sign-in providers could not be loaded. Try again."}),(0,o.jsx)(R,{type:"button",variant:"outline",onClick:e.retry,children:"Retry sign-in providers"})]}):e.providerStatus==="loading"?(0,o.jsx)("p",{children:"Loading sign-in providers\u2026"}):e.providers.length?null:(0,o.jsx)("p",{children:"Group access needs a sign-in provider that sends groups. Grant access to individual people instead."})}),s.type==="email"?(0,o.jsx)(A,{id:`${t}-email`,label:"Email address",help:"Use the person's sign-in email. Email matching ignores capitalization. Their provider must verify the email and allow its domain.",note:"This creates an access rule. No invitation email is sent.",error:r.email,children:(0,o.jsx)(F,{...b("email"),type:"email",name:"email",autoComplete:"email",placeholder:"alex@acme-company.example",value:s.email,onChange:p=>k({email:p.target.value})})}):(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("div",{className:"grid min-w-0 items-start gap-x-6 gap-y-4 lg:col-span-2 lg:grid-cols-2",children:e.providers.length===1?(0,o.jsxs)("p",{children:["Members signing in with ",h?.displayName]}):(0,o.jsx)(A,{id:`${t}-provider`,label:"Sign-in provider",help:"Choose the provider members use to sign in to Package Broker.",error:r.provider,children:(0,o.jsxs)(q,{...b("provider"),name:"provider",value:l,onChange:p=>k({provider:p.target.value}),children:[(0,o.jsx)("option",{value:"",children:"Choose a provider"}),e.providers.map(p=>(0,o.jsx)("option",{value:p.id,children:p.displayName},p.id))]})})}),(0,o.jsx)(A,{id:`${t}-group`,label:"Group value",help:"Use the exact group value sent by this provider. A group email works only if the provider sends that email as a group value.",note:"Package Broker cannot check whether this group exists. Ask a member to sign in and confirm their access after saving.",error:r.group,children:(0,o.jsx)(F,{...b("group"),name:"group",value:s.group,autoComplete:"off",spellCheck:!1,onChange:p=>k({group:p.target.value})})})]}),(0,o.jsx)(le,{catalogue:e.catalogue,project:e.project,id:`${t}-roleId`,value:a,onChange:p=>{m(!0),k({roleId:p})},error:r.roleId,retry:e.retry}),(0,o.jsxs)("div",{"aria-live":"polite",className:"min-w-0 break-words rounded border p-3 lg:col-span-2",children:[(0,o.jsx)("p",{children:Q(d,u,h,e.project,e.organization)}),s.type==="group"?(0,o.jsx)("p",{className:"text-sm",children:"Applies when the provider reports this exact group value."}):null]}),(0,o.jsx)("div",{className:"flex flex-col items-start sm:flex-row lg:col-span-2",children:(0,o.jsx)(R,{className:"w-full sm:w-auto lg:w-auto",type:"submit",disabled:e.busy||!I||s.type==="group"&&(e.providerStatus!=="ready"||!e.providers.length),children:"Create grant"})})]})}function ce({catalogue:e,project:t,currentRole:s,busy:n,retry:r,submit:c}){let f=(0,x.useId)(),[m,v]=(0,x.useState)(s),j=B(e.roles,t),a=!!m&&(e.status==="forbidden"||e.status==="ready"&&j.some(l=>l.id===m));return(0,o.jsxs)("form",{className:"grid max-w-5xl items-start gap-x-6 gap-y-4 lg:grid-cols-2",onSubmit:l=>{l.preventDefault(),!n&&a&&c(m)},children:[(0,o.jsx)("p",{className:"lg:col-span-2",children:"To change who this grant applies to, create a new grant and revoke this one."}),(0,o.jsx)(le,{id:f,catalogue:e,project:t,value:m,onChange:v,retry:r}),(0,o.jsx)("p",{"aria-live":"polite",className:"min-w-0 break-words lg:col-span-2",children:j.find(l=>l.id===m)?.name?`Save ${j.find(l=>l.id===m).name} ${t===null?"for the organization":`on project ${t}`}.`:"Choose a role to review this grant."}),(0,o.jsx)("div",{className:"flex flex-col items-start sm:flex-row lg:col-span-2",children:(0,o.jsx)(R,{className:"w-full sm:w-auto lg:w-auto",type:"submit",disabled:n||!a,children:"Save role"})})]})}var L=z(K(),1);var i=z(_(),1),ue=["grants","roles"],W=e=>X(e,ue),ve=e=>O("access",W(O("access",e))),M=e=>e.query.project===null&&e.query.status==="roles";function G(e){let t=!e.loading&&!e.stale,s=e.query.q?.toLowerCase()??"";return{roles:e.roles.filter(n=>n.name.toLowerCase().startsWith(s)),grants:e.grants.filter(n=>[n.principalName,n.principalId,n.id].some(r=>r?.toLowerCase().startsWith(s))),writeRoles:t&&e.query.project===null&&e.organization.includes("org:roles:write"),writeGrants:t&&(e.query.project===null?e.organization.includes("org:grants:write"):e.permissions.includes("project:grants:write"))}}function ye(e){let t=Z({query:{project:null},roles:[],catalogue:{roles:[],status:"loading"},providers:[],providerStatus:"loading",organizationName:"this organization",grants:[],next:null,organization:[],permissions:[],loading:!1,listError:!1,busy:!1,stale:!1,notice:null}),{client:s}=e,n=0,r=0;async function c(){let a=++r,l=n;t.set({catalogue:{roles:[],status:"loading"},providerStatus:"loading"});let[d,u,h]=await Promise.all([ie(s),s.request("get","/_pb/auth/providers"),s.request("get","/_pb/organization")]);a!==r||l!==n||t.set({catalogue:d,providers:u.ok?u.data.providers:[],providerStatus:u.ok?"ready":"error",organizationName:h.ok?h.data.name:"this organization"})}async function f(a,l=null){let d=++n;t.set({query:a,roles:[],grants:[],next:null,organization:[],permissions:[],loading:!0,listError:!1,busy:!1,stale:!1,notice:l});let[u,h]=await Promise.all([s.request("get","/_pb/me/permissions"),a.project===null?null:s.request("get","/_pb/projects/{project}/permissions",{params:{project:a.project}})]);if(d!==n)return;let b=u.ok?u.data.organization:[],k=h?.ok?h.data.project:[];t.set({organization:b,permissions:k});let I=M(t.snapshot()),p=a.project===null?b.includes("org:grants:write"):k.includes("project:grants:write");if(!I&&p&&await c(),d!==n)return;if(!(a.project===null?b.includes(I?"org:roles:read":"org:grants:read"):k.includes("project:grants:read"))){t.set({loading:!1,listError:!0,notice:"You do not have permission to view this list."});return}let w={after:a.after,limit:"50"};if(I){let g=await s.request("get","/_pb/roles",{query:w});if(d!==n)return;t.set({loading:!1,listError:!g.ok,roles:g.ok?g.data.items:[],next:g.ok?g.data.next:null,notice:g.ok?l:C(g)})}else if(a.project!==null){let g=await s.request("get","/_pb/projects/{project}/grants",{params:{project:a.project},query:w});if(d!==n)return;t.set({loading:!1,listError:!g.ok,grants:g.ok?g.data.items.map(y=>({id:y.id,principalId:y.principal.id,principalName:y.principal.displayName,kind:y.principal.kind,roleId:y.role.id,roleName:y.role.name,revision:y.revision,createdAt:y.createdAt})):[],next:g.ok?g.data.next:null,notice:g.ok?l:C(g)})}else{let g=await s.request("get","/_pb/grants",{query:w});if(d!==n)return;t.set({loading:!1,listError:!g.ok,grants:g.ok?g.data.items.map(y=>({id:y.id,principalId:null,principalName:null,kind:y.subject.type,roleId:y.roleId,roleName:y.roleId,revision:y.revision,createdAt:y.createdAt})):[],next:g.ok?g.data.next:null,notice:g.ok?l:C(g)})}}async function m(a,l="Access updated.",d=!1){let u=t.snapshot();if(u.busy||u.loading||u.stale)return;let h=n;t.set({busy:!0,notice:null});let b=await a();h===n&&(t.set({busy:!1}),ee(e,b)?t.set({stale:!0,notice:"Complete reauthentication and confirm the pending action."}):b.ok?await f(u.query,l):t.set({stale:b.status===412,notice:d&&b.status===412?"This grant changed. Reload it before saving.":C(b)}))}let v=a=>{let l=t.snapshot(),d=l.roles.find(u=>u.id===a);return G(l).writeRoles&&d&&!d.isSystem&&N(d.revision)?d:null},j=a=>{let l=t.snapshot(),d=l.grants.find(u=>u.id===a);return G(l).writeGrants&&d&&N(d.revision)?d:null};return{snapshot:t.snapshot,subscribe:t.subscribe,load:f,loadFormOptions:c,async createGrant(a){let l=t.snapshot();if(!G(l).writeGrants)return;let d=Q({type:a.subject.type,email:a.subject.type==="email"?a.subject.value:"",group:a.subject.type==="group"?a.subject.value:"",provider:a.subject.type==="group"?a.subject.provider:"",roleId:a.roleId},l.catalogue.roles.find(u=>u.id===a.roleId),a.subject.type==="group"?l.providers.find(u=>a.subject.type==="group"&&u.id===a.subject.provider):void 0,l.query.project,l.organizationName);await m(()=>l.query.project===null?s.request("post","/_pb/grants",{body:a,idempotencyKey:crypto.randomUUID()}):s.request("post","/_pb/projects/{project}/grants",{params:{project:l.query.project},body:a,idempotencyKey:crypto.randomUUID()}),`Grant created. Access depends on the person's email or the groups their provider reports at sign-in. ${d}`,!0)},async changeGrant(a,l){let d=j(a);if(!d)return;let u=t.snapshot().query.project,h={"If-Match":N(d.revision)};await m(()=>u===null?s.request("patch","/_pb/grants/{grant}",{params:{grant:a},headers:h,body:{roleId:l}}):s.request("patch","/_pb/projects/{project}/grants/{grant}",{params:{project:u,grant:a},headers:h,body:{roleId:l}}),void 0,!0)},async revoke(a){let l=j(a);if(!l)return;let d=t.snapshot().query.project,u={"If-Match":N(l.revision)};await m(()=>d===null?s.request("delete","/_pb/grants/{grant}",{params:{grant:a},headers:u}):s.request("delete","/_pb/projects/{project}/grants/{grant}",{params:{project:d,grant:a},headers:u}),void 0,!0)},async createRole(a){G(t.snapshot()).writeRoles&&await m(()=>s.request("post","/_pb/roles",{body:a,idempotencyKey:crypto.randomUUID()}))},async updateRole(a,l){let d=v(a);d&&await m(()=>s.request("patch","/_pb/roles/{role}",{params:{role:a},headers:{"If-Match":N(d.revision)},body:l}))},async deleteRole(a){let l=v(a);l&&await m(()=>s.request("delete","/_pb/roles/{role}",{params:{role:a},headers:{"If-Match":N(l.revision)}}))},async replayed(a){let l=t.snapshot().query.project,d=l===null?M(t.snapshot())?"/_pb/roles":"/_pb/grants":`/_pb/projects/${encodeURIComponent(l)}/grants`;a.path!==d&&!a.path.startsWith(`${d}/`)||(a.ok?await f(t.snapshot().query,"Access updated."):t.set({stale:!0,notice:a.status===412&&!M(t.snapshot())?"This grant changed. Reload it before saving.":C(a)}))},dispose(){++n}}}var de=(e="")=>e.split(/[\s,]+/).filter(Boolean);function fe({state:e,controller:t}){let s=G(e),n=!e.loading&&(e.query.project===null?e.organization.includes("org:grants:write"):e.permissions.includes("project:grants:write"));return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(re,{...e,reload:()=>{t.load(e.query)}}),M(e)?(0,i.jsxs)(i.Fragment,{children:[!e.loading&&!e.listError&&s.roles.length?(0,i.jsx)(V,{label:"Roles",items:s.roles,columns:[{key:"name",label:"Role",value:r=>r.name,render:r=>(0,i.jsxs)("div",{className:"grid gap-1",children:[(0,i.jsx)("strong",{children:r.name}),(0,i.jsx)(D,{value:r.id,label:"role ID"}),r.isSystem?(0,i.jsx)(E,{variant:"outline",children:"System"}):null,r.protectsLastHolder?(0,i.jsx)("span",{className:"text-xs text-neutral-600",children:"Last holder protected"}):null]})},{key:"scope",label:"Scope",value:r=>r.scope},{key:"permissions",label:"Permissions",value:r=>r.permissions.join(", "),render:r=>(0,i.jsx)("div",{className:"flex flex-wrap gap-1",children:r.permissions.map(c=>(0,i.jsx)(E,{variant:"outline",children:c},c))})},{key:"actions",label:"Actions",value:()=>"",sortable:!1,render:r=>s.writeRoles&&!r.isSystem&&N(r.revision)?(0,i.jsxs)("details",{children:[(0,i.jsx)("summary",{className:"cursor-pointer underline",children:"Edit role"}),(0,i.jsxs)("div",{className:"mt-3 grid gap-3",children:[(0,i.jsxs)("form",{className:"grid gap-2",onSubmit:c=>{if(c.preventDefault(),e.busy)return;let f=T(c);t.updateRole(r.id,{name:f.name??""})},children:[(0,i.jsx)(S,{name:"name",label:"Role name",value:r.name}),(0,i.jsx)(R,{type:"submit",disabled:e.busy,children:"Rename role"})]}),(0,i.jsxs)("form",{className:"grid gap-2",onSubmit:c=>{if(c.preventDefault(),e.busy)return;let f=T(c);t.updateRole(r.id,{permissions:de(f.permissions)})},children:[(0,i.jsx)(S,{name:"permissions",label:"Permissions (comma separated)",value:r.permissions.join(", "),required:!1}),(0,i.jsx)(R,{type:"submit",disabled:e.busy,children:"Save permissions"})]}),(0,i.jsx)(U,{action:"Remove role",target:`${r.name} (${r.id})`,scope:"Organization",description:"Deleting this role removes its permission bundle. Review grants using this role before continuing. This cannot be undone.",disabled:e.busy,onConfirm:()=>{t.deleteRole(r.id)}},`${r.id}:${r.revision}`)]})]}):null}]}):null,s.writeRoles?(0,i.jsxs)("details",{className:"detail-group my-6",children:[(0,i.jsx)("summary",{className:"cursor-pointer font-semibold",children:"New role"}),(0,i.jsxs)("form",{className:"my-6 grid gap-3",onSubmit:r=>{if(r.preventDefault(),e.busy)return;let c=T(r);t.createRole({key:c.key??"",name:c.name??"",scope:c.scope,permissions:de(c.permissions)})},children:[(0,i.jsx)("h2",{className:"text-lg font-semibold",children:"New role"}),(0,i.jsx)(S,{name:"key",label:"Role key"}),(0,i.jsx)(S,{name:"name",label:"Role name"}),(0,i.jsxs)($,{className:"grid gap-1",children:["Scope",(0,i.jsxs)(q,{name:"scope",children:[(0,i.jsx)("option",{value:"organization",children:"Organization"}),(0,i.jsx)("option",{value:"project",children:"Project"})]})]}),(0,i.jsx)(S,{name:"permissions",label:"Permissions (comma separated)",required:!1}),(0,i.jsx)(R,{type:"submit",disabled:e.busy,children:"Create role"})]})]}):null]}):(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("h2",{className:"my-3 text-lg font-semibold",children:e.query.project===null?"Organization grants":"Members and project grants"}),!e.loading&&!e.listError&&s.grants.length?(0,i.jsx)(V,{label:e.query.project===null?"Organization grants":"Members and project grants",items:s.grants,columns:[{key:"principal",label:"Principal / grant",value:r=>r.principalName??r.principalId??r.id,render:r=>(0,i.jsxs)("div",{className:"grid gap-1",children:[(0,i.jsx)("strong",{children:r.principalName??"Grant"}),(0,i.jsx)(D,{value:r.principalId??r.id,label:r.principalId?"principal ID":"grant ID"})]})},{key:"kind",label:"Kind",value:r=>r.kind,render:r=>(0,i.jsx)(E,{variant:"outline",children:r.kind})},{key:"role",label:"Role",value:r=>r.roleName},{key:"added",label:"Added",value:r=>r.createdAt,priority:2,render:r=>(0,i.jsx)(ae,{value:r.createdAt})},{key:"id",label:"Grant ID",value:r=>r.id,priority:3,render:r=>(0,i.jsx)(D,{value:r.id,label:"grant ID"})},{key:"actions",label:"Actions",value:()=>"",sortable:!1,render:r=>n&&N(r.revision)?(0,i.jsxs)("details",{children:[(0,i.jsx)("summary",{className:"cursor-pointer underline",children:"Change role"}),(0,i.jsxs)("div",{className:"mt-3 grid gap-2",children:[(0,i.jsx)(ce,{catalogue:e.catalogue,project:e.query.project,currentRole:r.roleId,busy:e.busy||e.stale,retry:()=>{t.loadFormOptions()},submit:c=>t.changeGrant(r.id,c)}),(0,i.jsx)(U,{action:"Revoke grant",target:`${r.principalName??r.principalId??r.id} \xB7 ${e.catalogue.roles.find(c=>c.id===r.roleId)?.name??r.roleName}`,scope:e.query.project===null?"Organization":`Project: ${e.query.project}`,description:"This removes the access provided by this grant. Other grants still apply. To restore this access, create a new grant.",disabled:e.busy||e.stale,onConfirm:()=>{t.revoke(r.id)}},`${r.id}:${r.revision}`)]})]}):null}]}):null,n?(0,i.jsxs)("details",{className:"detail-group my-6",children:[(0,i.jsx)("summary",{className:"cursor-pointer font-semibold",children:"New grant"}),(0,i.jsx)(pe,{catalogue:e.catalogue,providers:e.providers,providerStatus:e.providerStatus,project:e.query.project,organization:e.organizationName,busy:e.busy||e.stale,retry:()=>{t.loadFormOptions()},submit:r=>t.createGrant(r)},e.query.project??"organization")]}):null]}),!e.loading&&!e.listError&&(M(e)?s.roles:s.grants).length===0?(0,i.jsx)(J,{kind:e.query.q?"filtered-empty":"empty",title:"No entries found on this page."}):null,e.next?(0,i.jsx)("a",{className:"my-4 inline-block underline",href:ve({...e.query,after:e.next}),children:"Next entries"}):null]})}function Be(){let e=Y(),t=(0,L.useMemo)(()=>ye(e),[e]),s=(0,L.useSyncExternalStore)(t.subscribe,t.snapshot,t.snapshot),n=oe(e,t,W,"access"),r=W(n);return(0,i.jsxs)("section",{"aria-labelledby":"page-heading",children:[(0,i.jsx)("h1",{tabIndex:-1,id:"page-heading",className:"text-xl font-semibold",children:"Access"}),(0,i.jsx)("p",{className:"mt-1 text-neutral-600",children:"Membership comes from project grants. A role is the bundle of permissions a grant carries."}),(0,i.jsx)(te,{route:"access",query:r,statuses:r.project===null?ue:["grants"]},n),(0,i.jsx)(fe,{state:s,controller:t})]})}export{Be as AccessPage,fe as AccessView,G as accessViewModel,ve as buildAccessHash,ye as createAccessController,W as parseAccessHash};
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-900:oklch(41.4% .112 45.904);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-800:oklch(43.2% .095 166.913);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-700:oklch(37.3% .034 259.733);--color-neutral-50:oklch(98.5% 0 none);--color-neutral-100:oklch(97% 0 none);--color-neutral-200:oklch(92.2% 0 none);--color-neutral-300:oklch(87% 0 none);--color-neutral-500:oklch(55.6% 0 none);--color-neutral-600:oklch(43.9% 0 none);--color-neutral-700:oklch(37.1% 0 none);--color-neutral-900:oklch(20.5% 0 none);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-5xl:64rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--leading-snug:1.375;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}body{color:#171717;background:#fafafa;font-size:14px}:focus-visible{outline-offset:2px;outline:2px solid #155dfc}h1{letter-spacing:-.01em}}@layer components;@layer utilities{.\@container{container-type:inline-size}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:0}.top-4{top:calc(var(--spacing) * 4)}.right-4{right:calc(var(--spacing) * 4)}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-4{margin:calc(var(--spacing) * 4)}.m-auto{margin:auto}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.my-3{margin-block:calc(var(--spacing) * 3)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-6{margin-block:calc(var(--spacing) * 6)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mr-auto{margin-right:auto}.mb-1{margin-bottom:var(--spacing)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.h-4{height:calc(var(--spacing) * 4)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-auto{height:auto}.h-dvh{height:100dvh}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-\[90dvh\]{max-height:90dvh}.max-h-none{max-height:none}.min-h-0{min-height:0}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-24{min-height:calc(var(--spacing) * 24)}.min-h-screen{min-height:100vh}.w-4{width:calc(var(--spacing) * 4)}.w-11{width:calc(var(--spacing) * 11)}.w-36{width:calc(var(--spacing) * 36)}.w-\[calc\(100\%_-_2rem\)\]{width:calc(100% - 2rem)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.min-w-32{min-width:calc(var(--spacing) * 32)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0{gap:0}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-y-4{row-gap:calc(var(--spacing) * 4)}.self-end{align-self:flex-end}.justify-self-start{justify-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-amber-300{border-color:var(--color-amber-300)}.border-blue-200{border-color:var(--color-blue-200)}.border-emerald-200{border-color:var(--color-emerald-200)}.border-gray-400{border-color:var(--color-gray-400)}.border-neutral-200{border-color:var(--color-neutral-200)}.border-neutral-300{border-color:var(--color-neutral-300)}.border-red-200{border-color:var(--color-red-200)}.border-red-300{border-color:var(--color-red-300)}.border-transparent{border-color:#0000}.bg-amber-50{background-color:var(--color-amber-50)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-700{background-color:var(--color-blue-700)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-neutral-50{background-color:var(--color-neutral-50)}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-700{background-color:var(--color-red-700)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-0{padding-inline:0}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.pt-0{padding-top:0}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pr-16{padding-right:calc(var(--spacing) * 16)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-\[max\(1rem\,env\(safe-area-inset-bottom\)\)\]{padding-bottom:max(1rem, env(safe-area-inset-bottom))}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-6{padding-left:calc(var(--spacing) * 6)}.text-left{text-align:left}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-900{color:var(--color-amber-900)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-emerald-800{color:var(--color-emerald-800)}.text-gray-700{color:var(--color-gray-700)}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-600{color:var(--color-neutral-600)}.text-neutral-700{color:var(--color-neutral-700)}.text-neutral-900{color:var(--color-neutral-900)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-red-900{color:var(--color-red-900)}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.accent-blue-700{accent-color:var(--color-blue-700)}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.\[image-rendering\:pixelated\]{image-rendering:pixelated}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.placeholder\:text-neutral-500::placeholder{color:var(--color-neutral-500)}.backdrop\:bg-black\/50::backdrop{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.backdrop\:bg-black\/50::backdrop{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.open\:flex:is([open],:popover-open,:open){display:flex}@media (hover:hover){.hover\:bg-blue-800:hover{background-color:var(--color-blue-800)}.hover\:bg-neutral-50:hover{background-color:var(--color-neutral-50)}.hover\:bg-neutral-100:hover{background-color:var(--color-neutral-100)}.hover\:bg-neutral-200:hover{background-color:var(--color-neutral-200)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-800:hover{background-color:var(--color-red-800)}.hover\:text-red-800:hover{color:var(--color-red-800)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-blue-600:focus{--tw-ring-color:var(--color-blue-600)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-blue-600:focus-visible{--tw-ring-color:var(--color-blue-600)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.has-checked\:border-blue-700:has(:checked){border-color:var(--color-blue-700)}.has-checked\:bg-blue-50:has(:checked){background-color:var(--color-blue-50)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[highlighted\]\:bg-neutral-100[data-highlighted]{background-color:var(--color-neutral-100)}.data-\[state\=active\]\:bg-white[data-state=active]{background-color:var(--color-white)}.data-\[state\=active\]\:text-neutral-900[data-state=active]{color:var(--color-neutral-900)}.data-\[state\=active\]\:shadow[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}@media (min-width:40rem){.sm\:h-auto{height:auto}.sm\:max-h-\[90dvh\]{max-height:90dvh}.sm\:min-h-8{min-height:calc(var(--spacing) * 8)}.sm\:w-\[calc\(100\%_-_2rem\)\]{width:calc(100% - 2rem)}.sm\:w-auto{width:auto}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:grid-cols-\[1fr_2fr_auto\]{grid-template-columns:1fr 2fr auto}.sm\:flex-row{flex-direction:row}.sm\:rounded-lg{border-radius:var(--radius-lg)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:py-1{padding-block:var(--spacing)}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (min-width:48rem){.md\:hidden{display:none}}@media (min-width:64rem){.lg\:not-sr-only{clip-path:none;white-space:normal;width:auto;height:auto;margin:0;padding:0;position:static;overflow:visible}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:hidden{display:none}.lg\:w-48{width:calc(var(--spacing) * 48)}.lg\:w-auto{width:auto}.lg\:max-w-5xl{max-width:var(--container-5xl)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}.\[\&_button\]\:min-h-11 button{min-height:calc(var(--spacing) * 11)}.\[\&_button\]\:min-w-11 button{min-width:calc(var(--spacing) * 11)}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}}.shell-header{background:#fff;border-bottom:1px solid #e5e5e5;flex-wrap:wrap;align-items:center;gap:8px;padding:8px 12px;display:flex}.shell-brand{white-space:nowrap;font-size:15px}.shell-nav{border-top:1px solid #e5e5e5;order:10;width:100%;padding-top:8px;display:none}.shell-nav.is-open{display:grid}.shell-nav-group{margin:0;padding:0;list-style:none}.shell-nav-divider{border:0;border-top:1px solid #e5e5e5;margin:8px 0}.shell-nav a{padding:10px 12px}@media (min-width:1024px){.shell-header{flex-wrap:nowrap}.shell-nav,.shell-nav.is-open{border:0;flex-wrap:wrap;flex:1;order:0;width:auto;min-width:0;padding:0;display:flex}.shell-nav-group{flex-wrap:wrap;align-items:center;display:flex}.shell-nav-administration{margin-left:auto}.shell-nav-divider{display:none}.shell-nav a{padding:6px 10px}}@media (max-width:420px){.shell-brand{white-space:normal;max-width:62px;line-height:1.2}}.list-card{background:#fff;border:1px solid #e5e5e5;border-radius:6px;min-width:0;overflow:hidden}.column-options{color:#525252;border-bottom:1px solid #e5e5e5;padding:10px 16px}.column-options summary{cursor:pointer}.card-sort{border-bottom:1px solid #e5e5e5;flex-wrap:wrap;align-items:center;gap:8px;padding:10px 16px;display:none}.card-sort select,.column-options select{background:#fff;border:1px solid #d4d4d4;border-radius:4px;min-width:0;max-width:100%;padding:4px}.table-container{width:100%;min-width:0;container:broker-table/inline-size}.table-scroll{background-color:#0000;background-image:linear-gradient(90deg,#fff 30%,#0000),linear-gradient(270deg,#fff 30%,#0000),linear-gradient(90deg,#d4d4d4,#0000),linear-gradient(270deg,#d4d4d4,#0000);background-position:0,100%,0,100%;background-repeat:no-repeat;background-size:32px 100%,32px 100%,12px 100%,12px 100%;background-attachment:local,local,scroll,scroll;background-origin:padding-box,padding-box,padding-box,padding-box;background-clip:border-box,border-box,border-box,border-box;max-width:100%;overflow-x:auto}.table-hint{color:#525252;border-bottom:1px solid #e5e5e5;padding:6px 12px;font-size:12px}.responsive-table{border-collapse:separate;border-spacing:0}.responsive-table th{white-space:nowrap}.responsive-table th:first-child,.responsive-table td:first-child{z-index:1;background:#fff;position:sticky;left:0;box-shadow:1px 0 #e5e5e5}.responsive-table td{overflow-wrap:anywhere}.responsive-table tr[aria-selected=true] td{background:#eff6ff}.responsive-table button{white-space:normal;overflow-wrap:anywhere;max-width:100%}@container broker-table (max-width:1140px){.responsive-table .priority-3:not([data-visibility=visible]){display:none}}@container broker-table (max-width:960px){.responsive-table .priority-2:not([data-visibility=visible]){display:none}}@container broker-table (max-width:640px){.card-sort{display:flex}.table-hint{display:none}.responsive-table thead{clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}.responsive-table,.responsive-table tbody{width:100%;display:block}.responsive-table tbody tr{padding:10px 16px;display:block}.responsive-table td,.responsive-table td.priority-2:not([data-visibility=visible]),.responsive-table td.priority-3:not([data-visibility=visible]){border:0;justify-content:space-between;align-items:baseline;gap:12px;padding:4px 0;display:flex}.responsive-table td:before{content:attr(data-label);color:#525252;flex:0 0 34%;font-size:12px}.responsive-table .cell-value{text-align:right;flex:1;min-width:0}.responsive-table td:first-child{box-shadow:none;padding-bottom:8px;position:static}.responsive-table td:first-child:before{display:none}.responsive-table td:first-child .cell-value{text-align:left}}.filter-toolbar form{flex-wrap:wrap;align-items:end;gap:12px;display:flex}.filter-toolbar form>div{flex:160px;gap:6px;min-width:0;display:grid}.filter-chip{background:#fff;border:1px solid #d4d4d4;border-radius:999px;align-items:center;gap:4px;max-width:100%;padding-left:10px;font-size:12px;display:inline-flex}@media (max-width:767px){.filter-toolbar{background:#fff;border:1px solid #e5e5e5;border-radius:6px}.filter-toolbar form{margin:0;padding:0 12px 12px}.filter-toolbar form>div{flex-basis:100%}.filter-toolbar input,.filter-toolbar select{font-size:16px}}.list-state{text-align:center;color:#525252;border:1px dashed #d4d4d4;border-radius:8px;justify-items:center;gap:8px;margin:16px 0;padding:36px 16px;display:grid}.list-state strong{color:#171717;font-weight:500}.list-state-error{background:#fef2f2;border-style:solid;border-color:#ffc9c9}.detail-grid{grid-template-columns:repeat(auto-fit,minmax(min(100%,280px),1fr));gap:12px;display:grid}.detail-group{background:#fff;border:1px solid #e5e5e5;border-radius:6px;min-width:0;padding:16px}.detail-group h3{color:#525252;text-transform:uppercase;letter-spacing:.04em;margin-bottom:12px;font-size:12px;font-weight:600}.detail-list{grid-template-columns:max-content minmax(0,1fr);gap:8px 20px;display:grid}.detail-list dt{color:#525252}.detail-list dd{overflow-wrap:anywhere;min-width:0}@media (max-width:480px){.detail-list{grid-template-columns:minmax(0,1fr);gap:2px}.detail-list dd{margin-bottom:8px}}[data-overlay-host]{z-index:50;position:relative}.menu-positioner{z-index:50}.menu-popup{max-width:var(--available-width);max-height:var(--available-height);overscroll-behavior:contain;overflow:auto}.product-footer{color:#525252;text-align:center;flex-wrap:wrap;justify-content:center;align-items:center;gap:4px 16px;padding:16px;font-size:12px;line-height:16px;display:flex}.product-footer a{text-underline-offset:2px;align-items:center;min-height:44px;text-decoration:underline;display:inline-flex}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}