@enbox/browser 0.3.71 → 0.3.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/browser.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export*from"@enbox/api";export*from"@enbox/auth/browser";import{CONNECT_DENIED_TOKEN as Mo,ConnectProvider as So}from"@enbox/connect";import{DidDht as un,DidResolverCacheMemory as yt,DidWeb as fn,resolveDwnEndpointStatus as mn,UniversalResolver as Et}from"@enbox/dids";function ne(t){let e=t.indexOf("://dweb/");if(e===-1)return null;let n=t.slice(0,e);if(n!=="http"&&n!=="https")return null;let r=t.slice(e+8);if(r.length===0)return null;let o=r.indexOf("/");return o===-1?[r,""]:o===0?null:[r.slice(0,o),r.slice(o+1)]}var qe=new Et({didResolvers:[un,fn],cache:new yt}),xt=/^http:/,_e=/\/$/,_t="drl";async function Ct(t){let e=await mn(t,qe);return e.status==="ready"?e.endpoints:[]}async function Pt(){if(!(typeof caches>"u"))return caches.open(_t)}async function hn(t,e,n,r){let o=t.request.url.replace(xt,"https:").replace(_e,""),i=await Pt(),s=await i?.match(o);if(s){if(!navigator.onLine)return s;let a=await r?.onCacheCheck?.(t,o);if(a){let d=s.headers.get("dwn-cache-time");if(d&&Date.now()<Number(d)+(Number(a.ttl)||0))return s}}try{if(n)return await gn(t,e,o,n,i,r);{let a=await qe.resolve(e);return new Response(JSON.stringify(a),{status:200,headers:{"Content-Type":"application/json"}})}}catch(a){return a instanceof Response?a:(console.log(`Error in DID URL fetch: ${a}`),new Response("DID URL fetch error",{status:500}))}}async function gn(t,e,n,r,o,i){let s=await Ct(e);if(!s?.length)throw new Response("DWeb Node resolution failed: no valid endpoints found.",{status:530});let a;for(let d of s)try{let p=`${d.replace(_e,"")}/${e}/${r}`,b=await fetch(p,{headers:t.request.headers});if(b.ok)return await i?.onCacheCheck?.(t,n)&&o&&vn(n,p,b,o),b;console.log(`DWN endpoint error: ${b.status}`),a=new Response("DWeb Node request failed",{status:b.status})}catch(p){console.log(`DWN endpoint error: ${p}`),a=new Response("DWeb Node request failed",{status:500})}return a}async function vn(t,e,n,r){try{let o=n.clone(),i=new Headers(o.headers);i.append("dwn-cache-time",Date.now().toString()),i.append("dwn-composed-url",e);let s=new Response(o.body,{headers:i});await r.put(t,s)}catch(o){console.log(`Failed to cache DRL response: ${o}`)}}async function bn(t={}){try{if(typeof ServiceWorkerGlobalScope<"u"&&self instanceof ServiceWorkerGlobalScope){let e=self;e.skipWaiting(),e.addEventListener("activate",n=>{n.waitUntil(e.clients.claim())}),e.addEventListener("fetch",n=>{let r=ne(n.request.url);r&&n.respondWith(hn(n,r[0],r[1],t))})}else if(globalThis?.navigator?.serviceWorker){if(!await navigator.serviceWorker.getRegistration("/")){let n=t.path||document?.currentScript?.src||import.meta.url;n&&navigator.serviceWorker.register(n,{type:"module"}).catch(r=>{console.error("DWeb networking feature installation failed: ",r)})}}else throw new Error("DWeb networking features are not available for install in this environment")}catch(e){console.error("Error in installing networking features:",e)}}var Rt=`
1
+ export*from"@enbox/api";export*from"@enbox/auth/browser";import{CONNECT_DENIED_TOKEN as Bo,ConnectProvider as jo}from"@enbox/connect";import{DidDht as yn,DidResolverCacheMemory as Rt,DidWeb as En,resolveDwnEndpointStatus as xn,UniversalResolver as kt}from"@enbox/dids";function ae(t){let e=t.indexOf("://dweb/");if(e===-1)return null;let n=t.slice(0,e);if(n!=="http"&&n!=="https")return null;let r=t.slice(e+8);if(r.length===0)return null;let o=r.indexOf("/");return o===-1?[r,""]:o===0?null:[r.slice(0,o),r.slice(o+1)]}var je=new kt({didResolvers:[yn,En],cache:new Rt}),Tt=/^http:/,ke=/\/$/,Dt="drl";async function St(t){let e=await xn(t,je);return e.status==="ready"?e.endpoints:[]}async function Mt(){if(!(typeof caches>"u"))return caches.open(Dt)}async function Cn(t,e,n,r){let o=t.request.url.replace(Tt,"https:").replace(ke,""),i=await Mt(),s=await i?.match(o);if(s){if(!navigator.onLine)return s;let a=await r?.onCacheCheck?.(t,o);if(a){let d=s.headers.get("dwn-cache-time");if(d&&Date.now()<Number(d)+(Number(a.ttl)||0))return s}}try{if(n)return await _n(t,e,o,n,i,r);{let a=await je.resolve(e);return new Response(JSON.stringify(a),{status:200,headers:{"Content-Type":"application/json"}})}}catch(a){return a instanceof Response?a:(console.log(`Error in DID URL fetch: ${a}`),new Response("DID URL fetch error",{status:500}))}}async function _n(t,e,n,r,o,i){let s=await St(e);if(!s?.length)throw new Response("DWeb Node resolution failed: no valid endpoints found.",{status:530});let a;for(let d of s)try{let p=`${d.replace(ke,"")}/${e}/${r}`,b=await fetch(p,{headers:t.request.headers});if(b.ok)return await i?.onCacheCheck?.(t,n)&&o&&Pn(n,p,b,o),b;console.log(`DWN endpoint error: ${b.status}`),a=new Response("DWeb Node request failed",{status:b.status})}catch(p){console.log(`DWN endpoint error: ${p}`),a=new Response("DWeb Node request failed",{status:500})}return a}async function Pn(t,e,n,r){try{let o=n.clone(),i=new Headers(o.headers);i.append("dwn-cache-time",Date.now().toString()),i.append("dwn-composed-url",e);let s=new Response(o.body,{headers:i});await r.put(t,s)}catch(o){console.log(`Failed to cache DRL response: ${o}`)}}async function Rn(t={}){try{if(typeof ServiceWorkerGlobalScope<"u"&&self instanceof ServiceWorkerGlobalScope){let e=self;e.skipWaiting(),e.addEventListener("activate",n=>{n.waitUntil(e.clients.claim())}),e.addEventListener("fetch",n=>{let r=ae(n.request.url);r&&n.respondWith(Cn(n,r[0],r[1],t))})}else if(globalThis?.navigator?.serviceWorker){if(!await navigator.serviceWorker.getRegistration("/")){let n=t.path||document?.currentScript?.src||import.meta.url;n&&navigator.serviceWorker.register(n,{type:"module"}).catch(r=>{console.error("DWeb networking feature installation failed: ",r)})}}else throw new Error("DWeb networking features are not available for install in this environment")}catch(e){console.error("Error in installing networking features:",e)}}var Lt=`
2
2
  .drl-loading-overlay {
3
3
  position: fixed;
4
4
  inset: 0;
@@ -103,7 +103,7 @@ export*from"@enbox/api";export*from"@enbox/auth/browser";import{CONNECT_DENIED_T
103
103
  opacity: 0;
104
104
  }
105
105
  }
106
- `,wn=`
106
+ `,kn=`
107
107
  <!DOCTYPE html>
108
108
  <html lang='en'>
109
109
  <head>
@@ -119,7 +119,7 @@ export*from"@enbox/api";export*from"@enbox/auth/browser";import{CONNECT_DENIED_T
119
119
  font-family: Arial, sans-serif;
120
120
  text-align: center;
121
121
  }
122
- ${Rt}
122
+ ${Lt}
123
123
  </style>
124
124
  </head>
125
125
  <body>
