@popmelt.com/core 0.31.1 → 0.31.2

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 (42) hide show
  1. package/claude-plugin/.claude-plugin/plugin.json +1 -1
  2. package/codex-plugin/.codex-plugin/plugin.json +1 -1
  3. package/dist/{ParticipantRuntime-HU2P2PJ6.mjs → ParticipantRuntime-BGVZAWZH.mjs} +1 -1
  4. package/dist/{PopmeltTasteConnectedPane-ALR3RTSC.mjs → PopmeltTasteConnectedPane-7YIHIFPE.mjs} +1 -1
  5. package/dist/{PreviewRuntime-YAUBP6HA.mjs → PreviewRuntime-QDA4OF67.mjs} +1 -1
  6. package/dist/bridge-entry.mjs +1 -1
  7. package/dist/{browser-runtime-LTQBOXZW.mjs → browser-runtime-VSD5R2HG.mjs} +1 -1
  8. package/dist/browser.mjs +1 -1
  9. package/dist/{chunk-EG6SRS7N.mjs → chunk-2TFOULRG.mjs} +1 -1
  10. package/dist/chunk-4V7SK3M6.mjs +0 -0
  11. package/dist/{chunk-CECQ4VMR.mjs → chunk-7VW2KD6D.mjs} +1 -1
  12. package/dist/chunk-EXDOFFFJ.mjs +2 -0
  13. package/dist/{chunk-OLLUQ45J.mjs → chunk-F6AMPRUB.mjs} +1 -1
  14. package/dist/{chunk-253MCKJJ.mjs → chunk-GNZ73T3H.mjs} +1 -1
  15. package/dist/{chunk-GQ6CPJG6.mjs → chunk-IPR652AZ.mjs} +1 -1
  16. package/dist/{chunk-RXRZTZPN.mjs → chunk-JU7D4I76.mjs} +1 -1
  17. package/dist/{chunk-JQHZFDY5.mjs → chunk-MTQ5IWIK.mjs} +1 -1
  18. package/dist/{chunk-IRFL32GJ.mjs → chunk-Q5QRV4KJ.mjs} +3 -3
  19. package/dist/{chunk-CXQWNKZ4.mjs → chunk-QENHLODE.mjs} +2 -17
  20. package/dist/{chunk-LSPIP2IX.mjs → chunk-QLN5IYRL.mjs} +1 -1
  21. package/dist/{chunk-4ZZTJRHL.mjs → chunk-QTGE5KAA.mjs} +1 -1
  22. package/dist/chunk-RCVAPQ7X.mjs +2 -0
  23. package/dist/{chunk-E3ZTB2VR.mjs → chunk-SQA3PHME.mjs} +1 -1
  24. package/dist/{chunk-WIQ3RY6R.mjs → chunk-UZUYF4D5.mjs} +1 -1
  25. package/dist/cli.mjs +2 -2
  26. package/dist/codex-note-context-SGNCDBK4.mjs +2 -0
  27. package/dist/{codex-project-IE6ZJFGB.mjs → codex-project-PA5DEEPH.mjs} +1 -1
  28. package/dist/codex-session-registry-25DAA2KO.mjs +0 -0
  29. package/dist/{focus-inspection-GJKMI6OE.mjs → focus-inspection-WPHGCN6Y.mjs} +1 -1
  30. package/dist/index.mjs +1 -1
  31. package/dist/peer-client-BEU2VKYY.mjs +2 -0
  32. package/dist/plugin-astro.mjs +1 -1
  33. package/dist/plugin-nuxt.mjs +1 -1
  34. package/dist/plugin-vite.mjs +1 -1
  35. package/dist/server.mjs +1 -1
  36. package/dist/{workspace-snapshot-LKQWBDNS.mjs → workspace-snapshot-O34KMJ2V.mjs} +1 -1
  37. package/package.json +32 -22
  38. package/dist/chunk-HGW2U6PD.mjs +0 -2
  39. package/dist/chunk-XOGBFVWI.mjs +0 -2
  40. package/dist/codex-note-context-NVDO3PVT.mjs +0 -2
  41. package/dist/peer-client-2THOHRGA.mjs +0 -2
  42. /package/dist/{chunk-V6VQACC2.mjs → chunk-J5HW2SCX.mjs} +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "popmelt-core",
3
- "version": "0.31.1",
3
+ "version": "0.31.2",
4
4
  "description": "Local Popmelt context, canvas tools, and ambient turn capture for Claude Code.",
