1import{j as e}from"./index-CfHooNjQ.js";import{a as i,d as a}from"./react-vendor-QaboSCKR.js";import{u as t}from"./useTeamLive-C7u1kmWb.js";import{auth as l}from"./firebase-C59sj7zD.js";import{u as n}from"./useTenantId-BAzpvh6v.js";import{p as s}from"./toast-UW4uwVCl.js";import{p as o,P as r}from"./useWelcomeProgress-9E0RMv5J.js";import{H as c}from"./Hero-_H0rS6wZ.js";import{M as d}from"./routes-aN95rY8g.js";import{C as m}from"./Cinzel-BoqX7UTZ.js";import"./lenis-CYZ9w2j8.js";import"./framer-vv-CY5AZ.js";import"./gsap-CvrrfOyh.js";import"./firebase-firestore-9imLgH6W.js";import"./firebase-app-NszzeGgl.js";import"./firestore-DsC8L1pI.js";import"./useFirestoreSnapshot-DnG3vPBf.js";import"./useAuth-CGdeD6Lm.js";import"./use-reduced-motion-CiAw0R6O.js";import"./livekit-UlB0541D.js";import"./nadia-CbP0KdC-.js";import"./priya-chat-Cooaxzza.js";import"./ops-v4-routes-D6xdeB8x.js";import"./index-COVke7E_.js";import"./x-BnI8hONJ.js";const p=new Map([["bold",i.createElement(i.Fragment,null,i.createElement("path",{d:"M169.57,46.11a12,12,0,0,1,15.12-7.7L188,39.48V36a12,12,0,0,1,24,0v3.48l3.31-1.07a12,12,0,1,1,7.42,22.82l-3.31,1.08,2,2.82a12,12,0,1,1-19.41,14.1L200,76.42,198,79.23a12,12,0,1,1-19.41-14.1l2-2.82-3.31-1.08A12,12,0,0,1,169.57,46.11ZM236,128A108,108,0,1,1,128,20a109.19,109.19,0,0,1,18,1.49,12,12,0,0,1-4,23.67A85,85,0,0,0,128,44,83.94,83.94,0,0,0,62.05,179.94a83.48,83.48,0,0,1,29-23.42,52,52,0,1,1,74,0,83.48,83.48,0,0,1,29,23.42A83.57,83.57,0,0,0,212,128a85.2,85.2,0,0,0-1.16-14,12,12,0,0,1,23.67-4A109,109,0,0,1,236,128ZM128,148a28,28,0,1,0-28-28A28,28,0,0,0,128,148Zm0,64a83.53,83.53,0,0,0,48.43-15.43,60,60,0,0,0-96.86,0A83.53,83.53,0,0,0,128,212Z"}))],["duotone",i.createElement(i.Fragment,null,i.createElement("path",{d:"M224,128a95.76,95.76,0,0,1-31.8,71.37A72,72,0,0,0,128,160a40,40,0,1,0-40-40,40,40,0,0,0,40,40,72,72,0,0,0-64.2,39.37h0A96,96,0,0,1,184.92,50.69a16,16,0,0,0,20.39,20.39A95.61,95.61,0,0,1,224,128Z",opacity:"0.2"}),i.createElement("path",{d:"M228.25,63.07l-4.66-2.69a23.6,23.6,0,0,0,0-8.76l4.66-2.69a8,8,0,0,0-8-13.86l-4.67,2.7A23.92,23.92,0,0,0,208,33.38V28a8,8,0,0,0-16,0v5.38a23.92,23.92,0,0,0-7.58,4.39l-4.67-2.7a8,8,0,1,0-8,13.86l4.66,2.69a23.6,23.6,0,0,0,0,8.76l-4.66,2.69a8,8,0,0,0,4,14.93,7.92,7.92,0,0,0,4-1.07l4.67-2.7A23.92,23.92,0,0,0,192,78.62V84a8,8,0,0,0,16,0V78.62a23.92,23.92,0,0,0,7.58-4.39l4.67,2.7a7.92,7.92,0,0,0,4,1.07,8,8,0,0,0,4-14.93ZM192,56a8,8,0,1,1,8,8A8,8,0,0,1,192,56Zm29.35,48.11a8,8,0,0,0-6.57,9.21A88.85,88.85,0,0,1,216,128a87.62,87.62,0,0,1-22.24,58.41,79.66,79.66,0,0,0-36.06-28.75,48,48,0,1,0-59.4,0,79.66,79.66,0,0,0-36.06,28.75A88,88,0,0,1,128,40a88.76,88.76,0,0,1,14.68,1.22,8,8,0,0,0,2.64-15.78,103.92,103.92,0,1,0,85.24,85.24A8,8,0,0,0,221.35,104.11ZM96,120a32,32,0,1,1,32,32A32,32,0,0,1,96,120ZM74.08,197.5a64,64,0,0,1,107.84,0,87.83,87.83,0,0,1-107.84,0Z"}))],["fill",i.createElement(i.Fragment,null,i.createElement("path",{d:"M228.25,63.07l-4.66-2.69a23.6,23.6,0,0,0,0-8.76l4.66-2.69a8,8,0,0,0-8-13.86l-4.67,2.7A23.92,23.92,0,0,0,208,33.38V28a8,8,0,0,0-16,0v5.38a23.92,23.92,0,0,0-7.58,4.39l-4.67-2.7a8,8,0,1,0-8,13.86l4.66,2.69a23.6,23.6,0,0,0,0,8.76l-4.66,2.69a8,8,0,0,0,4,14.93,7.92,7.92,0,0,0,4-1.07l4.67-2.7A23.92,23.92,0,0,0,192,78.62V84a8,8,0,0,0,16,0V78.62a23.92,23.92,0,0,0,7.58-4.39l4.67,2.7a7.92,7.92,0,0,0,4,1.07,8,8,0,0,0,4-14.93ZM200,64a8,8,0,1,1,8-8A8,8,0,0,1,200,64ZM128,76a44,44,0,1,1-44,44A44,44,0,0,1,128,76Zm102.56,34.68a103.92,103.92,0,1,1-85.24-85.24,8,8,0,0,1-2.64,15.78A88.07,88.07,0,0,0,40,128a87.62,87.62,0,0,0,22.24,58.41A79.71,79.71,0,0,1,84,165.1a4,4,0,0,1,4.83.32,59.81,59.81,0,0,0,78.27,0,4,4,0,0,1,4.84-.32,79.86,79.86,0,0,1,21.79,21.31A87.62,87.62,0,0,0,216,128a88.85,88.85,0,0,0-1.22-14.68,8,8,0,1,1,15.78-2.64Z"}))],["light",i.createElement(i.Fragment,null,i.createElement("path",{d:"M227.25,64.8l-5.92-3.41a22,22,0,0,0,0-10.78l5.92-3.41a6,6,0,0,0-6-10.4l-5.93,3.43A22,22,0,0,0,206,34.84V28a6,6,0,0,0-12,0v6.84a22,22,0,0,0-9.32,5.39l-5.93-3.43a6,6,0,0,0-6,10.4l5.92,3.41a22,22,0,0,0,0,10.78l-5.92,3.41a6,6,0,0,0,6,10.4l5.93-3.43A22,22,0,0,0,194,77.16V84a6,6,0,0,0,12,0V77.16a22,22,0,0,0,9.32-5.39l5.93,3.43a6,6,0,0,0,6-10.4ZM200,
166a10,10,0,1,1,10-10A10,10,0,0,1,200,66Zm21.68,40.08a6,6,0,0,0-4.92,6.91A91.76,91.76,0,0,1,218,128a89.65,89.65,0,0,1-24.49,61.64,77.53,77.53,0,0,0-40-31.38,46,46,0,1,0-51,0,77.53,77.53,0,0,0-40,31.38A89.95,89.95,0,0,1,128,38a91.66,91.66,0,0,1,15,1.24,6,6,0,1,0,2-11.83,102,102,0,1,0,50,177.44c.65,1.36,1.68,0,2.34-2.11A102,102,0,0,0,228.59,111,6,6,0,0,0,221.68,106.08ZM94,120a34,34,0,1,1,34,34A34,34,0,0,1,94,120ZM71.44,198a66,66,0,0,1,113.12,0,89.8,89.8,0,0,1-113.12,0Z"}))],["regular",i.createElement(i.Fragment,null,i.createElement("path",{d:"M228.25,63.07l-4.66-2.69a23.6,23.6,0,0,0,0-8.76l4.66-2.69a8,8,0,0,0-8-13.86l-4.67,2.7A23.92,23.92,0,0,0,208,33.38V28a8,8,0,0,0-16,0v5.38a23.92,23.92,0,0,0-7.58,4.39l-4.67-2.7a8,8,0,1,0-8,13.86l4.66,2.69a23.6,23.6,0,0,0,0,8.76l-4.66,2.69a8,8,0,0,0,4,14.93,7.92,7.92,0,0,0,4-1.07l4.67-2.7A23.92,23.92,0,0,0,192,78.62V84a8,8,0,0,0,16,0V78.62a23.92,23.92,0,0,0,7.58-4.39l4.67,2.7a7.92,7.92,0,0,0,4,1.07,8,8,0,0,0,4-14.93ZM192,56a8,8,0,1,1,8,8A8,8,0,0,1,192,56Zm29.35,48.11a8,8,0,0,0-6.57,9.21A88.85,88.85,0,0,1,216,128a87.62,87.62,0,0,1-22.24,58.41,79.66,79.66,0,0,0-36.06-28.75,48,48,0,1,0-59.4,0,79.66,79.66,0,0,0-36.06,28.75A88,88,0,0,1,128,40a88.76,88.76,0,0,1,14.68,1.22,8,8,0,0,0,2.64-15.78,103.92,103.92,0,1,0,85.24,85.24A8,8,0,0,0,221.35,104.11ZM96,120a32,32,0,1,1,32,32A32,32,0,0,1,96,120ZM74.08,197.5a64,64,0,0,1,107.84,0,87.83,87.83,0,0,1-107.84,0Z"}))],["thin",i.createElement(i.Fragment,null,i.createElement("path",{d:"M226.25,66.54,219,62.33a19.78,19.78,0,0,0,0-12.66l7.29-4.21a4,4,0,0,0-4-6.92l-7.31,4.21A20,20,0,0,0,204,36.4V28a4,4,0,0,0-8,0v8.4a20,20,0,0,0-10.94,6.35l-7.31-4.21a4,4,0,1,0-4,6.92L181,49.67a19.78,19.78,0,0,0,0,12.66l-7.29,4.21a4,4,0,0,0,2,7.46,3.92,3.92,0,0,0,2-.54l7.31-4.21A20,20,0,0,0,196,75.6V84a4,4,0,0,0,8,0V75.6a20,20,0,0,0,10.94-6.35l7.31,4.21a3.92,3.92,0,0,0,2,.54,4,4,0,0,0,2-7.46ZM200,68a12,12,0,1,1,12-12A12,12,0,0,1,200,68Zm22,40.06a4,4,0,0,0-3.28,4.6A93.58,93.58,0,0,1,220,128a91.69,91.69,0,0,1-26.83,64.87,75.61,75.61,0,0,0-44.51-34,44,44,0,1,0-41.32,0,75.61,75.61,0,0,0-44.51,34A92,92,0,0,1,128,36a93.4,93.4,0,0,1,15.34,1.27,4,4,0,0,0,1.32
1-7.89,99.89,99.89,0,1,0,82,82A4,4,0,0,0,222,108.06ZM92,120a36,36,0,1,1,36,36A36,36,0,0,1,92,120ZM68.87,198.42a68,68,0,0,1,118.27,0,91.81,91.81,0,0,1-118.27,0Z"}))]]),u=i.forwardRef((e,a)=>i.createElement(o,{ref:a,...e,weights:p}));u.displayName="UserCircleGearIcon";const f=u,b=["specialist","manager","admin","viewer"];async function v(e){var i,a;const t=await(null==(a=null==(i=l)?void 0:i.currentUser)?void 0:a.getIdToken())??null,n={"Content-Type":"application/json"};t&&(n.Authorization=`Bearer ${t}`);const s=await fetch("/.netlify/functions/team-action",{method:"POST",headers:n,body:JSON.stringify(e)});if(!s.ok){const e=await s.text().catch(()=>"");throw new Error(`team-action ${s.status}: ${e.slice(0,160)}`)}}const g=[{value:"full",label:"Full"},{value:"read-only",label:"Read-only"},{value:"restricted",label:"Restricted"}];function y({member:a,actions:t,onAudit:l}){const n=function(e){switch(e){case"always":return"PERM";case"temp":return"TEMP";case"client":return"CLIENT"}}(a.access),o=function(e){switch(e){case"always":return r.green;case"temp":return r.yellow;case"client":return r.ink3}}(a.access),[c,p]=i.useState(null),[u,f]=i.useState(!1),[b,v]=i.useState(!1),y=i.useCallback(e=>{p(null),v(!0),f(!1),t.scope(a.id,e).then(()=>{s({level:"success",title:`Scope set to ${e}`})}).catch(e=>{const i=e instanceof Error?e.message:String(e);p(i),s({level:"error",title:"Scope update failed â try again",body:i})}).finally(()=>{v(!1)})},[t,a.id]),h=i.useCallback(()=>{p(null),t.revoke(a.id).then(()=>{s({level:"success",title:"Access revoked"})}).catch(e=>{const i=e instanceof Error?e.message:String(e);p(i),s({level:"error",title:"Revoke failed â try again",body:i})})},[t,a.id]);return e.jsxs("article",{role:"listitem","aria-label":`Team member ${a.name}`,"data-testid":`team-member-${a.id}`,className:"tile",style:{cursor:"default"},children:[e.jsxs("div",{style:{display:"flex",gap:12,alignItems:"center"},children:[e.jsx("div",{"aria-hidden":"true",style:{width:48,height:48,borderRadius:"50%",background:`radial-gradient(circle at 35% 30%, ${a.color}, var(--void))`,display:"flex",alignItems:"center",justifyContent:"center",fontFamily:"Cinzel, serif",fontWeight:700,fontSize:18,color:r.black0,border:"1px solid "+a.color},children:a.avatar}),e.jsxs("div",{style:{flex:1},children:[e.jsx(m,{as:"div",size:"data",weight:"bold",tracking:"tight",tone:"ink1",children:a.name}),e.jsx("span",{className:"mono",style:{fontSize:9,letterSpacing:".18em",color:a.color,marginTop:2,textTransform:"uppercase",display:"block"},children:a.role})]}),e.jsx("span",{className:"perm","data-testid":`perm-badge-${a.id}`,style:{color:o},children:n})]}),e.jsx("div",{style:{marginTop:12,paddingTop:12,borderTop:"1px solid var(--line)",display:"flex",gap:4,flexWrap:"wrap"},children:a.specialties.map(i=>e.jsx(d,{size:"xs",tone:"ink2",letterSpacing:"wider",caps:!0,style:{padding:"2px 6px",border:"1px dashed var(--line-2)"},children:i},i))}),a.expires&&e.jsxs(d,{as:"div",size:"sm",tone:"yellow",letterSpacing:"widest",caps:!0,style:{marginTop:10},children:[e.jsx("span",{"aria-hidden":"true",children:"â· "}),"expires ",a.expires]}),c?e.jsx("div",{role:"alert","data-testid":`team-member-error-${a.id}`,style:{marginTop:8,fontFamily:"IBM Plex Mono, monospace",fontSize:9,color:r.red,letterSpacing:".18em"},children:c}):null,e.jsxs("div",{style:{marginTop:10,display:"flex",justifyContent:"space-between",alignItems:"center"},children:[e.jsxs(d,{size:"sm",tone:"ink3",letterSpacing:"wider",children:["Last active ",a.last]}),e.jsxs("div",{style:{display:"flex",gap:4,position:"relative"},children:[e.jsx("button",{type:"button",className:"pill focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-beon-yellow focus-visible:ring-offset-2 focus-visible:ring-offset-beon-black","aria-label":`Scope for ${a.name}`,"aria-haspopup":"menu","aria-expanded":u,"data-testid":`team-scope-${a.id}`,disabled:b,style:{fontSize:8},onClick:()=>f(e=>!e),children:b?"Scopeâ¦":"Scope â¾"}),u&&e.jsx("div",{role:"menu","aria-label":`Scope options for ${a.name}`,"data-testid":`team-scope-menu-${a.id}`,style:{position:"absolute",top:"100%",right:0,marginTop:4,background:r.black0,border:"1px solid var(--line-2)",display:"flex",flexDirection:"column",minWidth:132,zIndex:10},children:g.map(i=>e.jsx("button",{type:"button",role:"menuitem","data-testid":`team-scope-option-${a.id}-${i.value}`,onClick:()=>
1y(i.value),className:"mono focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-beon-yellow",style:{padding:"8px 12px",background:"transparent",border:"none",borderBottom:"1px solid var(--line)",color:r.ink1,fontSize:10,letterSpacing:".18em",textTransform:"uppercase",textAlign:"left",cursor:"pointer"},children:i.label},i.value))}),e.jsx("button",{type:"button",className:"pill focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-beon-yellow focus-visible:ring-offset-2 focus-visible:ring-offset-beon-black","aria-label":`Audit for ${a.name}`,style:{fontSize:8},onClick:()=>l(a.id),children:"Audit"}),"temp"===a.access&&e.jsx("button",{type:"button",className:"pill focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-beon-yellow focus-visible:ring-offset-2 focus-visible:ring-offset-beon-black","aria-label":`Revoke for ${a.name}`,style:{fontSize:8,color:r.red,borderColor:r.red},onClick:h,children:"Revoke"})]})]})]},a.id)}function h({preset:a,onSubmit:t,onCancel:l}){const[n,s]=i.useState(""),[o,c]=i.useState(a),[d,m]=i.useState(!1),[p,u]=i.useState(null),f=i.useCallback(e=>{e.preventDefault(),n&&!d&&(m(!0),u(null),t(n,o).then(()=>{s(""),l()}).catch(e=>{u(e instanceof Error?e.message:String(e))}).finally(()=>{m(!1)}))},[n,o,d,t,l]);return e.jsxs("form",{onSubmit:f,"data-testid":"team-invite-panel","aria-label":"Invite team member",style:{marginTop:8,padding:12,border:"1px dashed var(--line-2)",background:r.black0,display:"flex",gap:8,alignItems:"center",flexWrap:"wrap"},children:[e.jsxs("label",{className:"mono",style:{fontSize:9,letterSpacing:".18em"},children:[e.jsx("span",{className:"sr-only",children:"Email"}),e.jsx("input",{type:"email",required:!0,value:n,onChange:e=>s(e.target.value),placeholder:"[email protected]","data-testid":"team-invite-email","aria-label":"Invitee email",className:"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-beon-yellow focus-visible:ring-offset-2 focus-visible:ring-offset-beon-black",style:{padding:"4px 8px",fontFamily:"IBM Plex Mono, monospace",fontSize:11,background:"transparent",border:"1px solid var(--line-2)",color:r.ink1}})]}),e.jsxs("label",{className:"mono",style:{fontSize:9,letterSpacing:".18em"},children:[e.jsx("span",{className:"sr-only",children:"Role"}),e.jsxs("select",{value:o,onChange:e=>c(e.target.value),"data-testid":"team-invite-role","aria-label":"Invitee role",className:"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-beon-yellow focus-visible:ring-offset-2 focus-visible:ring-offset-beon-black",style:{padding:"4px 8px",fontFamily:"IBM Plex Mono, monospace",fontSize:11,background:"transparent",border:"1px solid var(--line-2)",color:r.ink1},children:[e.jsx("option",{value:"specialist",children:"temp specialist"}),e.jsx("option",{value:"manager",children:"team manager"}),e.jsx("option",{value:"viewer",children:"client viewer"})]})]}),e.jsx("button",{type:"submit",className:"pill focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-beon-yellow focus-visible:ring-offset-2 focus-visible:ring-offset-beon-black",disabled:d,"data-testid":"team-invite-submit",children:"Send invite"}),e.jsx("button",{type:"button",className:"pill focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-beon-yellow focus-visible:ring-offset-2 focus-visible:ring-offset-beon-black",onClick:l,"data-testid":"team-invite-cancel",children:"Cancel"}),p?e.jsx("span",{role:"alert","data-testid":"team-invite-error",style:{fontFamily:"IBM Plex Mono, monospace",fontSize:9,letterSpacing:".18em",color:r.red},children:p}):null]})}function x(){const o=a(),{members:m,loading:p,error:u}=t(),g=function(){const e=n();return{invite:i.useCallback(async(i,a)=>{var t,n;if(!function(e){return b.includes(e)}(a))throw new Error(`invalid team invite role: ${a}`);const s=await(null==(n=null==(t=l)?void 0:t.currentUser)?void 0:n.getIdToken())??null,o={"content-type":"application/json"};s&&(o.Authorization=`Bearer ${s}`);const r=await fetch("/.netlify/functions/team-invite",{method:"POST",headers:o,body:JSON.stringify({op:"invite-specialist",tenantId:e,email:i,role:a})});if(!r.ok)throw new Error(`team-invite failed: ${r.status}`);const c=await r.json();if("object"==typeof c&&null!==c&&"invitationId"in c&&"string"==typeof c.invitationId){const e=c;return{invitationId:e.invitationId,emailed:!0===e.emailed}}throw new Error("team-invite: missing invitationId in response")},[e]),scope:i.useCallback(async(e,i)=>{await v({op:"scope",memberId:e,scope:i})},[]),revoke:i.useCallback(async e=>{await v({op:"revoke",memberId:e})},[])}}(),[x,j]=i.useState(null),k=i.useCallback(async(e,i)=>{try{(await g.invite(e,i)).emailed?s({level:"success",title:"Invite sent"}):s({level:"warn",title:"Invite created â email NOT sent",body:"The invitation is saved and can be re-delivered. Email send was skipped or failed (Resend not configured, allowlist gate, or transport error). Check function logs."})}catch(a){const e=a instanceof Error?a.message:String(a);throw s({level:"error",title:"Invite failed â try again",body:e}),a}},[g]),A=i.useCallback(e=>{o(`/v4/audit?member=${e}`)},[o]),w=m;return e.jsxs("div",{style:{flex:1,minHeight:0,display:"flex",flexDirection:"column"},"data-testid":"team-route",children:[e.jsx("div",{"data-testid":"team-hero",children:e.jsx(c,{icon:f,mission:"Roster + permissions",title:"Who can do what",sub:"Roster scopes â perm, temp, client â with full audit trail."})}),e.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:8,padding:"0 22px 12px"},children:[e.jsx("button",{type:"button",className:"pill focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-beon-yellow focus-visible:ring-offset-2 focus-visible:ring-offset-beon-black",onClick:()=>j("specialist"),children:"+ Invite specialist (temp)"}),e.jsx("button",{type:"button",className:"pill on focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-beon-yellow focus-visible:ring-offset-2 focus-visible:ring-offset-beon-black",onClick:()=>j("manager"),children:"+ Add team member"})]}),e.jsxs("div",{className:"page-body",children:[p?e.jsx(d,{as:"p",size:"md",tone:"ink3",role:"status",testid:"team-loading",children:"Loading teamâ¦"}):null,u?e.jsx(d,{as:"p",size:"md",tone:"red",role:"alert",testid:"team-error",children:u.message}
1):null,x?e.jsx(h,{preset:x,onSubmit:k,onCancel:()=>j(null)}):null,e.jsx("div",{role:"list","aria-label":"Team members","data-testid":"team-grid",style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(340px, 1fr))",gap:12,marginTop:x?12:0},children:w.map(i=>e.jsx(y,{member:i,actions:g,onAudit:A},i.id))}),p||u||0!==w.length?null:e.jsx("p",{role:"status","data-testid":"team-empty",style:{fontFamily:"IBM Plex Mono, monospace",fontSize:11,color:r.ink3,letterSpacing:".14em",padding:"20px 0",marginTop:x?12:0},children:"No team members yet â invite someone from the toolbar."})]})]})}export{x as TeamRoute};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.