@@ -132,8 +132,8 @@ export*from"@enbox/api";export*from"@enbox/auth/browser";import{CONNECT_DENIED_T
132
132
  </div>
133
133
  </body>
134
134
  </html>
135
- `,ye=!1,I=null,re=null;function wt(){ye||(re=document.createElement("style"),re.innerHTML=`
136
- ${Rt}
135
+ `,_e=!1,B=null,le=null;function Pt(){_e||(le=document.createElement("style"),le.innerHTML=`
136
+ ${Lt}
137
137
 
138
138
  .drl-loading-overlay {
139
139
  opacity: 0;
@@ -145,13 +145,13 @@ export*from"@enbox/api";export*from"@enbox/auth/browser";import{CONNECT_DENIED_T
145
145
  opacity: 1;
146
146
  pointer-events: all;
147
147
  }
148
- `,document.head.append(re),I=document.createElement("div"),I.classList.add("drl-loading-overlay"),I.innerHTML=`
148
+ `,document.head.append(le),B=document.createElement("div"),B.classList.add("drl-loading-overlay"),B.innerHTML=`
149
149
  <div class='drl-loading-spinner'>
150
150
  <div></div>
151
151
  Loading DRL
152
152
  </div>
153
153
  <span tabindex='0'></span>
154
- `,I.lastElementChild.addEventListener("click",Ne),document.body.prepend(I),ye=!0)}function yn(){ye&&(re?.remove(),re=null,I?.remove(),I=null,ye=!1)}function Ne(){document.documentElement.removeAttribute("drl-link-loading"),Ee=null}async function En(t,e,n){let r=null;n?(r=window.open("","_blank"),r&&r.document.write(wn)):(Ee=e,setTimeout(()=>document.documentElement.setAttribute("drl-link-loading",""),50));let o=await Ct(t);if(!o.length)throw new Error("no valid DWN endpoints found");let i=`${o[0].replace(_e,"")}/${t}/${e}`;n?r&&!r.closed&&(r.location.href=i):Ee===e&&(window.location.href=i)}var Ee=null,xe=!1,oe=null,ie=null;function xn(){xe||(oe=async t=>{let e=t.target?.closest("a");if(!e)return;let n=e.href,r=ne(n);if(!r)return;let o=r[0],i=r[1],s=e.target==="_blank";t.preventDefault();try{await En(o,i,s)}catch{throw Ee===i&&Ne(),new Error(`DID endpoint resolution failed for the DRL: ${n}`)}},ie=async t=>{let e=t.composedPath()[0];if(t.pointerType==="mouse"&&t.button===2||t.pointerType==="touch"&&t.isPrimary){if(z(),e?.src&&ne(e.src)){B=e,e.__src__=e.src;let n=e.src.replace(xt,"https:").replace(_e,""),o=await(await Pt())?.match(n);if(o){let i=o.headers.get("dwn-composed-url");i&&(e.src=i)}e.addEventListener("pointerup",z,{once:!0})}}else e===B&&z()},document.addEventListener("click",oe),document.addEventListener("pointercancel",z),document.addEventListener("pointerdown",ie),xe=!0)}function _n(){xe&&(oe&&(document.removeEventListener("click",oe),oe=null),ie&&(document.removeEventListener("pointerdown",ie),ie=null),document.removeEventListener("pointercancel",z),z(),Ne(),xe=!1)}var B=null;async function z(t){t?.type==="pointerup"&&await new Promise(e=>requestAnimationFrame(()=>e())),B&&(B.src=B.__src__,delete B.__src__,B=null)}function jr(t={}){t.didResolvers&&(qe=new Et({didResolvers:t.didResolvers,cache:new yt})),t.serviceWorker!==!1&&bn(t),typeof window<"u"&&typeof window.document<"u"&&(t.injectStyles!==!1&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",wt,{once:!0}):wt()),t.links!==!1&&xn())}function Hr(){typeof window<"u"&&typeof window.document<"u"&&(_n(),yn())}async function $r(){return typeof caches>"u"?!1:caches.delete(_t)}import{ConnectClient as cr}from"@enbox/connect";function se(t){let e=document.createElement("span");e.className="wallet-icon";let n=document.createElement("span");n.className="wallet-badge",n.textContent=t.name.charAt(0).toUpperCase(),e.appendChild(n);let r=Cn(t);if(r.length===0)return e;let o=document.createElement("img");o.className="wallet-img",o.alt="",o.width=28,o.height=28;let i=0;return o.addEventListener("error",()=>{i+=1,i<r.length?o.src=r[i]:o.remove()}),o.src=r[i],e.appendChild(o),e}function Cn(t){if(t.icon!==void 0)return[t.icon];let e;try{e=new URL(t.url).origin}catch{return[]}return[`${e}/favicon.svg`,`${e}/favicon.ico`,`${e}/favicon.png`]}import{assertX25519PublicJwk as Pn,CONNECT_DENIED_TOKEN as Rn,ConnectClient as kn}from"@enbox/connect";function Ce(){let t,e,n=new Promise((r,o)=>{t=r,e=o});return n.catch(()=>{}),{promise:n,resolve:t,reject:e}}var Ie="/dweb-connect",ae="enbox-connect-loaded",le="enbox-connect-request",G="enbox-connect-response",ce="enbox-connect-ack";function Pe(t,e,n){if(t.origin!==e||t.source!==n)return;let r=t.data;if(!(typeof r!="object"||r===null))return r}var Tn=3e5,Mn=500,Sn=1500,Dn="enbox-dweb-connect",kt=500,Tt=700;function Ln(){let t=`width=${kt},height=${Tt},menubar=no,toolbar=no,location=no,status=no`,e=window.outerWidth>0?window.outerWidth:window.screen?.availWidth??0,n=window.outerHeight>0?window.outerHeight:window.screen?.availHeight??0;if(e===0||n===0)return t;let r=Math.max(0,Math.round((window.screenX??0)+(e-kt)/2)),o=Math.max(0,Math.round((window.screenY??0)+(n-Tt)/2));return`${t},left=${r},top=${o}`}function An(){if(typeof window>"u")throw new TypeError("[@enbox/browser] DWeb Connect is only available in browser environments.")}var j=class extends Error{constructor(){super("[@enbox/browser] Wallet popup was closed before the wallet finished loading."),this.name="PopupWindowClosedError"}},Y=class{constructor(e){this.requiresPin=!1;this._settled=!1;this._walletEpkReceived=!1;An(),this._walletOrigin=new URL(e.walletUrl).origin,this._timeoutMs=e.timeoutMs??Tn;let n=new URL(Ie,e.walletUrl).toString(),r=window.open(n,Dn,Ln());if(!r)throw new Error("[@enbox/browser] Popup blocked. Allow popups for this site to connect to a wallet.");this._popup=r,this._walletEpkPromise=new Promise((i,s)=>{this._resolveWalletEpk=i,this._rejectWalletEpk=s});let o=Ce();this._responsePromise=o.promise,this._resolveResponse=o.resolve,this._rejectResponse=o.reject,this._messageListener=i=>{this.onMessage(i)},window.addEventListener("message",this._messageListener),this._timeoutId=setTimeout(()=>{this.fail(new Error("[@enbox/browser] DWeb Connect timed out waiting for wallet response."))},this._timeoutMs),this._closedPollId=setInterval(()=>{this.onClosedPoll()},Mn)}async requestProfile(e){return{encryption:{mode:"ecdh-es",walletEpk:await this._walletEpkPromise,walletOrigin:this._walletOrigin},reply:{mode:"post_message"},state:e}}async deliverRequest(e){this._popup.postMessage({type:le,jwe:e},this._walletOrigin)}async awaitResponse(){return await this._responsePromise}async confirmComplete(){this._popup.closed!==!0&&this._popup.postMessage({type:ce},this._walletOrigin)}onMessage(e){let n=Pe(e,this._walletOrigin,this._popup);if(n!==void 0){if(n.type===ae){this.onLoadedBeacon(n);return}n.type===G&&this.onResponseMessage(n)}}onLoadedBeacon(e){if(this._settled||this._walletEpkReceived)return;let n;try{Pn(e.walletEpk),n=e.walletEpk}catch{this.fail(new Error("[@enbox/browser] Wallet loaded beacon did not carry a valid X25519 public key."));return}if(e.walletOrigin!==this._walletOrigin){this.fail(new Error("[@enbox/browser] Wallet loaded beacon origin does not match the configured wallet origin."));return}this._walletEpkReceived=!0,this._resolveWalletEpk?.(n)}onResponseMessage(e){if(!this._settled){if(typeof e.payload!="string"){this.fail(new Error("[@enbox/browser] Wallet response message did not carry a ciphertext payload."));return}this._settled=!0,this.cleanup(),this._rejectWalletEpk?.(new Error("[@enbox/browser] Wallet responded before the handshake was established.")),this._resolveResponse(e.payload)}}onClosedPoll(){if(!(this._settled||this._popup.closed!==!0)){if(!this._walletEpkReceived){this.fail(new j);return}clearInterval(this._closedPollId),setTimeout(()=>{this._settled||(this._settled=!0,this.cleanup(),this._resolveResponse(Rn))},Sn)}}fail(e){if(!this._settled){this._settled=!0,this.cleanup();try{this._popup.close()}catch{}this._rejectWalletEpk?.(e),this._rejectResponse(e)}}cleanup(){clearTimeout(this._timeoutId),clearInterval(this._closedPollId),this._messageListener!==void 0&&(window.removeEventListener("message",this._messageListener),this._messageListener=void 0)}};function Re(){let t=Intl.DateTimeFormat().resolvedOptions(),e=Array.isArray(globalThis.navigator.languages)?globalThis.navigator.languages.filter(n=>typeof n=="string"&&n.length>0):void 0;return{origin:globalThis.location.origin,userAgent:globalThis.navigator.userAgent,platform:globalThis.navigator.platform,language:globalThis.navigator.language,...e&&e.length>0?{languages:e}:{},...t.timeZone?{timezone:t.timeZone}:{}}}async function Un(t){let e=new Y({walletUrl:t.walletUrl,timeoutMs:t.timeout}),n=new kn({transport:e});try{return await n.connect({appName:t.appName??globalThis.location.host,appIcon:t.appIcon,clientMetadata:Re(),permissionRequests:t.permissionRequests})}catch(r){if(r instanceof j)return;throw r}}var St=[-1,10,16,26,18,24,16,18,22,22,26],Dt=[-1,1,1,1,2,2,4,4,4,5,5],Lt=[-1,26,44,70,100,134,172,196,242,292,346],Wn=0,At=10;function Ut(t){return Lt[t]-St[t]*Dt[t]}function Ke(t,e){let n=new TextEncoder().encode(t),r=On(n.length);if(r===0)throw new Error(`[@enbox/browser] QR payload too long (${n.length} bytes exceeds version ${At}-M capacity).`);let o=qn(n,r),i=In(o,r),s=17+4*r,a=Array.from({length:s},()=>new Array(s).fill(!1)),d=Array.from({length:s},()=>new Array(s).fill(!1));$n(a,d,r),zn(a,d,i);let p=e??-1;return p===-1&&(p=Nn(a,d)),$e(a,d,p),Fe(a,d,p),{size:s,modules:a,version:r,mask:p}}function On(t){for(let e=1;e<=At;e++){let n=Ut(e)*8;if(4+(e<=9?8:16)+t*8<=n)return e}return 0}function qn(t,e){let n=[],r=(d,p)=>{for(let b=p-1;b>=0;b--)n.push(d>>>b&1)};r(4,4),r(t.length,e<=9?8:16);for(let d of t)r(d,8);let o=Ut(e)*8;r(0,Math.min(4,o-n.length)),r(0,(8-n.length%8)%8);let i=[236,17],s=0;for(;n.length<o;)r(i[s],8),s^=1;let a=new Uint8Array(o/8);for(let d=0;d<n.length;d++)a[d>>3]|=n[d]<<7-(d&7);return a}function Nn(t,e){let n=0,r=1/0;for(let o=0;o<8;o++){$e(t,e,o),Fe(t,e,o);let i=Zn(t);i<r&&(r=i,n=o),$e(t,e,o)}return n}function In(t,e){let n=Dt[e],r=St[e],o=Lt[e],i=n-o%n,s=Math.floor(o/n),a=[],d=[],p=Bn(r),b=0;for(let E=0;E<n;E++){let y=s-r+(E<i?0:1),x=t.slice(b,b+y);b+=y,a.push(x),d.push(jn(x,p))}let f=new Uint8Array(o),C=0,H=s-r+1;for(let E=0;E<H;E++)for(let y=0;y<n;y++)E<a[y].length&&(f[C++]=a[y][E]);for(let E=0;E<r;E++)for(let y=0;y<n;y++)f[C++]=d[y][E];return f}function He(t,e){let n=0;for(let r=7;r>=0;r--)n=n<<1^(n>>>7)*285,n^=(e>>>r&1)*t;return n&255}function Bn(t){let e=new Uint8Array(t);e[t-1]=1;let n=1;for(let r=0;r<t;r++){for(let o=0;o<t;o++)e[o]=He(e[o],n),o+1<t&&(e[o]^=e[o+1]);n=He(n,2)}return e}function jn(t,e){let n=new Uint8Array(e.length);for(let r of t){let o=r^n[0];n.copyWithin(0,1),n[n.length-1]=0;for(let i=0;i<e.length;i++)n[i]^=He(e[i],o)}return n}var Hn=[[],[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50]];function _(t,e,n,r,o){t[r][n]=o,e[r][n]=!0}function $n(t,e,n){let r=t.length;for(let i=0;i<r;i++)_(t,e,6,i,i%2===0),_(t,e,i,6,i%2===0);Be(t,e,3,3),Be(t,e,r-4,3),Be(t,e,3,r-4);let o=Hn[n];for(let i=0;i<o.length;i++)for(let s=0;s<o.length;s++)i===0&&s===0||i===0&&s===o.length-1||i===o.length-1&&s===0||Kn(t,e,o[i],o[s]);Fe(t,e,0),_(t,e,8,r-8,!0),n>=7&&Fn(t,e,n)}function Be(t,e,n,r){let o=t.length;for(let i=-4;i<=4;i++)for(let s=-4;s<=4;s++){let a=n+s,d=r+i;if(a<0||a>=o||d<0||d>=o)continue;let p=Math.max(Math.abs(s),Math.abs(i));_(t,e,a,d,p!==2&&p!==4)}}function Kn(t,e,n,r){for(let o=-2;o<=2;o++)for(let i=-2;i<=2;i++)_(t,e,n+i,r+o,Math.max(Math.abs(i),Math.abs(o))!==1)}function Fe(t,e,n){let r=t.length,o=Wn<<3|n,i=o;for(let a=0;a<10;a++)i=i<<1^(i>>>9)*1335;let s=(o<<10|i)^21522;for(let a=0;a<=5;a++)_(t,e,8,a,(s>>>a&1)!==0);_(t,e,8,7,(s>>>6&1)!==0),_(t,e,8,8,(s>>>7&1)!==0),_(t,e,7,8,(s>>>8&1)!==0);for(let a=9;a<15;a++)_(t,e,14-a,8,(s>>>a&1)!==0);for(let a=0;a<8;a++)_(t,e,r-1-a,8,(s>>>a&1)!==0);for(let a=8;a<15;a++)_(t,e,8,r-15+a,(s>>>a&1)!==0)}function Fn(t,e,n){let r=t.length,o=n;for(let s=0;s<12;s++)o=o<<1^(o>>>11)*7973;let i=n<<12|o;for(let s=0;s<18;s++){let a=(i>>>s&1)!==0,d=r-11+s%3,p=Math.floor(s/3);_(t,e,d,p,a),_(t,e,p,d,a)}}function zn(t,e,n){let r=t.length,o=0;for(let i=r-1;i>=1;i-=2){let s=i<=6?i-1:i;o=Gn(t,e,n,s,r,o)}}function Gn(t,e,n,r,o,i){for(let s=0;s<o;s++)for(let a=0;a<2;a++){let{x:d,y:p}=Yn(r,s,a,o);!e[p][d]&&i<n.length*8&&(t[p][d]=(n[i>>3]>>>7-(i&7)&1)!==0,i++)}return i}function Yn(t,e,n,r){let o=t-n,s=(t+1&2)===0?r-1-e:e;return{x:o,y:s}}function $e(t,e,n){let r=t.length;for(let o=0;o<r;o++)for(let i=0;i<r;i++){if(e[o][i])continue;let s;switch(n){case 0:s=(i+o)%2===0;break;case 1:s=o%2===0;break;case 2:s=i%3===0;break;case 3:s=(i+o)%3===0;break;case 4:s=(Math.floor(i/3)+Math.floor(o/2))%2===0;break;case 5:s=i*o%2+i*o%3===0;break;case 6:s=(i*o%2+i*o%3)%2===0;break;default:s=((i+o)%2+i*o%3)%2===0;break}s&&(t[o][i]=!t[o][i])}}function Qn(t,e){let n=0;for(let r=0;r<e;r++){let o=!1,i=0;for(let s=0;s<e;s++)s===0||t[r][s]!==o?(o=t[r][s],i=1):(i++,i===5?n+=3:i>5&&(n+=1))}for(let r=0;r<e;r++){let o=!1,i=0;for(let s=0;s<e;s++)s===0||t[s][r]!==o?(o=t[s][r],i=1):(i++,i===5?n+=3:i>5&&(n+=1))}return n}function Jn(t,e){let n=0;for(let r=0;r<e-1;r++)for(let o=0;o<e-1;o++){let i=t[r][o];i===t[r][o+1]&&i===t[r+1][o]&&i===t[r+1][o+1]&&(n+=3)}return n}function Mt(t,e){if(![!0,!1,!0,!0,!0,!1,!0].every((s,a)=>t[e+a]===s))return 0;let o=e>=4&&t.slice(e-4,e).every(s=>!s),i=e+11<=t.length&&t.slice(e+7,e+11).every(s=>!s);return(o?40:0)+(i?40:0)}function Xn(t,e){let n=0;for(let r=0;r<e;r++){let o=t[r],i=t.map(s=>s[r]);for(let s=0;s+7<=e;s++)n+=Mt(o,s),n+=Mt(i,s)}return n}function Vn(t,e){let n=0;for(let i of t)for(let s of i)s&&n++;let r=e*e;return(Math.ceil(Math.abs(n*20-r*10)/r)-1)*10}function Zn(t){let e=t.length,n=0;return n+=Qn(t,e),n+=Jn(t,e),n+=Xn(t,e),n+=Vn(t,e),n}var je="http://www.w3.org/2000/svg";function ze(t,e={}){let n=e.dark??"#000000",r=e.light??"#ffffff",o=e.quietZone??2,i=t.size+o*2,s="";for(let b=0;b<t.size;b++)for(let f=0;f<t.size;f++)t.modules[b][f]&&(s+=`M${f+o} ${b+o}h1v1h-1z`);let a=document.createElementNS(je,"svg");a.setAttribute("viewBox",`0 0 ${i} ${i}`),a.setAttribute("shape-rendering","crispEdges"),a.setAttribute("role","img");let d=document.createElementNS(je,"rect");d.setAttribute("width",String(i)),d.setAttribute("height",String(i)),d.setAttribute("fill",r),a.appendChild(d);let p=document.createElementNS(je,"path");return p.setAttribute("d",s),p.setAttribute("fill",n),a.appendChild(p),a}var Wt="/.well-known/enbox-connect";async function ke(t){try{let e=new URL(Wt,t).toString(),n=await fetch(e,{signal:AbortSignal.timeout(6e3)});if(!n.ok)return;let r=await n.json();return typeof r?.connectServerUrl!="string"?void 0:{connectServerUrl:r.connectServerUrl}}catch{return}}async function Ge(t){return await ke(t)!==void 0}import{DidJwk as er}from"@enbox/dids";import{X25519 as tr}from"@enbox/crypto";import{CONNECT_DENIED_TOKEN as nr,openResponse as rr,randomToken as Ot,RelayClientTransport as or,resolveDelegatePortableDid as ir,sealRequest as sr}from"@enbox/connect";var Ye=6,Q=class extends Error{constructor(){super("[@enbox/browser] Relay connect cancelled."),this.name="RelayConnectCancelledError"}};function ar(t){return new Promise(e=>{if(typeof document>"u"){setTimeout(e,t);return}let n=()=>{clearTimeout(o),document.removeEventListener("visibilitychange",r),e()},r=()=>{document.visibilityState==="visible"&&n()},o=setTimeout(n,t);document.addEventListener("visibilitychange",r)})}async function Qe(t){if(t.requestType==="refresh"&&t.delegatePortableDid===void 0)throw new Error("Connect: refresh requests require an existing `delegatePortableDid`.");let e=t.createTransport??(x=>new or({...x,sleep:ar})),n=t.cancelled===void 0?void 0:new AbortController,r=e({connectServerUrl:t.connectServerUrl,walletUri:t.walletUri,timeoutMs:t.timeoutMs,pollIntervalMs:t.pollIntervalMs,onClaimed:t.onClaimed,signal:n?.signal}),o=await er.create(),i=await tr.generateKey(),s={kty:"OKP",crv:"X25519",x:i.x},a=Ot(),d=Ot(),p=await r.requestProfile(d),b={clientDid:o.uri,appName:t.appName,appIcon:t.appIcon,clientMetadata:t.clientMetadata,permissionRequests:t.permissionRequests,delegateDid:t.delegatePortableDid?.uri,requestType:t.requestType,supportedDidMethods:["did:dht","did:jwk"],nonce:a,state:d,responseKey:s,reply:p.reply},f=await sr({request:b,signer:o,encryption:p.encryption}),C=await r.deliverRequest(f);C!==void 0&&t.onWalletUriReady(C);let H=t.cancelled===void 0?r.awaitResponse():Promise.race([r.awaitResponse(),t.cancelled]),E;try{E=await H}catch(x){throw n?.abort(),x}if(E===nr)return;let y;for(let x=1;x<=Ye;x++){let pe=await(t.cancelled===void 0?t.requestPin(x,y):Promise.race([t.requestPin(x,y),t.cancelled])),L=await lr({responseCiphertext:E,responsePrivateKey:i,clientDid:o.uri,nonce:a,state:d,pin:pe,delegatePortableDid:t.delegatePortableDid,confirmComplete:r.confirmComplete?.bind(r)});if(L.matched)return L.result;y=L.error}throw new Error(`[@enbox/browser] The pairing code did not match after ${Ye} attempts.`)}async function lr(t){try{let e=await rr({jwe:t.responseCiphertext,recipientPrivateKey:t.responsePrivateKey,expected:{clientDid:t.clientDid,nonce:t.nonce,state:t.state},pin:t.pin}),n=ir({localDelegatePortableDid:t.delegatePortableDid,response:e});return t.confirmComplete?.().catch(()=>{}),{matched:!0,result:{delegatePortableDid:n,delegateGrants:e.delegateGrants,connectedDid:e.providerDid,sessionRevocations:e.sessionRevocations}}}catch(e){let n=e instanceof Error?e:new Error(String(e));if(n.message.startsWith("Connect:"))throw n;return{matched:!1,error:n}}}var jt="enbox:connect:lastChoice",dr=12e4,pr=1e4,Te=4,ur=4,qt=3,Je={background:"--ec-bg",surface:"--ec-surface",text:"--ec-text",textMuted:"--ec-muted",border:"--ec-border",accent:"--ec-accent",accentContrast:"--ec-accent-contrast",danger:"--ec-danger",success:"--ec-success"};async function Ht(t){return(await ke(t))?.connectServerUrl}async function fr(t){let e=new Y({walletUrl:t.walletUrl,timeoutMs:t.timeoutMs});return await new cr({transport:e}).connect({appName:t.appName,appIcon:t.appIcon,clientMetadata:Re(),permissionRequests:t.permissionRequests,delegatePortableDid:t.delegatePortableDid,requestType:t.requestType})}function mr(){return typeof window>"u"?!1:(window.matchMedia?.("(pointer: coarse)").matches??!1)&&Math.min(window.innerWidth,window.innerHeight)<900}function hr(){return{runRelay:Qe,runPopup:fr,discoverConnectServerUrl:Ht,validateWalletUrl:Ge,isMobile:mr,storage:typeof localStorage>"u"?void 0:localStorage}}function gr(t){try{let e=t?.getItem(jt);if(e==null)return;let n=JSON.parse(e);if((n.method==="phone"||n.method==="browser")&&wr(n.walletUrl))return{method:n.method,walletUrl:n.walletUrl}}catch{}}function vr(t,e){try{t?.setItem(jt,JSON.stringify(e))}catch{}}function br(){let t,e={active:!0},n=new Promise((r,o)=>{t=()=>{e.active===!0&&(e.active=!1,o(new Q))}});return n.catch(()=>{}),e.cancelled=n,e.cancel=t,e}function Xe(t,e){return()=>t(e)}function Ve(t){if(typeof window>"u"||typeof document>"u")throw new Error("[@enbox/browser] The connect modal is only available in browser environments.");if(t.mode==="refresh"&&t.delegatePortableDid===void 0)throw new Error("Connect: refresh requests require an existing `delegatePortableDid`.");let e={...hr(),...t.deps},n=yr(t.wallets??[]),r=t.rememberChoice??!0,o=t.appName??window.location.host,i=t.relayWalletPath??"/connect/app",s=e.isMobile(),a=t.mode==="refresh",d=r?gr(e.storage):void 0,p=d!==void 0&&(a||Nt(n,d.walletUrl))?d.walletUrl:void 0,b=t.walletUrl!==void 0||a&&p!==void 0,f=t.walletUrl??p??n[0]?.url,C=t.preferredMethod??d?.method??"phone";return new Promise((H,E)=>{let y=document.createElement("div");y.id="enbox-connect-modal";let x=y.attachShadow({mode:"open"}),pe=document.createElement("style");pe.textContent=Pr,x.appendChild(pe);let L=document.createElement("div");L.className="overlay";let R=document.createElement("div");R.className="modal",R.setAttribute("role","dialog"),R.setAttribute("aria-modal","true");let rt=a?`Reconnect to ${o}`:`Connect to ${o}`;R.setAttribute("aria-label",rt);let A=t.theme??{},X=A.appearance??"auto";X!=="auto"&&(R.dataset.appearance=X);let Se=window.matchMedia?.("(prefers-color-scheme: dark)"),Ft=A.accent!==void 0||A.accentContrast!==void 0||A.light!==void 0||A.dark!==void 0,ot=()=>{let l=Se?.matches===!0?"dark":"light",c=X==="auto"?l:X,v={accent:A.accent,accentContrast:A.accentContrast,...A[c]};for(let u of Object.keys(Je)){let w=v[u];typeof w=="string"&&w.trim()!==""?R.style.setProperty(Je[u],w):R.style.removeProperty(Je[u])}},it=()=>ot();Ft&&(ot(),X==="auto"&&Se?.addEventListener?.("change",it));let k=!1,U,st,ue,De=!1,$,zt=()=>$,Gt=()=>{$=void 0},at=new Map,K=[],fe=l=>n.find(c=>c.url===l)??{name:Er(l)??l,url:l},Yt=()=>{if(f===void 0){K=n.slice(0,qt);return}if(K.some(c=>c.url===f))return;let l=fe(f);K=[l,...n.filter(c=>c.url!==l.url)].slice(0,qt)},me=l=>{f=l,Z(),V()},Qt=()=>{U?.cancel(),q(),document.removeEventListener("keydown",mt),document.removeEventListener("visibilitychange",ht),Se?.removeEventListener?.("change",it);try{y.remove()}catch{}},he=l=>{k||(k=!0,Qt(),l())},lt=l=>{r&&vr(e.storage,{method:C,walletUrl:f??""}),tn(),setTimeout(Xe(he,()=>H(l)),1200)},Le=()=>he(()=>E(new Error("[@enbox/browser] Connect cancelled.")));R.appendChild(xr(rt,t.appIcon,Le));let W=document.createElement("div");W.className="stage",W.setAttribute("aria-live","polite"),R.appendChild(W);let O=document.createElement("div");O.className="footer",R.appendChild(O);let P=(...l)=>{W.replaceChildren(...l),W.classList.remove("fade-in"),W.offsetWidth,W.classList.add("fade-in")},ct=l=>{P(h("div","spinner"),h("p","stage-caption",l))},Jt=l=>{let c=U;setTimeout(()=>{k||c!==U||c?.active!==!0||$!==void 0||Vt(l)},0)},dt=(l,c,v)=>{let u=document.createElement("a");return u.className=v,u.href=l.walletUri,u.target="_blank",u.rel="noopener noreferrer",u.addEventListener("click",()=>{Jt(c)}),u},Xt=l=>{let c=f!==void 0?fe(f):void 0,v=c?.name??"your wallet",u=dt(l,v,"qr-box qr-link");if(u.setAttribute("aria-label",`Open ${v} on this device`),u.replaceChildren(ze(Ke(l.walletUri),{dark:"#14141f",light:"transparent",quietZone:2})),c!==void 0){let w=h("div","qr-logo");w.appendChild(se(c)),u.appendChild(w)}if(s){let w=dt(l,v,"deep-link");c!==void 0&&w.appendChild(se(c)),w.appendChild(h("span","deep-link-label",`Continue in ${v}`)),u.classList.add("compact"),P(w,h("p","stage-subline",`${v} opens in a new tab \u2014 approve there, then come back for your code.`),h("div","stage-divider","or scan with another phone"),u);return}P(u,h("p","stage-caption","Scan with your phone\u2019s camera"),h("p","stage-subline",`${v} stays on your phone \u2014 or click the code to open it here.`))},Vt=l=>{P(h("div","spinner"),h("p","stage-caption",`Finish in ${l}`),h("p","stage-subline",s?`Approve the connection in the ${l} tab, then come back here for your code.`:"Approve the connection in the tab that just opened, then come back here for your code."),Me("Start over",()=>{Ae()}))},Zt=()=>{let l=f!==void 0?fe(f).name:"your wallet",c=document.createElement("div");c.className="claimed-pulse",P(c,h("p","stage-caption",`Request received \u2014 approve in ${l}`),h("p","stage-subline","Once you approve, you\u2019ll get a code to enter here."))},en=(l,c)=>new Promise(v=>{$=v;let u=f!==void 0?fe(f).name:"your wallet",w=document.createElement("div");w.className="pin-row",c!==void 0&&w.classList.add("shake");let F=_r(w,zt,Gt,ct);P(h("p","stage-caption",`Enter the code shown in ${u}`),w,...c!==void 0?[h("p","stage-error",`That code doesn\u2019t match \u2014 check ${u}.`)]:[h("p","stage-subline",l===1?"This confirms you\u2019re the one approving.":"")]),F[0].focus()}),tn=()=>{let l=h("div","check");l.textContent="\u2713",P(l,h("p","stage-caption","You\u2019re connected."))},pt=()=>{P(h("p","stage-caption","No problem \u2014 nothing was shared."),de("Start over",()=>{V()}),Me("Close",Xe(he,()=>H(void 0))))},ge=(l,c)=>{P(h("p","stage-caption",l),de("Start over",()=>{V()}),Me("Close",Xe(he,()=>E(c??new Error(`[@enbox/browser] ${l}`)))))},nn=()=>{P(h("p","stage-caption","This wallet can\u2019t connect by phone here."),h("p","stage-subline","You can continue in this browser instead."),de("Use this browser",()=>{be()}))},ve=s?"tab":"window",rn=()=>{P(h("p","stage-caption","Connect with a wallet in this browser"),h("p","stage-subline",s?"Your wallet opens in a new tab to approve this connection \u2014 no code needed.":"Your wallet opens in a small window to approve this connection."),de(s?"Open wallet":"Open wallet window",()=>{be()}))},on=()=>{P(h("div","spinner"),h("p","stage-caption",`Finish in the wallet ${ve}`),h("p","stage-subline","We\u2019ll wrap up here as soon as you\u2019re done."))},sn=l=>{P(h("p","stage-caption",l?`Your browser blocked the wallet ${ve}.`:`The wallet ${ve} was closed.`),de(l?"Open it now":`Reopen ${ve}`,()=>{be()}),Me(s?"Use a code instead":"Use your phone instead",()=>{ft("phone")}))},an=l=>{if(k)return;let c=l instanceof Error?l:new Error(String(l)),v=/popup blocked/i.test(c.message);if(l instanceof j||v){sn(v);return}ge(/timed out/i.test(c.message)?"That took too long, so we stopped for safety.":"Something went wrong while connecting.",c)},ln=async l=>{if(t.connectServerUrl!==void 0)return t.connectServerUrl;let c=at.get(l);return c===void 0&&(c=e.discoverConnectServerUrl(l),at.set(l,c)),c},q=()=>{clearTimeout(st),ue=void 0},ut=()=>{!k&&$===void 0&&C==="phone"&&Ae()},cn=l=>{q();let c=Math.max(pr,l*1e3-dr);ue=Date.now()+c,st=setTimeout(ut,c)},Ae=async()=>{if(U?.cancel(),q(),f===void 0){ge("No wallet is configured.");return}C="phone",Z(),ct("Getting things ready\u2026");let l=new URL(f).origin,c=await ln(l);if(c===void 0){nn();return}let v=br();U=v;try{let u=await e.runRelay({connectServerUrl:c,walletUri:new URL(i,l).toString(),appName:o,appIcon:t.appIcon,clientMetadata:Re(),permissionRequests:t.permissionRequests,delegatePortableDid:t.delegatePortableDid,requestType:t.mode,timeoutMs:t.timeout,cancelled:v.cancelled,onWalletUriReady:w=>{v.active&&!k&&(Xt(w),cn(w.expiresIn))},onClaimed:()=>{v.active&&!k&&(q(),Zt())},requestPin:(w,F)=>(q(),en(w,F))});if(!v.active||k)return;u===void 0?pt():lt(u)}catch(u){if(!v.active||k||u instanceof Q)return;let w=u instanceof Error?u:new Error(String(u));ge(/timed out/i.test(w.message)?"That took too long, so we stopped for safety.":"Something went wrong while connecting.",w)}},be=async()=>{if(U?.cancel(),q(),f===void 0){ge("No wallet is configured.");return}if(!De){C="browser",Z(),De=!0,on();try{let l=await e.runPopup({walletUrl:f,permissionRequests:t.permissionRequests,appName:o,appIcon:t.appIcon,timeoutMs:t.timeout,delegatePortableDid:t.delegatePortableDid,requestType:t.mode});if(k)return;l===void 0?pt():lt(l)}catch(l){an(l)}finally{De=!1}}},V=async()=>{C==="browser"?(U?.cancel(),q(),Z(),rn()):await Ae()},ft=async l=>{C=l,await V()},Z=()=>{if(O.replaceChildren(),!b){Yt();let c=dn();c.label!==void 0&&O.appendChild(c.label),O.appendChild(c.row),O.appendChild(c.panel)}let l=document.createElement("div");if(l.className="footer-row",C==="phone"){let c=document.createElement("button");c.className="footer-link method-link",c.textContent=s?"Or connect without a code \u2192":"No phone? Use this browser \u2192",c.addEventListener("click",()=>{be()}),l.appendChild(c)}else{let c=document.createElement("button");c.className="footer-link method-link",c.textContent=s?"Use a code instead \u2192":"Use your phone instead \u2192",c.addEventListener("click",()=>{ft("phone")}),l.appendChild(c)}l.childElementCount>0&&O.appendChild(l)},dn=()=>{let l=document.createElement("div");l.className="wallet-row",l.setAttribute("role","radiogroup"),l.setAttribute("aria-label","Wallet");for(let m of K){let g=document.createElement("button");g.className="row-tile",g.title=m.description??m.name,g.setAttribute("role","radio");let T=m.url===f;g.setAttribute("aria-checked",T?"true":"false"),T&&g.classList.add("selected"),g.appendChild(se(m)),g.appendChild(h("span","row-tile-name",m.name)),g.addEventListener("click",()=>{m.url!==f&&me(m.url)}),l.appendChild(g)}let c=document.createElement("div");c.className="wallet-panel",c.hidden=!0;let v=n.filter(m=>!Nt(K,m.url)),u=document.createElement("button");u.className="row-tile more-tile",u.title="All wallets",u.setAttribute("aria-expanded","false"),u.appendChild(h("span","more-count",v.length>0?`+${v.length}`:"\u22EF")),u.appendChild(h("span","row-tile-name","More")),u.addEventListener("click",()=>{c.hidden=!c.hidden,u.setAttribute("aria-expanded",c.hidden?"false":"true"),c.hidden||We()}),l.appendChild(u);let w=K.length>0?h("div","wallet-row-label","Connecting with"):void 0,F=[],ee=document.createElement("div");if(ee.className="wallet-empty",ee.textContent="No other wallets match your search.",ee.hidden=!0,v.length>ur){let m=document.createElement("input");m.type="search",m.className="wallet-search",m.placeholder="Search wallets\u2026",m.setAttribute("aria-label","Search wallets"),m.addEventListener("input",()=>{let g=m.value.trim().toLowerCase(),T=0;for(let{wallet:vt,el:pn}of F){let bt=g===""||vt.name.toLowerCase().includes(g)||vt.url.toLowerCase().includes(g);pn.hidden=!bt,bt&&(T+=1)}ee.hidden=T>0,We()}),c.appendChild(m)}let te=document.createElement("div");te.className="wallet-scroll-wrap",te.hidden=v.length===0;let M=document.createElement("div");M.className="wallet-scroll";let Ue=document.createElement("div");Ue.className="wallet-grid";let We=()=>{let m=M.scrollHeight-M.clientHeight>1,g=M.scrollTop+M.clientHeight>=M.scrollHeight-1;te.classList.toggle("scroll-hint",m&&!g)};M.addEventListener("scroll",We);for(let m of v){let g=document.createElement("button");g.className="wallet-tile",g.title=m.description??m.name,g.appendChild(se(m));let T=document.createElement("span");T.className="wallet-tile-name",T.textContent=m.name,g.appendChild(T),g.addEventListener("click",()=>{me(m.url)}),F.push({wallet:m,el:g}),Ue.appendChild(g)}M.appendChild(Ue),M.appendChild(ee),te.appendChild(M),c.appendChild(te);let we=document.createElement("div");we.className="wallet-custom";let S=document.createElement("input");S.className="url-input",S.type="url",S.placeholder="https://your-wallet.example";let D=document.createElement("button");D.className="url-go",D.textContent="Use";let N=document.createElement("div");N.className="url-error",N.hidden=!0;let Oe=!1,gt=async()=>{let m=S.value.trim();if(m==="")return;let g;try{g=new URL(m.includes("://")?m:`https://${m}`).origin}catch{S.classList.add("invalid");return}if(Oe){me(g);return}D.disabled=!0,D.textContent="Checking\u2026",N.hidden=!0;let T=await e.validateWalletUrl(g);if(D.disabled=!1,T){D.textContent="Use",me(g);return}Oe=!0,D.textContent="Use anyway",S.classList.add("invalid"),N.textContent=`Couldn't verify a wallet at ${g}.`,N.hidden=!1};return S.addEventListener("input",()=>{Oe=!1,D.textContent="Use",S.classList.remove("invalid"),N.hidden=!0}),S.addEventListener("keydown",m=>{m.key==="Enter"&&gt()}),D.addEventListener("click",()=>{gt()}),we.appendChild(S),we.appendChild(D),c.appendChild(we),c.appendChild(N),{label:w,row:l,panel:c}};L.addEventListener("click",l=>{l.target===L&&Le()});let mt=l=>{if(l.key==="Escape"){Le();return}l.key==="Tab"&&Cr(x,l)};document.addEventListener("keydown",mt);let ht=()=>{if(!(document.visibilityState!=="visible"||k)){if(ue!==void 0&&Date.now()>=ue){ut();return}$!==void 0&&Array.from(x.querySelectorAll(".pin-input")).find(c=>c.value==="")?.focus()}};document.addEventListener("visibilitychange",ht),L.appendChild(R),x.appendChild(L),document.body.appendChild(y),Z(),V()})}function Nt(t,e){return t.some(n=>n.url===e)}function wr(t){if(typeof t!="string"||t.trim()==="")return!1;try{let e=new URL(t);return e.protocol==="http:"||e.protocol==="https:"}catch{return!1}}function yr(t){return t.filter((e,n)=>t.findIndex(r=>r.url===e.url)===n)}function Er(t){if(t!==void 0)try{return new URL(t).hostname}catch{return t}}function h(t,e,n){let r=document.createElement(t);return r.className=e,n!==void 0&&(r.textContent=n),r}function de(t,e){let n=document.createElement("button");return n.className="stage-btn",n.textContent=t,n.addEventListener("click",e),n}function Me(t,e){let n=document.createElement("button");return n.className="footer-link",n.textContent=t,n.addEventListener("click",e),n}function xr(t,e,n){let r=document.createElement("div");r.className="header";let o=document.createElement("div");if(o.className="header-identity",e!==void 0){let a=document.createElement("img");a.className="header-icon",a.src=e,a.alt="",a.width=24,a.height=24,a.addEventListener("error",()=>a.remove()),o.appendChild(a)}let i=document.createElement("h2");i.textContent=t,o.appendChild(i);let s=document.createElement("button");return s.className="close-btn",s.setAttribute("aria-label","Close"),s.textContent="\xD7",s.addEventListener("click",n),r.appendChild(o),r.appendChild(s),r}function _r(t,e,n,r){let o=[];for(let s=0;s<Te;s++){let a=document.createElement("input");a.className="pin-input",a.type="text",a.inputMode="numeric",a.maxLength=1,a.setAttribute("aria-label",`Code digit ${s+1}`),o.push(a),t.appendChild(a)}let i=()=>{let s=o.map(d=>d.value).join(""),a=e();if(s.length===Te&&a!==void 0){let d=a;n(),r("Checking the code\u2026"),d(s)}};return o.forEach((s,a)=>{s.addEventListener("input",()=>{s.value=s.value.replace(/\D/g,"").slice(0,1),s.value!==""&&a+1<o.length&&o[a+1].focus(),i()}),s.addEventListener("keydown",d=>{d.key==="Backspace"&&s.value===""&&a>0&&o[a-1].focus()}),s.addEventListener("paste",d=>{let p=(d.clipboardData?.getData("text")??"").replace(/\D/g,"").slice(0,Te);p.length!==0&&(d.preventDefault(),p.split("").forEach((b,f)=>{o[f]!==void 0&&(o[f].value=b)}),o[Math.min(p.length,Te)-1]?.focus(),i())})}),o}function Cr(t,e){let n=Array.from(t.querySelectorAll('button, input, a[href], [tabindex]:not([tabindex="-1"])')).filter(s=>!s.hasAttribute("disabled")&&s.offsetParent!==null);if(n.length===0)return;let r=n[0],o=n[n.length-1],i=t.activeElement;e.shiftKey&&(i===r||i===null)?(e.preventDefault(),o.focus()):!e.shiftKey&&i===o&&(e.preventDefault(),r.focus())}var It=`
154
+ `,B.lastElementChild.addEventListener("click",He),document.body.prepend(B),_e=!0)}function Tn(){_e&&(le?.remove(),le=null,B?.remove(),B=null,_e=!1)}function He(){document.documentElement.removeAttribute("drl-link-loading"),Pe=null}async function Dn(t,e,n){let r=null;n?(r=window.open("","_blank"),r&&r.document.write(kn)):(Pe=e,setTimeout(()=>document.documentElement.setAttribute("drl-link-loading",""),50));let o=await St(t);if(!o.length)throw new Error("no valid DWN endpoints found");let i=`${o[0].replace(ke,"")}/${t}/${e}`;n?r&&!r.closed&&(r.location.href=i):Pe===e&&(window.location.href=i)}var Pe=null,Re=!1,ce=null,de=null;function Sn(){Re||(ce=async t=>{let e=t.target?.closest("a");if(!e)return;let n=e.href,r=ae(n);if(!r)return;let o=r[0],i=r[1],s=e.target==="_blank";t.preventDefault();try{await Dn(o,i,s)}catch{throw Pe===i&&He(),new Error(`DID endpoint resolution failed for the DRL: ${n}`)}},de=async t=>{let e=t.composedPath()[0];if(t.pointerType==="mouse"&&t.button===2||t.pointerType==="touch"&&t.isPrimary){if(Y(),e?.src&&ae(e.src)){j=e,e.__src__=e.src;let n=e.src.replace(Tt,"https:").replace(ke,""),o=await(await Mt())?.match(n);if(o){let i=o.headers.get("dwn-composed-url");i&&(e.src=i)}e.addEventListener("pointerup",Y,{once:!0})}}else e===j&&Y()},document.addEventListener("click",ce),document.addEventListener("pointercancel",Y),document.addEventListener("pointerdown",de),Re=!0)}function Mn(){Re&&(ce&&(document.removeEventListener("click",ce),ce=null),de&&(document.removeEventListener("pointerdown",de),de=null),document.removeEventListener("pointercancel",Y),Y(),He(),Re=!1)}var j=null;async function Y(t){t?.type==="pointerup"&&await new Promise(e=>requestAnimationFrame(()=>e())),j&&(j.src=j.__src__,delete j.__src__,j=null)}function Vr(t={}){t.didResolvers&&(je=new kt({didResolvers:t.didResolvers,cache:new Rt})),t.serviceWorker!==!1&&Rn(t),typeof window<"u"&&typeof window.document<"u"&&(t.injectStyles!==!1&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",Pt,{once:!0}):Pt()),t.links!==!1&&Sn())}function Zr(){typeof window<"u"&&typeof window.document<"u"&&(Mn(),Tn())}async function eo(){return typeof caches>"u"?!1:caches.delete(Dt)}import{ConnectClient as vr}from"@enbox/connect";function pe(t){let e=document.createElement("span");e.className="wallet-icon";let n=document.createElement("span");n.className="wallet-badge",n.textContent=t.name.charAt(0).toUpperCase(),e.appendChild(n);let r=Ln(t);if(r.length===0)return e;let o=document.createElement("img");o.className="wallet-img",o.alt="",o.width=28,o.height=28;let i=0;return o.addEventListener("error",()=>{i+=1,i<r.length?o.src=r[i]:o.remove()}),o.src=r[i],e.appendChild(o),e}function Ln(t){if(t.icon!==void 0)return[t.icon];let e;try{e=new URL(t.url).origin}catch{return[]}return[`${e}/favicon.svg`,`${e}/favicon.ico`,`${e}/favicon.png`]}import{assertX25519PublicJwk as An,CONNECT_DENIED_TOKEN as On,ConnectClient as Un}from"@enbox/connect";function Te(){let t,e,n=new Promise((r,o)=>{t=r,e=o});return n.catch(()=>{}),{promise:n,resolve:t,reject:e}}var $e="/dweb-connect",ue="enbox-connect-loaded",fe="enbox-connect-request",G="enbox-connect-response",me="enbox-connect-ack";function De(t,e,n){if(t.origin!==e||t.source!==n)return;let r=t.data;if(!(typeof r!="object"||r===null))return r}var Wn=3e5,Nn=500,qn=1500,In="enbox-dweb-connect",At=500,Ot=700;function Bn(){let t=`width=${At},height=${Ot},menubar=no,toolbar=no,location=no,status=no`,e=window.outerWidth>0?window.outerWidth:window.screen?.availWidth??0,n=window.outerHeight>0?window.outerHeight:window.screen?.availHeight??0;if(e===0||n===0)return t;let r=Math.max(0,Math.round((window.screenX??0)+(e-At)/2)),o=Math.max(0,Math.round((window.screenY??0)+(n-Ot)/2));return`${t},left=${r},top=${o}`}function jn(){if(typeof window>"u")throw new TypeError("[@enbox/browser] DWeb Connect is only available in browser environments.")}var H=class extends Error{constructor(){super("[@enbox/browser] Wallet popup was closed before the wallet finished loading."),this.name="PopupWindowClosedError"}},J=class{constructor(e){this.requiresPin=!1;this._settled=!1;this._walletEpkReceived=!1;jn(),this._walletOrigin=new URL(e.walletUrl).origin,this._timeoutMs=e.timeoutMs??Wn;let n=new URL($e,e.walletUrl).toString(),r=window.open(n,In,Bn());if(!r)throw new Error("[@enbox/browser] Popup blocked. Allow popups for this site to connect to a wallet.");this._popup=r,this._walletEpkPromise=new Promise((i,s)=>{this._resolveWalletEpk=i,this._rejectWalletEpk=s});let o=Te();this._responsePromise=o.promise,this._resolveResponse=o.resolve,this._rejectResponse=o.reject,this._messageListener=i=>{this.onMessage(i)},window.addEventListener("message",this._messageListener),this._timeoutId=setTimeout(()=>{this.fail(new Error("[@enbox/browser] DWeb Connect timed out waiting for wallet response."))},this._timeoutMs),this._closedPollId=setInterval(()=>{this.onClosedPoll()},Nn)}async requestProfile(e){return{encryption:{mode:"ecdh-es",walletEpk:await this._walletEpkPromise,walletOrigin:this._walletOrigin},reply:{mode:"post_message"},state:e}}async deliverRequest(e){this._popup.postMessage({type:fe,jwe:e},this._walletOrigin)}async awaitResponse(){return await this._responsePromise}async confirmComplete(){this._popup.closed!==!0&&this._popup.postMessage({type:me},this._walletOrigin)}onMessage(e){let n=De(e,this._walletOrigin,this._popup);if(n!==void 0){if(n.type===ue){this.onLoadedBeacon(n);return}n.type===G&&this.onResponseMessage(n)}}onLoadedBeacon(e){if(this._settled||this._walletEpkReceived)return;let n;try{An(e.walletEpk),n=e.walletEpk}catch{this.fail(new Error("[@enbox/browser] Wallet loaded beacon did not carry a valid X25519 public key."));return}if(e.walletOrigin!==this._walletOrigin){this.fail(new Error("[@enbox/browser] Wallet loaded beacon origin does not match the configured wallet origin."));return}this._walletEpkReceived=!0,this._resolveWalletEpk?.(n)}onResponseMessage(e){if(!this._settled){if(typeof e.payload!="string"){this.fail(new Error("[@enbox/browser] Wallet response message did not carry a ciphertext payload."));return}this._settled=!0,this.cleanup(),this._rejectWalletEpk?.(new Error("[@enbox/browser] Wallet responded before the handshake was established.")),this._resolveResponse(e.payload)}}onClosedPoll(){if(!(this._settled||this._popup.closed!==!0)){if(!this._walletEpkReceived){this.fail(new H);return}clearInterval(this._closedPollId),setTimeout(()=>{this._settled||(this._settled=!0,this.cleanup(),this._resolveResponse(On))},qn)}}fail(e){if(!this._settled){this._settled=!0,this.cleanup();try{this._popup.close()}catch{}this._rejectWalletEpk?.(e),this._rejectResponse(e)}}cleanup(){clearTimeout(this._timeoutId),clearInterval(this._closedPollId),this._messageListener!==void 0&&(window.removeEventListener("message",this._messageListener),this._messageListener=void 0)}};function Se(){let t=Intl.DateTimeFormat().resolvedOptions(),e=Array.isArray(globalThis.navigator.languages)?globalThis.navigator.languages.filter(n=>typeof n=="string"&&n.length>0):void 0;return{origin:globalThis.location.origin,userAgent:globalThis.navigator.userAgent,platform:globalThis.navigator.platform,language:globalThis.navigator.language,...e&&e.length>0?{languages:e}:{},...t.timeZone?{timezone:t.timeZone}:{}}}async function Hn(t){let e=new J({walletUrl:t.walletUrl,timeoutMs:t.timeout}),n=new Un({transport:e});try{return await n.connect({appName:t.appName??globalThis.location.host,appIcon:t.appIcon,clientMetadata:Se(),permissionRequests:t.permissionRequests})}catch(r){if(r instanceof H)return;throw r}}var Wt=[-1,10,16,26,18,24,16,18,22,22,26],Nt=[-1,1,1,1,2,2,4,4,4,5,5],qt=[-1,26,44,70,100,134,172,196,242,292,346],$n=0,It=10;function Bt(t){return qt[t]-Wt[t]*Nt[t]}function Ge(t,e){let n=new TextEncoder().encode(t),r=Kn(n.length);if(r===0)throw new Error(`[@enbox/browser] QR payload too long (${n.length} bytes exceeds version ${It}-M capacity).`);let o=Fn(n,r),i=Yn(o,r),s=17+4*r,a=Array.from({length:s},()=>new Array(s).fill(!1)),d=Array.from({length:s},()=>new Array(s).fill(!1));Xn(a,d,r),er(a,d,i);let p=e??-1;return p===-1&&(p=zn(a,d)),Ye(a,d,p),Je(a,d,p),{size:s,modules:a,version:r,mask:p}}function Kn(t){for(let e=1;e<=It;e++){let n=Bt(e)*8;if(4+(e<=9?8:16)+t*8<=n)return e}return 0}function Fn(t,e){let n=[],r=(d,p)=>{for(let b=p-1;b>=0;b--)n.push(d>>>b&1)};r(4,4),r(t.length,e<=9?8:16);for(let d of t)r(d,8);let o=Bt(e)*8;r(0,Math.min(4,o-n.length)),r(0,(8-n.length%8)%8);let i=[236,17],s=0;for(;n.length<o;)r(i[s],8),s^=1;let a=new Uint8Array(o/8);for(let d=0;d<n.length;d++)a[d>>3]|=n[d]<<7-(d&7);return a}function zn(t,e){let n=0,r=1/0;for(let o=0;o<8;o++){Ye(t,e,o),Je(t,e,o);let i=ar(t);i<r&&(r=i,n=o),Ye(t,e,o)}return n}function Yn(t,e){let n=Nt[e],r=Wt[e],o=qt[e],i=n-o%n,s=Math.floor(o/n),a=[],d=[],p=Gn(r),b=0;for(let u=0;u<n;u++){let y=s-r+(u<i?0:1),_=t.slice(b,b+y);b+=y,a.push(_),d.push(Jn(_,p))}let E=new Uint8Array(o),C=0,Z=s-r+1;for(let u=0;u<Z;u++)for(let y=0;y<n;y++)u<a[y].length&&(E[C++]=a[y][u]);for(let u=0;u<r;u++)for(let y=0;y<n;y++)E[C++]=d[y][u];return E}function ze(t,e){let n=0;for(let r=7;r>=0;r--)n=n<<1^(n>>>7)*285,n^=(e>>>r&1)*t;return n&255}function Gn(t){let e=new Uint8Array(t);e[t-1]=1;let n=1;for(let r=0;r<t;r++){for(let o=0;o<t;o++)e[o]=ze(e[o],n),o+1<t&&(e[o]^=e[o+1]);n=ze(n,2)}return e}function Jn(t,e){let n=new Uint8Array(e.length);for(let r of t){let o=r^n[0];n.copyWithin(0,1),n[n.length-1]=0;for(let i=0;i<e.length;i++)n[i]^=ze(e[i],o)}return n}var Qn=[[],[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50]];function P(t,e,n,r,o){t[r][n]=o,e[r][n]=!0}function Xn(t,e,n){let r=t.length;for(let i=0;i<r;i++)P(t,e,6,i,i%2===0),P(t,e,i,6,i%2===0);Ke(t,e,3,3),Ke(t,e,r-4,3),Ke(t,e,3,r-4);let o=Qn[n];for(let i=0;i<o.length;i++)for(let s=0;s<o.length;s++)i===0&&s===0||i===0&&s===o.length-1||i===o.length-1&&s===0||Vn(t,e,o[i],o[s]);Je(t,e,0),P(t,e,8,r-8,!0),n>=7&&Zn(t,e,n)}function Ke(t,e,n,r){let o=t.length;for(let i=-4;i<=4;i++)for(let s=-4;s<=4;s++){let a=n+s,d=r+i;if(a<0||a>=o||d<0||d>=o)continue;let p=Math.max(Math.abs(s),Math.abs(i));P(t,e,a,d,p!==2&&p!==4)}}function Vn(t,e,n,r){for(let o=-2;o<=2;o++)for(let i=-2;i<=2;i++)P(t,e,n+i,r+o,Math.max(Math.abs(i),Math.abs(o))!==1)}function Je(t,e,n){let r=t.length,o=$n<<3|n,i=o;for(let a=0;a<10;a++)i=i<<1^(i>>>9)*1335;let s=(o<<10|i)^21522;for(let a=0;a<=5;a++)P(t,e,8,a,(s>>>a&1)!==0);P(t,e,8,7,(s>>>6&1)!==0),P(t,e,8,8,(s>>>7&1)!==0),P(t,e,7,8,(s>>>8&1)!==0);for(let a=9;a<15;a++)P(t,e,14-a,8,(s>>>a&1)!==0);for(let a=0;a<8;a++)P(t,e,r-1-a,8,(s>>>a&1)!==0);for(let a=8;a<15;a++)P(t,e,8,r-15+a,(s>>>a&1)!==0)}function Zn(t,e,n){let r=t.length,o=n;for(let s=0;s<12;s++)o=o<<1^(o>>>11)*7973;let i=n<<12|o;for(let s=0;s<18;s++){let a=(i>>>s&1)!==0,d=r-11+s%3,p=Math.floor(s/3);P(t,e,d,p,a),P(t,e,p,d,a)}}function er(t,e,n){let r=t.length,o=0;for(let i=r-1;i>=1;i-=2){let s=i<=6?i-1:i;o=tr(t,e,n,s,r,o)}}function tr(t,e,n,r,o,i){for(let s=0;s<o;s++)for(let a=0;a<2;a++){let{x:d,y:p}=nr(r,s,a,o);!e[p][d]&&i<n.length*8&&(t[p][d]=(n[i>>3]>>>7-(i&7)&1)!==0,i++)}return i}function nr(t,e,n,r){let o=t-n,s=(t+1&2)===0?r-1-e:e;return{x:o,y:s}}function Ye(t,e,n){let r=t.length;for(let o=0;o<r;o++)for(let i=0;i<r;i++){if(e[o][i])continue;let s;switch(n){case 0:s=(i+o)%2===0;break;case 1:s=o%2===0;break;case 2:s=i%3===0;break;case 3:s=(i+o)%3===0;break;case 4:s=(Math.floor(i/3)+Math.floor(o/2))%2===0;break;case 5:s=i*o%2+i*o%3===0;break;case 6:s=(i*o%2+i*o%3)%2===0;break;default:s=((i+o)%2+i*o%3)%2===0;break}s&&(t[o][i]=!t[o][i])}}function rr(t,e){let n=0;for(let r=0;r<e;r++){let o=!1,i=0;for(let s=0;s<e;s++)s===0||t[r][s]!==o?(o=t[r][s],i=1):(i++,i===5?n+=3:i>5&&(n+=1))}for(let r=0;r<e;r++){let o=!1,i=0;for(let s=0;s<e;s++)s===0||t[s][r]!==o?(o=t[s][r],i=1):(i++,i===5?n+=3:i>5&&(n+=1))}return n}function or(t,e){let n=0;for(let r=0;r<e-1;r++)for(let o=0;o<e-1;o++){let i=t[r][o];i===t[r][o+1]&&i===t[r+1][o]&&i===t[r+1][o+1]&&(n+=3)}return n}function Ut(t,e){if(![!0,!1,!0,!0,!0,!1,!0].every((s,a)=>t[e+a]===s))return 0;let o=e>=4&&t.slice(e-4,e).every(s=>!s),i=e+11<=t.length&&t.slice(e+7,e+11).every(s=>!s);return(o?40:0)+(i?40:0)}function ir(t,e){let n=0;for(let r=0;r<e;r++){let o=t[r],i=t.map(s=>s[r]);for(let s=0;s+7<=e;s++)n+=Ut(o,s),n+=Ut(i,s)}return n}function sr(t,e){let n=0;for(let i of t)for(let s of i)s&&n++;let r=e*e;return(Math.ceil(Math.abs(n*20-r*10)/r)-1)*10}function ar(t){let e=t.length,n=0;return n+=rr(t,e),n+=or(t,e),n+=ir(t,e),n+=sr(t,e),n}var Fe="http://www.w3.org/2000/svg";function Qe(t,e={}){let n=e.dark??"#000000",r=e.light??"#ffffff",o=e.quietZone??2,i=t.size+o*2,s="";for(let b=0;b<t.size;b++)for(let E=0;E<t.size;E++)t.modules[b][E]&&(s+=`M${E+o} ${b+o}h1v1h-1z`);let a=document.createElementNS(Fe,"svg");a.setAttribute("viewBox",`0 0 ${i} ${i}`),a.setAttribute("shape-rendering","crispEdges"),a.setAttribute("role","img");let d=document.createElementNS(Fe,"rect");d.setAttribute("width",String(i)),d.setAttribute("height",String(i)),d.setAttribute("fill",r),a.appendChild(d);let p=document.createElementNS(Fe,"path");return p.setAttribute("d",s),p.setAttribute("fill",n),a.appendChild(p),a}var jt="/.well-known/enbox-connect";async function Me(t){try{let e=new URL(jt,t).toString(),n=await fetch(e,{signal:AbortSignal.timeout(6e3)});if(!n.ok)return;let r=await n.json();return typeof r?.connectServerUrl!="string"?void 0:{connectServerUrl:r.connectServerUrl}}catch{return}}async function Xe(t){return await Me(t)!==void 0}import{DidJwk as lr}from"@enbox/dids";import{X25519 as cr}from"@enbox/crypto";import{CONNECT_DENIED_TOKEN as dr,openResponse as pr,randomToken as Ht,RelayClientTransport as ur,resolveDelegatePortableDid as fr,sealRequest as mr}from"@enbox/connect";var Ve=6,Q=class extends Error{constructor(){super("[@enbox/browser] Relay connect cancelled."),this.name="RelayConnectCancelledError"}};function hr(t){return new Promise(e=>{if(typeof document>"u"){setTimeout(e,t);return}let n=()=>{clearTimeout(o),document.removeEventListener("visibilitychange",r),e()},r=()=>{document.visibilityState==="visible"&&n()},o=setTimeout(n,t);document.addEventListener("visibilitychange",r)})}async function Ze(t){if(t.requestType==="refresh"&&t.delegatePortableDid===void 0)throw new Error("Connect: refresh requests require an existing `delegatePortableDid`.");let e=t.createTransport??(_=>new ur({..._,sleep:hr})),n=t.cancelled===void 0?void 0:new AbortController,r=e({connectServerUrl:t.connectServerUrl,walletUri:t.walletUri,timeoutMs:t.timeoutMs,pollIntervalMs:t.pollIntervalMs,onClaimed:t.onClaimed,signal:n?.signal}),o=await lr.create(),i=await cr.generateKey(),s={kty:"OKP",crv:"X25519",x:i.x},a=Ht(),d=Ht(),p=await r.requestProfile(d),b={clientDid:o.uri,appName:t.appName,appIcon:t.appIcon,applicationId:t.applicationId,clientMetadata:t.clientMetadata,permissionRequests:t.permissionRequests,delegateDid:t.delegatePortableDid?.uri,requestType:t.requestType,expectedProviderDid:t.expectedProviderDid,supportedDidMethods:["did:dht","did:jwk"],nonce:a,state:d,responseKey:s,reply:p.reply},E=await mr({request:b,signer:o,encryption:p.encryption}),C=await r.deliverRequest(E);C!==void 0&&t.onWalletUriReady(C);let Z=t.cancelled===void 0?r.awaitResponse():Promise.race([r.awaitResponse(),t.cancelled]),u;try{u=await Z}catch(_){throw n?.abort(),_}if(u===dr)return;let y;for(let _=1;_<=Ve;_++){let he=await(t.cancelled===void 0?t.requestPin(_,y):Promise.race([t.requestPin(_,y),t.cancelled])),A=await gr({responseCiphertext:u,responsePrivateKey:i,clientDid:o.uri,nonce:a,state:d,pin:he,expectedProviderDid:t.expectedProviderDid,delegatePortableDid:t.delegatePortableDid,confirmComplete:r.confirmComplete?.bind(r)});if(A.matched)return A.result;y=A.error}throw new Error(`[@enbox/browser] The pairing code did not match after ${Ve} attempts.`)}async function gr(t){try{let e=await pr({jwe:t.responseCiphertext,recipientPrivateKey:t.responsePrivateKey,expected:{clientDid:t.clientDid,nonce:t.nonce,state:t.state,providerDid:t.expectedProviderDid},pin:t.pin}),n=fr({localDelegatePortableDid:t.delegatePortableDid,response:e});return t.confirmComplete?.().catch(()=>{}),{matched:!0,result:{delegatePortableDid:n,delegateGrants:e.delegateGrants,connectedDid:e.providerDid,sessionRevocations:e.sessionRevocations}}}catch(e){let n=e instanceof Error?e:new Error(String(e));if(n.message.startsWith("Connect:"))throw n;return{matched:!1,error:n}}}var Yt="enbox:connect:lastChoice",Ae="enbox:connect:sessionChoices",Gt=20,br=12e4,wr=1e4,Le=4,yr=4,$t=3,et={background:"--ec-bg",surface:"--ec-surface",text:"--ec-text",textMuted:"--ec-muted",border:"--ec-border",accent:"--ec-accent",accentContrast:"--ec-accent-contrast",danger:"--ec-danger",success:"--ec-success"};async function Jt(t){return(await Me(t))?.connectServerUrl}async function Er(t){let e=new J({walletUrl:t.walletUrl,timeoutMs:t.timeoutMs});return await new vr({transport:e}).connect({appName:t.appName,appIcon:t.appIcon,applicationId:t.applicationId,clientMetadata:Se(),permissionRequests:t.permissionRequests,delegatePortableDid:t.delegatePortableDid,requestType:t.requestType,expectedProviderDid:t.expectedProviderDid})}function xr(){return typeof window>"u"?!1:(window.matchMedia?.("(pointer: coarse)").matches??!1)&&Math.min(window.innerWidth,window.innerHeight)<900}function Cr(){return{runRelay:Ze,runPopup:Er,discoverConnectServerUrl:Jt,validateWalletUrl:Xe,isMobile:xr,storage:typeof localStorage>"u"?void 0:localStorage}}function _r(t){try{let e=t?.getItem(Yt);if(e==null)return;let n=JSON.parse(e);if((n.method==="phone"||n.method==="browser")&&Qt(n.walletUrl))return{method:n.method,walletUrl:n.walletUrl}}catch{}}function Pr(t,e){try{t?.setItem(Yt,JSON.stringify(e))}catch{}}function Rr(t){if(typeof t!="object"||t===null)return!1;let e=t;return(e.method==="phone"||e.method==="browser")&&Qt(e.walletUrl)&&typeof e.delegateDid=="string"&&e.delegateDid.length>0&&typeof e.providerDid=="string"&&e.providerDid.length>0}function nt(t){try{let e=t?.getItem(Ae);if(e==null)return[];let n=JSON.parse(e);return Array.isArray(n)?n.filter(Rr).slice(-Gt):[]}catch{return[]}}function kr(t,e,n){if(e===void 0)return;let r=nt(t);for(let o=r.length-1;o>=0;o--){let i=r[o];if(i.delegateDid===e&&(n===void 0||i.providerDid===n))return i}}function Tr(t,e){try{let n=nt(t).filter(r=>r.delegateDid!==e.delegateDid||r.providerDid!==e.providerDid);n.push(e),t?.setItem(Ae,JSON.stringify(n.slice(-Gt)))}catch{}}function Dr(t,e,n){try{let r=nt(t).filter(o=>o.delegateDid!==e||o.providerDid!==n);r.length===0?t?.removeItem(Ae):t?.setItem(Ae,JSON.stringify(r))}catch{}}function Sr(){let t,e={active:!0},n=new Promise((r,o)=>{t=()=>{e.active===!0&&(e.active=!1,o(new Q))}});return n.catch(()=>{}),e.cancelled=n,e.cancel=t,e}function tt(t,e){return()=>t(e)}function rt(t){if(typeof window>"u"||typeof document>"u")throw new Error("[@enbox/browser] The connect modal is only available in browser environments.");if(t.mode==="refresh"&&t.delegatePortableDid===void 0)throw new Error("Connect: refresh requests require an existing `delegatePortableDid`.");let e={...Cr(),...t.deps},n=Mr(t.wallets??[]),r=t.rememberChoice??!0,o=t.appName??window.location.host,i=t.applicationId??window.location.origin,s=e.isMobile(),a=t.mode==="refresh",d=r?_r(e.storage):void 0,p=r&&a?kr(e.storage,t.delegatePortableDid?.uri,t.expectedProviderDid):void 0,b=t.expectedProviderDid??p?.providerDid,E=t.relayWalletPath??"/connect/app",C=t.walletUrl===void 0?"Choose another wallet or method":"Choose another method",Z=d!==void 0&&(a||Kt(n,d.walletUrl))?d.walletUrl:void 0,u=p?.walletUrl??t.walletUrl??Z??n[0]?.url,y=p?.method??t.preferredMethod??d?.method??"phone";return new Promise((_,he)=>{let A=document.createElement("div");A.id="enbox-connect-modal";let ge=A.attachShadow({mode:"open"}),lt=document.createElement("style");lt.textContent=Wr,ge.appendChild(lt);let ee=document.createElement("div");ee.className="overlay";let R=document.createElement("div");R.className="modal",R.setAttribute("role","dialog"),R.setAttribute("aria-modal","true");let ct=a?`Reconnect to ${o}`:`Connect to ${o}`;R.setAttribute("aria-label",ct);let O=t.theme??{},te=O.appearance??"auto";te!=="auto"&&(R.dataset.appearance=te);let Oe=window.matchMedia?.("(prefers-color-scheme: dark)"),Zt=O.accent!==void 0||O.accentContrast!==void 0||O.light!==void 0||O.dark!==void 0,dt=()=>{let l=Oe?.matches===!0?"dark":"light",c=te==="auto"?l:te,g={accent:O.accent,accentContrast:O.accentContrast,...O[c]};for(let f of Object.keys(et)){let w=g[f];typeof w=="string"&&w.trim()!==""?R.style.setProperty(et[f],w):R.style.removeProperty(et[f])}},pt=()=>dt();Zt&&(dt(),te==="auto"&&Oe?.addEventListener?.("change",pt));let k=!1,L,ut,ve,Ue=!1,K,en=()=>K,tn=()=>{K=void 0},ft=new Map,F=[],ne=l=>n.find(c=>c.url===l)??{name:Lr(l)??l,url:l},nn=()=>{if(u===void 0){F=n.slice(0,$t);return}if(F.some(c=>c.url===u))return;let l=ne(u);F=[l,...n.filter(c=>c.url!==l.url)].slice(0,$t)},be=l=>{u=l,z(),oe()},rn=()=>{L?.cancel(),U(),document.removeEventListener("keydown",yt),document.removeEventListener("visibilitychange",Et),Oe?.removeEventListener?.("change",pt);try{A.remove()}catch{}},we=l=>{k||(k=!0,rn(),l())},mt=l=>{r&&u!==void 0&&(Pr(e.storage,{method:y,walletUrl:u}),Tr(e.storage,{delegateDid:l.delegatePortableDid.uri,providerDid:l.connectedDid,method:y,walletUrl:u})),dn(),setTimeout(tt(we,()=>_(l)),1200)},We=()=>we(()=>he(new Error("[@enbox/browser] Connect cancelled.")));R.appendChild(Ar(ct,t.appIcon,We));let N=document.createElement("div");N.className="stage",N.setAttribute("aria-live","polite"),R.appendChild(N);let q=document.createElement("div");q.className="footer",R.appendChild(q);let x=(...l)=>{N.replaceChildren(...l),N.classList.remove("fade-in"),N.offsetWidth,N.classList.add("fade-in")},ht=l=>{x(m("div","spinner"),m("p","stage-caption",l))},on=l=>{let c=L;setTimeout(()=>{k||c!==L||c?.active!==!0||K!==void 0||an(l)},0)},gt=(l,c,g)=>{let f=document.createElement("a");return f.className=g,f.href=l.walletUri,f.target="_blank",f.rel="noopener noreferrer",f.addEventListener("click",()=>{on(c)}),f},sn=l=>{let c=u!==void 0?ne(u):void 0,g=c?.name??"your wallet",f=gt(l,g,"qr-box qr-link");if(f.setAttribute("aria-label",`Open ${g} on this device`),f.replaceChildren(Qe(Ge(l.walletUri),{dark:"#14141f",light:"transparent",quietZone:2})),c!==void 0){let w=m("div","qr-logo");w.appendChild(pe(c)),f.appendChild(w)}if(s){let w=gt(l,g,"deep-link");c!==void 0&&w.appendChild(pe(c)),w.appendChild(m("span","deep-link-label",`Continue in ${g}`)),f.classList.add("compact"),x(w,m("p","stage-subline",`${g} opens in a new tab \u2014 approve there, then come back for your code.`),m("div","stage-divider","or scan with another phone"),f);return}x(f,m("p","stage-caption","Scan with your phone\u2019s camera"),m("p","stage-subline",`${g} stays on your phone \u2014 or click the code to open it here.`))},an=l=>{x(m("div","spinner"),m("p","stage-caption",`Finish in ${l}`),m("p","stage-subline",s?`Approve the connection in the ${l} tab, then come back here for your code.`:"Approve the connection in the tab that just opened, then come back here for your code."),$("Start over",()=>{Ee()}))},ln=()=>{let l=u!==void 0?ne(u).name:"your wallet",c=document.createElement("div");c.className="claimed-pulse",x(c,m("p","stage-caption",`Request received \u2014 approve in ${l}`),m("p","stage-subline","Once you approve, you\u2019ll get a code to enter here."))},cn=(l,c)=>new Promise(g=>{K=g;let f=u!==void 0?ne(u).name:"your wallet",w=document.createElement("div");w.className="pin-row",c!==void 0&&w.classList.add("shake");let W=Or(w,en,tn,ht);x(m("p","stage-caption",`Enter the code shown in ${f}`),w,...c!==void 0?[m("p","stage-error",`That code doesn\u2019t match \u2014 check ${f}.`)]:[m("p","stage-subline",l===1?"This confirms you\u2019re the one approving.":"")]),W[0].focus()}),dn=()=>{let l=m("div","check");l.textContent="\u2713",x(l,m("p","stage-caption","You\u2019re connected."))},vt=()=>{x(m("p","stage-caption","No problem \u2014 nothing was shared."),X("Start over",()=>{oe()}),$("Close",tt(we,()=>_(void 0))))},Ne=()=>{p!==void 0&&(L?.cancel(),L=void 0,U(),Dr(e.storage,p.delegateDid,p.providerDid),p=void 0,t.walletUrl!==void 0&&(u=t.walletUrl),z(),x(m("p","stage-caption","Choose another way to reconnect."),m("p","stage-subline","We\u2019ll still require the same wallet profile used for this session.")))},ye=(l,c)=>{x(m("p","stage-caption",l),X("Start over",()=>{oe()}),...p!==void 0?[$(C,Ne)]:[],$("Close",tt(we,()=>he(c??new Error(`[@enbox/browser] ${l}`)))))},pn=()=>{if(p!==void 0){x(m("p","stage-caption","Your saved wallet connection is unavailable right now."),m("p","stage-subline","Try again in a moment to reconnect the same session."),X("Try again",()=>{Ee()}),$(C,Ne));return}x(m("p","stage-caption","This wallet can\u2019t connect by phone here."),m("p","stage-subline","You can continue in this browser instead."),X("Use this browser",()=>{xe()}))},re=s?"tab":"window",un=()=>{let l=u!==void 0?ne(u).name:"your wallet",c=p!==void 0,f=c?`We\u2019ll open the same ${l} profile used for this session.`:s?"Your wallet opens in a new tab to approve this connection \u2014 no code needed.":"Your wallet opens in a small window to approve this connection.",W=c?`Open ${l} ${re}`:s?"Open wallet":"Open wallet window";x(m("p","stage-caption",c?`Reconnect with ${l}`:"Connect with a wallet in this browser"),m("p","stage-subline",f),X(W,()=>{xe()}))},fn=()=>{x(m("div","spinner"),m("p","stage-caption",`Finish in the wallet ${re}`),m("p","stage-subline","We\u2019ll wrap up here as soon as you\u2019re done."))},mn=l=>{x(m("p","stage-caption",l?`Your browser blocked the wallet ${re}.`:`The wallet ${re} was closed.`),X(l?"Open it now":`Reopen ${re}`,()=>{xe()}),...p!==void 0?[$(C,Ne)]:[$(s?"Use a code instead":"Use your phone instead",()=>{wt("phone")})])},hn=l=>{if(k)return;let c=l instanceof Error?l:new Error(String(l)),g=/popup blocked/i.test(c.message);if(l instanceof H||g){mn(g);return}ye(/timed out/i.test(c.message)?"That took too long, so we stopped for safety.":"Something went wrong while connecting.",c)},gn=async l=>{if(t.connectServerUrl!==void 0)return t.connectServerUrl;let c=ft.get(l);return c===void 0&&(c=e.discoverConnectServerUrl(l),ft.set(l,c)),c},U=()=>{clearTimeout(ut),ve=void 0},bt=()=>{!k&&K===void 0&&y==="phone"&&Ee()},vn=l=>{U();let c=Math.max(wr,l*1e3-br);ve=Date.now()+c,ut=setTimeout(bt,c)},Ee=async()=>{if(L?.cancel(),U(),u===void 0){ye("No wallet is configured.");return}y="phone",z(),ht("Getting things ready\u2026");let l=new URL(u).origin,c=await gn(l);if(c===void 0){pn();return}let g=Sr();L=g;try{let f=await e.runRelay({connectServerUrl:c,walletUri:new URL(E,l).toString(),appName:o,appIcon:t.appIcon,applicationId:i,clientMetadata:Se(),permissionRequests:t.permissionRequests,delegatePortableDid:t.delegatePortableDid,requestType:t.mode,expectedProviderDid:b,timeoutMs:t.timeout,cancelled:g.cancelled,onWalletUriReady:w=>{g.active&&!k&&(sn(w),vn(w.expiresIn))},onClaimed:()=>{g.active&&!k&&(U(),ln())},requestPin:(w,W)=>(U(),cn(w,W))});if(!g.active||k)return;f===void 0?vt():mt(f)}catch(f){if(!g.active||k||f instanceof Q)return;let w=f instanceof Error?f:new Error(String(f));ye(/timed out/i.test(w.message)?"That took too long, so we stopped for safety.":"Something went wrong while connecting.",w)}},xe=async()=>{if(L?.cancel(),U(),u===void 0){ye("No wallet is configured.");return}if(!Ue){y="browser",z(),Ue=!0,fn();try{let l=await e.runPopup({walletUrl:u,permissionRequests:t.permissionRequests,appName:o,appIcon:t.appIcon,applicationId:i,timeoutMs:t.timeout,delegatePortableDid:t.delegatePortableDid,requestType:t.mode,expectedProviderDid:b});if(k)return;l===void 0?vt():mt(l)}catch(l){hn(l)}finally{Ue=!1}}},oe=async()=>{y==="browser"?(L?.cancel(),U(),z(),un()):await Ee()},wt=async l=>{y=l,await oe()},z=()=>{if(q.replaceChildren(),p===void 0&&t.walletUrl===void 0){nn();let c=bn();c.label!==void 0&&q.appendChild(c.label),q.appendChild(c.row),q.appendChild(c.panel)}let l=document.createElement("div");if(l.className="footer-row",y==="phone"&&p===void 0){let c=document.createElement("button");c.className="footer-link method-link",c.textContent=s?"Or connect without a code \u2192":"No phone? Use this browser \u2192",c.addEventListener("click",()=>{xe()}),l.appendChild(c)}else if(y==="browser"&&p===void 0){let c=document.createElement("button");c.className="footer-link method-link",c.textContent=s?"Use a code instead \u2192":"Use your phone instead \u2192",c.addEventListener("click",()=>{wt("phone")}),l.appendChild(c)}l.childElementCount>0&&q.appendChild(l)},bn=()=>{let l=document.createElement("div");l.className="wallet-row",l.setAttribute("role","radiogroup"),l.setAttribute("aria-label","Wallet");for(let h of F){let v=document.createElement("button");v.className="row-tile",v.title=h.description??h.name,v.setAttribute("role","radio");let T=h.url===u;v.setAttribute("aria-checked",T?"true":"false"),T&&v.classList.add("selected"),v.appendChild(pe(h)),v.appendChild(m("span","row-tile-name",h.name)),v.addEventListener("click",()=>{h.url!==u&&be(h.url)}),l.appendChild(v)}let c=document.createElement("div");c.className="wallet-panel",c.hidden=!0;let g=n.filter(h=>!Kt(F,h.url)),f=document.createElement("button");f.className="row-tile more-tile",f.title="All wallets",f.setAttribute("aria-expanded","false"),f.appendChild(m("span","more-count",g.length>0?`+${g.length}`:"\u22EF")),f.appendChild(m("span","row-tile-name","More")),f.addEventListener("click",()=>{c.hidden=!c.hidden,f.setAttribute("aria-expanded",c.hidden?"false":"true"),c.hidden||Ie()}),l.appendChild(f);let w=F.length>0?m("div","wallet-row-label","Connecting with"):void 0,W=[],ie=document.createElement("div");if(ie.className="wallet-empty",ie.textContent="No other wallets match your search.",ie.hidden=!0,g.length>yr){let h=document.createElement("input");h.type="search",h.className="wallet-search",h.placeholder="Search wallets\u2026",h.setAttribute("aria-label","Search wallets"),h.addEventListener("input",()=>{let v=h.value.trim().toLowerCase(),T=0;for(let{wallet:Ct,el:wn}of W){let _t=v===""||Ct.name.toLowerCase().includes(v)||Ct.url.toLowerCase().includes(v);wn.hidden=!_t,_t&&(T+=1)}ie.hidden=T>0,Ie()}),c.appendChild(h)}let se=document.createElement("div");se.className="wallet-scroll-wrap",se.hidden=g.length===0;let D=document.createElement("div");D.className="wallet-scroll";let qe=document.createElement("div");qe.className="wallet-grid";let Ie=()=>{let h=D.scrollHeight-D.clientHeight>1,v=D.scrollTop+D.clientHeight>=D.scrollHeight-1;se.classList.toggle("scroll-hint",h&&!v)};D.addEventListener("scroll",Ie);for(let h of g){let v=document.createElement("button");v.className="wallet-tile",v.title=h.description??h.name,v.appendChild(pe(h));let T=document.createElement("span");T.className="wallet-tile-name",T.textContent=h.name,v.appendChild(T),v.addEventListener("click",()=>{be(h.url)}),W.push({wallet:h,el:v}),qe.appendChild(v)}D.appendChild(qe),D.appendChild(ie),se.appendChild(D),c.appendChild(se);let Ce=document.createElement("div");Ce.className="wallet-custom";let S=document.createElement("input");S.className="url-input",S.type="url",S.placeholder="https://your-wallet.example";let M=document.createElement("button");M.className="url-go",M.textContent="Use";let I=document.createElement("div");I.className="url-error",I.hidden=!0;let Be=!1,xt=async()=>{let h=S.value.trim();if(h==="")return;let v;try{v=new URL(h.includes("://")?h:`https://${h}`).origin}catch{S.classList.add("invalid");return}if(Be){be(v);return}M.disabled=!0,M.textContent="Checking\u2026",I.hidden=!0;let T=await e.validateWalletUrl(v);if(M.disabled=!1,T){M.textContent="Use",be(v);return}Be=!0,M.textContent="Use anyway",S.classList.add("invalid"),I.textContent=`Couldn't verify a wallet at ${v}.`,I.hidden=!1};return S.addEventListener("input",()=>{Be=!1,M.textContent="Use",S.classList.remove("invalid"),I.hidden=!0}),S.addEventListener("keydown",h=>{h.key==="Enter"&&xt()}),M.addEventListener("click",()=>{xt()}),Ce.appendChild(S),Ce.appendChild(M),c.appendChild(Ce),c.appendChild(I),{label:w,row:l,panel:c}};ee.addEventListener("click",l=>{l.target===ee&&We()});let yt=l=>{if(l.key==="Escape"){We();return}l.key==="Tab"&&Ur(ge,l)};document.addEventListener("keydown",yt);let Et=()=>{if(!(document.visibilityState!=="visible"||k)){if(ve!==void 0&&Date.now()>=ve){bt();return}K!==void 0&&Array.from(ge.querySelectorAll(".pin-input")).find(c=>c.value==="")?.focus()}};document.addEventListener("visibilitychange",Et),ee.appendChild(R),ge.appendChild(ee),document.body.appendChild(A),z(),oe()})}function Kt(t,e){return t.some(n=>n.url===e)}function Qt(t){if(typeof t!="string"||t.trim()==="")return!1;try{let e=new URL(t);return e.protocol==="http:"||e.protocol==="https:"}catch{return!1}}function Mr(t){return t.filter((e,n)=>t.findIndex(r=>r.url===e.url)===n)}function Lr(t){if(t!==void 0)try{return new URL(t).hostname}catch{return t}}function m(t,e,n){let r=document.createElement(t);return r.className=e,n!==void 0&&(r.textContent=n),r}function X(t,e){let n=document.createElement("button");return n.className="stage-btn",n.textContent=t,n.addEventListener("click",e),n}function $(t,e){let n=document.createElement("button");return n.className="footer-link",n.textContent=t,n.addEventListener("click",e),n}function Ar(t,e,n){let r=document.createElement("div");r.className="header";let o=document.createElement("div");if(o.className="header-identity",e!==void 0){let a=document.createElement("img");a.className="header-icon",a.src=e,a.alt="",a.width=24,a.height=24,a.addEventListener("error",()=>a.remove()),o.appendChild(a)}let i=document.createElement("h2");i.textContent=t,o.appendChild(i);let s=document.createElement("button");return s.className="close-btn",s.setAttribute("aria-label","Close"),s.textContent="\xD7",s.addEventListener("click",n),r.appendChild(o),r.appendChild(s),r}function Or(t,e,n,r){let o=[];for(let s=0;s<Le;s++){let a=document.createElement("input");a.className="pin-input",a.type="text",a.inputMode="numeric",a.maxLength=1,a.setAttribute("aria-label",`Code digit ${s+1}`),o.push(a),t.appendChild(a)}let i=()=>{let s=o.map(d=>d.value).join(""),a=e();if(s.length===Le&&a!==void 0){let d=a;n(),r("Checking the code\u2026"),d(s)}};return o.forEach((s,a)=>{s.addEventListener("input",()=>{s.value=s.value.replace(/\D/g,"").slice(0,1),s.value!==""&&a+1<o.length&&o[a+1].focus(),i()}),s.addEventListener("keydown",d=>{d.key==="Backspace"&&s.value===""&&a>0&&o[a-1].focus()}),s.addEventListener("paste",d=>{let p=(d.clipboardData?.getData("text")??"").replace(/\D/g,"").slice(0,Le);p.length!==0&&(d.preventDefault(),p.split("").forEach((b,E)=>{o[E]!==void 0&&(o[E].value=b)}),o[Math.min(p.length,Le)-1]?.focus(),i())})}),o}function Ur(t,e){let n=Array.from(t.querySelectorAll('button, input, a[href], [tabindex]:not([tabindex="-1"])')).filter(s=>!s.hasAttribute("disabled")&&s.offsetParent!==null);if(n.length===0)return;let r=n[0],o=n[n.length-1],i=t.activeElement;e.shiftKey&&(i===r||i===null)?(e.preventDefault(),o.focus()):!e.shiftKey&&i===o&&(e.preventDefault(),r.focus())}var Ft=`
155
155
  --ec-bg: #ffffff;
156
156
  --ec-surface: #f5f6f8;
157
157
  --ec-text: #17171f;
@@ -160,7 +160,7 @@ export*from"@enbox/api";export*from"@enbox/auth/browser";import{CONNECT_DENIED_T
160
160
  --ec-accent: #0a62d0;
161
161
  --ec-accent-contrast: #ffffff;
162
162
  --ec-danger: #c0392b;
163
- --ec-success: #1e9e5a;`,Bt=`
163
+ --ec-success: #1e9e5a;`,zt=`
164
164
  --ec-bg: #181822;
165
165
  --ec-surface: #23232f;
166
166
  --ec-text: #e9e9f0;
@@ -169,7 +169,7 @@ export*from"@enbox/api";export*from"@enbox/auth/browser";import{CONNECT_DENIED_T
169
169
  --ec-accent: #58a6ff;
170
170
  --ec-accent-contrast: #0b1526;
171
171
  --ec-danger: #ff7a7a;
172
- --ec-success: #43d17c;`,Pr=`
172
+ --ec-success: #43d17c;`,Wr=`
173
173
  * { box-sizing: border-box; margin: 0; padding: 0; }
174
174
 
175
175
  /* Keep the hidden attribute authoritative: author display values (e.g.
@@ -204,7 +204,7 @@ export*from"@enbox/api";export*from"@enbox/auth/browser";import{CONNECT_DENIED_T
204
204
  50% { transform: scale(1); opacity: 1; }
205
205
  }
206
206
 
207
- .modal {${It}
207
+ .modal {${Ft}
208
208
  --ec-accent-soft: color-mix(in srgb, var(--ec-accent) 14%, transparent);
209
209
  background: var(--ec-bg);
210
210
  color: var(--ec-text);
@@ -220,12 +220,12 @@ export*from"@enbox/api";export*from"@enbox/auth/browser";import{CONNECT_DENIED_T
220
220
  flex-direction: column;
221
221
  }
222
222
  @media (prefers-color-scheme: dark) {
223
- .modal {${Bt}
223
+ .modal {${zt}
224
224
  }
225
225
  }
226
- .modal[data-appearance='light'] {${It}
226
+ .modal[data-appearance='light'] {${Ft}
227
227
  }
228
- .modal[data-appearance='dark'] {${Bt}
228
+ .modal[data-appearance='dark'] {${zt}
229
229
  }
230
230
 
231
231
  button, input { font-family: inherit; }
@@ -536,5 +536,5 @@ export*from"@enbox/api";export*from"@enbox/auth/browser";import{CONNECT_DENIED_T
536
536
  .overlay, .modal, .stage.fade-in > *, .pin-row.shake { animation: none; }
537
537
  .claimed-pulse::after { animation: none; }
538
538
  }
539
- `;var $t=[{name:"Enbox",url:"https://enbox-wallet.pages.dev",description:"Manage your digital identity and data"},{name:"Prism",url:"https://prism-wallet.pages.dev",description:"A clear view into your digital identity"},{name:"Matcha",url:"https://matcha-wallet.pages.dev",description:"A fresh approach to digital identity"},{name:"Sumi",url:"https://sumi-wallet.pages.dev",description:"A refined home for your digital identity"},{name:"Taffy",url:"https://taffy-wallet.pages.dev",description:"A playful take on your digital identity"},{name:"Astoria",url:"https://astoria-wallet.pages.dev",description:"A grand home for your digital identity"},{name:"Quay",url:"https://quay-id.pages.dev",description:"A safe harbor for your digital identity"},{name:"Quoin",url:"https://quoin-id.pages.dev",description:"A cornerstone for your digital identity"}];function Rr(t={}){let{wallets:e=$t,walletUrl:n,timeout:r,appName:o,appIcon:i,preferredMethod:s,rememberChoice:a,connectServerUrl:d,relayWalletPath:p,theme:b}=t;return{async requestAccess(f){return Ve({wallets:e,walletUrl:n,preferredMethod:s,rememberChoice:a,appName:o,appIcon:i??`${window.location.origin}/favicon.ico`,connectServerUrl:d,relayWalletPath:p,timeout:r,theme:b,mode:f.requestType,delegatePortableDid:f.delegatePortableDid,permissionRequests:f.permissionRequests})}}}import{X25519 as kr}from"@enbox/crypto";import{CONNECT_DENIED_TOKEN as Tr,ConnectProvider as Mr}from"@enbox/connect";var Sr=3e5,Dr=5e3,Ze=class t{constructor(e){this._requestReceived=!1;this._dappOrigin=e.dappOrigin,this._dappWindow=e.dappWindow,this._recipientPrivateKey=e.recipientPrivateKey;let n=Ce();this._requestPromise=n.promise,this._resolveRequest=n.resolve,this._rejectRequest=n.reject,this._messageListener=r=>{this.onMessage(r)},window.addEventListener("message",this._messageListener),this._timeoutId=setTimeout(()=>{this.close(),this._rejectRequest(new Error("[@enbox/browser] Timed out waiting for the connect request from the dapp."))},e.timeoutMs)}static async create(e={}){if(typeof window>"u")throw new TypeError("[@enbox/browser] WalletPostMessageTransport is only available in browser environments.");let n=e.dappWindow??window.opener;if(!n)throw new Error("[@enbox/browser] No opener window: the DWeb Connect page must be opened as a popup by the dapp.");let r=Lr(e.dappOrigin),o=await kr.generateKey(),i={kty:"OKP",crv:"X25519",x:o.x},s=new t({dappOrigin:r,dappWindow:n,recipientPrivateKey:o,timeoutMs:e.timeoutMs??Sr});return n.postMessage({type:ae,walletEpk:i,walletOrigin:globalThis.location.origin},r),s}get dappOrigin(){return this._dappOrigin}async awaitRequest(){return await this._requestPromise}sendResponse(e){this._dappWindow.postMessage({type:G,payload:e},this._dappOrigin),this.close()}async sendResponseAwaitingAck(e,n={}){let r=new Promise(s=>{this._resolveAck=s});this._dappWindow.postMessage({type:G,payload:e},this._dappOrigin);let o=setTimeout(()=>{this._resolveAck?.(!1)},n.timeoutMs??Dr),i=await r;return clearTimeout(o),this._resolveAck=void 0,this.close(),i}deny(){this.sendResponse(Tr)}close(){clearTimeout(this._timeoutId),this._messageListener!==void 0&&(window.removeEventListener("message",this._messageListener),this._messageListener=void 0)}onMessage(e){let n=Pe(e,this._dappOrigin,this._dappWindow);if(n!==void 0){if(n.type===ce){this._resolveAck?.(!0);return}if(!(n.type!==le||this._requestReceived)){if(this._requestReceived=!0,typeof n.jwe!="string"){this.settleRequest(new Error("[@enbox/browser] Connect request message did not carry a ciphertext payload."));return}this.openRequest(n.jwe)}}}async openRequest(e){try{let n=await Mr.openRequest({jwe:e,decryption:{mode:"ecdh-es",recipientPrivateKey:this._recipientPrivateKey,walletOrigin:globalThis.location.origin}});if(n.reply.mode!=="post_message"){this.settleRequest(new Error("[@enbox/browser] Connect request over the popup channel must use the `post_message` reply mode."));return}this.settleRequest(n)}catch(n){this.settleRequest(n instanceof Error?n:new Error(String(n)))}}settleRequest(e){if(clearTimeout(this._timeoutId),e instanceof Error){this.close(),this._rejectRequest(e);return}this._resolveRequest(e)}};function Lr(t){if(t!==void 0)return new URL(t).origin;if(document.referrer)return new URL(document.referrer).origin;throw new Error("[@enbox/browser] Unable to determine the dapp origin: no `dappOrigin` option was provided and `document.referrer` is empty.")}function Ar(t){if(!Number.isSafeInteger(t)||t<0||t>2147483647)throw new TypeError("delayMs must be an integer between 0 and 2147483647.")}var J=class{constructor(e,n){this._onEmpty=n;this._isRevoked=!1;this._references=0;this._releaseTimers=new Set;this.url=globalThis.URL.createObjectURL(e)}get references(){return this._references}acquire(){if(this._isRevoked)throw new Error("Object URL has been revoked.");this._references+=1;let e=!1,n,r=()=>{e||(e=!0,n!==void 0&&(clearTimeout(n),this._releaseTimers.delete(n)),!this._isRevoked&&(this._references-=1,this._references===0&&this._onEmpty(this)))};return Object.freeze({url:this.url,release:r,releaseAfter:o=>{Ar(o),!(e||this._isRevoked||n!==void 0)&&(n=setTimeout(r,o),this._releaseTimers.add(n))}})}revoke(){if(!this._isRevoked){this._isRevoked=!0;for(let e of this._releaseTimers)clearTimeout(e);this._releaseTimers.clear(),this._references=0,globalThis.URL.revokeObjectURL(this.url)}}};var et=class{constructor(){this._references=new Map;this._isDisposed=!1}acquire(e){if(this._isDisposed)throw new Error("BlobUrlPool is disposed.");let n=this._references.get(e);return n===void 0&&(n=new J(e,r=>{this._references.delete(e),r.revoke()}),this._references.set(e,n)),n.acquire()}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(let e of this._references.values())e.revoke();this._references.clear()}}};function Ur(){return new et}var Wr=128*1024*1024,Or=50;function Kt(t,e){if(t!==1/0&&(!Number.isSafeInteger(t)||t<0))throw new TypeError(`${e} must be a non-negative safe integer or Infinity.`)}function tt(t){throw t.abort(),t.signal.reason}var nt=class{constructor(e){this._options=e;this._cache=new Map;this._entries=new Set;this._pending=new Map;this._bytes=0;this._generation=0;this._isDisposed=!1;this._maxBytes=e.maxBytes??Wr,this._maxEntries=e.maxEntries??Or,Kt(this._maxBytes,"maxBytes"),Kt(this._maxEntries,"maxEntries")}async acquire(e){this._assertActive();let n=this._options.key(e),r=this._cache.get(n);if(r!==void 0)return this._acquire(r);let o=this._pending.get(n)??this._startRead(e,n),i=await o.promise;if(this._isDisposed||o.generation!==this._generation)return tt(o.controller);if(i!==void 0)return this._cache.get(n)!==i?tt(o.controller):this._acquire(i)}acquireCached(e){this._assertActive();let n=this._cache.get(this._options.key(e));return n===void 0?void 0:this._acquire(n)}invalidate(e){this._assertActive();let n=this._options.key(e);this._pending.get(n)?.controller.abort(),this._pending.delete(n);let o=this._cache.get(n);o!==void 0&&this._remove(o)}clear(){this._assertActive(),this._reset(!1)}dispose(){this._isDisposed||(this._isDisposed=!0,this._reset(!0))}_abortReads(){for(let e of this._pending.values())e.controller.abort();this._pending.clear()}_acquire(e){this._cache.delete(e.key),this._cache.set(e.key,e);let n=e.url.acquire();return this._evict(),Object.freeze({filename:e.filename,mimeType:e.mimeType,release:n.release,releaseAfter:n.releaseAfter,url:n.url})}_assertActive(){if(this._isDisposed)throw new Error("FileEnvelopeUrlStore is disposed.")}_assertCurrent(e,n,r){(this._isDisposed||n.signal.aborted||this._generation!==r||this._pending.get(e)?.controller!==n)&&tt(n)}_evict(){for(;this._cache.size>this._maxEntries||this._bytes>this._maxBytes;){let e=[...this._cache.values()].find(n=>n.url.references===0);if(e===void 0)return;this._remove(e)}}async _load(e,n,r,o){let i=await this._options.read(e,r.signal);if(this._assertCurrent(n,r,o),i===void 0)return;let s=this._options.blobForUrl(i);this._assertCurrent(n,r,o);let a=new J(s,()=>this._released(d)),d={bytes:s.size,filename:i.filename,key:n,mimeType:i.mimeType,url:a};return this._cache.set(n,d),this._bytes+=d.bytes,this._entries.add(d),d}_released(e){this._cache.get(e.key)!==e?this._revoke(e):this._evict()}_remove(e){this._cache.get(e.key)===e&&(this._cache.delete(e.key),this._bytes-=e.bytes,e.url.references===0&&this._revoke(e))}_reset(e){this._generation+=1,this._abortReads(),this._cache.clear(),this._bytes=0;for(let n of this._entries)(e||n.url.references===0)&&this._revoke(n)}_revoke(e){e.url.revoke(),this._entries.delete(e)}_startRead(e,n){let r=new AbortController,o=this._generation,i=this._load(e,n,r,o).finally(()=>{this._pending.get(n)?.controller===r&&this._pending.delete(n)}),s={controller:r,generation:o,promise:i};return this._pending.set(n,s),s}};function qr(t){return new nt(t)}import{createProfileReader as $o,isRetryableProfileReadStatus as Ko}from"@enbox/protocols";import{DwnInterface as zo}from"@enbox/agent";import{DateSort as Yo,DwnInterfaceName as Qo,DwnMethodName as Jo}from"@enbox/dwn-sdk-js";export{Rr as BrowserConnectHandler,Mo as CONNECT_DENIED_TOKEN,So as ConnectProvider,$t as DEFAULT_WALLETS,ce as DWEB_CONNECT_ACK_MESSAGE_TYPE,ae as DWEB_CONNECT_LOADED_MESSAGE_TYPE,Ie as DWEB_CONNECT_PATH,le as DWEB_CONNECT_REQUEST_MESSAGE_TYPE,G as DWEB_CONNECT_RESPONSE_MESSAGE_TYPE,Yo as DateSort,zo as DwnInterface,Qo as DwnInterfaceName,Jo as DwnMethodName,Ye as MAX_PIN_ATTEMPTS,Y as PopupClientTransport,j as PopupWindowClosedError,Q as RelayConnectCancelledError,Wt as WALLET_WELL_KNOWN_PATH,Ze as WalletPostMessageTransport,jr as activatePolyfills,vn as cacheResponse,$r as clearDrlCache,Un as connectViaPopup,Ur as createBlobUrlPool,qr as createFileEnvelopeUrlStore,$o as createProfileReader,Hr as deactivatePolyfills,Ht as discoverWalletConnectServerUrl,Ke as encodeQr,gn as fetchResource,ke as fetchWalletWellKnown,Ct as getDwnEndpoints,hn as handleEvent,Ko as isRetryableProfileReadStatus,ne as parseDrlUrl,Ge as probeWalletWellKnown,ze as qrToSvg,Ve as runConnectModal,Qe as runRelayConnect};
539
+ `;var Xt=[{name:"Enbox",url:"https://enbox-wallet.pages.dev",description:"Manage your digital identity and data"},{name:"Prism",url:"https://prism-wallet.pages.dev",description:"A clear view into your digital identity"},{name:"Matcha",url:"https://matcha-wallet.pages.dev",description:"A fresh approach to digital identity"},{name:"Sumi",url:"https://sumi-wallet.pages.dev",description:"A refined home for your digital identity"},{name:"Taffy",url:"https://taffy-wallet.pages.dev",description:"A playful take on your digital identity"},{name:"Astoria",url:"https://astoria-wallet.pages.dev",description:"A grand home for your digital identity"},{name:"Quay",url:"https://quay-id.pages.dev",description:"A safe harbor for your digital identity"},{name:"Quoin",url:"https://quoin-id.pages.dev",description:"A cornerstone for your digital identity"}];function Nr(t={}){let{wallets:e=Xt,walletUrl:n,timeout:r,appName:o,appIcon:i,applicationId:s,preferredMethod:a,rememberChoice:d,connectServerUrl:p,relayWalletPath:b,theme:E}=t;return{async requestAccess(C){return rt({wallets:e,walletUrl:n,preferredMethod:a,rememberChoice:d,appName:o,appIcon:i??`${window.location.origin}/favicon.ico`,applicationId:s,connectServerUrl:p,relayWalletPath:b,timeout:r,theme:E,mode:C.requestType,delegatePortableDid:C.delegatePortableDid,expectedProviderDid:C.expectedProviderDid,permissionRequests:C.permissionRequests})}}}import{X25519 as qr}from"@enbox/crypto";import{CONNECT_DENIED_TOKEN as Ir,ConnectProvider as Br}from"@enbox/connect";var jr=3e5,Hr=5e3,ot=class t{constructor(e){this._requestReceived=!1;this._dappOrigin=e.dappOrigin,this._dappWindow=e.dappWindow,this._recipientPrivateKey=e.recipientPrivateKey;let n=Te();this._requestPromise=n.promise,this._resolveRequest=n.resolve,this._rejectRequest=n.reject,this._messageListener=r=>{this.onMessage(r)},window.addEventListener("message",this._messageListener),this._timeoutId=setTimeout(()=>{this.close(),this._rejectRequest(new Error("[@enbox/browser] Timed out waiting for the connect request from the dapp."))},e.timeoutMs)}static async create(e={}){if(typeof window>"u")throw new TypeError("[@enbox/browser] WalletPostMessageTransport is only available in browser environments.");let n=e.dappWindow??window.opener;if(!n)throw new Error("[@enbox/browser] No opener window: the DWeb Connect page must be opened as a popup by the dapp.");let r=$r(e.dappOrigin),o=await qr.generateKey(),i={kty:"OKP",crv:"X25519",x:o.x},s=new t({dappOrigin:r,dappWindow:n,recipientPrivateKey:o,timeoutMs:e.timeoutMs??jr});return n.postMessage({type:ue,walletEpk:i,walletOrigin:globalThis.location.origin},r),s}get dappOrigin(){return this._dappOrigin}async awaitRequest(){return await this._requestPromise}sendResponse(e){this._dappWindow.postMessage({type:G,payload:e},this._dappOrigin),this.close()}async sendResponseAwaitingAck(e,n={}){let r=new Promise(s=>{this._resolveAck=s});this._dappWindow.postMessage({type:G,payload:e},this._dappOrigin);let o=setTimeout(()=>{this._resolveAck?.(!1)},n.timeoutMs??Hr),i=await r;return clearTimeout(o),this._resolveAck=void 0,this.close(),i}deny(){this.sendResponse(Ir)}close(){clearTimeout(this._timeoutId),this._messageListener!==void 0&&(window.removeEventListener("message",this._messageListener),this._messageListener=void 0)}onMessage(e){let n=De(e,this._dappOrigin,this._dappWindow);if(n!==void 0){if(n.type===me){this._resolveAck?.(!0);return}if(!(n.type!==fe||this._requestReceived)){if(this._requestReceived=!0,typeof n.jwe!="string"){this.settleRequest(new Error("[@enbox/browser] Connect request message did not carry a ciphertext payload."));return}this.openRequest(n.jwe)}}}async openRequest(e){try{let n=await Br.openRequest({jwe:e,decryption:{mode:"ecdh-es",recipientPrivateKey:this._recipientPrivateKey,walletOrigin:globalThis.location.origin}});if(n.reply.mode!=="post_message"){this.settleRequest(new Error("[@enbox/browser] Connect request over the popup channel must use the `post_message` reply mode."));return}this.settleRequest(n)}catch(n){this.settleRequest(n instanceof Error?n:new Error(String(n)))}}settleRequest(e){if(clearTimeout(this._timeoutId),e instanceof Error){this.close(),this._rejectRequest(e);return}this._resolveRequest(e)}};function $r(t){if(t!==void 0)return new URL(t).origin;if(document.referrer)return new URL(document.referrer).origin;throw new Error("[@enbox/browser] Unable to determine the dapp origin: no `dappOrigin` option was provided and `document.referrer` is empty.")}function Kr(t){if(!Number.isSafeInteger(t)||t<0||t>2147483647)throw new TypeError("delayMs must be an integer between 0 and 2147483647.")}var V=class{constructor(e,n){this._onEmpty=n;this._isRevoked=!1;this._references=0;this._releaseTimers=new Set;this.url=globalThis.URL.createObjectURL(e)}get references(){return this._references}acquire(){if(this._isRevoked)throw new Error("Object URL has been revoked.");this._references+=1;let e=!1,n,r=()=>{e||(e=!0,n!==void 0&&(clearTimeout(n),this._releaseTimers.delete(n)),!this._isRevoked&&(this._references-=1,this._references===0&&this._onEmpty(this)))};return Object.freeze({url:this.url,release:r,releaseAfter:o=>{Kr(o),!(e||this._isRevoked||n!==void 0)&&(n=setTimeout(r,o),this._releaseTimers.add(n))}})}revoke(){if(!this._isRevoked){this._isRevoked=!0;for(let e of this._releaseTimers)clearTimeout(e);this._releaseTimers.clear(),this._references=0,globalThis.URL.revokeObjectURL(this.url)}}};var it=class{constructor(){this._references=new Map;this._isDisposed=!1}acquire(e){if(this._isDisposed)throw new Error("BlobUrlPool is disposed.");let n=this._references.get(e);return n===void 0&&(n=new V(e,r=>{this._references.delete(e),r.revoke()}),this._references.set(e,n)),n.acquire()}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(let e of this._references.values())e.revoke();this._references.clear()}}};function Fr(){return new it}var zr=128*1024*1024,Yr=50;function Vt(t,e){if(t!==1/0&&(!Number.isSafeInteger(t)||t<0))throw new TypeError(`${e} must be a non-negative safe integer or Infinity.`)}function st(t){throw t.abort(),t.signal.reason}var at=class{constructor(e){this._options=e;this._cache=new Map;this._entries=new Set;this._pending=new Map;this._bytes=0;this._generation=0;this._isDisposed=!1;this._maxBytes=e.maxBytes??zr,this._maxEntries=e.maxEntries??Yr,Vt(this._maxBytes,"maxBytes"),Vt(this._maxEntries,"maxEntries")}async acquire(e){this._assertActive();let n=this._options.key(e),r=this._cache.get(n);if(r!==void 0)return this._acquire(r);let o=this._pending.get(n)??this._startRead(e,n),i=await o.promise;if(this._isDisposed||o.generation!==this._generation)return st(o.controller);if(i!==void 0)return this._cache.get(n)!==i?st(o.controller):this._acquire(i)}acquireCached(e){this._assertActive();let n=this._cache.get(this._options.key(e));return n===void 0?void 0:this._acquire(n)}invalidate(e){this._assertActive();let n=this._options.key(e);this._pending.get(n)?.controller.abort(),this._pending.delete(n);let o=this._cache.get(n);o!==void 0&&this._remove(o)}clear(){this._assertActive(),this._reset(!1)}dispose(){this._isDisposed||(this._isDisposed=!0,this._reset(!0))}_abortReads(){for(let e of this._pending.values())e.controller.abort();this._pending.clear()}_acquire(e){this._cache.delete(e.key),this._cache.set(e.key,e);let n=e.url.acquire();return this._evict(),Object.freeze({filename:e.filename,mimeType:e.mimeType,release:n.release,releaseAfter:n.releaseAfter,url:n.url})}_assertActive(){if(this._isDisposed)throw new Error("FileEnvelopeUrlStore is disposed.")}_assertCurrent(e,n,r){(this._isDisposed||n.signal.aborted||this._generation!==r||this._pending.get(e)?.controller!==n)&&st(n)}_evict(){for(;this._cache.size>this._maxEntries||this._bytes>this._maxBytes;){let e=[...this._cache.values()].find(n=>n.url.references===0);if(e===void 0)return;this._remove(e)}}async _load(e,n,r,o){let i=await this._options.read(e,r.signal);if(this._assertCurrent(n,r,o),i===void 0)return;let s=this._options.blobForUrl(i);this._assertCurrent(n,r,o);let a=new V(s,()=>this._released(d)),d={bytes:s.size,filename:i.filename,key:n,mimeType:i.mimeType,url:a};return this._cache.set(n,d),this._bytes+=d.bytes,this._entries.add(d),d}_released(e){this._cache.get(e.key)!==e?this._revoke(e):this._evict()}_remove(e){this._cache.get(e.key)===e&&(this._cache.delete(e.key),this._bytes-=e.bytes,e.url.references===0&&this._revoke(e))}_reset(e){this._generation+=1,this._abortReads(),this._cache.clear(),this._bytes=0;for(let n of this._entries)(e||n.url.references===0)&&this._revoke(n)}_revoke(e){e.url.revoke(),this._entries.delete(e)}_startRead(e,n){let r=new AbortController,o=this._generation,i=this._load(e,n,r,o).finally(()=>{this._pending.get(n)?.controller===r&&this._pending.delete(n)}),s={controller:r,generation:o,promise:i};return this._pending.set(n,s),s}};function Gr(t){return new at(t)}import{createProfileReader as ei,isRetryableProfileReadStatus as ti}from"@enbox/protocols";import{DwnInterface as ri}from"@enbox/agent";import{DateSort as ii,DwnInterfaceName as si,DwnMethodName as ai}from"@enbox/dwn-sdk-js";export{Nr as BrowserConnectHandler,Bo as CONNECT_DENIED_TOKEN,jo as ConnectProvider,Xt as DEFAULT_WALLETS,me as DWEB_CONNECT_ACK_MESSAGE_TYPE,ue as DWEB_CONNECT_LOADED_MESSAGE_TYPE,$e as DWEB_CONNECT_PATH,fe as DWEB_CONNECT_REQUEST_MESSAGE_TYPE,G as DWEB_CONNECT_RESPONSE_MESSAGE_TYPE,ii as DateSort,ri as DwnInterface,si as DwnInterfaceName,ai as DwnMethodName,Ve as MAX_PIN_ATTEMPTS,J as PopupClientTransport,H as PopupWindowClosedError,Q as RelayConnectCancelledError,jt as WALLET_WELL_KNOWN_PATH,ot as WalletPostMessageTransport,Vr as activatePolyfills,Pn as cacheResponse,eo as clearDrlCache,Hn as connectViaPopup,Fr as createBlobUrlPool,Gr as createFileEnvelopeUrlStore,ei as createProfileReader,Zr as deactivatePolyfills,Jt as discoverWalletConnectServerUrl,Ge as encodeQr,_n as fetchResource,Me as fetchWalletWellKnown,St as getDwnEndpoints,Cn as handleEvent,ti as isRetryableProfileReadStatus,ae as parseDrlUrl,Xe as probeWalletWellKnown,Qe as qrToSvg,rt as runConnectModal,Ze as runRelayConnect};
540
540
  //# sourceMappingURL=browser.mjs.map