5
5
  "author": {
6
6
  "name": "Popmelt",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "popmelt-core",
3
- "version": "0.31.1",
3
+ "version": "0.31.2",
4
4
  "description": "Point out what you mean, talk through changes, and keep your AI on the same page.",
5
5
  "author": {
6
6
  "name": "Popmelt",
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import{a as Jt}from"./chunk-4ZZTJRHL.mjs";import{tb as Wt,db as Ut,Cb as gt,Qa as qt,Xa as _t,cb as tt,Ta as zt,Wa as Ft,Ua as Vt,M as Ht,Sa as Xt,Va as Kt,sb as Yt,Za as Bt,pb as Zt,rb as Gt,qb as yt,Pa as vt,Ra as Qt,Ka as er,bb as tr,Ya as rr,Lb as nr,d as ir}from"./chunk-IRFL32GJ.mjs";import"./chunk-J4WDYITA.mjs";import{e as ar,N as or,xa as sr,Ca as lr,g as wt}from"./chunk-253MCKJJ.mjs";import"./chunk-4LHTPRFY.mjs";import"./chunk-JQHZFDY5.mjs";import{a as Te}from"./chunk-OLLUQ45J.mjs";import"./chunk-XOGBFVWI.mjs";import{i as dr,a as cr,h as ur}from"./chunk-D32YV5O6.mjs";import{g as pr,e as rt,a as ze,d as fr}from"./chunk-V44RIEET.mjs";import{n as hr}from"./chunk-CPOYMGYY.mjs";import{a as mr}from"./chunk-6VXFTT5U.mjs";import"./chunk-XTOCFTVW.mjs";import"./chunk-LVEMYZOA.mjs";import{v as gr,o as bt}from"./chunk-HGW2U6PD.mjs";import{useState as U,useSyncExternalStore as It,useEffect as ee,useRef as K,useCallback as Je,useMemo as nt,useId as yr,useLayoutEffect as St}from"react";import{Link2 as vr,Ban as wr,Clock as br,X as Ir,Hand as Sr,SendHorizontal as kr,LoaderCircle as Er,RotateCcw as Pr,Check as xr,Copy as Cr}from"lucide-react";import{jsxs as B,jsx as S,Fragment as We}from"react/jsx-runtime";var Ar=class extends Error{constructor(){super("The saved draft changed in another runtime. Your local changes are preserved.")}},it=(e,t)=>e.revision===t.revision&&JSON.stringify(e.source)===JSON.stringify(t.source)&&JSON.stringify(e.state)===JSON.stringify(t.state);function jr(e){let t=structuredClone(e.draft.state??Te),r=structuredClone(e.source),i=e.draft.revision,n=0,a=0,s=null,d=!1,o=structuredClone(e.draft),f=null,l=null,u=!1,w=new Set,I=new Set,y=()=>{for(let c of[...I])c()},b={getSnapshot:()=>t,subscribe:c=>(w.add(c),()=>{w.delete(c)}),dispatch:c=>{if(u)throw new Error("Participant runtime is disposed");let p=wt(t,c);if(p!==t){t=p,n++;for(let x of[...w])x();y()}}},g=()=>u?Promise.reject(new Error("Participant runtime is disposed")):l||(s||d?Promise.reject(s??new Error("Draft sync paused")):n===a?Promise.resolve():(l=Promise.resolve().then(async()=>{for(;!u&&!d&&n!==a;){let c=n,p=structuredClone(r),x=structuredClone(t);f={generation:c,draft:{revision:i+1,source:p,state:x}};let C=await e.save(i,p,x);if(!it(C,f.draft))throw new Error("Unexpected saved draft revision; reconnect before writing");i=C.revision,a=c,o=structuredClone(C),f=null}}).catch(c=>{throw s=c instanceof Error?c:new Error(String(c)),s}).finally(()=>{l=null,y()}),l));return{binding:b,flush:g,getStatus:()=>({revision:i,unsaved:n!==a,error:s,disposed:u}),subscribeStatus(c){return I.add(c),()=>{I.delete(c)}},pause(c){d=!0,s=c,y()},async whenSettled(){await l?.catch(()=>{})},reconcile(c){if(u)throw new Error("Participant runtime is disposed");if(l)throw new Error("Wait for the pending save before reconciling");if(!it(c,o)){if(!f||!it(c,f.draft))throw new Ar;i=c.revision,a=f.generation,o=structuredClone(c)}f=null,s=null,d=!1,y()},retry(){return s=null,d=!1,g()},setSource(c){if(u)throw new Error("Participant runtime is disposed");if(c.sourceId!==r.sourceId)throw new Error("Changing source worlds requires a new participant runtime");c.revision!==r.revision&&(r=structuredClone(c),n++,y())},async revoke(){u=!0,d=!0,await l?.catch(()=>{}),t=structuredClone(Te),f=null,o={revision:i,source:null,state:null};for(let c of[...w])c();y()},dispose(){u=!0,w.clear(),I.clear()}}}var kt=8192,at=8*1024*1024,Tr=256,Fe=100,Ce=(...e)=>JSON.stringify(e),Ve=(e,t)=>JSON.stringify(e)===JSON.stringify(t),Re=e=>structuredClone(e),Or=class extends Error{constructor(){super("This edit predates retained synchronization history"),this.name="PlaneHistoryExpiredError"}},Et=(e,t)=>Pt(e.stamp,t.stamp)||(e.id<t.id?-1:e.id>t.id?1:0);function He(e,t){let r=new Map([...e.checkpoint?.receipts??[],...e.events].map(a=>[a.id,a])),i=[],n=[];for(let a of t){let s=r.get(a.id);if(s){if(!Ve(s,a))throw new Error("Plane event identity was reused");continue}e.checkpoint&&Et(a,e.checkpoint.through)<=0?n.push(a):i.push(a)}return{pending:i,superseded:n}}function Mr(e,t){let r=He(e,t);if(r.superseded.length)throw new Or;return r.pending}function Pt(e,t){return e.time-t.time||e.counter-t.counter||(e.actor<t.actor?-1:e.actor>t.actor?1:0)}function Nr(e,t,r,i){let n=r.reduce((s,d)=>!s||Pt(d.stamp,s)>0?d.stamp:s,t),a=Math.max(Math.floor(i),n?.time??0);return{actor:e,time:a,counter:a===n?.time?n.counter+1:0}}function ot(e){let t=new Map;for(let r of e.annotations){t.set(Ce("annotation",r.id),!0);for(let[i,n]of Object.entries(r))i!=="id"&&n!==void 0&&t.set(Ce("annotation",r.id,i),n)}for(let r of e.styleModifications){let i=Ce(r.pathname??"/",r.selector),{changes:n,...a}=r;t.set(Ce("styleMeta",i),a);for(let s of n)t.set(Ce("style",i,s.property),s)}for(let r of e.textModifications)t.set(Ce("text",Ce(r.pathname??"/",r.selector,JSON.stringify(r.textNodePath))),r);for(let r of e.domModifications)t.set(Ce("dom",r.id),r);for(let r of e.spacingTokenChanges)t.set(Ce("spacing",r.tokenPath),r);for(let r of e.spacingTokenMods)t.set(Ce("spacingMod",r.tokenPath),r);return t}function st(e,t){let r=ot(e),i=ot(t);return[...new Set([...r.keys(),...i.keys()])].filter(n=>!(JSON.parse(n)[0]==="styleMeta"&&!i.has(n))).filter(n=>!Ve(r.get(n),i.get(n))).map(n=>({key:n,...i.has(n)?{value:Re(i.get(n))}:{}}))}function xt(e,t){let r={...t,annotations:[],styleModifications:[],textModifications:[],domModifications:[],spacingTokenChanges:[],spacingTokenMods:[]},i=new Map;for(let[a,s]of e){let[d,o,f]=JSON.parse(a);d==="annotation"&&!f&&s===!0&&i.set(o,{id:o})}let n=new Map;for(let[a,s]of e){let[d,o,f]=JSON.parse(a);if(d==="annotation"&&f&&i.has(o)&&Object.defineProperty(i.get(o),f,{value:s,enumerable:!0,configurable:!0,writable:!0}),d==="style"){let l=n.get(o),u=e.get(Ce("styleMeta",o));if(!u)continue;l||(l={...u,changes:[]},n.set(o,l)),l.changes.push(s)}d==="text"&&r.textModifications.push(s),d==="dom"&&r.domModifications.push(s),d==="spacing"&&r.spacingTokenChanges.push(s),d==="spacingMod"&&r.spacingTokenMods.push(s)}return r.annotations=[...i.values()],r.styleModifications=[...n.values()],r.selectedAnnotationIds=t.selectedAnnotationIds.filter(a=>i.has(a)),r.lastSelectedId=r.selectedAnnotationIds.includes(t.lastSelectedId??"")?t.lastSelectedId:null,r}var Ct=e=>({annotations:e.annotations,styleModifications:e.styleModifications,textModifications:e.textModifications,domModifications:e.domModifications,spacingTokenChanges:e.spacingTokenChanges,spacingTokenMods:e.spacingTokenMods});function lt(e=Te){let t=[...e.undoStack.slice(-Fe),Ct(e)],r={...Re(e),...Re(t[0]),undoStack:[],redoStack:[]},i=[];for(let s=1;s<t.length;s++){let d=`migration:${s}`;i.push({id:d,stamp:{time:0,counter:s,actor:"migration"},kind:"edit",group:d,changes:st({...r,...t[s-1]},{...r,...t[s]})})}let n=e,a=[];for(let s of[...e.redoStack].reverse().slice(0,Fe)){let d=`migration:${i.length+1}`,o={...r,...s};i.push({id:d,stamp:{time:0,counter:i.length+1,actor:"migration"},kind:"edit",group:d,changes:st(n,o)}),a.push(d),n=o}for(let s of a.reverse()){let d=`migration:${i.length+1}`;i.push({id:d,stamp:{time:0,counter:i.length+1,actor:"migration"},kind:"undo",target:s})}return{version:1,base:r,events:i}}function dt(e){if(!Array.isArray(e)||e.length>kt||JSON.stringify(e).length>at)throw new Error("Plane history exceeds the local session limit");for(let t of e){let r=n=>typeof n=="string"&&n.length>0&&n.length<=256;if(!t||!r(t.id)||!t.stamp||!r(t.stamp.actor)||!Number.isSafeInteger(t.stamp.time)||t.stamp.time<0||!Number.isSafeInteger(t.stamp.counter)||t.stamp.counter<0||!["edit","undo","redo"].includes(t.kind))throw new Error("Invalid plane event");if(t.kind!=="edit"){if(!r(t.target))throw new Error("Invalid history target");continue}if(t.group!==void 0&&!r(t.group)||t.reset!==void 0&&typeof t.reset!="boolean"||!Array.isArray(t.changes)||t.changes.length>1e4)throw new Error("Invalid plane edit");let i=new Set;for(let n of t.changes){if(!n||typeof n.key!="string"||n.key.length>8192)throw new Error("Invalid property key");let a=JSON.parse(n.key);if(!Array.isArray(a)||a.length<2||a.length>3||a.some(s=>typeof s!="string"||!s.length)||!["annotation","style","styleMeta","text","dom","spacing","spacingMod"].includes(a[0])||a[0]==="style"&&a.length!==3||!["style","annotation"].includes(a[0])&&a.length!==2||a[0]==="annotation"&&a.length===2&&n.value!==void 0&&n.value!==!0||i.has(n.key))throw new Error("Invalid property key");i.add(n.key)}}return Re(e)}function ct(e,t){let r=new Map(e.events.map(i=>[i.id,i]));for(let i of Mr(e,t)){let n=r.get(i.id);if(n&&!Ve(n,i))throw new Error("Plane event identity was reused");r.set(i.id,i)}if(r.size>kt)throw new Error("Plane history exceeds the local session limit");return{...e,events:[...r.values()].sort(Et)}}function Rr(e){if(e.version!==1&&e.version!==2)throw new Error("Unsupported plane history version");if(e.version===2&&!e.checkpoint)throw new Error("Missing plane history checkpoint");let t=e.checkpoint,r=t?new Map(Re(t.cells)):ot(e.base),i=new Map(t?.writers??[]),n=Re(t?.undo??[]),a=Re(t?.redo??[]),s=(d,o)=>{let f=[],l=[...d].sort((u,w)=>JSON.parse(u.key).length-JSON.parse(w.key).length);for(let u of l){let[w,I,y]=JSON.parse(u.key);if(w==="styleMeta"&&u.value===void 0)continue;let b=i.get(u.key)??"base";if(u.guard!==void 0&&b!==u.guard||w==="annotation"&&y&&!r.has(Ce(w,I)))continue;let g=r.get(u.key);u.value===void 0?r.delete(u.key):r.set(u.key,u.value);let c=u.restoreWriter??o;if(i.set(u.key,c),f.push({key:u.key,before:g,after:u.value,beforeWriter:b,afterWriter:c}),w==="annotation"&&!y&&u.value===void 0)for(let p of[...r.keys()]){let[x,C]=JSON.parse(p);x===w&&C===I&&(f.push({key:p,before:r.get(p),after:void 0,beforeWriter:i.get(p)??"base",afterWriter:c}),r.delete(p),i.set(p,c))}}return f};for(let d of e.events)if(d.kind==="edit"){let o=s(d.changes,d.group??d.id);if(d.reset&&(n.length=0,a.length=0),!d.group||!o.length)continue;let f=n.find(l=>l.id===d.group);if(f)for(let l of o){let u=f.changes.find(w=>w.key===l.key);u?(u.after=l.after,u.afterWriter=l.afterWriter):f.changes.push(l)}else n.push({id:d.group,writer:d.group,changes:o});a.length=0,n.length>Fe&&n.shift()}else{let o=d.kind==="undo"?n:a,f=d.kind==="undo"?a:n,l=o.findIndex(I=>I.id===d.target);if(l<0)continue;let u=o.splice(l,1)[0],w=s(u.changes.map(I=>({key:I.key,value:I.before,guard:I.afterWriter,restoreWriter:I.beforeWriter})),d.id);w.length&&f.push({id:d.id,writer:d.id,changes:w}),f.length>Fe&&f.shift()}return{cells:r,writers:i,undo:n,redo:a}}function ut(e,t=e.base,r=!0){let{cells:i,writers:n,undo:a,redo:s}=Rr(e),d=xt(i,t);d.styleModifications=d.styleModifications.filter(I=>!e.hostStyleDeletions?.some(y=>ir(I,y)));let o=new Set(Object.keys(e.hostDeletions??{}));d.annotations=d.annotations.filter(I=>!o.has(I.id)),d.selectedAnnotationIds=d.selectedAnnotationIds.filter(I=>!o.has(I));let f=I=>{let y=new Map(i);for(let b of I.changes)(n.get(b.key)??"base")===b.afterWriter&&(b.before===void 0?y.delete(b.key):y.set(b.key,b.before));return Ct(xt(y,t))},l=I=>I.filter(y=>y.changes.some(b=>JSON.parse(b.key)[0]!=="styleMeta"&&(n.get(b.key)??"base")===b.afterWriter&&!Ve(b.before,i.get(b.key)))),u=l(a),w=l(s);return d.undoStack=r?u.map(f):[],d.redoStack=r?w.map(f):[],{state:Re(d),undo:u.map(I=>I.id),redo:w.map(I=>I.id)}}function Lr(e){let t=structuredClone(e.draft.history??lt(e.draft.state??Te)),r=He(t,e.pendingEvents??[]);t=ct(t,r.pending);let i=ut(t,{...structuredClone(e.draft.state??Te),...e.view}),n=i.state,a=structuredClone(e.source),s=e.draft.revision,d=r.pending,o=structuredClone(e.draft),f=null,l=!!e.persist,u=0,w=0,I=Promise.resolve(),y=!1,b,g,c=null,p=null,x=!1,C=!1,P=new Set,A=new Set,O=()=>{for(let v of[...P])v()},M=()=>{for(let v of[...A])v()},T=()=>{i=ut(t,n),n=i.state},$=()=>{if(!e.persist||!l)return Promise.resolve();let v=structuredClone(o),te=structuredClone(a),z=structuredClone(d),F=u;return w++,I=I.then(()=>e.persist(v,te,z)).then(()=>{F===u&&(f=null)}).catch(R=>{F===u&&(f=R instanceof Error?R:new Error(String(R)))}).finally(()=>{F===u&&(w--,M())}),I},q=async()=>{do await I;while(w>0);if(f)throw f},ie=v=>{if(v.revision<s)return;if(v.source&&v.source.sourceId!==a.sourceId)throw new Error("Draft source world mismatch");if(!v.history)throw new Error("Shared history is unavailable; reconnect to an updated bridge");let te=He(v.history,d),z=ct(structuredClone(v.history),te.pending),F=JSON.stringify(z.hostStyleDeletions)!==JSON.stringify(t.hostStyleDeletions)||JSON.stringify(z.hostDeletions)!==JSON.stringify(t.hostDeletions)||z.checkpoint?.through.id!==t.checkpoint?.through.id||z.events.length!==t.events.length||z.events.some((R,L)=>R.id!==t.events[L]?.id);d=te.pending,te.superseded.length&&(g=void 0),t=z,s=v.revision,o=structuredClone(v),F&&T(),$()},H={getSnapshot:()=>n,getUndoHead:()=>i.undo.at(-1),subscribe(v){return P.add(v),()=>{P.delete(v)}},dispatch(v){if(C)throw new Error("Participant runtime is disposed");let te=n,z,F=()=>(b=Nr(e.actor,b,t.events,(e.now??Date.now)()),b),R=()=>crypto.randomUUID();if(v.type==="UNDO"||v.type==="REDO"){let L=(v.type==="UNDO"?i.undo:i.redo).at(-1);if(!L)return;z={id:R(),stamp:F(),kind:v.type==="UNDO"?"undo":"redo",target:L},g=void 0}else{let L=wt(n,v);if(L===n)return;let D=v.type==="UPDATE_LINKED_POSITIONS"?[]:st(n,L),oe=L.undoStack.length>n.undoStack.length,me=["MODIFY_STYLE","MOVE_ANNOTATION","RESIZE_ANNOTATION","UPDATE_ANNOTATION_COLOR"].includes(v.type);if(D.length){let be=R(),pe=oe||me?!oe&&g&&g===i.undo.at(-1)?g:be:void 0;z={id:be,stamp:F(),kind:"edit",changes:D,...pe?{group:pe}:{},...v.type==="CLEAR"?{reset:!0}:{}},g=pe}n=L}if(z){try{t=ct(t,[z])}catch(L){n=te,p=L instanceof Error?L:new Error(String(L)),x=!0,g=void 0,O(),M();return}d.push(z),T(),$()}O(),M(),e.saveView?.(n)}},ae=()=>C?Promise.reject(new Error("Participant runtime is disposed")):c||(p||x?Promise.reject(p??new Error("Draft sync paused")):!d.length&&!y&&!w&&!f?Promise.resolve():(c=Promise.resolve().then(async()=>{for(f&&await $(),await q();!C&&!x&&(d.length||y);){await q();let v=structuredClone(d.slice(0,Tr)),te=structuredClone(a),z=await e.save(s,te,n,v);if(C)return;ie(z),await q(),a.revision===te.revision&&(y=!1),O()}}).catch(v=>{throw p=v instanceof Error?v:new Error(String(v)),p}).finally(()=>{c=null,M()}),c));return{binding:H,flush:ae,getStatus:()=>({revision:s,unsaved:d.length>0||y,error:p,localError:f,memoryOnly:!l,savingLocally:w>0,disposed:C}),subscribeStatus(v){return A.add(v),()=>{A.delete(v)}},pause(v){x=!0,p=v,M()},async whenSettled(){await c?.catch(()=>{}),await q().catch(()=>{})},whenDurable:q,async retryLocalSave(){if(C)throw new Error("Participant runtime is disposed");await $(),await q()},async clearLocalSpace(){if(x=!0,await c?.catch(()=>{}),await q().catch(()=>{}),C)throw new Error("Participant runtime is disposed");l=!1,d=[],y=!1,g=void 0,t=structuredClone(o.history??lt(o.state??Te)),i=ut(t,{...structuredClone(Te),activeColor:n.activeColor,isAnnotating:n.isAnnotating}),n=i.state,s=o.revision,f=null,p=null,O(),M()},async resumeLocalSaving(){if(!e.persist||C)return!1;l=!0;let v;try{return await Promise.race([$().then(q),new Promise((te,z)=>{v=setTimeout(()=>z(new Error("Local saving timed out")),2e3)})]),!C}catch{return u++,l=!1,w=0,I=Promise.resolve(),f=null,M(),!1}finally{clearTimeout(v)}},reconcile(v){if(C)throw new Error("Participant runtime is disposed");if(c)throw new Error("Wait for the pending save before reconciling");ie(v),p=null,x=!1,O(),M()},receive(v){C||x||c||v.revision<=s||(ie(v),O(),M())},retry(){return x=!1,p=null,ae()},setSource(v){if(v.sourceId!==a.sourceId)throw new Error("Changing source worlds requires a new participant runtime");v.revision===a.revision&&o.source?.revision===v.revision||(a=structuredClone(v),y=!0,M())},async revoke(){C=!0,x=!0,await c?.catch(()=>{}),await q().catch(()=>{}),d=[],t=lt(Te),n=structuredClone(Te),o={revision:s,source:null,state:null},O(),M()},dispose(){C=!0,P.clear(),A.clear()}}}function Dr(e,t){if(!t.reference.draft.history||t.reference.draft.source&&t.basis.sourceId!==t.reference.draft.source.sourceId)throw new Error("Offline recovery requires a matching shared-history source");if(e&&(e.version!==1||e.reference.author.id!==t.reference.author.id||e.reference.planeId!==t.reference.planeId||e.basis.sourceId!==t.basis.sourceId))throw new Error("Offline recovery belongs to a different plane");let r=e&&e.reference.draft.revision>t.reference.draft.revision?e.reference:t.reference,i=new Map;for(let o of[...dt(e?.pending??[]),...dt(t.pending)]){let f=i.get(o.id);if(f&&JSON.stringify(f)!==JSON.stringify(o))throw new Error("Offline operation identity was reused");i.set(o.id,o)}let n=He(r.draft.history,[...i.values()]),a=new Set(n.pending.map(o=>o.id)),s=e?.pending.some(o=>a.has(o.id)),d={version:1,reference:r,basis:s?e.basis:t.basis,pending:n.pending,...e?.superseded?{superseded:e.superseded}:{}};if(n.superseded.length){let o=n.superseded.slice(-128);for(;o.length&&new TextEncoder().encode(JSON.stringify(o)).length>256*1024;)o.shift();d.superseded={revision:r.draft.revision,events:o,omitted:n.superseded.length-o.length}}if(dt(d.pending),d.superseded&&new TextEncoder().encode(JSON.stringify(d)).length>at&&delete d.superseded,new TextEncoder().encode(JSON.stringify(d)).length>at)throw new Error("Offline recovery storage limit reached; pending work is preserved");return structuredClone(d)}function $r(e,t,r,i=indexedDB){let n=JSON.stringify([new URL(e).origin,t,r]),a=!1,s=new Promise((o,f)=>{let l=i.open("popmelt-plane-recovery",1);l.onupgradeneeded=()=>l.result.createObjectStore("planes"),l.onerror=()=>f(new Error("Could not open local draft recovery",{cause:l.error})),l.onblocked=()=>f(new Error("Local draft recovery is blocked by another browser view")),l.onsuccess=()=>{if(a){l.result.close(),f(new Error("Local draft recovery is closed"));return}l.result.onversionchange=()=>l.result.close(),o(l.result)}});s.catch(()=>{});let d=async o=>{let f=await s;if(a)throw new Error("Local draft recovery is closed");return new Promise((l,u)=>{let w=f.transaction("planes",o?"readwrite":"readonly"),I=w.objectStore("planes"),y=null,b,g=I.get(n);g.onsuccess=()=>{try{if(y=g.result??null,y&&(y.version!==1||y.reference.author.id!==r||y.basis.sourceId!==t))throw new Error("Invalid local recovery record; it has been preserved");o&&(y=Dr(y,o),I.put(y,n))}catch(c){b=c,w.abort()}},w.oncomplete=()=>l(y),w.onabort=()=>u(b??new Error("Could not save local draft recovery",{cause:w.error})),w.onerror=()=>{}})};return{read:()=>d(),update:o=>d(structuredClone(o)),async clear(){let o=await s;if(a)throw new Error("Local draft recovery is closed");await new Promise((f,l)=>{let u=o.transaction("planes","readwrite");u.objectStore("planes").delete(n),u.oncomplete=()=>f(),u.onabort=()=>l(u.error??new Error("Could not clear local draft recovery"))})},close(){a=!0,s.then(o=>o.close()).catch(()=>{})}}}var ke=class extends Error{constructor(e,t,r){super(t),this.status=e,this.code=r}},At=class{constructor(e,t,r,i=(...n)=>fetch(...n)){this.projectId=t,this.transport=i;let n=new URL(e);if(n.protocol!=="http:"||!["localhost","127.0.0.1","[::1]"].includes(n.hostname)||n.username||n.password||n.search||n.hash||n.pathname!=="/")throw new Error("Participant transport requires a local bridge origin");if(!t)throw new Error("Project identity required");this.base=n.origin,this.credential=r?{...r}:void 0}moderateStyles(e,t,r=!1){return this.rpc("moderate-styles",{participantId:e,styleModifications:t,restore:r})}moderateAnnotations(e,t,r=!1,i){return this.rpc("moderate-annotations",{participantId:e,annotationIds:t,restore:r,threadId:i})}async request(e,t,r={},i){let n=t instanceof FormData,a=await this.transport(this.base+e,{method:"POST",redirect:"error",credentials:"omit",signal:i??AbortSignal.timeout(3e4),headers:{...n?{}:{"Content-Type":"application/json"},"X-Popmelt-Project-Id":this.projectId,...this.credential?{"X-Popmelt-Participant-Id":this.credential.participantId,"X-Popmelt-Participant-Token":this.credential.token}:{},...r},body:n?t:JSON.stringify(t)}),s=await a.json().catch(()=>null);if(!a.ok)throw new ke(a.status,typeof s?.error=="string"?s.error:"Participant request failed",typeof s?.code=="string"?s.code:void 0);if(s===null)throw new Error("Invalid participant response");return{data:s,status:a.status}}async rpc(e,t={},r){return(await this.request("/participants/"+e,t,{},r)).data}mountRequestScope(e){if(!this.credential)throw new Error("Join before mounting a canvas");return mr(this.base,{"X-Popmelt-Project-Id":this.projectId,"X-Popmelt-Participant-Id":this.credential.participantId,"X-Popmelt-Participant-Token":this.credential.token,...e?{"X-Popmelt-Source-Revision":e.revision}:{}})}source(){return this.rpc("source")}snapshot(){return this.rpc("snapshot")}setHostModelSelection(e){return this.rpc("model-selection",{selection:e})}reserveAdmissionColor(e){return this.rpc("access-color",{receipt:e})}requestAdmission(e,t,r){return this.rpc("access-request",{receipt:e,name:t,colorIdentity:r})}admissionStatus(e){return this.rpc("access-status",{receipt:e})}cancelAdmission(e){return this.rpc("access-cancel",{receipt:e})}admissions(){return this.rpc("access-list")}decideAdmission(e,t){return this.rpc("access-decide",{id:e,decision:t})}attention(){return this.rpc("attention-read")}async reportAttention(e,t,r,i,n){return(await this.request("/participants/attention",{runtime:e,phase:t,operationId:r,location:i},{},n??AbortSignal.timeout(1500))).data}invite(){return this.rpc("invite")}revokeInvite(e){return this.rpc("revoke-invite",{invitation:e})}join(e,t,r){return this.rpc("join",{invitation:e,name:t,...r?{colorIdentity:r}:{}})}joinOrRequestAdmission(e,t,r){return this.rpc("join-or-request",{invitation:e,name:t,colorIdentity:r})}read(e,t){return this.rpc("read",{participantId:e,historyVersion:2},t)}connect(e,t){return this.rpc("connect",{runtimeId:e,previousToken:t})}renew(e,t){return this.rpc("renew",{runtime:e,activeColor:t})}disconnect(e){return this.rpc("disconnect",{runtime:e})}publish(e,t,r,i){return r.sourceId!==this.projectId?Promise.reject(new Error("Source world mismatch")):this.rpc("publish",{runtime:e,expectedRevision:t,sourceRevision:r.revision,state:i})}merge(e,t,r,i){return r.sourceId!==this.projectId?Promise.reject(new Error("Source world mismatch")):this.rpc("merge",{runtime:e,expectedRevision:t,sourceRevision:r.revision,events:i,historyVersion:2})}rename(e){return this.rpc("rename",{name:e})}setPermission(e,t){return this.rpc("permission",{participantId:e,permission:t})}revokeAccess(e){return this.rpc("revoke-access",{participantId:e})}pending(){return this.rpc("pending")}preview(e){return this.rpc("preview-read",{participantId:e})}previewWanted(e){return this.rpc("preview-demand",{runtime:e})}publishPreview(e,t,r){return this.rpc("preview-publish",{runtime:e,image:t,geometry:r})}review(e){return this.rpc("review",{id:e})}discard(e){return this.rpc("discard",{id:e})}submission(e,t){if(t===202&&e.pendingApproval===!0&&typeof e.submissionId=="string")return{status:"pending-approval",submissionId:e.submissionId,threadId:typeof e.threadId=="string"?e.threadId:void 0};if(t===200&&typeof e.jobId=="string"&&typeof e.threadId=="string"&&typeof e.position=="number")return{...e,status:"queued",jobId:e.jobId,threadId:e.threadId,position:e.position};throw new Error("Unexpected participant submission response")}async send(e,t,r){if(r.sourceId!==this.projectId)throw new Error("Source world mismatch");let i=await this.request("/send",e,{"X-Popmelt-Draft-Revision":String(t),"X-Popmelt-Source-Revision":r.revision});return this.submission(i.data,i.status)}contribute(e,t){return this.rpc("contribute",{threadId:e,text:t})}async approve(e,t){let r=await this.request("/participants/approve",{id:e,revision:t});return this.submission(r.data,r.status)}};function Jr(e){return[...new Set([...e.annotations.map(t=>t.linkedSelector),...e.styleModifications.map(t=>t.selector),...e.textModifications.map(t=>t.selector)].filter(t=>!!t))].slice(0,200)}function Wr(e,t,r){let i=Math.min(r.width/t.width,r.height/t.height),n=t.width*i,a=t.height*i;return{left:r.left+(r.width-n)/2+e.left*n,top:r.top+(r.height-a)/2+e.top*a,width:e.width*n,height:e.height*a}}function Xe(e){return e instanceof ke?e.status>=500||e.status===408||e.status===429||e.status===409&&(e.code==="runtime_expired"||e.code==="draft_conflict"):e instanceof TypeError||typeof e=="object"&&e!==null&&"name"in e&&(e.name==="TimeoutError"||e.name==="AbortError")}function pt(e,t=8e3){return Math.min(1e3*2**Math.min(Math.max(0,e-1),10),t)*(.5+Math.random()*.5)}function Ur(e,t,r){let i={selectedId:r};try{let a=JSON.parse(e.getItem(t)??"null");a?.version===1&&typeof a.selectedId=="string"&&a.selectedId&&(i={selectedId:a.selectedId,...typeof a.threadId=="string"&&a.threadId?{threadId:a.threadId}:{}})}catch{}let n=a=>{if(!(a.selectedId===i.selectedId&&a.threadId===i.threadId)){i=a;try{e.setItem(t,JSON.stringify({version:1,...i}))}catch{}}};return{read:()=>i,select(a){a!==i.selectedId&&n({selectedId:a})},rememberThread(a,s){a===i.selectedId&&n({selectedId:a,...s?{threadId:s}:{}})},clear(){i={selectedId:r};try{e.removeItem(t)}catch{}}}}async function qr(e){let{projectId:t,runtimeStorage:r}=e,i={...e.credential},n={...e.observedSource};if(n.sourceId!==t)throw new Error("The loaded source does not match this participant session");let a=new At(e.bridgeUrl,t,i),s=`popmelt-runtime:${t}:${i.participantId}`,d=`popmelt-view:${t}:${i.participantId}`,o=Ur(r,`popmelt-navigation:${t}:${i.participantId}`,i.participantId),f=rr(r,`popmelt-suggestion-views:${t}:${i.participantId}`),l;try{let h=JSON.parse(r.getItem(d)??"null");typeof h?.isAnnotating=="boolean"&&typeof h?.activeColor=="string"&&(l={isAnnotating:h.isAnnotating,activeColor:h.activeColor})}catch{}let u=null;try{u=JSON.parse(r.getItem(s)??"null"),(u?.participantId!==i.participantId||typeof u?.runtimeId!="string"||typeof u?.token!="string")&&(u=null)}catch{}let w=a.mountRequestScope(n),I=`popmelt-recovery-reset:${new URL(e.bridgeUrl).origin}:${t}:${i.participantId}`,y=!1;try{y=r.getItem(I)==="1"}catch{}let b=y?null:e.recoveryStore!==void 0?e.recoveryStore:typeof indexedDB<"u"?$r(e.bridgeUrl,t,i.participantId):null,g=null,c=null,p,x;try{g=await b?.read()??null;try{x=await a.read(),p=await a.connect(x.draft.history?crypto.randomUUID():u?.runtimeId??crypto.randomUUID(),x.draft.history?void 0:u?.token),r.setItem(s,JSON.stringify(p))}catch(h){if(h instanceof ke&&h.status===403&&(await a.snapshot().catch(()=>[])).find(J=>J.identity.id===i.participantId)?.revokedAt!==void 0)throw await b?.clear?.(),new ke(403,"Your access was removed by the host","access_removed");if(!g||!(h instanceof Error)||!Xe(h))throw h;x=g.reference,p={participantId:i.participantId,runtimeId:crypto.randomUUID(),token:"",expiresAt:0},c=h}x.draft.history&&b&&(g=await b.update({reference:x,basis:n,pending:[]}),g&&(x=g.reference))}catch(h){throw b?.close(),w(),h}let C;try{C=x.draft.history?Lr({draft:x.draft,source:n,actor:p.runtimeId,view:l,pendingEvents:g?.pending,persist:b?async(h,J,j)=>{await b.update({reference:{...x,draft:h},basis:J,pending:j})}:void 0,saveView:h=>{try{r.setItem(d,JSON.stringify({isAnnotating:h.isAnnotating,activeColor:h.activeColor}))}catch{}},save:(h,J,j,Q)=>a.merge(p,h,J,Q)}):null}catch(h){throw b?.close(),w(),h}let P=C??jr({draft:x.draft,source:n,save:(h,J,j)=>a.publish(p,h,J,j)}),A=!1,O=!1,M=null,T="connected",$=null,q=null,ie=0,H,ae=1e3,v=-1,te=!1,z=!1,F=new Set,R=()=>{for(let h of F)h()},L=()=>{A||H||$||T!=="reconnecting"||(H=setTimeout(()=>{H=void 0,oe()},ae),ae=Math.min(ae*2,3e4))},D=h=>{if(!A){if(M=h instanceof Error?h:new Error(String(h)),P.pause(M),M instanceof ke&&M.status===401){T="paused",z=!0,ie++,clearTimeout(H),H=void 0,R();return}T=Xe(M)?"reconnecting":"paused",T==="paused"&&(ie++,clearTimeout(H),H=void 0),L(),R()}},oe=(h=!1)=>{if(A)return Promise.reject(new Error("Participant runtime is closed"));if(q&&!h)return q;if($)return $;let J=++ie,j=()=>!A&&J===ie;return clearTimeout(H),H=void 0,T="reconnecting",P.pause(M??new Error("Reconnecting to the participant session")),R(),$=(async()=>{if(await P.whenSettled(),!j())return;let Q=await a.connect(p.runtimeId,p.token);if(A)return;p=Q;try{r.setItem(s,JSON.stringify(p))}catch(Oe){if(!C?.getStatus().memoryOnly)throw Oe}if(!j())return;let je=await a.read();j()&&(P.reconcile(je.draft),await P.flush(),j()&&(M=null,T="connected",ae=1e3,R()))})().catch(Q=>{j()&&D(Q)}).finally(()=>{$=null,L()}),$},me=P.binding.subscribe(()=>{T==="connected"&&P.flush().catch(D)}),be=C?.subscribeStatus(()=>{let h=C.getStatus().localError;h&&h!==M?D(h):R()}),pe,he=setInterval(()=>{if(A||O||T!=="connected")return;O=!0;let h=p,J=P.binding.getSnapshot().activeColor;a.renew(p,J!==pe?J:void 0).then(j=>{!A&&p===h&&(p=j,pe=J,r.setItem(s,JSON.stringify(j)))}).catch(j=>{pe=void 0,!(p!==h||T!=="connected")&&(D(j),j instanceof ke&&j.status===409&&j.code==="runtime_expired"&&oe())}).finally(()=>{O=!1})},4e3),de=!1,se=0,Ee=async h=>{if(A||T!=="connected"||!C||!h)return;let J=ie;if(h.draftRevision>P.getStatus().revision){let j=await a.read();!A&&T==="connected"&&J===ie&&C.receive(j.draft)}},ce=setInterval(()=>{A||de||T!=="connected"||!C||se||(de=!0,a.snapshot().then(async h=>{let J=h.find(j=>j.identity.id===i.participantId);await Ee(J)}).catch(D).finally(()=>{de=!1}))},1e3),ge=0,G=!1,_=()=>{let h=P.binding.getSnapshot();return JSON.stringify({annotations:h.annotations.map(J=>({...J,status:void 0})),styles:h.styleModifications,text:h.textModifications,dom:h.domModifications,spacing:h.spacingTokenChanges})},le=null,Ae=null,Y=!1,Le=setInterval(()=>{if(A||!le||Y||T!=="connected")return;let h=le,J=p;Y=!0,a.previewWanted(p).then(async({wanted:j})=>{if(!j||le!==h||A||T!=="connected")return;await P.flush();let Q=P.binding.getSnapshot(),je=P.getStatus().revision,Oe=await h.frame(Jr(Q));Oe&&le===h&&!A&&T==="connected"&&J.token===p.token&&Q===P.binding.getSnapshot()&&await a.publishPreview(p,Oe.image,{draftRevision:je,targets:Oe.targets})}).catch(j=>{if(!(A||T!=="connected")){if(j instanceof Error&&Xe(j)){D(j);return}le===h&&(Ae=j instanceof Error?j.message:"Preview unavailable",h.stop(),le=null,R())}}).finally(()=>{Y=!1})},1e3);c?D(c):g?.pending.length&&P.flush().catch(D);let re;return{client:a,credential:i,navigation:o,state:P,readViewedSuggestions:f.read,markSuggestionViewed:f.mark,markSuggestionsViewed:f.markMany,captureVersion:_,reportAttention(h,J,j,Q){return A||T!=="connected"?Promise.resolve(!1):a.reportAttention(p,h,J,j,Q)},bindSubjects(h){return re=h,()=>{re===h&&(re=void 0)}},getSubjects:()=>re,getStatus:()=>({error:M,phase:T,pendingCount:ge,sending:G,sharing:!!le,previewError:Ae,accessRemoved:z}),reconnect:()=>oe(),retainExternalMembershipPolling(){se++;let h=!1;return()=>{h||(h=!0,se--)}},async retryLocalSave(){if(q)return q;await C?.retryLocalSave(),await oe()},clearLocalSpace(){return q||(A||!C?Promise.reject(new Error("Local space is unavailable")):(q=Promise.resolve().then(async()=>{let h=$;if(ie++,clearTimeout(H),H=void 0,T="paused",P.pause(new Error("Clearing local space")),R(),await h,A)throw new Error("Participant runtime is closed");try{r.setItem(I,"1")}catch{}await C.clearLocalSpace();let J;try{if(await Promise.race([b?.clear?b.clear():Promise.reject(new Error("Local storage cannot be cleared")),new Promise((j,Q)=>{J=setTimeout(()=>Q(new Error("Local clear timed out")),2e3)})]),A)throw new Error("Participant runtime is closed");if(await C.resumeLocalSaving())try{r.removeItem(I)}catch{}}catch{}finally{clearTimeout(J)}if(A)throw new Error("Participant runtime is closed");if(await oe(!0),T!=="connected")throw M??new Error("Session remains unavailable")}).finally(()=>{q=null}),q))},observeMembership(h){if(!(A||h.identity.id!==i.participantId)){if(h.revokedAt!==void 0&&!te){te=!0,D(new ke(403,"Your access was removed by the host")),le?.stop(),le=null,r.removeItem(s),r.removeItem(d),o.clear(),P.revoke().then(()=>b?.clear?.()).then(()=>{z=!0,R()}).catch(J=>{M=J instanceof Error?J:new Error("Could not clear local draft"),R()});return}if(!te){if(h.permission!=="blocked"&&!de&&(de=!0,Ee(h).catch(D).finally(()=>{de=!1})),h.permission==="blocked")v=h.permissionEpoch,M instanceof ke&&M.status===403||D(new ke(403,"Participant access is blocked"));else if(T==="paused"&&M instanceof ke&&M.status===403&&h.permissionEpoch>v){v=h.permissionEpoch;let J=()=>{!A&&T==="paused"&&v===h.permissionEpoch&&M instanceof ke&&M.status===403&&oe()};$?$.then(J):J()}}}},sharePreview(h){if(A){h?.stop();return}le?.stop(),le=h,Ae=null,h||a.publishPreview(p,null).catch(()=>{}),R()},subscribe:h=>(F.add(h),()=>{F.delete(h)}),async send(h,J){if(A||T!=="connected")throw M??new Error("Participant runtime is closed");if(G)throw new Error("A submission is already in progress");G=!0,R();try{if(P.setSource(n),await P.flush(),T!=="connected")throw M??new Error("Draft sync paused");if(_()!==J)throw new Error("Draft changed during capture; send again to include your latest changes");let j=await a.send(hr(h),P.getStatus().revision,n);return j.status==="pending-approval"?(ge++,R(),{pendingApproval:!0,submissionId:j.submissionId,threadId:j.threadId}):j}finally{G=!1,R()}},dispose(){A||(A=!0,re=void 0,T="closed",clearTimeout(H),clearInterval(he),clearInterval(ce),clearInterval(Le),le?.stop(),le=null,a.publishPreview(p,null).catch(()=>{}),me(),be?.(),w(),P.dispose(),P.whenSettled().finally(()=>b?.close()),F.clear())}}}function _r(e,t){e.removeItem(`popmelt-participant:${t}`);let r=`popmelt-admission:${t}`,i;try{i=JSON.parse(e.getItem(r)??"null")}catch{e.removeItem(r);return}i&&typeof i=="object"&&e.setItem(r,JSON.stringify({name:i.name,colorIdentity:i.colorIdentity??i.receipt}))}var ft="popmelt-join",jt=/^[A-Za-z0-9_-]{43}$/;function zr(e,t){let r=new URL(e);if(!["http:","https:"].includes(r.protocol)||!["localhost","127.0.0.1","[::1]"].includes(r.hostname)||!jt.test(t))throw new Error("A local page and valid invitation are required");let i=Tt(r.href).cleanUrl,n=new URL(i);return n.hash=`${n.hash.slice(1)}${n.hash?"&":""}${ft}=${t}`,n.href}function Tt(e){let t=new URL(e),r=null,i=t.hash.slice(1).split("&").filter(n=>{if(!n.startsWith(`${ft}=`))return!0;let a=n.slice(ft.length+1);return jt.test(a)&&(r=a),!1});return t.hash=i.join("&"),{token:r,cleanUrl:t.href}}function Fr(e){let t={phase:"starting"},r=0,i=!1,n=!1,a=0,s,d=new Set,o=`popmelt-participant:${e.projectId}`,f=new At(e.url,e.projectId),l=g=>{if(!n){t=g;for(let c of d)c()}},u=async(g={})=>{let c=await fetch("/__popmelt/host",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"same-origin",body:JSON.stringify(g),redirect:"error"});if(c.status===403)return null;if(!c.ok)throw new Error(`Host entry unavailable (${c.status}).`);let p=`popmelt-before-participants:${e.projectId}`;return localStorage.getItem(p)===null&&localStorage.setItem(p,JSON.stringify(Object.fromEntries(Object.values(er(e.projectId)).map(x=>[x,localStorage.getItem(x)])))),await c.json()},w=g=>qr({bridgeUrl:e.url,projectId:e.projectId,credential:g,runtimeStorage:sessionStorage,observedSource:{sourceId:e.projectId,revision:e.revision}}),I=async(g,c=a)=>{if(n||c!==a)return;let p=await w(g);if(n||c!==a){p.dispose();return}try{localStorage.setItem(o,JSON.stringify(g))}catch(x){throw p.dispose(),x}s?.dispose(),s=p,l({phase:"connected",connection:p}),u({credential:g}).catch(()=>{})},y=()=>{a++,s?.dispose(),s=void 0,_r(localStorage,e.projectId),l({phase:"entry",invitation:null})},b=async()=>{let g=Tt(location.href),c=new URL(g.cleanUrl),p=new URLSearchParams(c.hash.slice(1)),x=p.get("popmelt-host");p.delete("popmelt-host"),x&&(c.hash=p.toString()),c.href!==location.href&&history.replaceState(history.state,"",c);let C=null;if(x){if(C=await u({token:x}),!C)throw new Error("Host entry expired. Use the current private host link.")}else if(!g.token){try{C=JSON.parse(localStorage.getItem(o)??"null")}catch{}C??(C=await u())}if(!n){if(!C){l({phase:"entry",invitation:g.token??null});return}try{await I(C)}catch(P){if(n)return;if(P.code==="access_removed"){y();return}if(P.status!==401)throw P;let A=await u();A?await I(A):y()}}};return{client:f,getSnapshot:()=>t,subscribe(g){return d.add(g),()=>{d.delete(g)}},retain(){if(n)throw new Error("Participant lifecycle is disposed");r++,i||(i=!0,b().catch(c=>l({phase:"error",message:c.message})));let g=!1;return()=>{g||(g=!0,r--,queueMicrotask(()=>{r||n||(n=!0,a++,s?.dispose(),s=void 0,d.clear())}))}},removed:y,async join(g,c){if(t.phase!=="entry"||!t.invitation||n)throw new Error("No active invitation");if(!c)throw new Error("Peer identity is not ready");let p=a,x=await f.joinOrRequestAdmission(t.invitation,g,c);if(!(n||p!==a)){if("admission"in x){localStorage.setItem(`popmelt-admission:${e.projectId}`,JSON.stringify({name:x.admission.name,receipt:c,colorIdentity:c})),l({phase:"entry",invitation:null});return}await I(x.joined.credential,p)}},admit:g=>I(g)}}function Ke(){let e=crypto.getRandomValues(new Uint8Array(32));return{id:crypto.randomUUID(),token:Array.from(e,t=>t.toString(16).padStart(2,"0")).join("")}}var Ue=360,qe=120,Ye=180,Ot=260;function Vr({client:e,storage:t,storageKey:r,onAdmitted:i,theme:n="light",themePreference:a=n,onThemePreferenceChange:s,onJoin:d}){let o=K(null),f=K(!1);if(!f.current){f.current=!0;try{o.current=JSON.parse(t.getItem(r)??"null")}catch{}}let[l,u]=U(o.current?.name??""),[w,I]=U(d?void 0:o.current?.receipt),[y,b]=U(null),[g,c]=U(),[p,x]=U(),C=K(null),[P,A]=U(!!d),[O,M]=U(!1),[T,$]=U(0),[q,ie]=U(),[H,ae]=U("idle"),[v,te]=U(),[z,F]=U(),R=K(!1),[L,D]=U(""),oe=K(null),me=K(null),be=K(null),pe=K(null),he=K(!1),de=K(0),se=K(!1),Ee=yr(),ce=K(!1),ge=K(0),G=K(i);G.current=i;let _=K(!1),le=K(null),Ae=K(()=>{});le.current||(le.current=new Promise(k=>{Ae.current=k}));let Y=rt[n],Le=P&&!g;ee(()=>{let k=!1,Z,X,V=()=>{k||(k=!0,_.current=!0,Ae.current())};typeof requestAnimationFrame=="function"&&(Z=requestAnimationFrame(()=>{X=requestAnimationFrame(V)}));let Ie=window.setTimeout(V,64);return()=>{Z!==void 0&&cancelAnimationFrame(Z),X!==void 0&&cancelAnimationFrame(X),window.clearTimeout(Ie),V()}},[]),ee(()=>fr(document),[]),St(()=>{let k=!0,Z=()=>{if(!k||!be.current)return;let X=getComputedStyle(be.current),V=document.createElement("span");Object.assign(V.style,{position:"fixed",visibility:"hidden",pointerEvents:"none",whiteSpace:"nowrap",fontFamily:X.fontFamily,fontSize:X.fontSize,fontWeight:X.fontWeight,lineHeight:X.lineHeight}),document.body.append(V);let Ie=Number.parseFloat(X.paddingLeft)+Number.parseFloat(X.paddingRight);V.textContent="Ask for access";let Pe=Ie+12+3+V.getBoundingClientRect().width;V.textContent="Request pending";let ye=Ie+12+3+V.getBoundingClientRect().width;V.textContent="Request declined";let Me=Ie+12+3+V.getBoundingClientRect().width;if(V.remove(),Pe>15&&ye>15&&Me>15&&te({ask:Math.ceil(Pe),pending:Math.ceil(ye),declined:Math.ceil(Me)}),pe.current){let xe=getComputedStyle(pe.current),ve=document.createElement("span");Object.assign(ve.style,{position:"fixed",visibility:"hidden",pointerEvents:"none",whiteSpace:"nowrap",fontFamily:xe.fontFamily,fontSize:xe.fontSize,fontWeight:xe.fontWeight,lineHeight:xe.lineHeight}),ve.textContent="Sending...",document.body.append(ve);let we=Number.parseFloat(xe.paddingLeft)+Number.parseFloat(xe.paddingRight);F({idle:Math.ceil(we+14),sending:Math.ceil(we+ve.getBoundingClientRect().width)}),ve.remove()}};return Z(),document.fonts?.ready.then(Z),()=>{k=!1}},[n,P]),ee(()=>{if(!T)return;let k=setTimeout(()=>$(0),Ue);return()=>clearTimeout(k)},[T]),ee(()=>{if(!q)return;let k=setTimeout(()=>ie(void 0),Ue);return()=>clearTimeout(k)},[q]),ee(()=>{if(H!=="in")return;let k=setTimeout(()=>ae("idle"),Ye);return()=>clearTimeout(k)},[H]),ee(()=>{o.current&&delete o.current.color;try{let k=JSON.parse(t.getItem(r)??"null");k&&typeof k=="object"&&"color"in k&&(delete k.color,t.setItem(r,JSON.stringify(k)))}catch{}},[t,r]);let re=!!(w&&(!y||y.status==="pending"||y.status==="granted")),h=(k,Z)=>{o.current={...o.current,name:k,receipt:Z},t.setItem(r,JSON.stringify(o.current))};ee(()=>{if(y?.status==="cancelled"){o.current={...o.current,name:l,receipt:void 0};try{t.setItem(r,JSON.stringify(o.current))}catch{}I(void 0),b(null)}},[y,l,t,r]);let J=()=>{if(C.current)return C.current;let k=async()=>{let Z=JSON.parse(t.getItem(r)??"null"),X=Z?.colorIdentity??Z?.receipt??Ke();o.current={name:l,receipt:Z?.receipt,colorIdentity:X},t.setItem(r,JSON.stringify(o.current));let V;try{V=await e.reserveAdmissionColor(X)}catch(Ie){let Pe=Ie.status;if(Pe!==400&&Pe!==401)throw Ie;X=Ke(),o.current={...o.current,colorIdentity:X},t.setItem(r,JSON.stringify(o.current)),V=await e.reserveAdmissionColor(X)}return c(V.color),x(tr(V)),X};return C.current=k().finally(()=>{C.current=null}),C.current},j=()=>{A(!P),P||D("")},Q=K(J);Q.current=J;let je=!!d;ee(()=>{if(!P||g)return;let k=!1,Z,X=0,V=async()=>{try{await Q.current()}catch{if(k)return;Z=setTimeout(()=>{V()},pt(++X))}};return V(),()=>{k=!0,clearTimeout(Z)}},[P,g,t,r]),ee(()=>{if(!P)return;me.current?.focus();let k=Z=>{Z.composedPath().includes(oe.current)||A(!1)};return document.addEventListener("pointerdown",k),()=>document.removeEventListener("pointerdown",k)},[P]),ee(()=>{if(!w)return;let k=!0,Z=!1,X=!1,V,Ie,Pe=()=>{ge.current+=1,o.current={...o.current,name:l,receipt:void 0};try{t.setItem(r,JSON.stringify(o.current))}catch{}I(void 0),b(null),A(!1),D("")},ye=()=>{X=!0;let ve=Ke(),we=0,De=async()=>{if(k)try{let $e=await Q.current();o.current={...o.current,name:l,receipt:ve,colorIdentity:$e},t.setItem(r,JSON.stringify(o.current));let _e=await e.requestAdmission(ve,l,$e);if(!k)return;ge.current+=1,I(ve),b(_e),D("")}catch{if(!k)return;Ie=setTimeout(()=>{De()},pt(++we))}};De()},Me=async()=>{if(Z||X||se.current||ce.current)return;Z=!0;let ve=ge.current;try{let we=await e.admissionStatus(w);if(!k||ve!==ge.current)return;if(we.status==="declined"){if(_.current||await le.current,!k||ve!==ge.current)return;X=!0;let De=window.matchMedia?.("(prefers-reduced-motion: reduce)").matches,$e=()=>{k&&(ae("rejected"),$(_e=>_e+1),V=setTimeout(()=>{if(k){if(De){Pe(),ae("idle");return}ae("rejected-out"),V=setTimeout(()=>{k&&(Pe(),ae("in"))},qe)}},Ue))};De?$e():(ae("pending-out"),V=setTimeout($e,qe));return}if(we.status==="expired"){ye();return}if(b(we),X=we.status==="cancelled",D(""),we.credential){se.current=!0;try{await G.current(we.credential),X=!0}finally{se.current=!1}}}catch(we){if(!k||ve!==ge.current)return;we.status===401&&ye()}finally{Z=!1}};Me();let xe=setInterval(Me,1500);return()=>{k=!1,clearInterval(xe),clearTimeout(V),clearTimeout(Ie)}},[e,w,l,t,r]);let Oe=async()=>{if(!(!w||O||ce.current)){ce.current=!0,ge.current+=1,M(!0),D("");try{let k=await e.cancelAdmission(w);b(k),A(!1)}catch{$(k=>k+1)}finally{ce.current=!1,M(!1)}}},et=async k=>{if(!l.trim()||O||re||R.current)return;if(R.current=!0,M(!0),D(""),ie(void 0),d){try{let X=await J();h(l.trim()),await d(l.trim(),X)}catch(X){D(X instanceof Error?X.message:"Could not join. Please try again.")}finally{R.current=!1,M(!1)}return}try{o.current=JSON.parse(t.getItem(r)??"null")}catch{}let Z=!y&&o.current?.receipt?o.current.receipt:Ke();try{let X=await J();h(l,Z),o.current={...o.current,name:l,receipt:Z};let V=await e.requestAdmission(Z,l.trim(),X);I(Z),u(V.name),b(V),A(!1)}catch{o.current={...o.current,name:l,receipt:Z},ie({target:k,pulse:++de.current})}finally{R.current=!1,M(!1)}};return B("div",{ref:oe,"data-devtools":"participant-admission","data-popmelt-font":"sans","data-popmelt-theme":n,style:{display:"contents"},onKeyDown:k=>{k.key==="Escape"&&(A(!1),k.stopPropagation())},children:[S("style",{children:`
2
+ import{a as Jt}from"./chunk-QTGE5KAA.mjs";import{tb as Wt,db as Ut,Cb as gt,Qa as qt,Xa as _t,cb as tt,Ta as zt,Wa as Ft,Ua as Vt,M as Ht,Sa as Xt,Va as Kt,sb as Yt,Za as Bt,pb as Zt,rb as Gt,qb as yt,Pa as vt,Ra as Qt,Ka as er,bb as tr,Ya as rr,Lb as nr,d as ir}from"./chunk-Q5QRV4KJ.mjs";import"./chunk-J4WDYITA.mjs";import{e as ar,N as or,xa as sr,Ca as lr,g as wt}from"./chunk-GNZ73T3H.mjs";import"./chunk-4LHTPRFY.mjs";import"./chunk-MTQ5IWIK.mjs";import{a as Te}from"./chunk-F6AMPRUB.mjs";import"./chunk-EXDOFFFJ.mjs";import{i as dr,a as cr,h as ur}from"./chunk-D32YV5O6.mjs";import{g as pr,e as rt,a as ze,d as fr}from"./chunk-V44RIEET.mjs";import{n as hr}from"./chunk-CPOYMGYY.mjs";import{a as mr}from"./chunk-6VXFTT5U.mjs";import"./chunk-XTOCFTVW.mjs";import"./chunk-LVEMYZOA.mjs";import{v as gr,o as bt}from"./chunk-RCVAPQ7X.mjs";import{useState as U,useSyncExternalStore as It,useEffect as ee,useRef as K,useCallback as Je,useMemo as nt,useId as yr,useLayoutEffect as St}from"react";import{Link2 as vr,Ban as wr,Clock as br,X as Ir,Hand as Sr,SendHorizontal as kr,LoaderCircle as Er,RotateCcw as Pr,Check as xr,Copy as Cr}from"lucide-react";import{jsxs as B,jsx as S,Fragment as We}from"react/jsx-runtime";var Ar=class extends Error{constructor(){super("The saved draft changed in another runtime. Your local changes are preserved.")}},it=(e,t)=>e.revision===t.revision&&JSON.stringify(e.source)===JSON.stringify(t.source)&&JSON.stringify(e.state)===JSON.stringify(t.state);function jr(e){let t=structuredClone(e.draft.state??Te),r=structuredClone(e.source),i=e.draft.revision,n=0,a=0,s=null,d=!1,o=structuredClone(e.draft),f=null,l=null,u=!1,w=new Set,I=new Set,y=()=>{for(let c of[...I])c()},b={getSnapshot:()=>t,subscribe:c=>(w.add(c),()=>{w.delete(c)}),dispatch:c=>{if(u)throw new Error("Participant runtime is disposed");let p=wt(t,c);if(p!==t){t=p,n++;for(let x of[...w])x();y()}}},g=()=>u?Promise.reject(new Error("Participant runtime is disposed")):l||(s||d?Promise.reject(s??new Error("Draft sync paused")):n===a?Promise.resolve():(l=Promise.resolve().then(async()=>{for(;!u&&!d&&n!==a;){let c=n,p=structuredClone(r),x=structuredClone(t);f={generation:c,draft:{revision:i+1,source:p,state:x}};let C=await e.save(i,p,x);if(!it(C,f.draft))throw new Error("Unexpected saved draft revision; reconnect before writing");i=C.revision,a=c,o=structuredClone(C),f=null}}).catch(c=>{throw s=c instanceof Error?c:new Error(String(c)),s}).finally(()=>{l=null,y()}),l));return{binding:b,flush:g,getStatus:()=>({revision:i,unsaved:n!==a,error:s,disposed:u}),subscribeStatus(c){return I.add(c),()=>{I.delete(c)}},pause(c){d=!0,s=c,y()},async whenSettled(){await l?.catch(()=>{})},reconcile(c){if(u)throw new Error("Participant runtime is disposed");if(l)throw new Error("Wait for the pending save before reconciling");if(!it(c,o)){if(!f||!it(c,f.draft))throw new Ar;i=c.revision,a=f.generation,o=structuredClone(c)}f=null,s=null,d=!1,y()},retry(){return s=null,d=!1,g()},setSource(c){if(u)throw new Error("Participant runtime is disposed");if(c.sourceId!==r.sourceId)throw new Error("Changing source worlds requires a new participant runtime");c.revision!==r.revision&&(r=structuredClone(c),n++,y())},async revoke(){u=!0,d=!0,await l?.catch(()=>{}),t=structuredClone(Te),f=null,o={revision:i,source:null,state:null};for(let c of[...w])c();y()},dispose(){u=!0,w.clear(),I.clear()}}}var kt=8192,at=8*1024*1024,Tr=256,Fe=100,Ce=(...e)=>JSON.stringify(e),Ve=(e,t)=>JSON.stringify(e)===JSON.stringify(t),Re=e=>structuredClone(e),Or=class extends Error{constructor(){super("This edit predates retained synchronization history"),this.name="PlaneHistoryExpiredError"}},Et=(e,t)=>Pt(e.stamp,t.stamp)||(e.id<t.id?-1:e.id>t.id?1:0);function He(e,t){let r=new Map([...e.checkpoint?.receipts??[],...e.events].map(a=>[a.id,a])),i=[],n=[];for(let a of t){let s=r.get(a.id);if(s){if(!Ve(s,a))throw new Error("Plane event identity was reused");continue}e.checkpoint&&Et(a,e.checkpoint.through)<=0?n.push(a):i.push(a)}return{pending:i,superseded:n}}function Mr(e,t){let r=He(e,t);if(r.superseded.length)throw new Or;return r.pending}function Pt(e,t){return e.time-t.time||e.counter-t.counter||(e.actor<t.actor?-1:e.actor>t.actor?1:0)}function Nr(e,t,r,i){let n=r.reduce((s,d)=>!s||Pt(d.stamp,s)>0?d.stamp:s,t),a=Math.max(Math.floor(i),n?.time??0);return{actor:e,time:a,counter:a===n?.time?n.counter+1:0}}function ot(e){let t=new Map;for(let r of e.annotations){t.set(Ce("annotation",r.id),!0);for(let[i,n]of Object.entries(r))i!=="id"&&n!==void 0&&t.set(Ce("annotation",r.id,i),n)}for(let r of e.styleModifications){let i=Ce(r.pathname??"/",r.selector),{changes:n,...a}=r;t.set(Ce("styleMeta",i),a);for(let s of n)t.set(Ce("style",i,s.property),s)}for(let r of e.textModifications)t.set(Ce("text",Ce(r.pathname??"/",r.selector,JSON.stringify(r.textNodePath))),r);for(let r of e.domModifications)t.set(Ce("dom",r.id),r);for(let r of e.spacingTokenChanges)t.set(Ce("spacing",r.tokenPath),r);for(let r of e.spacingTokenMods)t.set(Ce("spacingMod",r.tokenPath),r);return t}function st(e,t){let r=ot(e),i=ot(t);return[...new Set([...r.keys(),...i.keys()])].filter(n=>!(JSON.parse(n)[0]==="styleMeta"&&!i.has(n))).filter(n=>!Ve(r.get(n),i.get(n))).map(n=>({key:n,...i.has(n)?{value:Re(i.get(n))}:{}}))}function xt(e,t){let r={...t,annotations:[],styleModifications:[],textModifications:[],domModifications:[],spacingTokenChanges:[],spacingTokenMods:[]},i=new Map;for(let[a,s]of e){let[d,o,f]=JSON.parse(a);d==="annotation"&&!f&&s===!0&&i.set(o,{id:o})}let n=new Map;for(let[a,s]of e){let[d,o,f]=JSON.parse(a);if(d==="annotation"&&f&&i.has(o)&&Object.defineProperty(i.get(o),f,{value:s,enumerable:!0,configurable:!0,writable:!0}),d==="style"){let l=n.get(o),u=e.get(Ce("styleMeta",o));if(!u)continue;l||(l={...u,changes:[]},n.set(o,l)),l.changes.push(s)}d==="text"&&r.textModifications.push(s),d==="dom"&&r.domModifications.push(s),d==="spacing"&&r.spacingTokenChanges.push(s),d==="spacingMod"&&r.spacingTokenMods.push(s)}return r.annotations=[...i.values()],r.styleModifications=[...n.values()],r.selectedAnnotationIds=t.selectedAnnotationIds.filter(a=>i.has(a)),r.lastSelectedId=r.selectedAnnotationIds.includes(t.lastSelectedId??"")?t.lastSelectedId:null,r}var Ct=e=>({annotations:e.annotations,styleModifications:e.styleModifications,textModifications:e.textModifications,domModifications:e.domModifications,spacingTokenChanges:e.spacingTokenChanges,spacingTokenMods:e.spacingTokenMods});function lt(e=Te){let t=[...e.undoStack.slice(-Fe),Ct(e)],r={...Re(e),...Re(t[0]),undoStack:[],redoStack:[]},i=[];for(let s=1;s<t.length;s++){let d=`migration:${s}`;i.push({id:d,stamp:{time:0,counter:s,actor:"migration"},kind:"edit",group:d,changes:st({...r,...t[s-1]},{...r,...t[s]})})}let n=e,a=[];for(let s of[...e.redoStack].reverse().slice(0,Fe)){let d=`migration:${i.length+1}`,o={...r,...s};i.push({id:d,stamp:{time:0,counter:i.length+1,actor:"migration"},kind:"edit",group:d,changes:st(n,o)}),a.push(d),n=o}for(let s of a.reverse()){let d=`migration:${i.length+1}`;i.push({id:d,stamp:{time:0,counter:i.length+1,actor:"migration"},kind:"undo",target:s})}return{version:1,base:r,events:i}}function dt(e){if(!Array.isArray(e)||e.length>kt||JSON.stringify(e).length>at)throw new Error("Plane history exceeds the local session limit");for(let t of e){let r=n=>typeof n=="string"&&n.length>0&&n.length<=256;if(!t||!r(t.id)||!t.stamp||!r(t.stamp.actor)||!Number.isSafeInteger(t.stamp.time)||t.stamp.time<0||!Number.isSafeInteger(t.stamp.counter)||t.stamp.counter<0||!["edit","undo","redo"].includes(t.kind))throw new Error("Invalid plane event");if(t.kind!=="edit"){if(!r(t.target))throw new Error("Invalid history target");continue}if(t.group!==void 0&&!r(t.group)||t.reset!==void 0&&typeof t.reset!="boolean"||!Array.isArray(t.changes)||t.changes.length>1e4)throw new Error("Invalid plane edit");let i=new Set;for(let n of t.changes){if(!n||typeof n.key!="string"||n.key.length>8192)throw new Error("Invalid property key");let a=JSON.parse(n.key);if(!Array.isArray(a)||a.length<2||a.length>3||a.some(s=>typeof s!="string"||!s.length)||!["annotation","style","styleMeta","text","dom","spacing","spacingMod"].includes(a[0])||a[0]==="style"&&a.length!==3||!["style","annotation"].includes(a[0])&&a.length!==2||a[0]==="annotation"&&a.length===2&&n.value!==void 0&&n.value!==!0||i.has(n.key))throw new Error("Invalid property key");i.add(n.key)}}return Re(e)}function ct(e,t){let r=new Map(e.events.map(i=>[i.id,i]));for(let i of Mr(e,t)){let n=r.get(i.id);if(n&&!Ve(n,i))throw new Error("Plane event identity was reused");r.set(i.id,i)}if(r.size>kt)throw new Error("Plane history exceeds the local session limit");return{...e,events:[...r.values()].sort(Et)}}function Rr(e){if(e.version!==1&&e.version!==2)throw new Error("Unsupported plane history version");if(e.version===2&&!e.checkpoint)throw new Error("Missing plane history checkpoint");let t=e.checkpoint,r=t?new Map(Re(t.cells)):ot(e.base),i=new Map(t?.writers??[]),n=Re(t?.undo??[]),a=Re(t?.redo??[]),s=(d,o)=>{let f=[],l=[...d].sort((u,w)=>JSON.parse(u.key).length-JSON.parse(w.key).length);for(let u of l){let[w,I,y]=JSON.parse(u.key);if(w==="styleMeta"&&u.value===void 0)continue;let b=i.get(u.key)??"base";if(u.guard!==void 0&&b!==u.guard||w==="annotation"&&y&&!r.has(Ce(w,I)))continue;let g=r.get(u.key);u.value===void 0?r.delete(u.key):r.set(u.key,u.value);let c=u.restoreWriter??o;if(i.set(u.key,c),f.push({key:u.key,before:g,after:u.value,beforeWriter:b,afterWriter:c}),w==="annotation"&&!y&&u.value===void 0)for(let p of[...r.keys()]){let[x,C]=JSON.parse(p);x===w&&C===I&&(f.push({key:p,before:r.get(p),after:void 0,beforeWriter:i.get(p)??"base",afterWriter:c}),r.delete(p),i.set(p,c))}}return f};for(let d of e.events)if(d.kind==="edit"){let o=s(d.changes,d.group??d.id);if(d.reset&&(n.length=0,a.length=0),!d.group||!o.length)continue;let f=n.find(l=>l.id===d.group);if(f)for(let l of o){let u=f.changes.find(w=>w.key===l.key);u?(u.after=l.after,u.afterWriter=l.afterWriter):f.changes.push(l)}else n.push({id:d.group,writer:d.group,changes:o});a.length=0,n.length>Fe&&n.shift()}else{let o=d.kind==="undo"?n:a,f=d.kind==="undo"?a:n,l=o.findIndex(I=>I.id===d.target);if(l<0)continue;let u=o.splice(l,1)[0],w=s(u.changes.map(I=>({key:I.key,value:I.before,guard:I.afterWriter,restoreWriter:I.beforeWriter})),d.id);w.length&&f.push({id:d.id,writer:d.id,changes:w}),f.length>Fe&&f.shift()}return{cells:r,writers:i,undo:n,redo:a}}function ut(e,t=e.base,r=!0){let{cells:i,writers:n,undo:a,redo:s}=Rr(e),d=xt(i,t);d.styleModifications=d.styleModifications.filter(I=>!e.hostStyleDeletions?.some(y=>ir(I,y)));let o=new Set(Object.keys(e.hostDeletions??{}));d.annotations=d.annotations.filter(I=>!o.has(I.id)),d.selectedAnnotationIds=d.selectedAnnotationIds.filter(I=>!o.has(I));let f=I=>{let y=new Map(i);for(let b of I.changes)(n.get(b.key)??"base")===b.afterWriter&&(b.before===void 0?y.delete(b.key):y.set(b.key,b.before));return Ct(xt(y,t))},l=I=>I.filter(y=>y.changes.some(b=>JSON.parse(b.key)[0]!=="styleMeta"&&(n.get(b.key)??"base")===b.afterWriter&&!Ve(b.before,i.get(b.key)))),u=l(a),w=l(s);return d.undoStack=r?u.map(f):[],d.redoStack=r?w.map(f):[],{state:Re(d),undo:u.map(I=>I.id),redo:w.map(I=>I.id)}}function Lr(e){let t=structuredClone(e.draft.history??lt(e.draft.state??Te)),r=He(t,e.pendingEvents??[]);t=ct(t,r.pending);let i=ut(t,{...structuredClone(e.draft.state??Te),...e.view}),n=i.state,a=structuredClone(e.source),s=e.draft.revision,d=r.pending,o=structuredClone(e.draft),f=null,l=!!e.persist,u=0,w=0,I=Promise.resolve(),y=!1,b,g,c=null,p=null,x=!1,C=!1,P=new Set,A=new Set,O=()=>{for(let v of[...P])v()},M=()=>{for(let v of[...A])v()},T=()=>{i=ut(t,n),n=i.state},$=()=>{if(!e.persist||!l)return Promise.resolve();let v=structuredClone(o),te=structuredClone(a),z=structuredClone(d),F=u;return w++,I=I.then(()=>e.persist(v,te,z)).then(()=>{F===u&&(f=null)}).catch(R=>{F===u&&(f=R instanceof Error?R:new Error(String(R)))}).finally(()=>{F===u&&(w--,M())}),I},q=async()=>{do await I;while(w>0);if(f)throw f},ie=v=>{if(v.revision<s)return;if(v.source&&v.source.sourceId!==a.sourceId)throw new Error("Draft source world mismatch");if(!v.history)throw new Error("Shared history is unavailable; reconnect to an updated bridge");let te=He(v.history,d),z=ct(structuredClone(v.history),te.pending),F=JSON.stringify(z.hostStyleDeletions)!==JSON.stringify(t.hostStyleDeletions)||JSON.stringify(z.hostDeletions)!==JSON.stringify(t.hostDeletions)||z.checkpoint?.through.id!==t.checkpoint?.through.id||z.events.length!==t.events.length||z.events.some((R,L)=>R.id!==t.events[L]?.id);d=te.pending,te.superseded.length&&(g=void 0),t=z,s=v.revision,o=structuredClone(v),F&&T(),$()},H={getSnapshot:()=>n,getUndoHead:()=>i.undo.at(-1),subscribe(v){return P.add(v),()=>{P.delete(v)}},dispatch(v){if(C)throw new Error("Participant runtime is disposed");let te=n,z,F=()=>(b=Nr(e.actor,b,t.events,(e.now??Date.now)()),b),R=()=>crypto.randomUUID();if(v.type==="UNDO"||v.type==="REDO"){let L=(v.type==="UNDO"?i.undo:i.redo).at(-1);if(!L)return;z={id:R(),stamp:F(),kind:v.type==="UNDO"?"undo":"redo",target:L},g=void 0}else{let L=wt(n,v);if(L===n)return;let D=v.type==="UPDATE_LINKED_POSITIONS"?[]:st(n,L),oe=L.undoStack.length>n.undoStack.length,me=["MODIFY_STYLE","MOVE_ANNOTATION","RESIZE_ANNOTATION","UPDATE_ANNOTATION_COLOR"].includes(v.type);if(D.length){let be=R(),pe=oe||me?!oe&&g&&g===i.undo.at(-1)?g:be:void 0;z={id:be,stamp:F(),kind:"edit",changes:D,...pe?{group:pe}:{},...v.type==="CLEAR"?{reset:!0}:{}},g=pe}n=L}if(z){try{t=ct(t,[z])}catch(L){n=te,p=L instanceof Error?L:new Error(String(L)),x=!0,g=void 0,O(),M();return}d.push(z),T(),$()}O(),M(),e.saveView?.(n)}},ae=()=>C?Promise.reject(new Error("Participant runtime is disposed")):c||(p||x?Promise.reject(p??new Error("Draft sync paused")):!d.length&&!y&&!w&&!f?Promise.resolve():(c=Promise.resolve().then(async()=>{for(f&&await $(),await q();!C&&!x&&(d.length||y);){await q();let v=structuredClone(d.slice(0,Tr)),te=structuredClone(a),z=await e.save(s,te,n,v);if(C)return;ie(z),await q(),a.revision===te.revision&&(y=!1),O()}}).catch(v=>{throw p=v instanceof Error?v:new Error(String(v)),p}).finally(()=>{c=null,M()}),c));return{binding:H,flush:ae,getStatus:()=>({revision:s,unsaved:d.length>0||y,error:p,localError:f,memoryOnly:!l,savingLocally:w>0,disposed:C}),subscribeStatus(v){return A.add(v),()=>{A.delete(v)}},pause(v){x=!0,p=v,M()},async whenSettled(){await c?.catch(()=>{}),await q().catch(()=>{})},whenDurable:q,async retryLocalSave(){if(C)throw new Error("Participant runtime is disposed");await $(),await q()},async clearLocalSpace(){if(x=!0,await c?.catch(()=>{}),await q().catch(()=>{}),C)throw new Error("Participant runtime is disposed");l=!1,d=[],y=!1,g=void 0,t=structuredClone(o.history??lt(o.state??Te)),i=ut(t,{...structuredClone(Te),activeColor:n.activeColor,isAnnotating:n.isAnnotating}),n=i.state,s=o.revision,f=null,p=null,O(),M()},async resumeLocalSaving(){if(!e.persist||C)return!1;l=!0;let v;try{return await Promise.race([$().then(q),new Promise((te,z)=>{v=setTimeout(()=>z(new Error("Local saving timed out")),2e3)})]),!C}catch{return u++,l=!1,w=0,I=Promise.resolve(),f=null,M(),!1}finally{clearTimeout(v)}},reconcile(v){if(C)throw new Error("Participant runtime is disposed");if(c)throw new Error("Wait for the pending save before reconciling");ie(v),p=null,x=!1,O(),M()},receive(v){C||x||c||v.revision<=s||(ie(v),O(),M())},retry(){return x=!1,p=null,ae()},setSource(v){if(v.sourceId!==a.sourceId)throw new Error("Changing source worlds requires a new participant runtime");v.revision===a.revision&&o.source?.revision===v.revision||(a=structuredClone(v),y=!0,M())},async revoke(){C=!0,x=!0,await c?.catch(()=>{}),await q().catch(()=>{}),d=[],t=lt(Te),n=structuredClone(Te),o={revision:s,source:null,state:null},O(),M()},dispose(){C=!0,P.clear(),A.clear()}}}function Dr(e,t){if(!t.reference.draft.history||t.reference.draft.source&&t.basis.sourceId!==t.reference.draft.source.sourceId)throw new Error("Offline recovery requires a matching shared-history source");if(e&&(e.version!==1||e.reference.author.id!==t.reference.author.id||e.reference.planeId!==t.reference.planeId||e.basis.sourceId!==t.basis.sourceId))throw new Error("Offline recovery belongs to a different plane");let r=e&&e.reference.draft.revision>t.reference.draft.revision?e.reference:t.reference,i=new Map;for(let o of[...dt(e?.pending??[]),...dt(t.pending)]){let f=i.get(o.id);if(f&&JSON.stringify(f)!==JSON.stringify(o))throw new Error("Offline operation identity was reused");i.set(o.id,o)}let n=He(r.draft.history,[...i.values()]),a=new Set(n.pending.map(o=>o.id)),s=e?.pending.some(o=>a.has(o.id)),d={version:1,reference:r,basis:s?e.basis:t.basis,pending:n.pending,...e?.superseded?{superseded:e.superseded}:{}};if(n.superseded.length){let o=n.superseded.slice(-128);for(;o.length&&new TextEncoder().encode(JSON.stringify(o)).length>256*1024;)o.shift();d.superseded={revision:r.draft.revision,events:o,omitted:n.superseded.length-o.length}}if(dt(d.pending),d.superseded&&new TextEncoder().encode(JSON.stringify(d)).length>at&&delete d.superseded,new TextEncoder().encode(JSON.stringify(d)).length>at)throw new Error("Offline recovery storage limit reached; pending work is preserved");return structuredClone(d)}function $r(e,t,r,i=indexedDB){let n=JSON.stringify([new URL(e).origin,t,r]),a=!1,s=new Promise((o,f)=>{let l=i.open("popmelt-plane-recovery",1);l.onupgradeneeded=()=>l.result.createObjectStore("planes"),l.onerror=()=>f(new Error("Could not open local draft recovery",{cause:l.error})),l.onblocked=()=>f(new Error("Local draft recovery is blocked by another browser view")),l.onsuccess=()=>{if(a){l.result.close(),f(new Error("Local draft recovery is closed"));return}l.result.onversionchange=()=>l.result.close(),o(l.result)}});s.catch(()=>{});let d=async o=>{let f=await s;if(a)throw new Error("Local draft recovery is closed");return new Promise((l,u)=>{let w=f.transaction("planes",o?"readwrite":"readonly"),I=w.objectStore("planes"),y=null,b,g=I.get(n);g.onsuccess=()=>{try{if(y=g.result??null,y&&(y.version!==1||y.reference.author.id!==r||y.basis.sourceId!==t))throw new Error("Invalid local recovery record; it has been preserved");o&&(y=Dr(y,o),I.put(y,n))}catch(c){b=c,w.abort()}},w.oncomplete=()=>l(y),w.onabort=()=>u(b??new Error("Could not save local draft recovery",{cause:w.error})),w.onerror=()=>{}})};return{read:()=>d(),update:o=>d(structuredClone(o)),async clear(){let o=await s;if(a)throw new Error("Local draft recovery is closed");await new Promise((f,l)=>{let u=o.transaction("planes","readwrite");u.objectStore("planes").delete(n),u.oncomplete=()=>f(),u.onabort=()=>l(u.error??new Error("Could not clear local draft recovery"))})},close(){a=!0,s.then(o=>o.close()).catch(()=>{})}}}var ke=class extends Error{constructor(e,t,r){super(t),this.status=e,this.code=r}},At=class{constructor(e,t,r,i=(...n)=>fetch(...n)){this.projectId=t,this.transport=i;let n=new URL(e);if(n.protocol!=="http:"||!["localhost","127.0.0.1","[::1]"].includes(n.hostname)||n.username||n.password||n.search||n.hash||n.pathname!=="/")throw new Error("Participant transport requires a local bridge origin");if(!t)throw new Error("Project identity required");this.base=n.origin,this.credential=r?{...r}:void 0}moderateStyles(e,t,r=!1){return this.rpc("moderate-styles",{participantId:e,styleModifications:t,restore:r})}moderateAnnotations(e,t,r=!1,i){return this.rpc("moderate-annotations",{participantId:e,annotationIds:t,restore:r,threadId:i})}async request(e,t,r={},i){let n=t instanceof FormData,a=await this.transport(this.base+e,{method:"POST",redirect:"error",credentials:"omit",signal:i??AbortSignal.timeout(3e4),headers:{...n?{}:{"Content-Type":"application/json"},"X-Popmelt-Project-Id":this.projectId,...this.credential?{"X-Popmelt-Participant-Id":this.credential.participantId,"X-Popmelt-Participant-Token":this.credential.token}:{},...r},body:n?t:JSON.stringify(t)}),s=await a.json().catch(()=>null);if(!a.ok)throw new ke(a.status,typeof s?.error=="string"?s.error:"Participant request failed",typeof s?.code=="string"?s.code:void 0);if(s===null)throw new Error("Invalid participant response");return{data:s,status:a.status}}async rpc(e,t={},r){return(await this.request("/participants/"+e,t,{},r)).data}mountRequestScope(e){if(!this.credential)throw new Error("Join before mounting a canvas");return mr(this.base,{"X-Popmelt-Project-Id":this.projectId,"X-Popmelt-Participant-Id":this.credential.participantId,"X-Popmelt-Participant-Token":this.credential.token,...e?{"X-Popmelt-Source-Revision":e.revision}:{}})}source(){return this.rpc("source")}snapshot(){return this.rpc("snapshot")}setHostModelSelection(e){return this.rpc("model-selection",{selection:e})}reserveAdmissionColor(e){return this.rpc("access-color",{receipt:e})}requestAdmission(e,t,r){return this.rpc("access-request",{receipt:e,name:t,colorIdentity:r})}admissionStatus(e){return this.rpc("access-status",{receipt:e})}cancelAdmission(e){return this.rpc("access-cancel",{receipt:e})}admissions(){return this.rpc("access-list")}decideAdmission(e,t){return this.rpc("access-decide",{id:e,decision:t})}attention(){return this.rpc("attention-read")}async reportAttention(e,t,r,i,n){return(await this.request("/participants/attention",{runtime:e,phase:t,operationId:r,location:i},{},n??AbortSignal.timeout(1500))).data}invite(){return this.rpc("invite")}revokeInvite(e){return this.rpc("revoke-invite",{invitation:e})}join(e,t,r){return this.rpc("join",{invitation:e,name:t,...r?{colorIdentity:r}:{}})}joinOrRequestAdmission(e,t,r){return this.rpc("join-or-request",{invitation:e,name:t,colorIdentity:r})}read(e,t){return this.rpc("read",{participantId:e,historyVersion:2},t)}connect(e,t){return this.rpc("connect",{runtimeId:e,previousToken:t})}renew(e,t){return this.rpc("renew",{runtime:e,activeColor:t})}disconnect(e){return this.rpc("disconnect",{runtime:e})}publish(e,t,r,i){return r.sourceId!==this.projectId?Promise.reject(new Error("Source world mismatch")):this.rpc("publish",{runtime:e,expectedRevision:t,sourceRevision:r.revision,state:i})}merge(e,t,r,i){return r.sourceId!==this.projectId?Promise.reject(new Error("Source world mismatch")):this.rpc("merge",{runtime:e,expectedRevision:t,sourceRevision:r.revision,events:i,historyVersion:2})}rename(e){return this.rpc("rename",{name:e})}setPermission(e,t){return this.rpc("permission",{participantId:e,permission:t})}revokeAccess(e){return this.rpc("revoke-access",{participantId:e})}pending(){return this.rpc("pending")}preview(e){return this.rpc("preview-read",{participantId:e})}previewWanted(e){return this.rpc("preview-demand",{runtime:e})}publishPreview(e,t,r){return this.rpc("preview-publish",{runtime:e,image:t,geometry:r})}review(e){return this.rpc("review",{id:e})}discard(e){return this.rpc("discard",{id:e})}submission(e,t){if(t===202&&e.pendingApproval===!0&&typeof e.submissionId=="string")return{status:"pending-approval",submissionId:e.submissionId,threadId:typeof e.threadId=="string"?e.threadId:void 0};if(t===200&&typeof e.jobId=="string"&&typeof e.threadId=="string"&&typeof e.position=="number")return{...e,status:"queued",jobId:e.jobId,threadId:e.threadId,position:e.position};throw new Error("Unexpected participant submission response")}async send(e,t,r){if(r.sourceId!==this.projectId)throw new Error("Source world mismatch");let i=await this.request("/send",e,{"X-Popmelt-Draft-Revision":String(t),"X-Popmelt-Source-Revision":r.revision});return this.submission(i.data,i.status)}contribute(e,t){return this.rpc("contribute",{threadId:e,text:t})}async approve(e,t){let r=await this.request("/participants/approve",{id:e,revision:t});return this.submission(r.data,r.status)}};function Jr(e){return[...new Set([...e.annotations.map(t=>t.linkedSelector),...e.styleModifications.map(t=>t.selector),...e.textModifications.map(t=>t.selector)].filter(t=>!!t))].slice(0,200)}function Wr(e,t,r){let i=Math.min(r.width/t.width,r.height/t.height),n=t.width*i,a=t.height*i;return{left:r.left+(r.width-n)/2+e.left*n,top:r.top+(r.height-a)/2+e.top*a,width:e.width*n,height:e.height*a}}function Xe(e){return e instanceof ke?e.status>=500||e.status===408||e.status===429||e.status===409&&(e.code==="runtime_expired"||e.code==="draft_conflict"):e instanceof TypeError||typeof e=="object"&&e!==null&&"name"in e&&(e.name==="TimeoutError"||e.name==="AbortError")}function pt(e,t=8e3){return Math.min(1e3*2**Math.min(Math.max(0,e-1),10),t)*(.5+Math.random()*.5)}function Ur(e,t,r){let i={selectedId:r};try{let a=JSON.parse(e.getItem(t)??"null");a?.version===1&&typeof a.selectedId=="string"&&a.selectedId&&(i={selectedId:a.selectedId,...typeof a.threadId=="string"&&a.threadId?{threadId:a.threadId}:{}})}catch{}let n=a=>{if(!(a.selectedId===i.selectedId&&a.threadId===i.threadId)){i=a;try{e.setItem(t,JSON.stringify({version:1,...i}))}catch{}}};return{read:()=>i,select(a){a!==i.selectedId&&n({selectedId:a})},rememberThread(a,s){a===i.selectedId&&n({selectedId:a,...s?{threadId:s}:{}})},clear(){i={selectedId:r};try{e.removeItem(t)}catch{}}}}async function qr(e){let{projectId:t,runtimeStorage:r}=e,i={...e.credential},n={...e.observedSource};if(n.sourceId!==t)throw new Error("The loaded source does not match this participant session");let a=new At(e.bridgeUrl,t,i),s=`popmelt-runtime:${t}:${i.participantId}`,d=`popmelt-view:${t}:${i.participantId}`,o=Ur(r,`popmelt-navigation:${t}:${i.participantId}`,i.participantId),f=rr(r,`popmelt-suggestion-views:${t}:${i.participantId}`),l;try{let h=JSON.parse(r.getItem(d)??"null");typeof h?.isAnnotating=="boolean"&&typeof h?.activeColor=="string"&&(l={isAnnotating:h.isAnnotating,activeColor:h.activeColor})}catch{}let u=null;try{u=JSON.parse(r.getItem(s)??"null"),(u?.participantId!==i.participantId||typeof u?.runtimeId!="string"||typeof u?.token!="string")&&(u=null)}catch{}let w=a.mountRequestScope(n),I=`popmelt-recovery-reset:${new URL(e.bridgeUrl).origin}:${t}:${i.participantId}`,y=!1;try{y=r.getItem(I)==="1"}catch{}let b=y?null:e.recoveryStore!==void 0?e.recoveryStore:typeof indexedDB<"u"?$r(e.bridgeUrl,t,i.participantId):null,g=null,c=null,p,x;try{g=await b?.read()??null;try{x=await a.read(),p=await a.connect(x.draft.history?crypto.randomUUID():u?.runtimeId??crypto.randomUUID(),x.draft.history?void 0:u?.token),r.setItem(s,JSON.stringify(p))}catch(h){if(h instanceof ke&&h.status===403&&(await a.snapshot().catch(()=>[])).find(J=>J.identity.id===i.participantId)?.revokedAt!==void 0)throw await b?.clear?.(),new ke(403,"Your access was removed by the host","access_removed");if(!g||!(h instanceof Error)||!Xe(h))throw h;x=g.reference,p={participantId:i.participantId,runtimeId:crypto.randomUUID(),token:"",expiresAt:0},c=h}x.draft.history&&b&&(g=await b.update({reference:x,basis:n,pending:[]}),g&&(x=g.reference))}catch(h){throw b?.close(),w(),h}let C;try{C=x.draft.history?Lr({draft:x.draft,source:n,actor:p.runtimeId,view:l,pendingEvents:g?.pending,persist:b?async(h,J,j)=>{await b.update({reference:{...x,draft:h},basis:J,pending:j})}:void 0,saveView:h=>{try{r.setItem(d,JSON.stringify({isAnnotating:h.isAnnotating,activeColor:h.activeColor}))}catch{}},save:(h,J,j,Q)=>a.merge(p,h,J,Q)}):null}catch(h){throw b?.close(),w(),h}let P=C??jr({draft:x.draft,source:n,save:(h,J,j)=>a.publish(p,h,J,j)}),A=!1,O=!1,M=null,T="connected",$=null,q=null,ie=0,H,ae=1e3,v=-1,te=!1,z=!1,F=new Set,R=()=>{for(let h of F)h()},L=()=>{A||H||$||T!=="reconnecting"||(H=setTimeout(()=>{H=void 0,oe()},ae),ae=Math.min(ae*2,3e4))},D=h=>{if(!A){if(M=h instanceof Error?h:new Error(String(h)),P.pause(M),M instanceof ke&&M.status===401){T="paused",z=!0,ie++,clearTimeout(H),H=void 0,R();return}T=Xe(M)?"reconnecting":"paused",T==="paused"&&(ie++,clearTimeout(H),H=void 0),L(),R()}},oe=(h=!1)=>{if(A)return Promise.reject(new Error("Participant runtime is closed"));if(q&&!h)return q;if($)return $;let J=++ie,j=()=>!A&&J===ie;return clearTimeout(H),H=void 0,T="reconnecting",P.pause(M??new Error("Reconnecting to the participant session")),R(),$=(async()=>{if(await P.whenSettled(),!j())return;let Q=await a.connect(p.runtimeId,p.token);if(A)return;p=Q;try{r.setItem(s,JSON.stringify(p))}catch(Oe){if(!C?.getStatus().memoryOnly)throw Oe}if(!j())return;let je=await a.read();j()&&(P.reconcile(je.draft),await P.flush(),j()&&(M=null,T="connected",ae=1e3,R()))})().catch(Q=>{j()&&D(Q)}).finally(()=>{$=null,L()}),$},me=P.binding.subscribe(()=>{T==="connected"&&P.flush().catch(D)}),be=C?.subscribeStatus(()=>{let h=C.getStatus().localError;h&&h!==M?D(h):R()}),pe,he=setInterval(()=>{if(A||O||T!=="connected")return;O=!0;let h=p,J=P.binding.getSnapshot().activeColor;a.renew(p,J!==pe?J:void 0).then(j=>{!A&&p===h&&(p=j,pe=J,r.setItem(s,JSON.stringify(j)))}).catch(j=>{pe=void 0,!(p!==h||T!=="connected")&&(D(j),j instanceof ke&&j.status===409&&j.code==="runtime_expired"&&oe())}).finally(()=>{O=!1})},4e3),de=!1,se=0,Ee=async h=>{if(A||T!=="connected"||!C||!h)return;let J=ie;if(h.draftRevision>P.getStatus().revision){let j=await a.read();!A&&T==="connected"&&J===ie&&C.receive(j.draft)}},ce=setInterval(()=>{A||de||T!=="connected"||!C||se||(de=!0,a.snapshot().then(async h=>{let J=h.find(j=>j.identity.id===i.participantId);await Ee(J)}).catch(D).finally(()=>{de=!1}))},1e3),ge=0,G=!1,_=()=>{let h=P.binding.getSnapshot();return JSON.stringify({annotations:h.annotations.map(J=>({...J,status:void 0})),styles:h.styleModifications,text:h.textModifications,dom:h.domModifications,spacing:h.spacingTokenChanges})},le=null,Ae=null,Y=!1,Le=setInterval(()=>{if(A||!le||Y||T!=="connected")return;let h=le,J=p;Y=!0,a.previewWanted(p).then(async({wanted:j})=>{if(!j||le!==h||A||T!=="connected")return;await P.flush();let Q=P.binding.getSnapshot(),je=P.getStatus().revision,Oe=await h.frame(Jr(Q));Oe&&le===h&&!A&&T==="connected"&&J.token===p.token&&Q===P.binding.getSnapshot()&&await a.publishPreview(p,Oe.image,{draftRevision:je,targets:Oe.targets})}).catch(j=>{if(!(A||T!=="connected")){if(j instanceof Error&&Xe(j)){D(j);return}le===h&&(Ae=j instanceof Error?j.message:"Preview unavailable",h.stop(),le=null,R())}}).finally(()=>{Y=!1})},1e3);c?D(c):g?.pending.length&&P.flush().catch(D);let re;return{client:a,credential:i,navigation:o,state:P,readViewedSuggestions:f.read,markSuggestionViewed:f.mark,markSuggestionsViewed:f.markMany,captureVersion:_,reportAttention(h,J,j,Q){return A||T!=="connected"?Promise.resolve(!1):a.reportAttention(p,h,J,j,Q)},bindSubjects(h){return re=h,()=>{re===h&&(re=void 0)}},getSubjects:()=>re,getStatus:()=>({error:M,phase:T,pendingCount:ge,sending:G,sharing:!!le,previewError:Ae,accessRemoved:z}),reconnect:()=>oe(),retainExternalMembershipPolling(){se++;let h=!1;return()=>{h||(h=!0,se--)}},async retryLocalSave(){if(q)return q;await C?.retryLocalSave(),await oe()},clearLocalSpace(){return q||(A||!C?Promise.reject(new Error("Local space is unavailable")):(q=Promise.resolve().then(async()=>{let h=$;if(ie++,clearTimeout(H),H=void 0,T="paused",P.pause(new Error("Clearing local space")),R(),await h,A)throw new Error("Participant runtime is closed");try{r.setItem(I,"1")}catch{}await C.clearLocalSpace();let J;try{if(await Promise.race([b?.clear?b.clear():Promise.reject(new Error("Local storage cannot be cleared")),new Promise((j,Q)=>{J=setTimeout(()=>Q(new Error("Local clear timed out")),2e3)})]),A)throw new Error("Participant runtime is closed");if(await C.resumeLocalSaving())try{r.removeItem(I)}catch{}}catch{}finally{clearTimeout(J)}if(A)throw new Error("Participant runtime is closed");if(await oe(!0),T!=="connected")throw M??new Error("Session remains unavailable")}).finally(()=>{q=null}),q))},observeMembership(h){if(!(A||h.identity.id!==i.participantId)){if(h.revokedAt!==void 0&&!te){te=!0,D(new ke(403,"Your access was removed by the host")),le?.stop(),le=null,r.removeItem(s),r.removeItem(d),o.clear(),P.revoke().then(()=>b?.clear?.()).then(()=>{z=!0,R()}).catch(J=>{M=J instanceof Error?J:new Error("Could not clear local draft"),R()});return}if(!te){if(h.permission!=="blocked"&&!de&&(de=!0,Ee(h).catch(D).finally(()=>{de=!1})),h.permission==="blocked")v=h.permissionEpoch,M instanceof ke&&M.status===403||D(new ke(403,"Participant access is blocked"));else if(T==="paused"&&M instanceof ke&&M.status===403&&h.permissionEpoch>v){v=h.permissionEpoch;let J=()=>{!A&&T==="paused"&&v===h.permissionEpoch&&M instanceof ke&&M.status===403&&oe()};$?$.then(J):J()}}}},sharePreview(h){if(A){h?.stop();return}le?.stop(),le=h,Ae=null,h||a.publishPreview(p,null).catch(()=>{}),R()},subscribe:h=>(F.add(h),()=>{F.delete(h)}),async send(h,J){if(A||T!=="connected")throw M??new Error("Participant runtime is closed");if(G)throw new Error("A submission is already in progress");G=!0,R();try{if(P.setSource(n),await P.flush(),T!=="connected")throw M??new Error("Draft sync paused");if(_()!==J)throw new Error("Draft changed during capture; send again to include your latest changes");let j=await a.send(hr(h),P.getStatus().revision,n);return j.status==="pending-approval"?(ge++,R(),{pendingApproval:!0,submissionId:j.submissionId,threadId:j.threadId}):j}finally{G=!1,R()}},dispose(){A||(A=!0,re=void 0,T="closed",clearTimeout(H),clearInterval(he),clearInterval(ce),clearInterval(Le),le?.stop(),le=null,a.publishPreview(p,null).catch(()=>{}),me(),be?.(),w(),P.dispose(),P.whenSettled().finally(()=>b?.close()),F.clear())}}}function _r(e,t){e.removeItem(`popmelt-participant:${t}`);let r=`popmelt-admission:${t}`,i;try{i=JSON.parse(e.getItem(r)??"null")}catch{e.removeItem(r);return}i&&typeof i=="object"&&e.setItem(r,JSON.stringify({name:i.name,colorIdentity:i.colorIdentity??i.receipt}))}var ft="popmelt-join",jt=/^[A-Za-z0-9_-]{43}$/;function zr(e,t){let r=new URL(e);if(!["http:","https:"].includes(r.protocol)||!["localhost","127.0.0.1","[::1]"].includes(r.hostname)||!jt.test(t))throw new Error("A local page and valid invitation are required");let i=Tt(r.href).cleanUrl,n=new URL(i);return n.hash=`${n.hash.slice(1)}${n.hash?"&":""}${ft}=${t}`,n.href}function Tt(e){let t=new URL(e),r=null,i=t.hash.slice(1).split("&").filter(n=>{if(!n.startsWith(`${ft}=`))return!0;let a=n.slice(ft.length+1);return jt.test(a)&&(r=a),!1});return t.hash=i.join("&"),{token:r,cleanUrl:t.href}}function Fr(e){let t={phase:"starting"},r=0,i=!1,n=!1,a=0,s,d=new Set,o=`popmelt-participant:${e.projectId}`,f=new At(e.url,e.projectId),l=g=>{if(!n){t=g;for(let c of d)c()}},u=async(g={})=>{let c=await fetch("/__popmelt/host",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"same-origin",body:JSON.stringify(g),redirect:"error"});if(c.status===403)return null;if(!c.ok)throw new Error(`Host entry unavailable (${c.status}).`);let p=`popmelt-before-participants:${e.projectId}`;return localStorage.getItem(p)===null&&localStorage.setItem(p,JSON.stringify(Object.fromEntries(Object.values(er(e.projectId)).map(x=>[x,localStorage.getItem(x)])))),await c.json()},w=g=>qr({bridgeUrl:e.url,projectId:e.projectId,credential:g,runtimeStorage:sessionStorage,observedSource:{sourceId:e.projectId,revision:e.revision}}),I=async(g,c=a)=>{if(n||c!==a)return;let p=await w(g);if(n||c!==a){p.dispose();return}try{localStorage.setItem(o,JSON.stringify(g))}catch(x){throw p.dispose(),x}s?.dispose(),s=p,l({phase:"connected",connection:p}),u({credential:g}).catch(()=>{})},y=()=>{a++,s?.dispose(),s=void 0,_r(localStorage,e.projectId),l({phase:"entry",invitation:null})},b=async()=>{let g=Tt(location.href),c=new URL(g.cleanUrl),p=new URLSearchParams(c.hash.slice(1)),x=p.get("popmelt-host");p.delete("popmelt-host"),x&&(c.hash=p.toString()),c.href!==location.href&&history.replaceState(history.state,"",c);let C=null;if(x){if(C=await u({token:x}),!C)throw new Error("Host entry expired. Use the current private host link.")}else if(!g.token){try{C=JSON.parse(localStorage.getItem(o)??"null")}catch{}C??(C=await u())}if(!n){if(!C){l({phase:"entry",invitation:g.token??null});return}try{await I(C)}catch(P){if(n)return;if(P.code==="access_removed"){y();return}if(P.status!==401)throw P;let A=await u();A?await I(A):y()}}};return{client:f,getSnapshot:()=>t,subscribe(g){return d.add(g),()=>{d.delete(g)}},retain(){if(n)throw new Error("Participant lifecycle is disposed");r++,i||(i=!0,b().catch(c=>l({phase:"error",message:c.message})));let g=!1;return()=>{g||(g=!0,r--,queueMicrotask(()=>{r||n||(n=!0,a++,s?.dispose(),s=void 0,d.clear())}))}},removed:y,async join(g,c){if(t.phase!=="entry"||!t.invitation||n)throw new Error("No active invitation");if(!c)throw new Error("Peer identity is not ready");let p=a,x=await f.joinOrRequestAdmission(t.invitation,g,c);if(!(n||p!==a)){if("admission"in x){localStorage.setItem(`popmelt-admission:${e.projectId}`,JSON.stringify({name:x.admission.name,receipt:c,colorIdentity:c})),l({phase:"entry",invitation:null});return}await I(x.joined.credential,p)}},admit:g=>I(g)}}function Ke(){let e=crypto.getRandomValues(new Uint8Array(32));return{id:crypto.randomUUID(),token:Array.from(e,t=>t.toString(16).padStart(2,"0")).join("")}}var Ue=360,qe=120,Ye=180,Ot=260;function Vr({client:e,storage:t,storageKey:r,onAdmitted:i,theme:n="light",themePreference:a=n,onThemePreferenceChange:s,onJoin:d}){let o=K(null),f=K(!1);if(!f.current){f.current=!0;try{o.current=JSON.parse(t.getItem(r)??"null")}catch{}}let[l,u]=U(o.current?.name??""),[w,I]=U(d?void 0:o.current?.receipt),[y,b]=U(null),[g,c]=U(),[p,x]=U(),C=K(null),[P,A]=U(!!d),[O,M]=U(!1),[T,$]=U(0),[q,ie]=U(),[H,ae]=U("idle"),[v,te]=U(),[z,F]=U(),R=K(!1),[L,D]=U(""),oe=K(null),me=K(null),be=K(null),pe=K(null),he=K(!1),de=K(0),se=K(!1),Ee=yr(),ce=K(!1),ge=K(0),G=K(i);G.current=i;let _=K(!1),le=K(null),Ae=K(()=>{});le.current||(le.current=new Promise(k=>{Ae.current=k}));let Y=rt[n],Le=P&&!g;ee(()=>{let k=!1,Z,X,V=()=>{k||(k=!0,_.current=!0,Ae.current())};typeof requestAnimationFrame=="function"&&(Z=requestAnimationFrame(()=>{X=requestAnimationFrame(V)}));let Ie=window.setTimeout(V,64);return()=>{Z!==void 0&&cancelAnimationFrame(Z),X!==void 0&&cancelAnimationFrame(X),window.clearTimeout(Ie),V()}},[]),ee(()=>fr(document),[]),St(()=>{let k=!0,Z=()=>{if(!k||!be.current)return;let X=getComputedStyle(be.current),V=document.createElement("span");Object.assign(V.style,{position:"fixed",visibility:"hidden",pointerEvents:"none",whiteSpace:"nowrap",fontFamily:X.fontFamily,fontSize:X.fontSize,fontWeight:X.fontWeight,lineHeight:X.lineHeight}),document.body.append(V);let Ie=Number.parseFloat(X.paddingLeft)+Number.parseFloat(X.paddingRight);V.textContent="Ask for access";let Pe=Ie+12+3+V.getBoundingClientRect().width;V.textContent="Request pending";let ye=Ie+12+3+V.getBoundingClientRect().width;V.textContent="Request declined";let Me=Ie+12+3+V.getBoundingClientRect().width;if(V.remove(),Pe>15&&ye>15&&Me>15&&te({ask:Math.ceil(Pe),pending:Math.ceil(ye),declined:Math.ceil(Me)}),pe.current){let xe=getComputedStyle(pe.current),ve=document.createElement("span");Object.assign(ve.style,{position:"fixed",visibility:"hidden",pointerEvents:"none",whiteSpace:"nowrap",fontFamily:xe.fontFamily,fontSize:xe.fontSize,fontWeight:xe.fontWeight,lineHeight:xe.lineHeight}),ve.textContent="Sending...",document.body.append(ve);let we=Number.parseFloat(xe.paddingLeft)+Number.parseFloat(xe.paddingRight);F({idle:Math.ceil(we+14),sending:Math.ceil(we+ve.getBoundingClientRect().width)}),ve.remove()}};return Z(),document.fonts?.ready.then(Z),()=>{k=!1}},[n,P]),ee(()=>{if(!T)return;let k=setTimeout(()=>$(0),Ue);return()=>clearTimeout(k)},[T]),ee(()=>{if(!q)return;let k=setTimeout(()=>ie(void 0),Ue);return()=>clearTimeout(k)},[q]),ee(()=>{if(H!=="in")return;let k=setTimeout(()=>ae("idle"),Ye);return()=>clearTimeout(k)},[H]),ee(()=>{o.current&&delete o.current.color;try{let k=JSON.parse(t.getItem(r)??"null");k&&typeof k=="object"&&"color"in k&&(delete k.color,t.setItem(r,JSON.stringify(k)))}catch{}},[t,r]);let re=!!(w&&(!y||y.status==="pending"||y.status==="granted")),h=(k,Z)=>{o.current={...o.current,name:k,receipt:Z},t.setItem(r,JSON.stringify(o.current))};ee(()=>{if(y?.status==="cancelled"){o.current={...o.current,name:l,receipt:void 0};try{t.setItem(r,JSON.stringify(o.current))}catch{}I(void 0),b(null)}},[y,l,t,r]);let J=()=>{if(C.current)return C.current;let k=async()=>{let Z=JSON.parse(t.getItem(r)??"null"),X=Z?.colorIdentity??Z?.receipt??Ke();o.current={name:l,receipt:Z?.receipt,colorIdentity:X},t.setItem(r,JSON.stringify(o.current));let V;try{V=await e.reserveAdmissionColor(X)}catch(Ie){let Pe=Ie.status;if(Pe!==400&&Pe!==401)throw Ie;X=Ke(),o.current={...o.current,colorIdentity:X},t.setItem(r,JSON.stringify(o.current)),V=await e.reserveAdmissionColor(X)}return c(V.color),x(tr(V)),X};return C.current=k().finally(()=>{C.current=null}),C.current},j=()=>{A(!P),P||D("")},Q=K(J);Q.current=J;let je=!!d;ee(()=>{if(!P||g)return;let k=!1,Z,X=0,V=async()=>{try{await Q.current()}catch{if(k)return;Z=setTimeout(()=>{V()},pt(++X))}};return V(),()=>{k=!0,clearTimeout(Z)}},[P,g,t,r]),ee(()=>{if(!P)return;me.current?.focus();let k=Z=>{Z.composedPath().includes(oe.current)||A(!1)};return document.addEventListener("pointerdown",k),()=>document.removeEventListener("pointerdown",k)},[P]),ee(()=>{if(!w)return;let k=!0,Z=!1,X=!1,V,Ie,Pe=()=>{ge.current+=1,o.current={...o.current,name:l,receipt:void 0};try{t.setItem(r,JSON.stringify(o.current))}catch{}I(void 0),b(null),A(!1),D("")},ye=()=>{X=!0;let ve=Ke(),we=0,De=async()=>{if(k)try{let $e=await Q.current();o.current={...o.current,name:l,receipt:ve,colorIdentity:$e},t.setItem(r,JSON.stringify(o.current));let _e=await e.requestAdmission(ve,l,$e);if(!k)return;ge.current+=1,I(ve),b(_e),D("")}catch{if(!k)return;Ie=setTimeout(()=>{De()},pt(++we))}};De()},Me=async()=>{if(Z||X||se.current||ce.current)return;Z=!0;let ve=ge.current;try{let we=await e.admissionStatus(w);if(!k||ve!==ge.current)return;if(we.status==="declined"){if(_.current||await le.current,!k||ve!==ge.current)return;X=!0;let De=window.matchMedia?.("(prefers-reduced-motion: reduce)").matches,$e=()=>{k&&(ae("rejected"),$(_e=>_e+1),V=setTimeout(()=>{if(k){if(De){Pe(),ae("idle");return}ae("rejected-out"),V=setTimeout(()=>{k&&(Pe(),ae("in"))},qe)}},Ue))};De?$e():(ae("pending-out"),V=setTimeout($e,qe));return}if(we.status==="expired"){ye();return}if(b(we),X=we.status==="cancelled",D(""),we.credential){se.current=!0;try{await G.current(we.credential),X=!0}finally{se.current=!1}}}catch(we){if(!k||ve!==ge.current)return;we.status===401&&ye()}finally{Z=!1}};Me();let xe=setInterval(Me,1500);return()=>{k=!1,clearInterval(xe),clearTimeout(V),clearTimeout(Ie)}},[e,w,l,t,r]);let Oe=async()=>{if(!(!w||O||ce.current)){ce.current=!0,ge.current+=1,M(!0),D("");try{let k=await e.cancelAdmission(w);b(k),A(!1)}catch{$(k=>k+1)}finally{ce.current=!1,M(!1)}}},et=async k=>{if(!l.trim()||O||re||R.current)return;if(R.current=!0,M(!0),D(""),ie(void 0),d){try{let X=await J();h(l.trim()),await d(l.trim(),X)}catch(X){D(X instanceof Error?X.message:"Could not join. Please try again.")}finally{R.current=!1,M(!1)}return}try{o.current=JSON.parse(t.getItem(r)??"null")}catch{}let Z=!y&&o.current?.receipt?o.current.receipt:Ke();try{let X=await J();h(l,Z),o.current={...o.current,name:l,receipt:Z};let V=await e.requestAdmission(Z,l.trim(),X);I(Z),u(V.name),b(V),A(!1)}catch{o.current={...o.current,name:l,receipt:Z},ie({target:k,pulse:++de.current})}finally{R.current=!1,M(!1)}};return B("div",{ref:oe,"data-devtools":"participant-admission","data-popmelt-font":"sans","data-popmelt-theme":n,style:{display:"contents"},onKeyDown:k=>{k.key==="Escape"&&(A(!1),k.stopPropagation())},children:[S("style",{children:`
3
3
  ${Yt}
4
4
  [data-popmelt-admission-ask] {
5
5
  transition: box-shadow 120ms ease, width ${Ye}ms ease;
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import{b as Vn}from"./chunk-GQ6CPJG6.mjs";import{Ca as Vr,Da as Yn,na as Jn,N as _n,A as Yr}from"./chunk-253MCKJJ.mjs";import"./chunk-4LHTPRFY.mjs";import"./chunk-OLLUQ45J.mjs";import"./chunk-XOGBFVWI.mjs";import{e as Ge,a as Wt}from"./chunk-V44RIEET.mjs";import{b as Le}from"./chunk-CPOYMGYY.mjs";import"./chunk-6VXFTT5U.mjs";import{x as Xe,w as vr,e as At,f as mt,r as yr,l as qt,v as Jr,t as _r,b as Gn,p as Ot,g as rr,d as nr,j as Gr,c as Zr,o as Qr,k as Zn,s as Xr,m as en,h as Qn,i as br,q as Xn,a as ea,n as ta,u as ra}from"./chunk-O4HZP3RP.mjs";import"./chunk-XTOCFTVW.mjs";import{a as na}from"./chunk-LVEMYZOA.mjs";import"./chunk-HGW2U6PD.mjs";import{createContext as aa,useRef as D,useState as A,useSyncExternalStore as wr,useLayoutEffect as Pe,useEffect as le,useCallback as tn,useMemo as Ht,isValidElement as ia,useId as xr,Fragment as oa,createElement as la,useContext as sa}from"react";import{Search as kr,X as St,ChevronLeft as Cr,Component as da,PenLine as ca,History as ua,Eye as pa,Ruler as ha,Fingerprint as Ut,Plus as Ft,ChevronRight as Kt,RotateCw as fa,RotateCcw as ga,ArrowLeftRight as rn,Minimize2 as ma,Info as va,ChevronDown as ya,Check as ba,User as wa,ArrowRight as xa}from"lucide-react";import{jsx as i,jsxs as k,Fragment as Te}from"react/jsx-runtime";import{createPortal as nn}from"react-dom";var ar=["display","boxSizing","width","height","flexDirection","flexWrap","alignItems","justifyContent","alignSelf","flexGrow","flexShrink","gridTemplateColumns","rowGap","columnGap","gap","padding","paddingInline","paddingBlock","border","borderRadius","paddingTop","paddingRight","paddingBottom","paddingLeft","marginTop","marginRight","marginBottom","marginLeft","borderTop","borderRight","borderBottom","borderLeft","borderColor","borderWidth","borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius","color","backgroundColor","backgroundImage","boxShadow","opacity","fontFamily","fontSize","fontWeight","fontStyle","lineHeight","letterSpacing","textAlign","textTransform","textDecoration","whiteSpace","overflow","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","objectFit"],an=/^[+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?$/i;function ka(e,t){return Et(t)?e==="flexGrow"||e==="flexShrink"?an.test(t)&&Number.isFinite(Number(t))&&Number(t)>=0:["display","boxSizing","flexDirection","flexWrap","alignItems","justifyContent","alignSelf","textAlign","whiteSpace","overflow","strokeLinecap","strokeLinejoin","objectFit"].includes(e)?!an.test(t):/^(none|normal|auto|transparent|currentcolor)$/i.test(t)?!0:/^(?:width|height|gridTemplateColumns)$/.test(e)?/^(?:min-content|max-content|fit-content|subgrid)$/.test(t):/^(?:padding|margin|border.*Radius|gap|rowGap|columnGap|letterSpacing|strokeWidth)/.test(e)?/^0(?:px|em|rem|%)?$/.test(t):/^border(Top|Right|Bottom|Left)$/.test(e)?/^(?:0px\b|.*\bnone\b)/.test(t):e==="opacity"?t==="1":/^(?:backgroundColor|fill|stroke)$/.test(e)&&/^rgba\([^)]*,\s*0\)$/.test(t):!1}function Vt(e,t){return{...e,tokens:[...e.tokens,...t.tokens??[]]}}function Sr(e){return/^(width|height|marginTop|marginRight|marginBottom|marginLeft|gridTemplateColumns)$/.test(e)}var Rt=e=>{throw new ra(e)},Et=e=>typeof e=="string"&&e.length>0&&e.length<=512&&!/[;{}\\]|\b(?:url|expression|var)\s*\(/i.test(e)&&![...e].some(t=>t.charCodeAt(0)<32),Rr=e=>typeof e=="string"&&/^[a-zA-Z0-9_-]{1,80}$/.test(e),Ca=new Set(["div","span","img","svg","path","circle","rect","line","polyline","polygon","ellipse","g"]),on=e=>typeof e=="string"&&e.length<=2e4&&/^(https?:\/\/|blob:https?:\/\/|data:image\/(png|jpeg|webp|gif);base64,)/i.test(e),Sa=new Set(["viewBox","d","cx","cy","r","rx","ry","x","y","x1","x2","y1","y2","width","height","points","transform","fillRule","clipRule"]);function Ra(e){(!e||typeof e!="object"||JSON.stringify(e).length>24e4)&&Rt("Invalid fragment capture.");let t=e,{evidence:r,draft:n}=t;(!r||!Rr(r.id)||![r.width,r.height].every(d=>Number.isFinite(d)&&d>0&&d<=1e4)||!Array.isArray(r.values)||r.values.length>180||!n||!Array.isArray(n.constraints)||n.constraints.length>32||!Array.isArray(n.tokens)||n.tokens.length>128)&&Rt("This component is too large to capture. Try a smaller element.");let o=new Set;for(let d of r.values)(!d||!Rr(d.id)||o.has(d.id)||!ar.includes(d.property)||d.local!==void 0&&(d.local!==!0||!Sr(d.property))||!Et(d.value))&&Rt("Unsupported captured style."),o.add(d.id);let s=0,l=new Set,a=(d,f)=>{(!d||!Rr(d.id)||l.has(d.id)||!Ca.has(d.tag)||++s>64||f>12||!Array.isArray(d.children)||d.children.length>128||!d.styles||typeof d.styles!="object")&&Rt("This component is too complex. Try a smaller element."),l.add(d.id);for(let[u,g]of Object.entries(d.styles))r.values.some(y=>y.id===g&&y.property===u)||Rt("Invalid captured style reference.");for(let[u,g]of Object.entries(d.attributes??{}))d.tag==="img"&&u==="src"&&on(g)||(!Sa.has(u)||typeof g!="string"||g.length>12e3||!/^[\d\w\s.,+()-]*$/.test(g))&&Rt("Unsupported vector geometry.");for(let u of d.children)typeof u=="string"?u.length>2e3&&Rt("Too much captured text."):a(u,f+1)};return a(r.root,0),t}function Yt(e,t,r){try{let n=["fontWeight","opacity","flexGrow","flexShrink","strokeWidth"].includes(r),o;if(t.kind==="token"){let s=e.tokens.find(l=>l.id===t.id);o=s?yr(s.value,e.constraints,!n):null}else{let s=At(e.constraints,t.id,t.step??0);o=mt(s),s.kind==="layout"&&!s.unit&&!n&&(o+="px")}return Et(o)?o:null}catch{return null}}function ln(e,t){let r=["div","span","img"].includes(t.tag)?{all:"initial"}:{};for(let[n,o]of Object.entries(t.localStyles??{}))ar.includes(n)&&(ka(n,o)||Sr(n)&&Et(o))&&(r[n]=["flexGrow","flexShrink","opacity","strokeWidth"].includes(n)&&Number.isFinite(Number(o))?Number(o):o);for(let[n,o]of Object.entries(t.styles)){if(!ar.includes(n))continue;let s=Yt(e,o,n);s!==null&&(r[n]=["fontWeight","opacity","flexGrow","flexShrink","strokeWidth"].includes(n)&&Number.isFinite(Number(s))?Number(s):s)}return r}function It(e,t=!1){if(typeof e!="string"||!e||e.length>800||!/^[a-z\d\s.,%+#()\-/]+$/i.test(e))return!1;let r=0;for(let s of e)if(s==="("&&++r>8||s===")"&&--r<0)return!1;if(r)return!1;let n=e.replace(/#[\da-f]{3,8}\b/gi,"").replace(/[-+]?(?:\d*\.)?\d+(?:e[-+]?\d+)?(?:px|rem|em|deg|turn|rad|%)?/gi,"").match(/[a-z][a-z-]*/gi)??[],o=new Set("none transparent black white currentcolor rgb rgba hsl hsla hwb oklch oklab lab lch color color-mix srgb srgb-linear display-p3 in shorter longer increasing decreasing hue solid dashed dotted double groove ridge inset outset".split(" "));if(t)for(let s of"linear-gradient radial-gradient conic-gradient repeating-linear-gradient repeating-radial-gradient repeating-conic-gradient to top right bottom left circle ellipse closest-side farthest-side closest-corner farthest-corner at center from".split(" "))o.add(s);return n.every(s=>o.has(s.toLowerCase()))}function Mt(e){if(e.border===void 0)return e;let{border:t,...r}=e,n=String(t).match(/(?:[^\s(]+\([^)]*\)|[^\s]+)/g)??[],o=n.find(a=>/^(?:[\d.]+(?:[a-z%]+)?|thin|medium|thick)$/.test(a)),s=n.find(a=>/^(none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset)$/.test(a)),l=n.filter(a=>a!==o&&a!==s).join(" ");return{borderWidth:o??"medium",borderStyle:s??"none",borderColor:l||"currentColor",...r}}function vt(e){if(e.background===void 0)return e;let{background:t,...r}=e,n=String(t);if(typeof document<"u"){let o=document.createElement("span").style;if(o.background=n,o.background)return{backgroundColor:o.backgroundColor||"transparent",backgroundImage:o.backgroundImage||"none",...r}}return{backgroundColor:/gradient\(/i.test(n)||n==="none"?"transparent":n,backgroundImage:/gradient\(/i.test(n)?n:"none",...r}}function Ir(e){if(!e||typeof e!="object")return;let t={};for(let r of["body","heading","card","button","input"]){let n=e[r];if(!n||typeof n!="object")continue;let o={};for(let[s,l]of Object.entries(n)){let a=String(l??"");s==="fontFamily"&&a.length<=200&&/^[a-zA-Z][a-zA-Z0-9 ,"'_-]*$/.test(a.replace(/^["']/,""))&&(o[s]=a),s==="color"&&It(l)&&(o[s]=a),["background","backgroundColor","backgroundImage","border","borderColor","boxShadow","outline"].includes(s)&&It(l,s.startsWith("background"))&&(o[s]=a),s==="opacity"&&typeof l=="number"&&Number.isFinite(l)&&(o[s]=Math.max(0,Math.min(1,l))),s==="transform"&&a.length<150&&/^(?:none|(?:\s*(?:translate(?:X|Y)?\(-?[\d.]+(?:px|rem|%)(?:,\s*-?[\d.]+(?:px|rem|%))?\)|scale\(\d*\.?\d+\))\s*){1,3})$/.test(a)&&(o[s]=a),s==="transition"&&a.length<200&&/^(?:(?:all|color|background-color|border-color|box-shadow|transform|opacity)\s+\d*\.?\d+(?:ms|s)(?:\s+(?:ease|ease-in|ease-out|ease-in-out|linear))?\s*,?\s*){1,5}$/.test(a)&&(o[s]=a),s==="fontWeight"&&typeof l=="number"&&l>=100&&l<=900&&(o[s]=l),s==="fontStyle"&&["normal","italic"].includes(a)&&(o[s]=a),s==="textTransform"&&["none","uppercase","lowercase","capitalize"].includes(a)&&(o[s]=a),["fontSize","letterSpacing","lineHeight","padding","margin","marginTop","marginBottom","gap","borderRadius","borderWidth","outlineOffset"].includes(s)&&a.length<100&&/^-?\d*\.?\d+(?:px|rem|em|%)?(?:\s+-?\d*\.?\d+(?:px|rem|em|%)?){0,3}$/.test(a)&&(o[s]=a)}t[r]=o}return t}function Ze(e,t=640,r=!1){if(!e)return{};let n={...e};for(let[o,s]of Object.entries(n))o==="fontFamily"||o==="fontWeight"||!r&&typeof s=="string"&&(n[o]=s.replace(/(-?\d*\.?\d+)(px|rem)\b/g,(l,a,d)=>`${Math.max(-12,Math.min(12,Number(a)*(d==="rem"?16:1)/(t/100)))}cqw`));if(e.fontFamily){let o=sn(e.fontFamily);/^Geist\s?Mono$/i.test(o)?n.fontFamily='"Popmelt Geist Mono", ui-monospace, monospace':/^Geist$/i.test(o)?n.fontFamily='"Popmelt Geist", system-ui, sans-serif':o&&!dn(o)&&(n.fontFamily=`"Popmelt Taste ${o}", ${e.fontFamily}`)}return vt(Mt(n))}var sn=e=>e.split(",")[0].trim().replace(/^["']|["']$/g,""),dn=e=>/^(inherit|initial|unset|serif|sans-serif|monospace|system-ui|ui-.+|Arial|Helvetica|Verdana|Georgia|Times New Roman|Courier New|SFMono-Regular|Menlo|Monaco|Consolas)$/i.test(e),Nr=new Map;function Ia(e){if(!e||typeof FontFace>"u"||!document.fonts)return Promise.resolve();let t=new Map;for(let r of Object.values(e)){if(!r?.fontFamily)continue;let n=sn(r.fontFamily);if(dn(n)||/^Geist(?:\s?Mono)?$/i.test(n)||!/^[a-zA-Z][a-zA-Z0-9 _-]{0,79}$/.test(n))continue;let o=Number(r.fontWeight)||400,s=r.fontStyle==="italic";t.set(`${n}:${o}:${s}`,{family:n,weight:o,italic:s})}return Promise.all([...t.entries()].slice(0,5).map(([r,n])=>{let o=Nr.get(r);if(o)return o;let s=(async()=>{let l=new AbortController,a=setTimeout(()=>l.abort(),8e3);try{let d=new URLSearchParams({family:`${n.family}:${n.italic?"ital,wght@1,":"wght@"}${n.weight}`,display:"swap"}),f=await fetch(`https://fonts.googleapis.com/css2?${d}`,{signal:l.signal,credentials:"omit",referrerPolicy:"no-referrer"});if(f.ok||(f=await fetch(`https://fonts.googleapis.com/css2?family=${encodeURIComponent(n.family)}&display=swap`,{signal:l.signal,credentials:"omit",referrerPolicy:"no-referrer"})),!f.ok)throw new Error("Font unavailable");if(![...(await f.text()).matchAll(/@font-face\s*\{([^}]+)\}/g)].slice(0,32).flatMap(u=>{let g=u[1],y=g.match(/url\((https:\/\/fonts\.gstatic\.com\/[^\s)"']+)\)/)?.[1];if(!y)return[];let v=new FontFace(`Popmelt Taste ${n.family}`,`url(${JSON.stringify(y)})`,{weight:g.match(/font-weight:\s*([^;]+);/)?.[1]??"400",style:g.match(/font-style:\s*([^;]+);/)?.[1]??"normal",unicodeRange:g.match(/unicode-range:\s*([^;]+);/)?.[1]??"U+0-10FFFF",display:"swap"});return document.fonts.add(v),[v]}).length)throw new Error("Font unavailable");await document.fonts.load(`${n.italic?"italic ":""}${n.weight} 16px "Popmelt Taste ${n.family}"`,"Your workspace A little space for big ideas. Create a project")}finally{clearTimeout(a)}})().catch(l=>{console.warn(`[Popmelt] Preview font ${n.family} unavailable; using its fallback.`,l instanceof Error?l.message:"Font request failed"),Nr.delete(r)});return Nr.set(r,s),s})).then(()=>{})}var et=e=>!!e&&typeof e=="object"&&!Array.isArray(e),zt=(e,t=512)=>typeof e=="string"&&e.length<=t,$t=e=>zt(e,100)&&/^[a-zA-Z0-9_-]+$/.test(e),Lr=e=>zt(e,4096)&&![...e].some(t=>t.charCodeAt(0)<9)&&!/[;{}<>]|\b(?:url|expression|javascript)\s*[:(]/i.test(e),yt=(e,t)=>Object.keys(e).every(r=>t.includes(r)),Dt=(e,t)=>new Set(e.map(r=>r[t])).size===e.length,Tr=new Set("display boxSizing width height flexDirection flexWrap alignItems justifyContent alignSelf flexGrow flexShrink gridTemplateColumns rowGap columnGap gap padding paddingInline paddingBlock border borderRadius paddingTop paddingRight paddingBottom paddingLeft marginTop marginRight marginBottom marginLeft borderTop borderRight borderBottom borderLeft borderColor borderWidth borderTopLeftRadius borderTopRightRadius borderBottomLeftRadius borderBottomRightRadius color backgroundColor backgroundImage boxShadow opacity fontFamily fontSize fontWeight fontStyle lineHeight letterSpacing textAlign textTransform textDecoration whiteSpace overflow fill stroke strokeWidth strokeLinecap strokeLinejoin objectFit".split(" ")),Na=new Set("div span img svg path circle rect line polyline polygon ellipse g".split(" ")),La=new Set("src alt viewBox d cx cy r x y x1 x2 y1 y2 rx ry width height points preserveAspectRatio transform fillRule clipRule".split(" "));function bt(e){return Array.isArray(e)?"["+e.map(bt).join(",")+"]":et(e)?"{"+Object.keys(e).sort().map(t=>JSON.stringify(t)+":"+bt(e[t])).join(",")+"}":JSON.stringify(e)}function Ta(e){try{if(!et(e)||!yt(e,["format","schemaVersion","draft"])||e.format!=="popmelt.taste.graph"||e.schemaVersion!==1||new TextEncoder().encode(JSON.stringify(e)).byteLength>512e3)return!1;let t=e.draft;if(!et(t)||!yt(t,["schemaVersion","name","constraints","tokens","usage","fragments","featuredComponentId"])||t.schemaVersion!==1||!zt(t.name,80)||!t.name.trim()||!Array.isArray(t.constraints)||t.constraints.length<1||t.constraints.length>32||!t.constraints.every(a=>et(a)&&yt(a,["id","name","kind","group","typographyRole","scaleMode","value","parentId","derivative","scale"])&&$t(a.id)&&zt(a.name,80)&&(a.group===void 0||a.group==="typography")&&(a.typographyRole===void 0||a.typographyRole==="body"||a.typographyRole==="heading")&&["layout","color","font"].includes(String(a.kind))&&Lr(a.value)&&(a.parentId===null||$t(a.parentId))&&Number.isFinite(a.derivative)&&Number.isFinite(a.scale)&&typeof a.scale=="number"&&a.scale>=0&&(a.scaleMode===void 0||a.scaleMode==="increment"))||!Dt(t.constraints,"id"))return!1;let r=new Map(t.constraints.map(a=>[String(a.id),a]));for(let a of t.constraints){let d=new Set,f=a;for(;f.parentId!==null;){if(d.has(f.id))return!1;d.add(f.id);let u=r.get(f.parentId);if(!u||u.kind!==f.kind)return!1;f=u}if(!f.value.trim())return!1}let n=a=>Array.isArray(a)&&a.length<=128&&a.every(d=>et(d)&&yt(d,["id","name","value"])&&$t(d.id)&&$t(d.name)&&Lr(d.value)&&d.value.trim()&&[...d.value.matchAll(/@([a-zA-Z0-9_-]+)/g)].every(f=>r.has(f[1])))&&Dt(a,"id")&&Dt(a,"name");if(!n(t.tokens))return!1;let o=t.tokens,s=(a,d)=>et(a)&&yt(a,["kind","id","step"])&&(a.kind==="dimension"?r.has(String(a.id)):a.kind==="token"&&d.some(f=>f.id===a.id))&&(a.step===void 0||typeof a.step=="number"&&Number.isInteger(a.step)&&Math.abs(a.step)<=100);if(t.usage!==void 0&&(!Array.isArray(t.usage)||t.usage.length>256||!t.usage.every(a=>et(a)&&yt(a,["target","property","source"])&&["page","heading","body","muted","card","button","input"].includes(String(a.target))&&Tr.has(String(a.property))&&s(a.source,o))))return!1;let l=t.fragments??[];if(!Array.isArray(l)||l.length>32||!Dt(l,"id"))return!1;for(let a of l){if(!et(a)||!yt(a,["id","name","width","height","root","tokens"])||!$t(a.id)||!zt(a.name,80)||!a.name.trim()||![a.width,a.height].every(v=>typeof v=="number"&&Number.isFinite(v)&&v>0&&v<=2e4)||!n(a.tokens??[]))return!1;let d=a.tokens??[];if(!n(d))return!1;let f=[...o,...d];if(!Dt(f,"id")||!Dt(f,"name"))return!1;let u=new Set,g=0,y=(v,C)=>typeof v=="string"?v.length<=1e4:!et(v)||!yt(v,["id","tag","styles","localStyles","attributes","children"])||!$t(v.id)||u.has(v.id)||++g>256||C>16||!Na.has(String(v.tag))||!et(v.styles)||!Array.isArray(v.children)||v.children.length>256||(u.add(v.id),!Object.entries(v.styles).every(([c,b])=>Tr.has(c)&&s(b,f)))||v.localStyles!==void 0&&(!et(v.localStyles)||!Object.entries(v.localStyles).every(([c,b])=>Tr.has(c)&&Lr(b)))||v.attributes!==void 0&&(!et(v.attributes)||!Object.entries(v.attributes).every(([c,b])=>La.has(c)&&zt(b,2e4)&&(c!=="src"||/^https:\/\//.test(b))))?!1:v.children.every(c=>y(c,C+1));if(!y(a.root,0))return!1}return t.featuredComponentId==null||l.some(a=>a.id===t.featuredComponentId)}catch{return!1}}function Nt(e){if(!Ta(e))return;let t=e;try{for(let r of t.draft.constraints)At(t.draft.constraints,r.id);for(let r of t.draft.fragments??[]){let n=Vt(t.draft,r),o=s=>Object.entries(s.styles).every(([l,a])=>Yt(n,a,l)!==null)&&s.children.every(l=>typeof l=="string"||o(l));if(!o(r.root))return}return t}catch{return}}function Ar(e){let t={format:"popmelt.taste.graph",schemaVersion:1,draft:e};if(!Nt(t))throw Error("This Taste has incomplete or invalid dimensions, tokens, or component bindings.");return t}function wt(e){if(!e||typeof e!="object")return;let t=e;for(let o of["background","surface","foreground","muted","accent","border"])if(!It(t[o],!0))return;for(let o of["radius","spacing"])if(typeof t[o]!="number"||!Number.isFinite(t[o])||t[o]<0||t[o]>32)return;let r={...t};delete r.savedDocument;let n=t.savedDocument;if(n&&typeof n.id=="string"&&Number.isSafeInteger(n.revision)&&n.revision>0&&Nt(n.document)&&(r.savedDocument=n),delete r.detail,t.detail!==void 0&&(r.detail=Ir(t.detail)),delete r.states,t.states&&typeof t.states=="object"){r.states={};for(let o of["card","button","input"]){let s=t.states[o];if(!(!s||typeof s!="object")){r.states[o]={};for(let l of["hover","focus","active"])r.states[o][l]=Ir({[o]:s[l]})?.[o]}}}if(delete r.parts,t.parts!==void 0){if(!t.parts||typeof t.parts!="object")return;let o={};for(let s of["card","button","content"]){let l=t.parts[s];if(!l||typeof l.radius!="number"||!Number.isFinite(l.radius)||l.radius<0||l.radius>999)return;let a=l.backdropFilter;o[s]={background:It(l.background,!0)?l.background:r.surface,border:It(l.border)?l.border:`1px solid ${r.border}`,radius:l.radius,shadow:It(l.shadow)?l.shadow:"none",...l.backgroundImage!==void 0?{backgroundImage:It(l.backgroundImage,!0)?l.backgroundImage:"none"}:{},...l.backgroundBlendMode!==void 0?{backgroundBlendMode:["normal","overlay","multiply","screen","soft-light","hard-light"].includes(l.backgroundBlendMode)?l.backgroundBlendMode:"normal"}:{},...a!==void 0?{backdropFilter:typeof a=="string"&&a.length<150&&/^(?:none|(?:\s*(?:blur\(\d*\.?\d+(?:px|rem)\)|saturate\(\d*\.?\d+%?\))\s*){1,3})$/.test(a)?a:"none"}:{},...l.opacity!==void 0?{opacity:Number.isFinite(l.opacity)?Math.max(0,Math.min(1,l.opacity)):1}:{}}}r.parts=o}return(!Number.isSafeInteger(r.recipeRevision)||r.recipeRevision<0)&&delete r.recipeRevision,(typeof r.contentRevision!="string"||!/^[a-f\d]{24}$/.test(r.contentRevision))&&delete r.contentRevision,r}function Aa({recipe:e}){let t=e.radius*.45,r=o=>o.replace(/(-?\d*\.?\d+)(px|rem)\b/g,(s,l,a)=>`${Math.max(-32,Math.min(32,Number(l)*(a==="rem"?16:1)*.45))}px`),n=o=>o?{background:o.background,...o.backgroundImage&&o.backgroundImage!=="none"?{backgroundImage:o.backgroundImage}:{},backgroundBlendMode:o.backgroundBlendMode,backdropFilter:o.backdropFilter?r(o.backdropFilter).replace(/saturate\(([\d.]+)%\)/g,(s,l)=>`saturate(${Math.min(400,Number(l))}%)`):void 0,WebkitBackdropFilter:o.backdropFilter?r(o.backdropFilter):void 0,opacity:o.opacity,border:r(o.border),borderRadius:o.radius*.45,boxShadow:r(o.shadow)}:{};return i("span",{"data-taste-specimen":!0,"aria-hidden":"true",style:{position:"absolute",inset:0,background:e.background,pointerEvents:"none",overflow:"hidden"},children:k("span",{"data-specimen-window":!0,style:{position:"absolute",left:"19.23%",top:"19.23%",width:"110%",height:"110%",background:e.surface,border:`1px solid ${e.border}`,borderRadius:t,overflow:"hidden",boxSizing:"border-box",...n(e.parts?.card),borderTopRightRadius:0,borderBottomRightRadius:0,borderBottomLeftRadius:0},children:[i("span",{"data-specimen-title":!0,style:{position:"absolute",left:0,top:0,width:"100%",height:"18.18%",background:e.parts?"transparent":e.accent}}),i("span",{"data-specimen-control":!0,style:{position:"absolute",left:"7.95%",top:"26.14%",width:"90.91%",height:"18.18%",background:e.muted,border:`1px solid ${e.border}`,borderRadius:t*.6,boxSizing:"border-box",...n(e.parts?.button)}}),i("span",{"data-specimen-content":!0,style:{position:"absolute",left:"7.95%",top:"53.41%",width:"90.91%",height:"67.05%",background:e.background,border:`1px solid ${e.border}`,borderRadius:t*.6,boxSizing:"border-box",...n(e.parts?.content)}})]})})}function Jt(e,t=!1,r=640){let[n,o]=A(!1),[s,l]=A(!1),[a,d]=A(!1);return{handlers:{onPointerEnter:()=>o(!0),onPointerLeave:()=>{o(!1),d(!1)},onPointerDown:()=>d(!0),onPointerUp:()=>d(!1),onPointerCancel:()=>d(!1),onKeyDown:f=>{t&&["Enter"," "].includes(f.key)&&d(!0)},onKeyUp:()=>d(!1),onFocus:()=>l(!0),onBlur:()=>{l(!1),d(!1)}},style:{...Ze(n?e?.hover:void 0,r),...Ze(s?e?.focus:void 0,r),...Ze(a?e?.active:void 0,r)}}}function Er({recipe:e,usageStyles:t}){let r=t!==void 0,n=u=>Ze({...e.detail?.[u]??{},...t?.[u]},640,r),o=Jt(e.states?.button,!0),s=Jt(e.states?.input),l=Jt(e.states?.card),a=r?`${e.spacing}px`:`${e.spacing/6.4}cqw`;le(()=>{Ia({...e.detail,...t})},[e.detail,t]);let d=u=>u.replace(/(-?\d*\.?\d+)(px|rem)\b/g,(g,y,v)=>`${Math.max(-16,Math.min(16,Number(y)*(v==="rem"?16:1)/6.4))}cqw`),f=u=>u?{...vt({background:u.background}),...u.backgroundImage&&u.backgroundImage!=="none"?{backgroundImage:u.backgroundImage}:{},backgroundBlendMode:u.backgroundBlendMode,...Mt({border:d(u.border)}),borderRadius:`${u.radius/6.4}cqw`,boxShadow:d(u.shadow),backdropFilter:u.backdropFilter?d(u.backdropFilter):void 0,WebkitBackdropFilter:u.backdropFilter?d(u.backdropFilter):void 0,opacity:u.opacity}:{};return i("div",{"data-taste-detail-specimen":!0,role:"group","aria-label":"Interactive taste preview",style:{position:r?"relative":"absolute",...r?{width:640,padding:0,boxSizing:"border-box"}:{inset:0},containerType:"inline-size",...vt({background:e.background}),color:e.foreground,fontSynthesis:"none",...n("body"),...n("page"),overflow:r?"visible":"hidden"},children:i("div",{"data-taste-component":"card",style:{position:r?"relative":"absolute",...r?{}:{inset:"9% 8%"},...vt({background:e.surface}),...Mt({border:`1px solid ${e.border}`}),borderRadius:e.radius,...f(e.parts?.card),padding:r?0:"5cqw",boxSizing:"border-box",display:"flex",flexDirection:"column",gap:a,...n("card")},children:k("div",{style:{display:"grid",gridTemplateColumns:"1.35fr 1fr",gap:r?n("card").gap??a:`calc(${a} * 2)`,alignItems:"center",flex:1,minHeight:0},children:[k("div",{children:[k("h2",{"data-taste-component":"heading",style:{margin:0,fontWeight:"inherit",lineHeight:1.1,letterSpacing:"-0.03em",marginBottom:a,...n("heading"),...r?{}:{fontSize:`clamp(3.8cqw, ${Ze(e.detail?.heading).fontSize??"4.6cqw"}, 5.4cqw)`}},children:["A little space",i("br",{}),"for big ideas."]}),k("p",{"data-taste-component":"paragraph",style:{margin:0,fontSize:r?"inherit":"2.4cqw",lineHeight:1.5,marginBottom:a,...n("body"),...n("muted")},children:["Gather your thoughts.",i("br",{}),"Make something your own."]}),i("button",{"data-taste-component":"button",...o.handlers,type:"button",style:{fontFamily:"inherit",color:"inherit",display:"inline-block",...vt({background:e.accent}),...Mt({border:`1px solid ${e.border}`}),borderRadius:e.radius,...f(e.parts?.button),padding:r?0:"1.5cqw 2.5cqw",fontSize:r?"inherit":"2.3cqw",fontWeight:"inherit",lineHeight:1.2,...n("button"),cursor:"pointer",...o.style},children:"Create a project \u2197"})]}),k("div",{"data-taste-component":"card",...l.handlers,style:{...vt({background:e.surface}),...Mt({border:`1px solid ${e.border}`}),borderRadius:e.radius,...f(e.parts?.card),padding:r?0:"3cqw",fontSize:r?"inherit":"2.1cqw",lineHeight:1.5,...n("card"),...l.style},children:[i("h3",{"data-taste-component":"heading",style:{margin:0,fontWeight:"inherit",...n("heading"),...r?{}:{fontSize:"2.6cqw"},marginBottom:a},children:"In the works"}),i("input",{"data-taste-component":"input",...s.handlers,"aria-label":"Preview project name",defaultValue:"A fresh start",style:{appearance:"none",outline:"none",borderWidth:0,borderStyle:"none",borderColor:"transparent",...vt({background:"transparent"}),...f(e.parts?.content),font:"inherit",color:"inherit",padding:r?0:"1.5cqw",...n("input"),width:"100%",minWidth:0,boxSizing:"border-box",marginBottom:a,...s.style}}),i("div",{children:"02 \xA0 What comes next"})]})]})})})}function cn({children:e}){let t=Ge.dark,r=D(null),[n,o]=A(),[s,l]=A({scale:1,x:0,y:0}),a=D(s);return le(()=>{let d=r.current;if(!d)return;let f=()=>o({width:d.clientWidth,height:d.clientHeight});f();let u=typeof ResizeObserver<"u"?new ResizeObserver(f):void 0;u?.observe(d);let g=()=>window.matchMedia("(any-hover: hover) and (any-pointer: fine)").matches,y=(h,p,m)=>{h=Math.max(1,Math.min(4,h));let L={scale:h,x:Math.max(1-h,Math.min(0,p)),y:Math.max(1-h,Math.min(0,m))};a.current=L,l(L)},v=(h,p,m)=>{let L=d.getBoundingClientRect();if(!L.width||!L.height)return;let E=a.current,P=Math.max(1,Math.min(4,h)),q=Math.max(0,Math.min(1,(p-L.left)/L.width)),x=Math.max(0,Math.min(1,(m-L.top)/L.height));y(P,q-(q-E.x)*P/E.scale,x-(x-E.y)*P/E.scale)},C=null,c=h=>{if(!g()||!h.ctrlKey&&a.current.scale===1)return;h.preventDefault(),h.stopPropagation();let p=h.deltaMode===1?16:h.deltaMode===2?d.clientHeight:1;if(h.ctrlKey)C===null&&v(a.current.scale*Math.exp(-h.deltaY*p*.01),h.clientX,h.clientY);else{let m=d.getBoundingClientRect();m.width&&m.height&&y(a.current.scale,a.current.x-h.deltaX*p/m.width,a.current.y-h.deltaY*p/m.height)}},b=h=>{if(!g())return;h.preventDefault(),h.stopPropagation();let p=h;h.type==="gesturestart"?C=a.current.scale:h.type==="gestureend"?C=null:C!==null&&Number.isFinite(p.scale)&&v(C*p.scale,p.clientX,p.clientY)};d.addEventListener("wheel",c,{passive:!1});for(let h of["gesturestart","gesturechange","gestureend"])d.addEventListener(h,b,{passive:!1});return()=>{u?.disconnect(),d.removeEventListener("wheel",c);for(let h of["gesturestart","gesturechange","gestureend"])d.removeEventListener(h,b)}},[]),k("div",{ref:r,"data-preview-zoom":!0,style:{position:"relative",width:"100%",aspectRatio:"16 / 9",overflow:"hidden",borderRadius:8},children:[i("div",{"data-preview-zoom-content":!0,style:{width:n?.width||"100%",height:n?.height||"100%",zoom:s.scale,transformOrigin:"0 0",transform:`translate(${s.x*100/s.scale}%, ${s.y*100/s.scale}%)`},children:e}),s.scale>1&&k(Te,{children:[i("style",{children:`
2
+ import{b as Vn}from"./chunk-IPR652AZ.mjs";import{Ca as Vr,Da as Yn,na as Jn,N as _n,A as Yr}from"./chunk-GNZ73T3H.mjs";import"./chunk-4LHTPRFY.mjs";import"./chunk-F6AMPRUB.mjs";import"./chunk-EXDOFFFJ.mjs";import{e as Ge,a as Wt}from"./chunk-V44RIEET.mjs";import{b as Le}from"./chunk-CPOYMGYY.mjs";import"./chunk-6VXFTT5U.mjs";import{x as Xe,w as vr,e as At,f as mt,r as yr,l as qt,v as Jr,t as _r,b as Gn,p as Ot,g as rr,d as nr,j as Gr,c as Zr,o as Qr,k as Zn,s as Xr,m as en,h as Qn,i as br,q as Xn,a as ea,n as ta,u as ra}from"./chunk-O4HZP3RP.mjs";import"./chunk-XTOCFTVW.mjs";import{a as na}from"./chunk-LVEMYZOA.mjs";import"./chunk-RCVAPQ7X.mjs";import{createContext as aa,useRef as D,useState as A,useSyncExternalStore as wr,useLayoutEffect as Pe,useEffect as le,useCallback as tn,useMemo as Ht,isValidElement as ia,useId as xr,Fragment as oa,createElement as la,useContext as sa}from"react";import{Search as kr,X as St,ChevronLeft as Cr,Component as da,PenLine as ca,History as ua,Eye as pa,Ruler as ha,Fingerprint as Ut,Plus as Ft,ChevronRight as Kt,RotateCw as fa,RotateCcw as ga,ArrowLeftRight as rn,Minimize2 as ma,Info as va,ChevronDown as ya,Check as ba,User as wa,ArrowRight as xa}from"lucide-react";import{jsx as i,jsxs as k,Fragment as Te}from"react/jsx-runtime";import{createPortal as nn}from"react-dom";var ar=["display","boxSizing","width","height","flexDirection","flexWrap","alignItems","justifyContent","alignSelf","flexGrow","flexShrink","gridTemplateColumns","rowGap","columnGap","gap","padding","paddingInline","paddingBlock","border","borderRadius","paddingTop","paddingRight","paddingBottom","paddingLeft","marginTop","marginRight","marginBottom","marginLeft","borderTop","borderRight","borderBottom","borderLeft","borderColor","borderWidth","borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius","color","backgroundColor","backgroundImage","boxShadow","opacity","fontFamily","fontSize","fontWeight","fontStyle","lineHeight","letterSpacing","textAlign","textTransform","textDecoration","whiteSpace","overflow","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","objectFit"],an=/^[+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?$/i;function ka(e,t){return Et(t)?e==="flexGrow"||e==="flexShrink"?an.test(t)&&Number.isFinite(Number(t))&&Number(t)>=0:["display","boxSizing","flexDirection","flexWrap","alignItems","justifyContent","alignSelf","textAlign","whiteSpace","overflow","strokeLinecap","strokeLinejoin","objectFit"].includes(e)?!an.test(t):/^(none|normal|auto|transparent|currentcolor)$/i.test(t)?!0:/^(?:width|height|gridTemplateColumns)$/.test(e)?/^(?:min-content|max-content|fit-content|subgrid)$/.test(t):/^(?:padding|margin|border.*Radius|gap|rowGap|columnGap|letterSpacing|strokeWidth)/.test(e)?/^0(?:px|em|rem|%)?$/.test(t):/^border(Top|Right|Bottom|Left)$/.test(e)?/^(?:0px\b|.*\bnone\b)/.test(t):e==="opacity"?t==="1":/^(?:backgroundColor|fill|stroke)$/.test(e)&&/^rgba\([^)]*,\s*0\)$/.test(t):!1}function Vt(e,t){return{...e,tokens:[...e.tokens,...t.tokens??[]]}}function Sr(e){return/^(width|height|marginTop|marginRight|marginBottom|marginLeft|gridTemplateColumns)$/.test(e)}var Rt=e=>{throw new ra(e)},Et=e=>typeof e=="string"&&e.length>0&&e.length<=512&&!/[;{}\\]|\b(?:url|expression|var)\s*\(/i.test(e)&&![...e].some(t=>t.charCodeAt(0)<32),Rr=e=>typeof e=="string"&&/^[a-zA-Z0-9_-]{1,80}$/.test(e),Ca=new Set(["div","span","img","svg","path","circle","rect","line","polyline","polygon","ellipse","g"]),on=e=>typeof e=="string"&&e.length<=2e4&&/^(https?:\/\/|blob:https?:\/\/|data:image\/(png|jpeg|webp|gif);base64,)/i.test(e),Sa=new Set(["viewBox","d","cx","cy","r","rx","ry","x","y","x1","x2","y1","y2","width","height","points","transform","fillRule","clipRule"]);function Ra(e){(!e||typeof e!="object"||JSON.stringify(e).length>24e4)&&Rt("Invalid fragment capture.");let t=e,{evidence:r,draft:n}=t;(!r||!Rr(r.id)||![r.width,r.height].every(d=>Number.isFinite(d)&&d>0&&d<=1e4)||!Array.isArray(r.values)||r.values.length>180||!n||!Array.isArray(n.constraints)||n.constraints.length>32||!Array.isArray(n.tokens)||n.tokens.length>128)&&Rt("This component is too large to capture. Try a smaller element.");let o=new Set;for(let d of r.values)(!d||!Rr(d.id)||o.has(d.id)||!ar.includes(d.property)||d.local!==void 0&&(d.local!==!0||!Sr(d.property))||!Et(d.value))&&Rt("Unsupported captured style."),o.add(d.id);let s=0,l=new Set,a=(d,f)=>{(!d||!Rr(d.id)||l.has(d.id)||!Ca.has(d.tag)||++s>64||f>12||!Array.isArray(d.children)||d.children.length>128||!d.styles||typeof d.styles!="object")&&Rt("This component is too complex. Try a smaller element."),l.add(d.id);for(let[u,g]of Object.entries(d.styles))r.values.some(y=>y.id===g&&y.property===u)||Rt("Invalid captured style reference.");for(let[u,g]of Object.entries(d.attributes??{}))d.tag==="img"&&u==="src"&&on(g)||(!Sa.has(u)||typeof g!="string"||g.length>12e3||!/^[\d\w\s.,+()-]*$/.test(g))&&Rt("Unsupported vector geometry.");for(let u of d.children)typeof u=="string"?u.length>2e3&&Rt("Too much captured text."):a(u,f+1)};return a(r.root,0),t}function Yt(e,t,r){try{let n=["fontWeight","opacity","flexGrow","flexShrink","strokeWidth"].includes(r),o;if(t.kind==="token"){let s=e.tokens.find(l=>l.id===t.id);o=s?yr(s.value,e.constraints,!n):null}else{let s=At(e.constraints,t.id,t.step??0);o=mt(s),s.kind==="layout"&&!s.unit&&!n&&(o+="px")}return Et(o)?o:null}catch{return null}}function ln(e,t){let r=["div","span","img"].includes(t.tag)?{all:"initial"}:{};for(let[n,o]of Object.entries(t.localStyles??{}))ar.includes(n)&&(ka(n,o)||Sr(n)&&Et(o))&&(r[n]=["flexGrow","flexShrink","opacity","strokeWidth"].includes(n)&&Number.isFinite(Number(o))?Number(o):o);for(let[n,o]of Object.entries(t.styles)){if(!ar.includes(n))continue;let s=Yt(e,o,n);s!==null&&(r[n]=["fontWeight","opacity","flexGrow","flexShrink","strokeWidth"].includes(n)&&Number.isFinite(Number(s))?Number(s):s)}return r}function It(e,t=!1){if(typeof e!="string"||!e||e.length>800||!/^[a-z\d\s.,%+#()\-/]+$/i.test(e))return!1;let r=0;for(let s of e)if(s==="("&&++r>8||s===")"&&--r<0)return!1;if(r)return!1;let n=e.replace(/#[\da-f]{3,8}\b/gi,"").replace(/[-+]?(?:\d*\.)?\d+(?:e[-+]?\d+)?(?:px|rem|em|deg|turn|rad|%)?/gi,"").match(/[a-z][a-z-]*/gi)??[],o=new Set("none transparent black white currentcolor rgb rgba hsl hsla hwb oklch oklab lab lch color color-mix srgb srgb-linear display-p3 in shorter longer increasing decreasing hue solid dashed dotted double groove ridge inset outset".split(" "));if(t)for(let s of"linear-gradient radial-gradient conic-gradient repeating-linear-gradient repeating-radial-gradient repeating-conic-gradient to top right bottom left circle ellipse closest-side farthest-side closest-corner farthest-corner at center from".split(" "))o.add(s);return n.every(s=>o.has(s.toLowerCase()))}function Mt(e){if(e.border===void 0)return e;let{border:t,...r}=e,n=String(t).match(/(?:[^\s(]+\([^)]*\)|[^\s]+)/g)??[],o=n.find(a=>/^(?:[\d.]+(?:[a-z%]+)?|thin|medium|thick)$/.test(a)),s=n.find(a=>/^(none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset)$/.test(a)),l=n.filter(a=>a!==o&&a!==s).join(" ");return{borderWidth:o??"medium",borderStyle:s??"none",borderColor:l||"currentColor",...r}}function vt(e){if(e.background===void 0)return e;let{background:t,...r}=e,n=String(t);if(typeof document<"u"){let o=document.createElement("span").style;if(o.background=n,o.background)return{backgroundColor:o.backgroundColor||"transparent",backgroundImage:o.backgroundImage||"none",...r}}return{backgroundColor:/gradient\(/i.test(n)||n==="none"?"transparent":n,backgroundImage:/gradient\(/i.test(n)?n:"none",...r}}function Ir(e){if(!e||typeof e!="object")return;let t={};for(let r of["body","heading","card","button","input"]){let n=e[r];if(!n||typeof n!="object")continue;let o={};for(let[s,l]of Object.entries(n)){let a=String(l??"");s==="fontFamily"&&a.length<=200&&/^[a-zA-Z][a-zA-Z0-9 ,"'_-]*$/.test(a.replace(/^["']/,""))&&(o[s]=a),s==="color"&&It(l)&&(o[s]=a),["background","backgroundColor","backgroundImage","border","borderColor","boxShadow","outline"].includes(s)&&It(l,s.startsWith("background"))&&(o[s]=a),s==="opacity"&&typeof l=="number"&&Number.isFinite(l)&&(o[s]=Math.max(0,Math.min(1,l))),s==="transform"&&a.length<150&&/^(?:none|(?:\s*(?:translate(?:X|Y)?\(-?[\d.]+(?:px|rem|%)(?:,\s*-?[\d.]+(?:px|rem|%))?\)|scale\(\d*\.?\d+\))\s*){1,3})$/.test(a)&&(o[s]=a),s==="transition"&&a.length<200&&/^(?:(?:all|color|background-color|border-color|box-shadow|transform|opacity)\s+\d*\.?\d+(?:ms|s)(?:\s+(?:ease|ease-in|ease-out|ease-in-out|linear))?\s*,?\s*){1,5}$/.test(a)&&(o[s]=a),s==="fontWeight"&&typeof l=="number"&&l>=100&&l<=900&&(o[s]=l),s==="fontStyle"&&["normal","italic"].includes(a)&&(o[s]=a),s==="textTransform"&&["none","uppercase","lowercase","capitalize"].includes(a)&&(o[s]=a),["fontSize","letterSpacing","lineHeight","padding","margin","marginTop","marginBottom","gap","borderRadius","borderWidth","outlineOffset"].includes(s)&&a.length<100&&/^-?\d*\.?\d+(?:px|rem|em|%)?(?:\s+-?\d*\.?\d+(?:px|rem|em|%)?){0,3}$/.test(a)&&(o[s]=a)}t[r]=o}return t}function Ze(e,t=640,r=!1){if(!e)return{};let n={...e};for(let[o,s]of Object.entries(n))o==="fontFamily"||o==="fontWeight"||!r&&typeof s=="string"&&(n[o]=s.replace(/(-?\d*\.?\d+)(px|rem)\b/g,(l,a,d)=>`${Math.max(-12,Math.min(12,Number(a)*(d==="rem"?16:1)/(t/100)))}cqw`));if(e.fontFamily){let o=sn(e.fontFamily);/^Geist\s?Mono$/i.test(o)?n.fontFamily='"Popmelt Geist Mono", ui-monospace, monospace':/^Geist$/i.test(o)?n.fontFamily='"Popmelt Geist", system-ui, sans-serif':o&&!dn(o)&&(n.fontFamily=`"Popmelt Taste ${o}", ${e.fontFamily}`)}return vt(Mt(n))}var sn=e=>e.split(",")[0].trim().replace(/^["']|["']$/g,""),dn=e=>/^(inherit|initial|unset|serif|sans-serif|monospace|system-ui|ui-.+|Arial|Helvetica|Verdana|Georgia|Times New Roman|Courier New|SFMono-Regular|Menlo|Monaco|Consolas)$/i.test(e),Nr=new Map;function Ia(e){if(!e||typeof FontFace>"u"||!document.fonts)return Promise.resolve();let t=new Map;for(let r of Object.values(e)){if(!r?.fontFamily)continue;let n=sn(r.fontFamily);if(dn(n)||/^Geist(?:\s?Mono)?$/i.test(n)||!/^[a-zA-Z][a-zA-Z0-9 _-]{0,79}$/.test(n))continue;let o=Number(r.fontWeight)||400,s=r.fontStyle==="italic";t.set(`${n}:${o}:${s}`,{family:n,weight:o,italic:s})}return Promise.all([...t.entries()].slice(0,5).map(([r,n])=>{let o=Nr.get(r);if(o)return o;let s=(async()=>{let l=new AbortController,a=setTimeout(()=>l.abort(),8e3);try{let d=new URLSearchParams({family:`${n.family}:${n.italic?"ital,wght@1,":"wght@"}${n.weight}`,display:"swap"}),f=await fetch(`https://fonts.googleapis.com/css2?${d}`,{signal:l.signal,credentials:"omit",referrerPolicy:"no-referrer"});if(f.ok||(f=await fetch(`https://fonts.googleapis.com/css2?family=${encodeURIComponent(n.family)}&display=swap`,{signal:l.signal,credentials:"omit",referrerPolicy:"no-referrer"})),!f.ok)throw new Error("Font unavailable");if(![...(await f.text()).matchAll(/@font-face\s*\{([^}]+)\}/g)].slice(0,32).flatMap(u=>{let g=u[1],y=g.match(/url\((https:\/\/fonts\.gstatic\.com\/[^\s)"']+)\)/)?.[1];if(!y)return[];let v=new FontFace(`Popmelt Taste ${n.family}`,`url(${JSON.stringify(y)})`,{weight:g.match(/font-weight:\s*([^;]+);/)?.[1]??"400",style:g.match(/font-style:\s*([^;]+);/)?.[1]??"normal",unicodeRange:g.match(/unicode-range:\s*([^;]+);/)?.[1]??"U+0-10FFFF",display:"swap"});return document.fonts.add(v),[v]}).length)throw new Error("Font unavailable");await document.fonts.load(`${n.italic?"italic ":""}${n.weight} 16px "Popmelt Taste ${n.family}"`,"Your workspace A little space for big ideas. Create a project")}finally{clearTimeout(a)}})().catch(l=>{console.warn(`[Popmelt] Preview font ${n.family} unavailable; using its fallback.`,l instanceof Error?l.message:"Font request failed"),Nr.delete(r)});return Nr.set(r,s),s})).then(()=>{})}var et=e=>!!e&&typeof e=="object"&&!Array.isArray(e),zt=(e,t=512)=>typeof e=="string"&&e.length<=t,$t=e=>zt(e,100)&&/^[a-zA-Z0-9_-]+$/.test(e),Lr=e=>zt(e,4096)&&![...e].some(t=>t.charCodeAt(0)<9)&&!/[;{}<>]|\b(?:url|expression|javascript)\s*[:(]/i.test(e),yt=(e,t)=>Object.keys(e).every(r=>t.includes(r)),Dt=(e,t)=>new Set(e.map(r=>r[t])).size===e.length,Tr=new Set("display boxSizing width height flexDirection flexWrap alignItems justifyContent alignSelf flexGrow flexShrink gridTemplateColumns rowGap columnGap gap padding paddingInline paddingBlock border borderRadius paddingTop paddingRight paddingBottom paddingLeft marginTop marginRight marginBottom marginLeft borderTop borderRight borderBottom borderLeft borderColor borderWidth borderTopLeftRadius borderTopRightRadius borderBottomLeftRadius borderBottomRightRadius color backgroundColor backgroundImage boxShadow opacity fontFamily fontSize fontWeight fontStyle lineHeight letterSpacing textAlign textTransform textDecoration whiteSpace overflow fill stroke strokeWidth strokeLinecap strokeLinejoin objectFit".split(" ")),Na=new Set("div span img svg path circle rect line polyline polygon ellipse g".split(" ")),La=new Set("src alt viewBox d cx cy r x y x1 x2 y1 y2 rx ry width height points preserveAspectRatio transform fillRule clipRule".split(" "));function bt(e){return Array.isArray(e)?"["+e.map(bt).join(",")+"]":et(e)?"{"+Object.keys(e).sort().map(t=>JSON.stringify(t)+":"+bt(e[t])).join(",")+"}":JSON.stringify(e)}function Ta(e){try{if(!et(e)||!yt(e,["format","schemaVersion","draft"])||e.format!=="popmelt.taste.graph"||e.schemaVersion!==1||new TextEncoder().encode(JSON.stringify(e)).byteLength>512e3)return!1;let t=e.draft;if(!et(t)||!yt(t,["schemaVersion","name","constraints","tokens","usage","fragments","featuredComponentId"])||t.schemaVersion!==1||!zt(t.name,80)||!t.name.trim()||!Array.isArray(t.constraints)||t.constraints.length<1||t.constraints.length>32||!t.constraints.every(a=>et(a)&&yt(a,["id","name","kind","group","typographyRole","scaleMode","value","parentId","derivative","scale"])&&$t(a.id)&&zt(a.name,80)&&(a.group===void 0||a.group==="typography")&&(a.typographyRole===void 0||a.typographyRole==="body"||a.typographyRole==="heading")&&["layout","color","font"].includes(String(a.kind))&&Lr(a.value)&&(a.parentId===null||$t(a.parentId))&&Number.isFinite(a.derivative)&&Number.isFinite(a.scale)&&typeof a.scale=="number"&&a.scale>=0&&(a.scaleMode===void 0||a.scaleMode==="increment"))||!Dt(t.constraints,"id"))return!1;let r=new Map(t.constraints.map(a=>[String(a.id),a]));for(let a of t.constraints){let d=new Set,f=a;for(;f.parentId!==null;){if(d.has(f.id))return!1;d.add(f.id);let u=r.get(f.parentId);if(!u||u.kind!==f.kind)return!1;f=u}if(!f.value.trim())return!1}let n=a=>Array.isArray(a)&&a.length<=128&&a.every(d=>et(d)&&yt(d,["id","name","value"])&&$t(d.id)&&$t(d.name)&&Lr(d.value)&&d.value.trim()&&[...d.value.matchAll(/@([a-zA-Z0-9_-]+)/g)].every(f=>r.has(f[1])))&&Dt(a,"id")&&Dt(a,"name");if(!n(t.tokens))return!1;let o=t.tokens,s=(a,d)=>et(a)&&yt(a,["kind","id","step"])&&(a.kind==="dimension"?r.has(String(a.id)):a.kind==="token"&&d.some(f=>f.id===a.id))&&(a.step===void 0||typeof a.step=="number"&&Number.isInteger(a.step)&&Math.abs(a.step)<=100);if(t.usage!==void 0&&(!Array.isArray(t.usage)||t.usage.length>256||!t.usage.every(a=>et(a)&&yt(a,["target","property","source"])&&["page","heading","body","muted","card","button","input"].includes(String(a.target))&&Tr.has(String(a.property))&&s(a.source,o))))return!1;let l=t.fragments??[];if(!Array.isArray(l)||l.length>32||!Dt(l,"id"))return!1;for(let a of l){if(!et(a)||!yt(a,["id","name","width","height","root","tokens"])||!$t(a.id)||!zt(a.name,80)||!a.name.trim()||![a.width,a.height].every(v=>typeof v=="number"&&Number.isFinite(v)&&v>0&&v<=2e4)||!n(a.tokens??[]))return!1;let d=a.tokens??[];if(!n(d))return!1;let f=[...o,...d];if(!Dt(f,"id")||!Dt(f,"name"))return!1;let u=new Set,g=0,y=(v,C)=>typeof v=="string"?v.length<=1e4:!et(v)||!yt(v,["id","tag","styles","localStyles","attributes","children"])||!$t(v.id)||u.has(v.id)||++g>256||C>16||!Na.has(String(v.tag))||!et(v.styles)||!Array.isArray(v.children)||v.children.length>256||(u.add(v.id),!Object.entries(v.styles).every(([c,b])=>Tr.has(c)&&s(b,f)))||v.localStyles!==void 0&&(!et(v.localStyles)||!Object.entries(v.localStyles).every(([c,b])=>Tr.has(c)&&Lr(b)))||v.attributes!==void 0&&(!et(v.attributes)||!Object.entries(v.attributes).every(([c,b])=>La.has(c)&&zt(b,2e4)&&(c!=="src"||/^https:\/\//.test(b))))?!1:v.children.every(c=>y(c,C+1));if(!y(a.root,0))return!1}return t.featuredComponentId==null||l.some(a=>a.id===t.featuredComponentId)}catch{return!1}}function Nt(e){if(!Ta(e))return;let t=e;try{for(let r of t.draft.constraints)At(t.draft.constraints,r.id);for(let r of t.draft.fragments??[]){let n=Vt(t.draft,r),o=s=>Object.entries(s.styles).every(([l,a])=>Yt(n,a,l)!==null)&&s.children.every(l=>typeof l=="string"||o(l));if(!o(r.root))return}return t}catch{return}}function Ar(e){let t={format:"popmelt.taste.graph",schemaVersion:1,draft:e};if(!Nt(t))throw Error("This Taste has incomplete or invalid dimensions, tokens, or component bindings.");return t}function wt(e){if(!e||typeof e!="object")return;let t=e;for(let o of["background","surface","foreground","muted","accent","border"])if(!It(t[o],!0))return;for(let o of["radius","spacing"])if(typeof t[o]!="number"||!Number.isFinite(t[o])||t[o]<0||t[o]>32)return;let r={...t};delete r.savedDocument;let n=t.savedDocument;if(n&&typeof n.id=="string"&&Number.isSafeInteger(n.revision)&&n.revision>0&&Nt(n.document)&&(r.savedDocument=n),delete r.detail,t.detail!==void 0&&(r.detail=Ir(t.detail)),delete r.states,t.states&&typeof t.states=="object"){r.states={};for(let o of["card","button","input"]){let s=t.states[o];if(!(!s||typeof s!="object")){r.states[o]={};for(let l of["hover","focus","active"])r.states[o][l]=Ir({[o]:s[l]})?.[o]}}}if(delete r.parts,t.parts!==void 0){if(!t.parts||typeof t.parts!="object")return;let o={};for(let s of["card","button","content"]){let l=t.parts[s];if(!l||typeof l.radius!="number"||!Number.isFinite(l.radius)||l.radius<0||l.radius>999)return;let a=l.backdropFilter;o[s]={background:It(l.background,!0)?l.background:r.surface,border:It(l.border)?l.border:`1px solid ${r.border}`,radius:l.radius,shadow:It(l.shadow)?l.shadow:"none",...l.backgroundImage!==void 0?{backgroundImage:It(l.backgroundImage,!0)?l.backgroundImage:"none"}:{},...l.backgroundBlendMode!==void 0?{backgroundBlendMode:["normal","overlay","multiply","screen","soft-light","hard-light"].includes(l.backgroundBlendMode)?l.backgroundBlendMode:"normal"}:{},...a!==void 0?{backdropFilter:typeof a=="string"&&a.length<150&&/^(?:none|(?:\s*(?:blur\(\d*\.?\d+(?:px|rem)\)|saturate\(\d*\.?\d+%?\))\s*){1,3})$/.test(a)?a:"none"}:{},...l.opacity!==void 0?{opacity:Number.isFinite(l.opacity)?Math.max(0,Math.min(1,l.opacity)):1}:{}}}r.parts=o}return(!Number.isSafeInteger(r.recipeRevision)||r.recipeRevision<0)&&delete r.recipeRevision,(typeof r.contentRevision!="string"||!/^[a-f\d]{24}$/.test(r.contentRevision))&&delete r.contentRevision,r}function Aa({recipe:e}){let t=e.radius*.45,r=o=>o.replace(/(-?\d*\.?\d+)(px|rem)\b/g,(s,l,a)=>`${Math.max(-32,Math.min(32,Number(l)*(a==="rem"?16:1)*.45))}px`),n=o=>o?{background:o.background,...o.backgroundImage&&o.backgroundImage!=="none"?{backgroundImage:o.backgroundImage}:{},backgroundBlendMode:o.backgroundBlendMode,backdropFilter:o.backdropFilter?r(o.backdropFilter).replace(/saturate\(([\d.]+)%\)/g,(s,l)=>`saturate(${Math.min(400,Number(l))}%)`):void 0,WebkitBackdropFilter:o.backdropFilter?r(o.backdropFilter):void 0,opacity:o.opacity,border:r(o.border),borderRadius:o.radius*.45,boxShadow:r(o.shadow)}:{};return i("span",{"data-taste-specimen":!0,"aria-hidden":"true",style:{position:"absolute",inset:0,background:e.background,pointerEvents:"none",overflow:"hidden"},children:k("span",{"data-specimen-window":!0,style:{position:"absolute",left:"19.23%",top:"19.23%",width:"110%",height:"110%",background:e.surface,border:`1px solid ${e.border}`,borderRadius:t,overflow:"hidden",boxSizing:"border-box",...n(e.parts?.card),borderTopRightRadius:0,borderBottomRightRadius:0,borderBottomLeftRadius:0},children:[i("span",{"data-specimen-title":!0,style:{position:"absolute",left:0,top:0,width:"100%",height:"18.18%",background:e.parts?"transparent":e.accent}}),i("span",{"data-specimen-control":!0,style:{position:"absolute",left:"7.95%",top:"26.14%",width:"90.91%",height:"18.18%",background:e.muted,border:`1px solid ${e.border}`,borderRadius:t*.6,boxSizing:"border-box",...n(e.parts?.button)}}),i("span",{"data-specimen-content":!0,style:{position:"absolute",left:"7.95%",top:"53.41%",width:"90.91%",height:"67.05%",background:e.background,border:`1px solid ${e.border}`,borderRadius:t*.6,boxSizing:"border-box",...n(e.parts?.content)}})]})})}function Jt(e,t=!1,r=640){let[n,o]=A(!1),[s,l]=A(!1),[a,d]=A(!1);return{handlers:{onPointerEnter:()=>o(!0),onPointerLeave:()=>{o(!1),d(!1)},onPointerDown:()=>d(!0),onPointerUp:()=>d(!1),onPointerCancel:()=>d(!1),onKeyDown:f=>{t&&["Enter"," "].includes(f.key)&&d(!0)},onKeyUp:()=>d(!1),onFocus:()=>l(!0),onBlur:()=>{l(!1),d(!1)}},style:{...Ze(n?e?.hover:void 0,r),...Ze(s?e?.focus:void 0,r),...Ze(a?e?.active:void 0,r)}}}function Er({recipe:e,usageStyles:t}){let r=t!==void 0,n=u=>Ze({...e.detail?.[u]??{},...t?.[u]},640,r),o=Jt(e.states?.button,!0),s=Jt(e.states?.input),l=Jt(e.states?.card),a=r?`${e.spacing}px`:`${e.spacing/6.4}cqw`;le(()=>{Ia({...e.detail,...t})},[e.detail,t]);let d=u=>u.replace(/(-?\d*\.?\d+)(px|rem)\b/g,(g,y,v)=>`${Math.max(-16,Math.min(16,Number(y)*(v==="rem"?16:1)/6.4))}cqw`),f=u=>u?{...vt({background:u.background}),...u.backgroundImage&&u.backgroundImage!=="none"?{backgroundImage:u.backgroundImage}:{},backgroundBlendMode:u.backgroundBlendMode,...Mt({border:d(u.border)}),borderRadius:`${u.radius/6.4}cqw`,boxShadow:d(u.shadow),backdropFilter:u.backdropFilter?d(u.backdropFilter):void 0,WebkitBackdropFilter:u.backdropFilter?d(u.backdropFilter):void 0,opacity:u.opacity}:{};return i("div",{"data-taste-detail-specimen":!0,role:"group","aria-label":"Interactive taste preview",style:{position:r?"relative":"absolute",...r?{width:640,padding:0,boxSizing:"border-box"}:{inset:0},containerType:"inline-size",...vt({background:e.background}),color:e.foreground,fontSynthesis:"none",...n("body"),...n("page"),overflow:r?"visible":"hidden"},children:i("div",{"data-taste-component":"card",style:{position:r?"relative":"absolute",...r?{}:{inset:"9% 8%"},...vt({background:e.surface}),...Mt({border:`1px solid ${e.border}`}),borderRadius:e.radius,...f(e.parts?.card),padding:r?0:"5cqw",boxSizing:"border-box",display:"flex",flexDirection:"column",gap:a,...n("card")},children:k("div",{style:{display:"grid",gridTemplateColumns:"1.35fr 1fr",gap:r?n("card").gap??a:`calc(${a} * 2)`,alignItems:"center",flex:1,minHeight:0},children:[k("div",{children:[k("h2",{"data-taste-component":"heading",style:{margin:0,fontWeight:"inherit",lineHeight:1.1,letterSpacing:"-0.03em",marginBottom:a,...n("heading"),...r?{}:{fontSize:`clamp(3.8cqw, ${Ze(e.detail?.heading).fontSize??"4.6cqw"}, 5.4cqw)`}},children:["A little space",i("br",{}),"for big ideas."]}),k("p",{"data-taste-component":"paragraph",style:{margin:0,fontSize:r?"inherit":"2.4cqw",lineHeight:1.5,marginBottom:a,...n("body"),...n("muted")},children:["Gather your thoughts.",i("br",{}),"Make something your own."]}),i("button",{"data-taste-component":"button",...o.handlers,type:"button",style:{fontFamily:"inherit",color:"inherit",display:"inline-block",...vt({background:e.accent}),...Mt({border:`1px solid ${e.border}`}),borderRadius:e.radius,...f(e.parts?.button),padding:r?0:"1.5cqw 2.5cqw",fontSize:r?"inherit":"2.3cqw",fontWeight:"inherit",lineHeight:1.2,...n("button"),cursor:"pointer",...o.style},children:"Create a project \u2197"})]}),k("div",{"data-taste-component":"card",...l.handlers,style:{...vt({background:e.surface}),...Mt({border:`1px solid ${e.border}`}),borderRadius:e.radius,...f(e.parts?.card),padding:r?0:"3cqw",fontSize:r?"inherit":"2.1cqw",lineHeight:1.5,...n("card"),...l.style},children:[i("h3",{"data-taste-component":"heading",style:{margin:0,fontWeight:"inherit",...n("heading"),...r?{}:{fontSize:"2.6cqw"},marginBottom:a},children:"In the works"}),i("input",{"data-taste-component":"input",...s.handlers,"aria-label":"Preview project name",defaultValue:"A fresh start",style:{appearance:"none",outline:"none",borderWidth:0,borderStyle:"none",borderColor:"transparent",...vt({background:"transparent"}),...f(e.parts?.content),font:"inherit",color:"inherit",padding:r?0:"1.5cqw",...n("input"),width:"100%",minWidth:0,boxSizing:"border-box",marginBottom:a,...s.style}}),i("div",{children:"02 \xA0 What comes next"})]})]})})})}function cn({children:e}){let t=Ge.dark,r=D(null),[n,o]=A(),[s,l]=A({scale:1,x:0,y:0}),a=D(s);return le(()=>{let d=r.current;if(!d)return;let f=()=>o({width:d.clientWidth,height:d.clientHeight});f();let u=typeof ResizeObserver<"u"?new ResizeObserver(f):void 0;u?.observe(d);let g=()=>window.matchMedia("(any-hover: hover) and (any-pointer: fine)").matches,y=(h,p,m)=>{h=Math.max(1,Math.min(4,h));let L={scale:h,x:Math.max(1-h,Math.min(0,p)),y:Math.max(1-h,Math.min(0,m))};a.current=L,l(L)},v=(h,p,m)=>{let L=d.getBoundingClientRect();if(!L.width||!L.height)return;let E=a.current,P=Math.max(1,Math.min(4,h)),q=Math.max(0,Math.min(1,(p-L.left)/L.width)),x=Math.max(0,Math.min(1,(m-L.top)/L.height));y(P,q-(q-E.x)*P/E.scale,x-(x-E.y)*P/E.scale)},C=null,c=h=>{if(!g()||!h.ctrlKey&&a.current.scale===1)return;h.preventDefault(),h.stopPropagation();let p=h.deltaMode===1?16:h.deltaMode===2?d.clientHeight:1;if(h.ctrlKey)C===null&&v(a.current.scale*Math.exp(-h.deltaY*p*.01),h.clientX,h.clientY);else{let m=d.getBoundingClientRect();m.width&&m.height&&y(a.current.scale,a.current.x-h.deltaX*p/m.width,a.current.y-h.deltaY*p/m.height)}},b=h=>{if(!g())return;h.preventDefault(),h.stopPropagation();let p=h;h.type==="gesturestart"?C=a.current.scale:h.type==="gestureend"?C=null:C!==null&&Number.isFinite(p.scale)&&v(C*p.scale,p.clientX,p.clientY)};d.addEventListener("wheel",c,{passive:!1});for(let h of["gesturestart","gesturechange","gestureend"])d.addEventListener(h,b,{passive:!1});return()=>{u?.disconnect(),d.removeEventListener("wheel",c);for(let h of["gesturestart","gesturechange","gestureend"])d.removeEventListener(h,b)}},[]),k("div",{ref:r,"data-preview-zoom":!0,style:{position:"relative",width:"100%",aspectRatio:"16 / 9",overflow:"hidden",borderRadius:8},children:[i("div",{"data-preview-zoom-content":!0,style:{width:n?.width||"100%",height:n?.height||"100%",zoom:s.scale,transformOrigin:"0 0",transform:`translate(${s.x*100/s.scale}%, ${s.y*100/s.scale}%)`},children:e}),s.scale>1&&k(Te,{children:[i("style",{children:`
3
3
  [data-preview-zoom-reset] span { color: ${t.primary}; }
4
4
  [data-preview-zoom-reset] svg { color: ${t.secondary}; }
5
5
  [data-preview-zoom-reset]:hover span, [data-preview-zoom-reset]:focus-visible span { color: ${t.secondary}; }
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{b as c}from"./chunk-4ZZTJRHL.mjs";import"./chunk-JQHZFDY5.mjs";import"./chunk-OLLUQ45J.mjs";import"./chunk-XOGBFVWI.mjs";import"./chunk-HGW2U6PD.mjs";import{useRef as u,useEffect as s}from"react";function f({config:r,adapters:e}){let n=u(e);n.current=e;let t=u(new Set);return s(()=>{c({sourceId:r.projectId,revision:r.revision},{get:()=>n.current,subscribe:i=>(t.current.add(i),()=>{t.current.delete(i)})});let o=window.__POPMELT_CODE_PREVIEW__;return()=>o?.dispose()},[r]),s(()=>{for(let o of t.current)o()},[e]),null}export{f as default};
2
+ import{b as c}from"./chunk-QTGE5KAA.mjs";import"./chunk-MTQ5IWIK.mjs";import"./chunk-F6AMPRUB.mjs";import"./chunk-EXDOFFFJ.mjs";import"./chunk-RCVAPQ7X.mjs";import{useRef as u,useEffect as s}from"react";function f({config:r,adapters:e}){let n=u(e);n.current=e;let t=u(new Set);return s(()=>{c({sourceId:r.projectId,revision:r.revision},{get:()=>n.current,subscribe:i=>(t.current.add(i),()=>{t.current.delete(i)})});let o=window.__POPMELT_CODE_PREVIEW__;return()=>o?.dispose()},[r]),s(()=>{for(let o of t.current)o()},[e]),null}export{f as default};
@@ -1,2 +1,2 @@
1
- import{k as n}from"./chunk-E3ZTB2VR.mjs";import"./chunk-GL4I4MI6.mjs";import"./chunk-QXVMGZFP.mjs";import{mkdir as d,unlink as l,writeFile as P}from"fs/promises";import{join as r}from"path";var u=parseInt(process.env.POPMELT_PORT||"1111",10),s=process.env.POPMELT_PROJECT_ROOT||process.cwd(),w=process.env.POPMELT_DEV_ORIGIN||void 0,m=process.env.POPMELT_COPILOT_PATH||void 0,O=process.env.POPMELT_CDP_URL||void 0,c=r(s,".popmelt"),i=r(c,"bridge.lock");async function f(e){await d(c,{recursive:!0}),await P(i,JSON.stringify({pid:process.pid,port:e,startedAt:Date.now()})+`
1
+ import{k as n}from"./chunk-SQA3PHME.mjs";import"./chunk-GL4I4MI6.mjs";import"./chunk-QXVMGZFP.mjs";import{mkdir as d,unlink as l,writeFile as P}from"fs/promises";import{join as r}from"path";var u=parseInt(process.env.POPMELT_PORT||"1111",10),s=process.env.POPMELT_PROJECT_ROOT||process.cwd(),w=process.env.POPMELT_DEV_ORIGIN||void 0,m=process.env.POPMELT_COPILOT_PATH||void 0,O=process.env.POPMELT_CDP_URL||void 0,c=r(s,".popmelt"),i=r(c,"bridge.lock");async function f(e){await d(c,{recursive:!0}),await P(i,JSON.stringify({pid:process.pid,port:e,startedAt:Date.now()})+`
2
2
  `)}async function a(){try{await l(i)}catch{}}async function T(){let e=await n({port:u,projectRoot:s,devOrigin:w,copilotPath:m,nativeCaptureUrl:O,restartMode:"detached"});await f(e.port),await new Promise(p=>{let t=!1,o=async()=>{t||(t=!0,await e.close(),await a(),p(),process.exit(0))};process.on("SIGTERM",o),process.on("SIGINT",o)})}T().catch(e=>{console.error("[popmelt bridge-entry] Fatal:",e),a().finally(()=>process.exit(1))});
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{b as m,a as i}from"./chunk-CXQWNKZ4.mjs";import"./chunk-RXRZTZPN.mjs";import"./chunk-GQ6CPJG6.mjs";import"./chunk-IRFL32GJ.mjs";import"./chunk-J4WDYITA.mjs";import"./chunk-253MCKJJ.mjs";import"./chunk-4LHTPRFY.mjs";import"./chunk-JQHZFDY5.mjs";import"./chunk-OLLUQ45J.mjs";import"./chunk-XOGBFVWI.mjs";import"./chunk-2P2NUZW7.mjs";import"./chunk-D32YV5O6.mjs";import"./chunk-V44RIEET.mjs";import"./chunk-CPOYMGYY.mjs";import"./chunk-EX63NVDN.mjs";import"./chunk-N2ZEZCHO.mjs";import"./chunk-J3UIBBU2.mjs";import"./chunk-6VXFTT5U.mjs";import"./chunk-XTOCFTVW.mjs";import"./chunk-LVEMYZOA.mjs";import"./chunk-HGW2U6PD.mjs";import{createElement as p}from"react";import{createRoot as e}from"react-dom/client";function n(o,t){let r=e(o);return r.render(p(m,t)),()=>{r.unmount(),i()}}export{n as mountBrowserRuntime};
2
+ import{b as m,a as i}from"./chunk-QENHLODE.mjs";import"./chunk-JU7D4I76.mjs";import"./chunk-IPR652AZ.mjs";import"./chunk-Q5QRV4KJ.mjs";import"./chunk-J4WDYITA.mjs";import"./chunk-GNZ73T3H.mjs";import"./chunk-4LHTPRFY.mjs";import"./chunk-MTQ5IWIK.mjs";import"./chunk-F6AMPRUB.mjs";import"./chunk-EXDOFFFJ.mjs";import"./chunk-2P2NUZW7.mjs";import"./chunk-D32YV5O6.mjs";import"./chunk-V44RIEET.mjs";import"./chunk-CPOYMGYY.mjs";import"./chunk-EX63NVDN.mjs";import"./chunk-N2ZEZCHO.mjs";import"./chunk-J3UIBBU2.mjs";import"./chunk-6VXFTT5U.mjs";import"./chunk-XTOCFTVW.mjs";import"./chunk-LVEMYZOA.mjs";import"./chunk-RCVAPQ7X.mjs";import{createElement as p}from"react";import{createRoot as e}from"react-dom/client";function n(o,t){let r=e(o);return r.render(p(m,t)),()=>{r.unmount(),i()}}export{n as mountBrowserRuntime};
package/dist/browser.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- export{a as isPopmeltPreview}from"./chunk-EX63NVDN.mjs";var m={unmount(){}},u="[data-popmelt-browser-host]";async function p(o={}){if(!o.enabled||typeof document>"u")return m;if(document.querySelector(`${u}, [data-popmelt-top-layer-host]`))throw new Error("Popmelt is already mounted. Unmount it before mounting again.");let e=document.createElement("div");e.setAttribute("data-popmelt-browser-host",""),e.setAttribute("data-devtools",""),document.documentElement.appendChild(e);let d=[["__POPMELT_PROJECT_ID__",o.projectId],["__POPMELT_BRIDGE_URL__",o.bridgeUrl]].flatMap(([t,r])=>{if(r===void 0)return[];let n=Object.prototype.hasOwnProperty.call(window,t),l=window[t],i=r??void 0;return window[t]=i,[()=>{window[t]===i&&(n?window[t]=l:delete window[t])}]}),a=()=>{e.remove();for(let t of d)t()};try{let{mountBrowserRuntime:t}=await import("./browser-runtime-LTQBOXZW.mjs");if(!e.isConnected)throw new Error("Popmelt mount was removed before startup.");let r=t(e,o),n=!0;return{unmount(){if(n){n=!1;try{r()}finally{a()}}}}}catch(t){throw a(),t}}export{p as mountPopmelt};
2
+ export{a as isPopmeltPreview}from"./chunk-EX63NVDN.mjs";var m={unmount(){}},u="[data-popmelt-browser-host]";async function p(o={}){if(!o.enabled||typeof document>"u")return m;if(document.querySelector(`${u}, [data-popmelt-top-layer-host]`))throw new Error("Popmelt is already mounted. Unmount it before mounting again.");let e=document.createElement("div");e.setAttribute("data-popmelt-browser-host",""),e.setAttribute("data-devtools",""),document.documentElement.appendChild(e);let d=[["__POPMELT_PROJECT_ID__",o.projectId],["__POPMELT_BRIDGE_URL__",o.bridgeUrl]].flatMap(([t,r])=>{if(r===void 0)return[];let n=Object.prototype.hasOwnProperty.call(window,t),l=window[t],i=r??void 0;return window[t]=i,[()=>{window[t]===i&&(n?window[t]=l:delete window[t])}]}),a=()=>{e.remove();for(let t of d)t()};try{let{mountBrowserRuntime:t}=await import("./browser-runtime-VSD5R2HG.mjs");if(!e.isConnected)throw new Error("Popmelt mount was removed before startup.");let r=t(e,o),n=!0;return{unmount(){if(n){n=!1;try{r()}finally{a()}}}}}catch(t){throw a(),t}}export{p as mountPopmelt};
@@ -1 +1 @@
1
- import{a as o,b as d,c as l,d as s}from"./chunk-V6VQACC2.mjs";function g(r){let p=r?.basePath??"/popmelt",e={port:null,projectId:null},n="virtual:popmelt/bridge",i=`\0${n}`;return{name:"popmelt",resolveId(t){if(t===n)return i},load(t){if(t===i)return`export const bridgeUrl = ${JSON.stringify(e.port===null?null:`http://localhost:${e.port}`)}; export const projectId = ${JSON.stringify(e.projectId)};`},async configureServer(t){e=await o(r,t,5173),await d(e,t),t.middlewares.use(l(p,()=>e))},transformIndexHtml(){if(e.port!==null)return[{tag:"script",attrs:{type:"text/javascript"},children:s(e),injectTo:"head-prepend"}]}}}export{g as a};
1
+ import{a as o,b as d,c as l,d as s}from"./chunk-J5HW2SCX.mjs";function g(r){let p=r?.basePath??"/popmelt",e={port:null,projectId:null},n="virtual:popmelt/bridge",i=`\0${n}`;return{name:"popmelt",resolveId(t){if(t===n)return i},load(t){if(t===i)return`export const bridgeUrl = ${JSON.stringify(e.port===null?null:`http://localhost:${e.port}`)}; export const projectId = ${JSON.stringify(e.projectId)};`},async configureServer(t){e=await o(r,t,5173),await d(e,t),t.middlewares.use(l(p,()=>e))},transformIndexHtml(){if(e.port!==null)return[{tag:"script",attrs:{type:"text/javascript"},children:s(e),injectTo:"head-prepend"}]}}}export{g as a};
File without changes
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{A as l,d as b,l as I,m as w,y as k}from"./chunk-LSPIP2IX.mjs";import{readFile as h,realpath as P,mkdir as x,writeFile as E}from"fs/promises";import{createHash as S}from"crypto";import{join as m,resolve as O}from"path";function N(t,e){let r=S("sha256").update(e).digest("hex");return m(t,".popmelt","participant-agents",r+".json")}async function M(t,e){if(e.storeId!==t.storeId)return{ok:!1,body:{status:"writable_store_required"}};if(typeof e.threadId!="string"||!e.threadId||typeof e.text!="string"||!e.text.trim()||e.text.length>8e3)return{ok:!1,body:{status:"invalid_note"}};let r;try{r=await v(t,t.sessionId,!0)}catch(a){if(a.code!=="ENOENT")throw a;return{ok:!1,body:{status:"participant_invitation_required"}}}if(!r)return{ok:!1,body:{status:"enrolled_bridge_required"}};let o=await l(r.endpoint,"/participants/thread-note",{...r.request,method:"POST",signal:AbortSignal.timeout(3e4),body:JSON.stringify({storeId:t.storeId,threadId:e.threadId,reply:e.text,sessionId:t.sessionId,requestId:e.requestId})});return{ok:o.response.ok,body:o.body}}async function v(t,e,r=!1){let o=await h(m(t.projectRoot,".popmelt","participant-bridge.json"),"utf8").then(JSON.parse).catch(c=>{if(c.code!=="ENOENT"||!t.bridgePort)throw c;return{projectId:t.projectId,port:t.bridgePort}});if(o.projectId!==t.projectId||!Number.isInteger(o.port)||o.port<1||o.port>65535)return null;let a={redirect:"error",signal:AbortSignal.timeout(3e3)},p=await l(o,"/status",a);if(!p.response.ok||p.body?.projectId!==t.projectId)return null;let i=N(t.projectRoot,e),n;try{n=JSON.parse(await h(i,"utf8"))}catch(c){if(c.code!=="ENOENT"||!r)throw c;let d=await P(t.projectRoot),u=b(e);if(w(d)!==t.projectId||!u)return null;let s=JSON.parse(await h(m(d,".popmelt","participant-host.json"),"utf8"));if(!(await l(o,"/participants/agent-join",{...a,method:"POST",headers:{"X-Popmelt-Participant-Id":s.participantId,"X-Popmelt-Participant-Token":s.token},body:JSON.stringify({sessionId:e,name:u,headless:!0})})).response.ok)return null;n=JSON.parse(await h(i,"utf8"))}return{endpoint:o,request:{...a,headers:{"X-Popmelt-Participant-Id":n.participantId,"X-Popmelt-Participant-Token":n.token}}}}async function F(t,e,r){let o=[t,...t.mountedStores].find(c=>c.storeId===e.storeId);if(!o||r&&o!==t)return{ok:!1,body:{status:"store_unavailable"}};if(r&&(typeof e.threadId!="string"||!e.threadId))return{ok:!1,body:{status:"thread_required"}};let a=await v(o,t.sessionId,r).catch(c=>{if(c.code==="ENOENT")return null;throw c});if(!a)return{ok:!1,body:{status:"enrolled_bridge_required",message:"Join this project as a Popmelt peer and check that its bridge is running."}};let{endpoint:p,request:i}=a,n=await l(p,r?t.sessionId.startsWith("claude:")?"/participants/link-claude-chat":"/participants/link-codex-chat":"/participants/check-claude-notes",{...i,method:"POST",body:JSON.stringify({sessionId:t.sessionId,...r?{threadId:e.threadId}:{}})});return{ok:n.response.ok,body:n.body}}async function _(t,e,r){if(!r.projectRoot)throw new Error("Participant connections require the active project root");let o=await P(r.projectRoot);if(w(o)!==t.projectId)throw new Error("Participant project does not match");let a=m(o,".popmelt"),p=S("sha256").update(e).digest("hex"),i=async(s,f,g)=>{let j=await l(t,"/participants/"+s,{method:"POST",redirect:"error",headers:{"X-Popmelt-Participant-Id":f.participantId,"X-Popmelt-Participant-Token":f.token},body:JSON.stringify(g),signal:AbortSignal.timeout(9e4)}),y=j.body;if(!j.response.ok||y.error)throw new Error(y.error??"Participant connection unavailable");return y},n,c;try{n=JSON.parse(await h(N(o,e),"utf8"))}catch(s){if(s.code!=="ENOENT")throw s;if(!r.name)return{status:"participant_invitation_required"};let f=JSON.parse(await h(m(a,"participant-host.json"),"utf8")),g=await i("agent-join",f,{sessionId:e,name:r.name});n=g.credential,c=g.participant}if(!r.action){let s=await i("agent-connect",n,{});return{status:"participant_connected",participantId:n.participantId,participant:s.participant??c}}let d=await i("agent-act",n,{action:I(r.action)}),u=d.evidence;if(u?.frame?.image){let s=u.frame.image;if(!/^data:image\/jpeg;base64,[A-Za-z0-9+/=]+$/.test(s)||s.length>7e5)throw new Error("Invalid participant preview");let f=m(a,"artifacts","participant-previews");await x(f,{recursive:!0,mode:448});let g=m(f,p+".jpg");return await E(g,Buffer.from(s.slice(s.indexOf(",")+1),"base64"),{mode:384}),{status:"participant_connected",participant:d.participant,evidence:{...u,frame:{imagePath:g,targets:u.frame.targets}}}}return{status:"participant_connected",participant:d.participant,evidence:d.evidence}}async function C(t,e,r={}){if(k())return{status:"already_managed_by_bridge"};if((await l(t,"/status",{redirect:"error",signal:AbortSignal.timeout(3e3)})).body?.participantSessions)return _(t,e,r);let a=async(c,d)=>{let u=await l(t,`/peers/${c}`,{method:"POST",body:JSON.stringify(d),signal:AbortSignal.timeout(5e4)}),s=u.body;if(!u.response.ok||s?.error)throw new Error(s?.error??"Peer connection unavailable");return s},p=await a("join",{sessionId:e,name:r.name}),i=r.action?await a("act",{token:p.token,clientId:r.clientId,action:I(r.action)}):p,n=i.peer;return{...i.status?{status:i.status}:{},...n?{peer:{...n,state:n.state?{annotations:n.state.annotations,styleModifications:n.state.styleModifications,textModifications:n.state.textModifications,undoDepth:n.state.undoStack.length,redoDepth:n.state.redoStack.length}:null}}:{},...i.evidence?{evidence:i.evidence}:{},clients:p.clients}}async function D(t){let e=c=>{let d=t.indexOf(c);return d>=0?t[d+1]:void 0},r=e("--session");if(!r)throw new Error("Usage: popmelt peer --session <stable-agent-session> [--project-root <active-project>] [--name <your-name>] [--client <canvas-id>] [--action <JSON>]");let o=await P(O(e("--project-root")??process.cwd())),a=JSON.parse(await h(m(o,".popmelt","bridge.lock"),"utf8")),p=w(o),i=await l({port:a.port,projectId:p},"/status",{signal:AbortSignal.timeout(3e3)});if(!i.response.ok||i.body.projectRoot!==o&&!(i.body.participantSessions&&i.body.projectId===p))throw new Error("No matching running project bridge");let n=e("--action");console.log(JSON.stringify(await C({port:a.port,projectId:p},r,{name:e("--name"),projectRoot:o,clientId:e("--client"),action:n?JSON.parse(n):void 0}),null,2))}export{N as a,M as b,v as c,F as d,C as e,D as f};
2
+ import{A as l,d as b,l as I,m as w,y as k}from"./chunk-QLN5IYRL.mjs";import{readFile as h,realpath as P,mkdir as x,writeFile as E}from"fs/promises";import{createHash as S}from"crypto";import{join as m,resolve as O}from"path";function N(t,e){let r=S("sha256").update(e).digest("hex");return m(t,".popmelt","participant-agents",r+".json")}async function M(t,e){if(e.storeId!==t.storeId)return{ok:!1,body:{status:"writable_store_required"}};if(typeof e.threadId!="string"||!e.threadId||typeof e.text!="string"||!e.text.trim()||e.text.length>8e3)return{ok:!1,body:{status:"invalid_note"}};let r;try{r=await v(t,t.sessionId,!0)}catch(a){if(a.code!=="ENOENT")throw a;return{ok:!1,body:{status:"participant_invitation_required"}}}if(!r)return{ok:!1,body:{status:"enrolled_bridge_required"}};let o=await l(r.endpoint,"/participants/thread-note",{...r.request,method:"POST",signal:AbortSignal.timeout(3e4),body:JSON.stringify({storeId:t.storeId,threadId:e.threadId,reply:e.text,sessionId:t.sessionId,requestId:e.requestId})});return{ok:o.response.ok,body:o.body}}async function v(t,e,r=!1){let o=await h(m(t.projectRoot,".popmelt","participant-bridge.json"),"utf8").then(JSON.parse).catch(c=>{if(c.code!=="ENOENT"||!t.bridgePort)throw c;return{projectId:t.projectId,port:t.bridgePort}});if(o.projectId!==t.projectId||!Number.isInteger(o.port)||o.port<1||o.port>65535)return null;let a={redirect:"error",signal:AbortSignal.timeout(3e3)},p=await l(o,"/status",a);if(!p.response.ok||p.body?.projectId!==t.projectId)return null;let i=N(t.projectRoot,e),n;try{n=JSON.parse(await h(i,"utf8"))}catch(c){if(c.code!=="ENOENT"||!r)throw c;let d=await P(t.projectRoot),u=b(e);if(w(d)!==t.projectId||!u)return null;let s=JSON.parse(await h(m(d,".popmelt","participant-host.json"),"utf8"));if(!(await l(o,"/participants/agent-join",{...a,method:"POST",headers:{"X-Popmelt-Participant-Id":s.participantId,"X-Popmelt-Participant-Token":s.token},body:JSON.stringify({sessionId:e,name:u,headless:!0})})).response.ok)return null;n=JSON.parse(await h(i,"utf8"))}return{endpoint:o,request:{...a,headers:{"X-Popmelt-Participant-Id":n.participantId,"X-Popmelt-Participant-Token":n.token}}}}async function F(t,e,r){let o=[t,...t.mountedStores].find(c=>c.storeId===e.storeId);if(!o||r&&o!==t)return{ok:!1,body:{status:"store_unavailable"}};if(r&&(typeof e.threadId!="string"||!e.threadId))return{ok:!1,body:{status:"thread_required"}};let a=await v(o,t.sessionId,r).catch(c=>{if(c.code==="ENOENT")return null;throw c});if(!a)return{ok:!1,body:{status:"enrolled_bridge_required",message:"Join this project as a Popmelt peer and check that its bridge is running."}};let{endpoint:p,request:i}=a,n=await l(p,r?t.sessionId.startsWith("claude:")?"/participants/link-claude-chat":"/participants/link-codex-chat":"/participants/check-claude-notes",{...i,method:"POST",body:JSON.stringify({sessionId:t.sessionId,...r?{threadId:e.threadId}:{}})});return{ok:n.response.ok,body:n.body}}async function _(t,e,r){if(!r.projectRoot)throw new Error("Participant connections require the active project root");let o=await P(r.projectRoot);if(w(o)!==t.projectId)throw new Error("Participant project does not match");let a=m(o,".popmelt"),p=S("sha256").update(e).digest("hex"),i=async(s,f,g)=>{let j=await l(t,"/participants/"+s,{method:"POST",redirect:"error",headers:{"X-Popmelt-Participant-Id":f.participantId,"X-Popmelt-Participant-Token":f.token},body:JSON.stringify(g),signal:AbortSignal.timeout(9e4)}),y=j.body;if(!j.response.ok||y.error)throw new Error(y.error??"Participant connection unavailable");return y},n,c;try{n=JSON.parse(await h(N(o,e),"utf8"))}catch(s){if(s.code!=="ENOENT")throw s;if(!r.name)return{status:"participant_invitation_required"};let f=JSON.parse(await h(m(a,"participant-host.json"),"utf8")),g=await i("agent-join",f,{sessionId:e,name:r.name});n=g.credential,c=g.participant}if(!r.action){let s=await i("agent-connect",n,{});return{status:"participant_connected",participantId:n.participantId,participant:s.participant??c}}let d=await i("agent-act",n,{action:I(r.action)}),u=d.evidence;if(u?.frame?.image){let s=u.frame.image;if(!/^data:image\/jpeg;base64,[A-Za-z0-9+/=]+$/.test(s)||s.length>7e5)throw new Error("Invalid participant preview");let f=m(a,"artifacts","participant-previews");await x(f,{recursive:!0,mode:448});let g=m(f,p+".jpg");return await E(g,Buffer.from(s.slice(s.indexOf(",")+1),"base64"),{mode:384}),{status:"participant_connected",participant:d.participant,evidence:{...u,frame:{imagePath:g,targets:u.frame.targets}}}}return{status:"participant_connected",participant:d.participant,evidence:d.evidence}}async function C(t,e,r={}){if(k())return{status:"already_managed_by_bridge"};if((await l(t,"/status",{redirect:"error",signal:AbortSignal.timeout(3e3)})).body?.participantSessions)return _(t,e,r);let a=async(c,d)=>{let u=await l(t,`/peers/${c}`,{method:"POST",body:JSON.stringify(d),signal:AbortSignal.timeout(5e4)}),s=u.body;if(!u.response.ok||s?.error)throw new Error(s?.error??"Peer connection unavailable");return s},p=await a("join",{sessionId:e,name:r.name}),i=r.action?await a("act",{token:p.token,clientId:r.clientId,action:I(r.action)}):p,n=i.peer;return{...i.status?{status:i.status}:{},...n?{peer:{...n,state:n.state?{annotations:n.state.annotations,styleModifications:n.state.styleModifications,textModifications:n.state.textModifications,undoDepth:n.state.undoStack.length,redoDepth:n.state.redoStack.length}:null}}:{},...i.evidence?{evidence:i.evidence}:{},clients:p.clients}}async function D(t){let e=c=>{let d=t.indexOf(c);return d>=0?t[d+1]:void 0},r=e("--session");if(!r)throw new Error("Usage: popmelt peer --session <stable-agent-session> [--project-root <active-project>] [--name <your-name>] [--client <canvas-id>] [--action <JSON>]");let o=await P(O(e("--project-root")??process.cwd())),a=JSON.parse(await h(m(o,".popmelt","bridge.lock"),"utf8")),p=w(o),i=await l({port:a.port,projectId:p},"/status",{signal:AbortSignal.timeout(3e3)});if(!i.response.ok||i.body.projectRoot!==o&&!(i.body.participantSessions&&i.body.projectId===p))throw new Error("No matching running project bridge");let n=e("--action");console.log(JSON.stringify(await C({port:a.port,projectId:p},r,{name:e("--name"),projectRoot:o,clientId:e("--client"),action:n?JSON.parse(n):void 0}),null,2))}export{N as a,M as b,v as c,F as d,C as e,D as f};
@@ -0,0 +1,2 @@
1
+ "use client";
2
+ import{a as f,j as F,r as w,l as W,t as T,q as $,o as b,m as g,d as I,s as q,e as B}from"./chunk-RCVAPQ7X.mjs";var O=["data-popmelt-frame","data-popmelt-media-id","data-testid","data-test","data-cy"];function S(e){let t=e.getRootNode();if(!("querySelectorAll"in t))return null;let r=new Set([...O,...e.getAttributeNames().filter(n=>n!=="id"&&q(n))]);for(let n of r){let i=e.getAttribute(n);if(!i||i.length>200)continue;let o=typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(i):Array.from(i,a=>{if(a==='"'||a==="\\")return`\\${a}`;let u=a.charCodeAt(0);return u<32||u===127?`\\${u.toString(16)} `:a}).join(""),l=`[${n}="${o}"]`;if(t.querySelectorAll(l).length===1)return l}return null}function v(e){if(f(e.ownerDocument))return d(e);let t=S(e);if(t)return t;if(e.id)return`#${e.id}`;let r=e.tagName.toLowerCase(),n=Array.from(e.classList).slice(0,3).join(".");return n?`${r}.${n}`:r}function d(e){return x(L(e),e.ownerDocument)}function x(e,t){let r=f(t);if(r){!(r.id&&r.ownerDocument.querySelectorAll(`#${CSS.escape(r.id)}`).length===1)&&!S(r)&&r.setAttribute("data-popmelt-frame",globalThis.crypto?.randomUUID?.()??`frame-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`);let n=r.hasAttribute("data-popmelt-frame")?`[data-popmelt-frame="${r.getAttribute("data-popmelt-frame")}"]`:L(r),i=f(r.ownerDocument)?d(r):n;return F(i,t)+e}return e}function L(e){if(e.getRootNode().nodeType===9&&e.id&&!e.id.startsWith("radix-")&&!e.id.startsWith(":")&&e.ownerDocument.querySelectorAll(`#${CSS.escape(e.id)}`).length===1)return`#${CSS.escape(e.id)}`;let t=[],r=e;for(;r&&r!==e.ownerDocument.documentElement;){let n=r.tagName.toLowerCase(),i=S(r);if(i?n=i:r.id&&!r.id.startsWith("radix-")&&!r.id.startsWith(":")&&r.getRootNode().querySelectorAll(`#${CSS.escape(r.id)}`).length===1&&(n=`#${CSS.escape(r.id)}`),!i&&!n.startsWith("#")){let a=Array.from(r.classList).filter(u=>!u.startsWith("_")&&u.length<30).slice(0,2);a.length>0&&(n+="."+a.map(u=>CSS.escape(u)).join("."))}let o=r.parentElement;if(o&&!i&&!n.startsWith("#")){let a=Array.from(o.children).filter(u=>u.tagName===r.tagName);if(a.length>1){let u=a.indexOf(r)+1;n+=`:nth-of-type(${u})`}}if(t.unshift(n),i||n.startsWith("#")){let a=r.getRootNode();if(a.nodeType===9)break;if("host"in a){t.unshift(w().trim()),r=a.host;continue}}if(o){r=o;continue}let l=r.getRootNode();if(!("host"in l))break;t.unshift(w().trim()),r=l.host}return t.join(" > ").replace(/ > >>> > /g,w())}function U(e){try{return W(e)}catch{return null}}var M=900,y=80;function m(e){if(!e)return null;try{return W(e)}catch{return null}}function p(e){return(e??"").replace(/\s+/g," ").trim()}function R(e){let t=p(e.getAttribute("aria-label"));if(t)return t.slice(0,y);let r=p(e.getAttribute("aria-labelledby"));if(r){let i=r.split(/\s+/).map(o=>p(document.getElementById(o)?.textContent)).filter(Boolean).join(" ");if(i)return i.slice(0,y)}let n=p(e.getAttribute("title"));return n?n.slice(0,y):p(e.textContent).slice(0,y)}function P(e){return e.id?Array.from(document.querySelectorAll("[aria-controls]")).find(t=>t.getAttribute("aria-controls")===e.id)??null:null}function H(e){if(e instanceof HTMLDetailsElement){let n=Array.from(e.children).find(o=>o.tagName.toLowerCase()==="summary");if(!n)return null;let i=R(n);return i?{triggerSelector:d(n),targetSelector:d(e),label:i}:null}let t=P(e);if(!t)return null;let r=R(t);return r?{triggerSelector:d(t),targetSelector:d(e),label:r}:null}function N(e){let t=[],r=new Set,n=g(e);for(;n&&n!==document.body&&n!==document.documentElement;){let o=H(n);o&&!r.has(o.triggerSelector)&&(r.add(o.triggerSelector),t.push(o)),n=g(n)}if(t.length===0)return;let i=t.reverse();return{steps:i,location:i.map(o=>o.label)}}function j(e){let t=e?.[0]?.revealRecipe;if(t?.steps.length)return t;let r=m(e?.[0]?.selector);return r?N(r):void 0}function V(e){let t=j(e)?.location.filter(Boolean);return t?.length?`Inside: ${t.join(" \u203A ")}`:null}function C(e){if(!e?.isConnected)return!1;let t=e.getBoundingClientRect();if(t.width<=0||t.height<=0||e.getClientRects().length===0)return!1;let r=e;for(;r;){let n=window.getComputedStyle(r);if(n.display==="none"||n.visibility==="hidden"||n.visibility==="collapse"||Number.parseFloat(n.opacity||"1")<=0)return!1;r=r.parentElement}return!0}function X(e,t,r){return t.getAttribute("aria-expanded")==="true"||t.getAttribute("data-state")==="open"?!0:r instanceof HTMLDetailsElement?r.open:C(r)}function E(e,t=M){return e?new Promise(r=>{let n=performance.now(),i=()=>{let o=m(e);if(C(o)){r(o);return}if(performance.now()-n>=t){r(null);return}requestAnimationFrame(i)};i()}):Promise.resolve(null)}function Z(e,t){return m(e)??m(t?.[0]?.selector)}async function z(e,t){let r=Z(e,t);if(C(r))return r;let n=j(t)??(r?N(r):void 0);if(!n)return null;for(let o of n.steps){let l=m(o.triggerSelector);if(!(l instanceof HTMLElement))return null;let a=m(o.targetSelector);if(!X(o,l,a)&&(l.click(),!await E(o.targetSelector)))return null}let i=e&&m(e)?e:t?.[0]?.selector;return E(i)}function _(e){let t=Object.keys(e).find(o=>o.startsWith("__reactFiber$")||o.startsWith("__reactInternalInstance$"));if(!t)return null;let r=e[t],n=[],i=r?._debugSource;for(;r;){let o=r.type,l=o?.displayName||o?.name;l&&typeof l=="string"&&/^[A-Z]/.test(l)&&!l.startsWith("_")&&l!=="Fragment"&&n.unshift(l),r=r.return}return n.length>0?{name:n[n.length-1],path:n,...i?.fileName&&Number.isFinite(i.lineNumber)?{source:i}:{}}:null}function K(e){let t=Object.keys(e).find(i=>i.startsWith("__reactFiber$")||i.startsWith("__reactInternalInstance$"));if(!t)return[];let r=e[t],n=[];for(;r;){let i=r.type,o=typeof i=="function"||typeof i=="object"?i?.displayName||i?.name:null;o&&typeof o=="string"&&/^[A-Z]/.test(o)&&!o.startsWith("_")&&o!=="Fragment"&&n.push({name:o,fiber:r}),r=r.return}return n.reverse(),n}function Y(e){let t=e,r=new Set;for(;t&&!r.has(t);){if(r.add(t),t.stateNode instanceof Element)return t.stateNode;t.child?t=t.child:t=null}return null}function G(e){let t={targetFingerprint:T(e),selector:v(e),tagName:e.tagName.toLowerCase()},r=[],n=e.ownerDocument,i=f(n);for(;i;)r.unshift({url:n.URL,title:n.title,label:i.title||i.getAttribute("aria-label")||i.id||void 0}),n=i.ownerDocument,i=f(n);r.length&&(t.frameContext=r),e.id&&(t.id=e.id),e.classList.length>0&&(t.className=Array.from(e.classList).join(" "));let o=J(e)||e.matches('button, a, [role="button"], [role="tab"]')&&(e.getAttribute("aria-label")||e.getAttribute("title")||e.textContent?.trim())||"";o&&o.length>0&&o.length<200&&(t.textContent=o);let l={};for(let s of e.attributes)s.name.startsWith("data-")&&(l[s.name]=s.value);Object.keys(l).length>0&&(t.dataAttributes=l);let a=_(e);a&&(t.reactComponent=a.name,t.reactComponentPath=a.path,a.source&&(t.reactSource=a.source));let u=ie(e);u&&(t.context=u);let c=N(e);return c&&(t.revealRecipe=c),t}function J(e){let t="";for(let r of e.childNodes)r.nodeType===Node.TEXT_NODE&&(t+=r.textContent||"");return t.trim()}function Q(e,t,r){let n=A(e,t,r),i=n.findIndex(o=>o.tagName.toLowerCase()==="canvas");return(i<0?n[0]:n.slice(0,i+1).find(o=>h(o,e,t)))??null}function ee(e,t,r){if(typeof document.elementsFromPoint!="function")return!0;for(let n of A(t,r)){if(n===e||e.contains(n))return h(n,t,r);if(h(n,t,r))return!1}return!1}var te="[data-popmelt-canvas-block]";function k(e,t){let r=$(e,t).find(n=>n.id!=="devtools-canvas"&&n.id!=="devtools-scrim");return!!(r&&b(r,te))}function re(e){return e.namespaceURI==="http://www.w3.org/2000/svg"?e.closest("svg")??e:e}function A(e,t,r){if(k(e,t))return[];let n=new Set,i=$(e,t,document,l=>!b(l,"[data-devtools], [data-popmelt-root], [data-popmelt-shadow-host], [data-popmelt-canvas-block]")&&h(l,e,t,!1)),o=i.map(re).filter(l=>n.has(l)||(n.add(l),l.id==="devtools-canvas"||l.id==="devtools-toolbar"||l.id==="devtools-scrim")||b(l,"#devtools-toolbar")||l.hasAttribute("data-devtools")||b(l,"[data-devtools]")?!1:l!==l.ownerDocument.body&&l!==l.ownerDocument.documentElement);return o.length>0?o:r?.allowBodyFallback&&i.includes(document.body)?[document.body]:[]}function ne(e,t,r){for(let n of e.childNodes){if(n.nodeType!==Node.TEXT_NODE||!n.textContent?.trim())continue;let i=e.ownerDocument.createRange();i.selectNodeContents(n);let o=i.getClientRects?.();if(o&&Array.from(o).some(l=>{let a=B(t,r,e.ownerDocument);return a.x>=l.left&&a.x<=l.right&&a.y>=l.top&&a.y<=l.bottom}))return!0}return!1}function h(e,t,r,n=!0){let i=e.ownerDocument.defaultView;if(!i)return!1;let o=i.getComputedStyle(e);if(o.visibility==="hidden"||o.visibility==="collapse")return!1;for(let s=e;s;s=g(s))if(s.ownerDocument.defaultView?.getComputedStyle(s).opacity==="0")return!1;if(ne(e,t,r)||e.namespaceURI==="http://www.w3.org/2000/svg"&&(n||e.localName!=="svg")||["button","canvas","embed","iframe","img","input","object","select","textarea","video"].includes(e.tagName.toLowerCase())||o.backgroundImage&&o.backgroundImage!=="none")return!0;let l=o.backgroundColor.trim();if(l&&l!=="transparent"&&!/rgba?\([^)]*,\s*0(?:\.0+)?\s*\)$/.test(l))return!0;let a=I(e),u={top:Number.parseFloat(o.borderTopWidth)||0,right:Number.parseFloat(o.borderRightWidth)||0,bottom:Number.parseFloat(o.borderBottomWidth)||0,left:Number.parseFloat(o.borderLeftWidth)||0},c=s=>{let D=o[`border${s}Color`];return o[`border${s}Style`]!=="none"&&D!=="transparent"&&!/rgba?\([^)]*,\s*0(?:\.0+)?\s*\)$/.test(D)};return u.top>0&&c("Top")&&r<=a.top+u.top||u.right>0&&c("Right")&&t>=a.right-u.right||u.bottom>0&&c("Bottom")&&r>=a.bottom-u.bottom||u.left>0&&c("Left")&&t<=a.left+u.left}function oe(e,t,r){let n=A(e,t,r);return n.find(i=>h(i,e,t))??n.at(-1)??null}function ie(e){let t=g(e),r=["section","article","nav","aside","header","footer","main"];for(;t&&t!==e.ownerDocument.body;){let n=t.tagName.toLowerCase();if(r.includes(n)&&t.id)return f(t.ownerDocument)?v(t):`${n}#${t.id}`;if(t.id&&!t.id.startsWith("radix-")&&!t.id.startsWith(":"))return f(t.ownerDocument)?v(t):`${n}#${t.id}`;t=g(t)}return null}export{d as a,x as b,U as c,V as d,z as e,_ as f,K as g,Y as h,G as i,Q as j,ee as k,k as l,oe as m};
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{c as a}from"./chunk-XOGBFVWI.mjs";var b={isAnnotating:!1,activeTool:"inspector",activeColor:"oklch(0.628 0.258 29)",strokeWidth:3,annotations:[],undoStack:[],redoStack:[],selectedAnnotationIds:[],lastSelectedId:null,styleModifications:[],textModifications:[],domModifications:[],spacingTokenChanges:[],spacingTokenMods:[]};function c(t){return!!(t&&(t.namespaceURI==="http://www.w3.org/1999/xhtml"||t.namespaceURI==="http://www.w3.org/2000/svg"))}var f=new WeakMap,u=new WeakMap;function S(t,e){if(c(e))for(let[o,r]of u.get(t)??[])r.value?e.style.setProperty(o,r.value,r.priority):e.style.removeProperty(o)}function v(t,e){f.set(t,new Set(e))}function x(t){f.delete(t)}function d(t,e){return c(t)&&(f.get(t)?.has(e)??!1)}function p(t){let e=t.sticker;return e?e.family==="padding"||e.family==="margin"?e.subproperty==="all"?10:e.subproperty==="x"||e.subproperty==="y"?20:30:e.family==="radius"||e.family==="border"?e.subproperty==="all"?10:20:10:0}function P(t){return t.changes.map((e,o)=>({change:e,index:o})).sort((e,o)=>p(e.change)-p(o.change)||e.index-o.index).map(({change:e})=>e)}function m(t,e,o){if(c(t)){let r=u.get(t);r||(r=new Map,u.set(t,r)),r.has(e)||r.set(e,{value:t.style.getPropertyValue(e),priority:t.style.getPropertyPriority(e)}),t.style.setProperty(e,o,"important")}}function w(t,e,o,r=!1){if(c(t)){let n=r?u.get(t)?.get(e):void 0;n?.value?t.style.setProperty(e,n.value,n.priority):t.style.removeProperty(e),u.get(t)?.delete(e)}}function g(t){let e=a(t.selector);if(!e&&t.durableSelector&&(e=a(t.durableSelector),e)){let o=t.selector.match(/\[data-pm="([^"]+)"\]/)?.[1];o&&e.setAttribute("data-pm",o)}return e}function k(t){for(let e of t){let o=g(e);if(o)for(let r of P(e))d(o,r.property)||m(o,r.property,r.modified)}}function A(t,e=!1){for(let o of t){let r=a(o.selector);if(r)for(let n of o.changes)d(r,n.property)||w(r,n.property,n.original,e)}}function y(t){let e=a(t.selector);if(!e&&t.durableSelector&&(e=a(t.durableSelector),e)){let o=t.selector.match(/\[data-pm="([^"]+)"\]/)?.[1];o&&e.setAttribute("data-pm",o)}return e}function h(t,e){let o=t;for(let r of e)o=o?.childNodes[r]??null;return o?.nodeType===Node.TEXT_NODE?o:null}function M(t){for(let e of t){if(e.captured)continue;let o=y(e);if(!o)continue;let r=h(o,e.textNodePath);r&&r.nodeValue===e.original&&r.nodeValue!==e.modified&&(r.nodeValue=e.modified)}}function V(t){for(let e of t){if(e.captured)continue;let o=y(e);if(!o)continue;let r=h(o,e.textNodePath);r&&r.nodeValue===e.modified&&r.nodeValue!==e.original&&(r.nodeValue=e.original)}}function l(t,e){if(!t)return null;let o=a(t);if(!o&&e&&(o=a(e),o)){let r=t.match(/\[data-pm="([^"]+)"\]/)?.[1];r&&o.setAttribute("data-pm",r)}return o}function I(t){t.removeAttribute("data-pm"),t.querySelectorAll("[data-pm]").forEach(e=>e.removeAttribute("data-pm"))}function N(t,e){let o=e.match(/\[data-pm="([^"]+)"\]/)?.[1];o&&t.setAttribute("data-pm",o)}function s(t,e,o){let r=Array.from(t.children).filter(i=>i!==e),n=Math.max(0,Math.min(o,r.length));t.insertBefore(e,r[n]??null)}function T(t){for(let e of t){let o=l(e.targetParentSelector,e.targetParentDurableSelector);if(!o)continue;if(e.operation==="move"){let i=l(e.selector,e.durableSelector);if(!i||i===o||i.contains(o))continue;s(o,i,e.targetIndex);continue}if(l(e.selector,e.durableSelector))continue;let r=l(e.sourceSelector,e.sourceDurableSelector);if(!r)continue;let n=r.cloneNode(!0);n instanceof Element&&(I(n),N(n,e.selector),s(o,n,e.targetIndex))}}function D(t){for(let e of[...t].reverse()){if(e.operation==="copy"){l(e.selector,e.durableSelector)?.remove();continue}let o=l(e.selector,e.durableSelector),r=l(e.originalParentSelector,e.originalParentDurableSelector);!o||!r||o===r||o.contains(r)||s(r,o,e.originalIndex??r.children.length)}}export{b as a,c as b,S as c,v as d,x as e,m as f,g,k as h,A as i,M as j,V as k,T as l,D as m};
2
+ import{c as a}from"./chunk-EXDOFFFJ.mjs";var b={isAnnotating:!1,activeTool:"inspector",activeColor:"oklch(0.628 0.258 29)",strokeWidth:3,annotations:[],undoStack:[],redoStack:[],selectedAnnotationIds:[],lastSelectedId:null,styleModifications:[],textModifications:[],domModifications:[],spacingTokenChanges:[],spacingTokenMods:[]};function c(t){return!!(t&&(t.namespaceURI==="http://www.w3.org/1999/xhtml"||t.namespaceURI==="http://www.w3.org/2000/svg"))}var f=new WeakMap,u=new WeakMap;function S(t,e){if(c(e))for(let[o,r]of u.get(t)??[])r.value?e.style.setProperty(o,r.value,r.priority):e.style.removeProperty(o)}function v(t,e){f.set(t,new Set(e))}function x(t){f.delete(t)}function d(t,e){return c(t)&&(f.get(t)?.has(e)??!1)}function p(t){let e=t.sticker;return e?e.family==="padding"||e.family==="margin"?e.subproperty==="all"?10:e.subproperty==="x"||e.subproperty==="y"?20:30:e.family==="radius"||e.family==="border"?e.subproperty==="all"?10:20:10:0}function P(t){return t.changes.map((e,o)=>({change:e,index:o})).sort((e,o)=>p(e.change)-p(o.change)||e.index-o.index).map(({change:e})=>e)}function m(t,e,o){if(c(t)){let r=u.get(t);r||(r=new Map,u.set(t,r)),r.has(e)||r.set(e,{value:t.style.getPropertyValue(e),priority:t.style.getPropertyPriority(e)}),t.style.setProperty(e,o,"important")}}function w(t,e,o,r=!1){if(c(t)){let n=r?u.get(t)?.get(e):void 0;n?.value?t.style.setProperty(e,n.value,n.priority):t.style.removeProperty(e),u.get(t)?.delete(e)}}function g(t){let e=a(t.selector);if(!e&&t.durableSelector&&(e=a(t.durableSelector),e)){let o=t.selector.match(/\[data-pm="([^"]+)"\]/)?.[1];o&&e.setAttribute("data-pm",o)}return e}function k(t){for(let e of t){let o=g(e);if(o)for(let r of P(e))d(o,r.property)||m(o,r.property,r.modified)}}function A(t,e=!1){for(let o of t){let r=a(o.selector);if(r)for(let n of o.changes)d(r,n.property)||w(r,n.property,n.original,e)}}function y(t){let e=a(t.selector);if(!e&&t.durableSelector&&(e=a(t.durableSelector),e)){let o=t.selector.match(/\[data-pm="([^"]+)"\]/)?.[1];o&&e.setAttribute("data-pm",o)}return e}function h(t,e){let o=t;for(let r of e)o=o?.childNodes[r]??null;return o?.nodeType===Node.TEXT_NODE?o:null}function M(t){for(let e of t){if(e.captured)continue;let o=y(e);if(!o)continue;let r=h(o,e.textNodePath);r&&r.nodeValue===e.original&&r.nodeValue!==e.modified&&(r.nodeValue=e.modified)}}function V(t){for(let e of t){if(e.captured)continue;let o=y(e);if(!o)continue;let r=h(o,e.textNodePath);r&&r.nodeValue===e.modified&&r.nodeValue!==e.original&&(r.nodeValue=e.original)}}function l(t,e){if(!t)return null;let o=a(t);if(!o&&e&&(o=a(e),o)){let r=t.match(/\[data-pm="([^"]+)"\]/)?.[1];r&&o.setAttribute("data-pm",r)}return o}function I(t){t.removeAttribute("data-pm"),t.querySelectorAll("[data-pm]").forEach(e=>e.removeAttribute("data-pm"))}function N(t,e){let o=e.match(/\[data-pm="([^"]+)"\]/)?.[1];o&&t.setAttribute("data-pm",o)}function s(t,e,o){let r=Array.from(t.children).filter(i=>i!==e),n=Math.max(0,Math.min(o,r.length));t.insertBefore(e,r[n]??null)}function T(t){for(let e of t){let o=l(e.targetParentSelector,e.targetParentDurableSelector);if(!o)continue;if(e.operation==="move"){let i=l(e.selector,e.durableSelector);if(!i||i===o||i.contains(o))continue;s(o,i,e.targetIndex);continue}if(l(e.selector,e.durableSelector))continue;let r=l(e.sourceSelector,e.sourceDurableSelector);if(!r)continue;let n=r.cloneNode(!0);n instanceof Element&&(I(n),N(n,e.selector),s(o,n,e.targetIndex))}}function D(t){for(let e of[...t].reverse()){if(e.operation==="copy"){l(e.selector,e.durableSelector)?.remove();continue}let o=l(e.selector,e.durableSelector),r=l(e.originalParentSelector,e.originalParentDurableSelector);!o||!r||o===r||o.contains(r)||s(r,o,e.originalIndex??r.children.length)}}export{b as a,c as b,S as c,v as d,x as e,m as f,g,k as h,A as i,M as j,V as k,T as l,D as m};