@lockerverse/react 0.2.101 โ†’ 0.2.103

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +55 -18
  2. package/dist/auction-base.css +128 -0
  3. package/dist/auction-catalog.css +8 -1
  4. package/dist/auction-checkout.css +2 -2
  5. package/dist/auction-data.d.ts +16 -0
  6. package/dist/auction-data.d.ts.map +1 -0
  7. package/dist/auction-data.js +2 -0
  8. package/dist/auction-data.js.map +1 -0
  9. package/dist/auction-item-layout.css +302 -0
  10. package/dist/auction-item.css +4 -0
  11. package/dist/auction-item.d.ts +3 -0
  12. package/dist/auction-item.d.ts.map +1 -1
  13. package/dist/auction-item.js +1 -1
  14. package/dist/auction-item.js.map +1 -1
  15. package/dist/auction.css +2 -0
  16. package/dist/auction.d.ts +3 -0
  17. package/dist/auction.js +1 -0
  18. package/dist/auctions.css +2 -406
  19. package/dist/auctions.d.ts +6 -19
  20. package/dist/auctions.d.ts.map +1 -1
  21. package/dist/auctions.js +1 -1
  22. package/dist/auctions.js.map +1 -1
  23. package/dist/immutable-resource-identity.js.map +1 -1
  24. package/dist/lockerverse-auction-item-card.d.ts +47 -0
  25. package/dist/lockerverse-auction-item-card.d.ts.map +1 -0
  26. package/dist/lockerverse-auction.js +2 -0
  27. package/dist/lockerverse-auction.js.map +1 -0
  28. package/dist/lockerverse-payment.js +1 -1
  29. package/dist/lockerverse-payment.js.map +1 -1
  30. package/dist/phone.js +1 -1
  31. package/dist/signup.js +1 -1
  32. package/dist/signup.js.map +1 -1
  33. package/dist/use-auction-boundary.js +2 -0
  34. package/dist/use-auction-boundary.js.map +1 -0
  35. package/dist/use-lockerverse-auctions.d.ts +13 -0
  36. package/dist/use-lockerverse-auctions.d.ts.map +1 -0
  37. package/dist/use-lockerverse-auctions.js +2 -0
  38. package/dist/use-lockerverse-auctions.js.map +1 -0
  39. package/package.json +26 -3
  40. package/dist/auction-description.js +0 -2
  41. package/dist/auction-description.js.map +0 -1
package/dist/phone.js CHANGED
@@ -1,2 +1,2 @@
1
- import{i as e,n as t,r as n}from"./host-callback.js";import{array as r,minLength as i,nonEmpty as a,pipe as o,safeParse as s,string as c,trim as l}from"valibot";import{jsx as u,jsxs as d}from"react/jsx-runtime";const f=/^#([\da-f]{3}|[\da-f]{6})$/i,p=/^([\da-f]{3}|[\da-f]{6})$/i;function m(e){let t=e.trim();return p.test(t)?`#${t}`:t}function h(e){let t=f.exec(m(e));if(!t)return;let[,n]=t;if(!n)return;let r=n.length===3?Array.from(n,e=>`${e}${e}`).join(``):n;return[0,2,4].map(e=>Number.parseInt(r.slice(e,e+2),16))}function g([e,t,n]){let[r=0,i=0,a=0]=[e,t,n].map((e=0)=>{let t=e/255;return t<=.04045?t/12.92:((t+.055)/1.055)**2.4});return .2126*r+.7152*i+.0722*a}function _(e){let t=h(e);if(!t)return;let n=g(t);return(n+.05)/.05>=1.05/(n+.05)?`#000`:`#fff`}function v(e){return e.type===`checkbox`?!1:e.type===`checkboxes`||e.type===`multi_select`?[]:``}function y(e){let t={};for(let n of e)t[n.id]=v(n);return t}function b(e){let t=s(c(),e);return t.success?t.output:``}function x(e,t){return e.map(e=>{let n=t[e.id];return e.type===`checkbox`?{fieldId:e.id,value:n===!0}:e.type===`checkboxes`||e.type===`multi_select`?{fieldId:e.id,value:Array.isArray(n)?n:[]}:{fieldId:e.id,value:b(n)}})}function S(e,t){let n={};for(let u of e){if(!u.required)continue;let e=`${u.label} is required.`,d=t[u.id];if(u.type===`checkbox`){d!==!0&&(n[u.id]=e);continue}let f=u.type===`checkboxes`||u.type===`multi_select`?s(o(r(c()),i(1,e)),d??[]):s(o(c(),l(),a(e)),b(d));f.success||(n[u.id]=f.issues[0]?.message??e)}return n}function C({choiceClassName:e,errorClassName:t,errors:n,fields:r,idPrefix:i,onChange:a,values:o}){return r.map(r=>u(w,{choiceClassName:e,error:n[r.id],errorClassName:t,field:r,idPrefix:i,onChange:e=>a({...o,[r.id]:e}),value:o[r.id]},r.id))}function w(e){let{field:t,idPrefix:n}=e,r=`${n}-custom-${t.id}`,i=`${r}-error`,a={...e,controlId:r,errorId:i};switch(t.type){case`checkbox`:return u(T,{...a,field:t});case`text`:case`textarea`:return u(D,{...a,field:t});case`select`:case`multi_select`:return u(O,{...a,field:t});case`radio`:case`checkboxes`:return u(k,{...a,field:t});default:return null}}function T({choiceClassName:e,controlId:t,error:n,errorClassName:r,errorId:i,field:a,onChange:o,value:s}){return d(`label`,{className:e,htmlFor:t,children:[u(`input`,{"aria-describedby":n?i:void 0,"aria-invalid":n?`true`:void 0,checked:s===!0,id:t,name:`custom:${a.id}`,onChange:e=>o(e.currentTarget.checked),required:a.required,type:`checkbox`}),u(`span`,{children:a.label}),u(E,{className:r,error:n,id:i})]})}function E({className:e,error:t,id:n}){return t?u(`span`,{className:e,id:n,role:`alert`,children:t}):null}function D({controlId:e,error:t,errorClassName:n,errorId:r,field:i,onChange:a,value:o}){let s={"aria-describedby":t?r:void 0,"aria-invalid":t?`true`:void 0,id:e,name:`custom:${i.id}`,onChange:e=>a(e.currentTarget.value),required:i.required,value:b(o)};return d(`label`,{htmlFor:e,children:[u(`span`,{children:i.label}),i.type===`textarea`?u(`textarea`,{...s}):u(`input`,{...s}),u(E,{className:n,error:t,id:r})]})}function O({controlId:e,error:t,errorClassName:n,errorId:r,field:i,onChange:a,value:o}){return d(`label`,{htmlFor:e,children:[u(`span`,{children:i.label}),d(`select`,{"aria-describedby":t?r:void 0,"aria-invalid":t?`true`:void 0,id:e,multiple:i.type===`multi_select`,name:`custom:${i.id}`,onChange:e=>a(i.type===`multi_select`?[...e.currentTarget.selectedOptions].map(e=>e.value):e.currentTarget.value),required:i.required,value:o===!0||o===!1?``:o??(i.type===`multi_select`?[]:``),children:[i.type===`select`?u(`option`,{value:``,children:`Selectโ€ฆ`}):null,i.options.map(e=>u(`option`,{value:e.id,children:e.label},e.id))]}),u(E,{className:n,error:t,id:r})]})}function k({choiceClassName:e,controlId:t,error:n,errorClassName:r,errorId:i,field:a,onChange:o,value:s}){let c=Array.isArray(s)?s:[];return d(`fieldset`,{"aria-describedby":n?i:void 0,"aria-invalid":n?`true`:void 0,children:[u(`legend`,{children:a.label}),a.options.map((n,r)=>d(`label`,{className:e,children:[u(`input`,{checked:Array.isArray(s)?s.includes(n.id):s===n.id,id:`${t}-${r}`,name:`custom:${a.id}`,onChange:e=>{if(a.type===`radio`){o(n.id);return}o(e.currentTarget.checked?[...c,n.id]:c.filter(e=>e!==n.id))},required:a.required&&a.type===`radio`,type:a.type===`radio`?`radio`:`checkbox`,value:n.id}),u(`span`,{children:n.label})]},n.id)),u(E,{className:r,error:n,id:i})]})}function A({fieldCount:e,label:t,sectionCount:n=0,showCheckbox:r=!1}){return d(`div`,{className:`lockerverse-form-skeleton__loading`,children:[u(`span`,{className:`lockerverse-form-skeleton__sr-only`,role:`status`,children:t}),d(`div`,{"aria-hidden":`true`,className:`lockerverse-form-skeleton`,children:[d(`div`,{className:`lockerverse-form-skeleton__branding`,children:[u(`span`,{className:`lockerverse-form-skeleton__avatar`}),u(`span`,{className:`lockerverse-form-skeleton__community`})]}),u(`div`,{className:`lockerverse-form-skeleton__fields`,children:Array.from({length:e},(e,t)=>d(`div`,{className:`lockerverse-form-skeleton__field`,children:[u(`span`,{className:`lockerverse-form-skeleton__label`}),u(`span`,{className:`lockerverse-form-skeleton__input`})]},t))}),Array.from({length:n},(e,t)=>d(`div`,{className:`lockerverse-form-skeleton__section`,children:[u(`span`,{className:`lockerverse-form-skeleton__section-label`}),d(`div`,{className:`lockerverse-form-skeleton__section-content`,children:[u(`span`,{className:`lockerverse-form-skeleton__section-full`}),d(`div`,{className:`lockerverse-form-skeleton__section-grid`,children:[u(`span`,{className:`lockerverse-form-skeleton__section-half`}),u(`span`,{className:`lockerverse-form-skeleton__section-half`})]})]})]},t)),d(`div`,{className:`lockerverse-form-skeleton__actions`,children:[r?u(`span`,{className:`lockerverse-form-skeleton__check-line`}):null,u(`span`,{className:`lockerverse-form-skeleton__button`})]})]})]})}const j=[{callingCode:`+1`,label:`๐Ÿ‡บ๐Ÿ‡ธ +1`,value:`US`},{callingCode:`+52`,label:`๐Ÿ‡ฒ๐Ÿ‡ฝ +52`,value:`MX`},{callingCode:`+380`,label:`๐Ÿ‡บ๐Ÿ‡ฆ +380`,value:`UA`},{callingCode:`+48`,label:`๐Ÿ‡ต๐Ÿ‡ฑ +48`,value:`PL`},{callingCode:`+1`,label:`๐Ÿ‡จ๐Ÿ‡ฆ +1`,value:`CA`},{callingCode:`+49`,label:`๐Ÿ‡ฉ๐Ÿ‡ช +49`,value:`DE`},{callingCode:`+44`,label:`๐Ÿ‡ฌ๐Ÿ‡ง +44`,value:`GB`},{callingCode:`+46`,label:`๐Ÿ‡ธ๐Ÿ‡ช +46`,value:`SE`},{callingCode:`+358`,label:`๐Ÿ‡ซ๐Ÿ‡ฎ +358`,value:`FI`},{callingCode:`+1`,label:`๐Ÿ‡ต๐Ÿ‡ท +1`,value:`PR`}];function M(e){if(e===`PAYMENT_WIDGET_PHONE_REQUIRED`||e===`SIGN_UP_WIDGET_PHONE_REQUIRED`)return n;if(e===`PAYMENT_WIDGET_PHONE_INVALID`||e===`SIGN_UP_WIDGET_PHONE_INVALID`)return t}function N(e){return j.find(t=>t.value===e)??j[0]}function P(e,t){let n=`${t}${t}`,r=e;for(;r.startsWith(n);)r=`${t}${r.slice(n.length)}`;return r}function F(t,n){let r=e(t);if(!r)return``;let i=N(n),a=P(r,i.callingCode);return a.startsWith(`+`)?a:`${i.callingCode}${a}`}export{C as a,S as c,A as i,_ as l,F as n,x as o,M as r,y as s,j as t,m as u};
1
+ import{i as e,n as t,r as n}from"./host-callback.js";import{jsx as r,jsxs as i}from"react/jsx-runtime";import{array as a,minLength as o,nonEmpty as s,pipe as c,safeParse as l,string as u,trim as d}from"valibot";const f=/^#([\da-f]{3}|[\da-f]{6})$/i,p=/^([\da-f]{3}|[\da-f]{6})$/i;function m(e){let t=e.trim();return p.test(t)?`#${t}`:t}function h(e){let t=f.exec(m(e));if(!t)return;let[,n]=t;if(!n)return;let r=n.length===3?Array.from(n,e=>`${e}${e}`).join(``):n;return[0,2,4].map(e=>Number.parseInt(r.slice(e,e+2),16))}function g([e,t,n]){let[r=0,i=0,a=0]=[e,t,n].map((e=0)=>{let t=e/255;return t<=.04045?t/12.92:((t+.055)/1.055)**2.4});return .2126*r+.7152*i+.0722*a}function _(e){let t=h(e);if(!t)return;let n=g(t);return(n+.05)/.05>=1.05/(n+.05)?`#000`:`#fff`}function v(e){return e.type===`checkbox`?!1:e.type===`checkboxes`||e.type===`multi_select`?[]:``}function y(e){let t={};for(let n of e)t[n.id]=v(n);return t}function b(e){let t=l(u(),e);return t.success?t.output:``}function x(e,t){return e.map(e=>{let n=t[e.id];return e.type===`checkbox`?{fieldId:e.id,value:n===!0}:e.type===`checkboxes`||e.type===`multi_select`?{fieldId:e.id,value:Array.isArray(n)?n:[]}:{fieldId:e.id,value:b(n)}})}function S(e,t){let n={};for(let r of e){if(!r.required)continue;let e=`${r.label} is required.`,i=t[r.id];if(r.type===`checkbox`){i!==!0&&(n[r.id]=e);continue}let f=r.type===`checkboxes`||r.type===`multi_select`?l(c(a(u()),o(1,e)),i??[]):l(c(u(),d(),s(e)),b(i));f.success||(n[r.id]=f.issues[0]?.message??e)}return n}function C({choiceClassName:e,errorClassName:t,errors:n,fields:i,idPrefix:a,onChange:o,values:s}){return i.map(i=>r(w,{choiceClassName:e,error:n[i.id],errorClassName:t,field:i,idPrefix:a,onChange:e=>o({...s,[i.id]:e}),value:s[i.id]},i.id))}function w(e){let{field:t,idPrefix:n}=e,i=`${n}-custom-${t.id}`,a=`${i}-error`,o={...e,controlId:i,errorId:a};switch(t.type){case`checkbox`:return r(T,{...o,field:t});case`text`:case`textarea`:return r(D,{...o,field:t});case`select`:case`multi_select`:return r(O,{...o,field:t});case`radio`:case`checkboxes`:return r(k,{...o,field:t});default:return null}}function T({choiceClassName:e,controlId:t,error:n,errorClassName:a,errorId:o,field:s,onChange:c,value:l}){return i(`label`,{className:e,htmlFor:t,children:[r(`input`,{"aria-describedby":n?o:void 0,"aria-invalid":n?`true`:void 0,checked:l===!0,id:t,name:`custom:${s.id}`,onChange:e=>c(e.currentTarget.checked),required:s.required,type:`checkbox`}),r(`span`,{children:s.label}),r(E,{className:a,error:n,id:o})]})}function E({className:e,error:t,id:n}){return t?r(`span`,{className:e,id:n,role:`alert`,children:t}):null}function D({controlId:e,error:t,errorClassName:n,errorId:a,field:o,onChange:s,value:c}){let l={"aria-describedby":t?a:void 0,"aria-invalid":t?`true`:void 0,id:e,name:`custom:${o.id}`,onChange:e=>s(e.currentTarget.value),required:o.required,value:b(c)};return i(`label`,{htmlFor:e,children:[r(`span`,{children:o.label}),o.type===`textarea`?r(`textarea`,{...l}):r(`input`,{...l}),r(E,{className:n,error:t,id:a})]})}function O({controlId:e,error:t,errorClassName:n,errorId:a,field:o,onChange:s,value:c}){return i(`label`,{htmlFor:e,children:[r(`span`,{children:o.label}),i(`select`,{"aria-describedby":t?a:void 0,"aria-invalid":t?`true`:void 0,id:e,multiple:o.type===`multi_select`,name:`custom:${o.id}`,onChange:e=>s(o.type===`multi_select`?[...e.currentTarget.selectedOptions].map(e=>e.value):e.currentTarget.value),required:o.required,value:c===!0||c===!1?``:c??(o.type===`multi_select`?[]:``),children:[o.type===`select`?r(`option`,{value:``,children:`Selectโ€ฆ`}):null,o.options.map(e=>r(`option`,{value:e.id,children:e.label},e.id))]}),r(E,{className:n,error:t,id:a})]})}function k({choiceClassName:e,controlId:t,error:n,errorClassName:a,errorId:o,field:s,onChange:c,value:l}){let u=Array.isArray(l)?l:[];return i(`fieldset`,{"aria-describedby":n?o:void 0,"aria-invalid":n?`true`:void 0,children:[r(`legend`,{children:s.label}),s.options.map((n,a)=>i(`label`,{className:e,children:[r(`input`,{checked:Array.isArray(l)?l.includes(n.id):l===n.id,id:`${t}-${a}`,name:`custom:${s.id}`,onChange:e=>{if(s.type===`radio`){c(n.id);return}c(e.currentTarget.checked?[...u,n.id]:u.filter(e=>e!==n.id))},required:s.required&&s.type===`radio`,type:s.type===`radio`?`radio`:`checkbox`,value:n.id}),r(`span`,{children:n.label})]},n.id)),r(E,{className:a,error:n,id:o})]})}function A({fieldCount:e,label:t,sectionCount:n=0,showCheckbox:a=!1}){return i(`div`,{className:`lockerverse-form-skeleton__loading`,children:[r(`span`,{className:`lockerverse-form-skeleton__sr-only`,role:`status`,children:t}),i(`div`,{"aria-hidden":`true`,className:`lockerverse-form-skeleton`,children:[i(`div`,{className:`lockerverse-form-skeleton__branding`,children:[r(`span`,{className:`lockerverse-form-skeleton__avatar`}),r(`span`,{className:`lockerverse-form-skeleton__community`})]}),r(`div`,{className:`lockerverse-form-skeleton__fields`,children:Array.from({length:e},(e,t)=>i(`div`,{className:`lockerverse-form-skeleton__field`,children:[r(`span`,{className:`lockerverse-form-skeleton__label`}),r(`span`,{className:`lockerverse-form-skeleton__input`})]},t))}),Array.from({length:n},(e,t)=>i(`div`,{className:`lockerverse-form-skeleton__section`,children:[r(`span`,{className:`lockerverse-form-skeleton__section-label`}),i(`div`,{className:`lockerverse-form-skeleton__section-content`,children:[r(`span`,{className:`lockerverse-form-skeleton__section-full`}),i(`div`,{className:`lockerverse-form-skeleton__section-grid`,children:[r(`span`,{className:`lockerverse-form-skeleton__section-half`}),r(`span`,{className:`lockerverse-form-skeleton__section-half`})]})]})]},t)),i(`div`,{className:`lockerverse-form-skeleton__actions`,children:[a?r(`span`,{className:`lockerverse-form-skeleton__check-line`}):null,r(`span`,{className:`lockerverse-form-skeleton__button`})]})]})]})}const j=[{callingCode:`+1`,label:`๐Ÿ‡บ๐Ÿ‡ธ +1`,value:`US`},{callingCode:`+52`,label:`๐Ÿ‡ฒ๐Ÿ‡ฝ +52`,value:`MX`},{callingCode:`+380`,label:`๐Ÿ‡บ๐Ÿ‡ฆ +380`,value:`UA`},{callingCode:`+48`,label:`๐Ÿ‡ต๐Ÿ‡ฑ +48`,value:`PL`},{callingCode:`+1`,label:`๐Ÿ‡จ๐Ÿ‡ฆ +1`,value:`CA`},{callingCode:`+49`,label:`๐Ÿ‡ฉ๐Ÿ‡ช +49`,value:`DE`},{callingCode:`+44`,label:`๐Ÿ‡ฌ๐Ÿ‡ง +44`,value:`GB`},{callingCode:`+46`,label:`๐Ÿ‡ธ๐Ÿ‡ช +46`,value:`SE`},{callingCode:`+358`,label:`๐Ÿ‡ซ๐Ÿ‡ฎ +358`,value:`FI`},{callingCode:`+1`,label:`๐Ÿ‡ต๐Ÿ‡ท +1`,value:`PR`}];function M(e){if(e===`PAYMENT_WIDGET_PHONE_REQUIRED`||e===`SIGN_UP_WIDGET_PHONE_REQUIRED`)return n;if(e===`PAYMENT_WIDGET_PHONE_INVALID`||e===`SIGN_UP_WIDGET_PHONE_INVALID`)return t}function N(e){return j.find(t=>t.value===e)??j[0]}function P(e,t){let n=`${t}${t}`,r=e;for(;r.startsWith(n);)r=`${t}${r.slice(n.length)}`;return r}function F(t,n){let r=e(t);if(!r)return``;let i=N(n),a=P(r,i.callingCode);return a.startsWith(`+`)?a:`${i.callingCode}${a}`}export{C as a,S as c,A as i,_ as l,F as n,x as o,M as r,y as s,j as t,m as u};
2
2
  //# sourceMappingURL=phone.js.map
package/dist/signup.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a as e,c as t,o as n,s as r,t as i}from"./host-callback.js";import{t as a}from"./immutable-resource-identity.js";import{a as o,c as s,i as c,l,n as u,o as d,r as f,s as p,t as m,u as h}from"./phone.js";import{useCallback as g,useEffect as _,useId as v,useRef as y,useState as b}from"react";import{check as x,nonEmpty as S,nullable as C,object as w,pipe as T,regex as E,safeParse as D,string as O,transform as k,trim as A}from"valibot";import{jsx as j,jsxs as M}from"react/jsx-runtime";import{createLockerverseSignupClient as N}from"@lockerverse/sdk/signup";const P=`lockerverse-signup-google-places`,F=[`premise`,`subpremise`,`street_address`,`route`];let I=null;function L(e){let t=window;if(t.google?.maps?.importLibrary)return;t.google||={};let n=t.google;n.maps||={};let r=n.maps,i=null;r.importLibrary=n=>(i||=new Promise((t,i)=>{let a=document.getElementById(P);if(r.__lockerverseSignupReady=t,a){a.addEventListener(`error`,()=>i(Error(`Unable to load Google Places.`)),{once:!0});return}let o=document.createElement(`script`),s=new URLSearchParams({callback:`google.maps.__lockerverseSignupReady`,key:e,libraries:n,v:`weekly`});o.async=!0,o.id=P,o.src=`https://maps.googleapis.com/maps/api/js?${s}`,o.onerror=()=>i(Error(`Unable to load Google Places.`)),document.head.append(o)}),i.then(()=>{let e=t.google?.maps?.importLibrary;if(!e)throw Error(`Unable to load Google Places.`);return e(n)}).catch(e=>{throw i=null,document.getElementById(P)?.remove(),e}))}function R(e){return I||=(async()=>{try{L(e);let t=window.google?.maps?.importLibrary;if(!t)throw Error(`Unable to load Google Places.`);return await t(`places`)}catch(e){throw I=null,e}})(),I}function z(e,t,n=`longText`){return e.find(e=>e.types.includes(t))?.[n]??``}function ee(e,t){let n=t.addressComponents??[],r=[z(n,`street_number`),z(n,`route`)].filter(Boolean).join(` `);return{...e,city:z(n,`locality`)||z(n,`postal_town`)||z(n,`sublocality_level_1`),country:z(n,`country`,`shortText`)||`US`,line1:r||t.formattedAddress?.split(`,`)[0]||``,line2:z(n,`subpremise`),postalCode:[z(n,`postal_code`),z(n,`postal_code_suffix`)].filter(Boolean).join(`-`),state:z(n,`administrative_area_level_1`,`shortText`)}}function te({apiKey:e,errorId:t,invalid:n,onChange:r,required:i,value:a}){let o=v(),s=`${o}-suggestions`,[c,l]=b(-1),[u,d]=b(!1),[f,p]=b(!1),[m,h]=b([]),g=y(0),x=y(0),S=y(null);_(()=>()=>{g.current+=1},[]),_(()=>{let t=x.current+1;x.current=t;let n=a.line1.trim();if(l(-1),p(!1),!(e&&u&&n.length>=3)){h([]);return}let r=window.setTimeout(async()=>{if(t===x.current){p(!0);try{let{AutocompleteSessionToken:r,AutocompleteSuggestion:i}=await R(e);S.current??=new r;let a=await i.fetchAutocompleteSuggestions({includedPrimaryTypes:F,includedRegionCodes:[`US`],input:n,region:`US`,sessionToken:S.current});t===x.current&&h(a.suggestions.flatMap(({placePrediction:e})=>e?[{id:e.placeId,label:e.mainText?.text??e.text.text,prediction:e,secondaryLabel:e.secondaryText?.text??``}]:[]))}catch{t===x.current&&h([])}finally{t===x.current&&p(!1)}}},250);return()=>{window.clearTimeout(r)}},[e,u,a.line1]);let C=e=>{g.current+=1,r({...a,...e})},w=async e=>{let t=g.current+1;g.current=t;let n=e.prediction.toPlace();try{if(await n.fetchFields({fields:[`addressComponents`,`formattedAddress`]}),t!==g.current)return;r(ee(a,n)),S.current=null,h([]),l(-1),d(!1)}catch{if(t!==g.current)return;h([]),l(-1)}};return M(`fieldset`,{"aria-describedby":n?t:void 0,"aria-invalid":n?`true`:void 0,className:`lockerverse-signup__address`,children:[j(`legend`,{children:`Address`}),M(`label`,{htmlFor:`${o}-line1`,children:[j(`span`,{children:`Street address`}),M(`div`,{className:`lockerverse-signup__address-search`,children:[j(`input`,{"aria-activedescendant":c>=0?`${o}-suggestion-${c}`:void 0,"aria-autocomplete":`list`,"aria-controls":s,"aria-describedby":n?t:void 0,"aria-expanded":u&&m.length>0,"aria-invalid":n?`true`:void 0,autoComplete:`street-address`,id:`${o}-line1`,name:`address.line1`,onBlur:()=>window.setTimeout(()=>d(!1),120),onChange:e=>C({line1:e.currentTarget.value}),onFocus:()=>d(!0),onKeyDown:e=>{if(e.key===`Escape`){e.preventDefault(),h([]),l(-1);return}if(m.length===0)return;if(e.key===`ArrowDown`){e.preventDefault(),l(e=>e<m.length-1?e+1:0);return}if(e.key===`ArrowUp`){e.preventDefault(),l(e=>e>0?e-1:m.length-1);return}let t=m[c];e.key===`Enter`&&t&&(e.preventDefault(),w(t).catch(()=>void 0))},required:i,role:`combobox`,value:a.line1}),f?j(`span`,{className:`lockerverse-signup__address-loading`,children:`Searchingโ€ฆ`}):null,m.length>0?j(`div`,{className:`lockerverse-signup__address-suggestions`,id:s,role:`listbox`,children:m.map((e,t)=>M(`button`,{"aria-selected":c===t,id:`${o}-suggestion-${t}`,onMouseDown:t=>{t.preventDefault(),w(e).catch(()=>void 0)},role:`option`,type:`button`,children:[j(`strong`,{children:e.label}),e.secondaryLabel?j(`span`,{children:e.secondaryLabel}):null]},e.id))}):null]})]}),M(`label`,{htmlFor:`${o}-line2`,children:[j(`span`,{children:`Apartment, suite, or unit`}),j(`input`,{autoComplete:`address-line2`,id:`${o}-line2`,onChange:e=>C({line2:e.currentTarget.value}),placeholder:`Optional`,value:a.line2??``})]}),M(`div`,{className:`lockerverse-signup__address-row`,children:[M(`label`,{htmlFor:`${o}-city`,children:[j(`span`,{children:`City`}),j(`input`,{autoComplete:`address-level2`,id:`${o}-city`,onChange:e=>C({city:e.currentTarget.value}),required:i,value:a.city})]}),M(`label`,{htmlFor:`${o}-state`,children:[j(`span`,{children:`State`}),j(`input`,{autoComplete:`address-level1`,id:`${o}-state`,onChange:e=>C({state:e.currentTarget.value}),required:i,value:a.state})]})]}),M(`div`,{className:`lockerverse-signup__address-row`,children:[M(`label`,{htmlFor:`${o}-postal`,children:[j(`span`,{children:`Postal code`}),j(`input`,{autoComplete:`postal-code`,id:`${o}-postal`,onChange:e=>C({postalCode:e.currentTarget.value}),required:i,value:a.postalCode})]}),M(`label`,{htmlFor:`${o}-country`,children:[j(`span`,{children:`Country`}),j(`input`,{autoComplete:`country`,id:`${o}-country`,maxLength:2,onChange:e=>C({country:e.currentTarget.value.toUpperCase()}),required:i,value:a.country})]})]})]})}const ne=/^[1-9]\d*$/,re=/^(?:$|[1-9]\d*)$/,B=T(O(),A(),S(`Name is required.`)),V=T(O(),A(),E(re,`Guest count must be a positive whole number.`),k(e=>e?Number(e):null),x(e=>e===null||Number.isSafeInteger(e),`Guest count must be a positive whole number.`)),H=T(O(),A(),S(`Guest count is required.`),E(ne,`Guest count must be a positive whole number.`),k(Number),x(e=>Number.isSafeInteger(e),`Guest count must be a positive whole number.`)),U=w({city:O(),country:O(),line1:O(),line2:C(O()),postalCode:O(),state:O()}),W=T(U,x(J,`Complete the address.`)),G={city:``,country:`US`,line1:``,line2:null,postalCode:``,state:``},K=T(U,x(e=>q(e)||J(e),`Complete the address or leave it blank.`));function q(e){return![e.city,e.line1,e.line2,e.postalCode,e.state].some(e=>e?.trim())}function J(e){return[e.city,e.country,e.line1,e.postalCode,e.state].every(e=>e.trim())}function Y(i,a){let o={...a,address:i.fields.address.enabled?a.address:G,email:i.fields.email.enabled?a.email:``,participantCount:i.fields.participantCount.enabled?a.participantCount:``,phone:i.fields.phone.enabled?u(a.phone,a.phoneCountry):``},c=w({address:i.fields.address.enabled&&i.fields.address.required?W:K,email:i.fields.email.enabled&&i.fields.email.required?r:e,name:B,participantCount:i.fields.participantCount.enabled&&i.fields.participantCount.required?H:V,phone:i.fields.phone.enabled&&i.fields.phone.required?t:n}),l=D(c,o),d=s(i.customFields,a.customFields);if(!l.success)for(let e of l.issues){let t=e.path?.[0]?.key,n=[`address`,`email`,`name`,`participantCount`,`phone`].find(e=>e===t);n&&!d[n]&&(d[n]=e.message)}return l.success?{errors:d,value:{...a,...l.output}}:{errors:d,value:null}}const ie={city:``,country:`US`,line1:``,line2:``,postalCode:``,state:``};function ae(e){return{address:ie,customFields:p(e.customFields),email:``,honeypot:``,name:``,participantCount:``,phone:``,phoneCountry:`US`}}function X({error:e,id:t}){return e?j(`span`,{className:`lockerverse-signup__field-error`,id:t,role:`alert`,children:e}):null}function Z(e,t){let n=e.elements.namedItem(t);if(n instanceof HTMLElement)return!n.matches(`:disabled`)&&(n.focus(),!0);if(n instanceof RadioNodeList){let e=Array.from(n).find(e=>e instanceof HTMLElement&&!e.matches(`:disabled`));return e?.focus(),!!e}return!1}function oe(e,t){let n=[[`name`,`name`],[`email`,`email`],[`phone`,`phone`],[`participantCount`,`participantCount`],[`address`,`address.line1`]];for(let[r,i]of n)if(t[r]&&Z(e,i))return;let r=new Set(n.map(([e])=>e)),i=Object.keys(t).find(e=>!r.has(e));i&&Z(e,`custom:${i}`)}function Q({children:e,loading:t=!1,status:n=!1,viewProps:r}){let{branding:i,className:a,googlePlacesApiKey:o,onSignupComplete:s,style:c,theme:u=`dark`,...d}=r,f=h(c?.[`--lockerverse-accent`]??c?.[`--lockerverse-signup-accent`]??i?.accentColor??`#5751f2`),p={...c};if((c?.[`--lockerverse-accent`]!==void 0||c?.[`--lockerverse-signup-accent`]!==void 0||i?.accentColor)&&(p[`--lockerverse-accent`]=f),c?.[`--lockerverse-accent-contrast`]===void 0&&c?.[`--lockerverse-signup-accent-contrast`]===void 0){let e=l(f);e&&(p[`--lockerverse-accent-contrast`]=e)}return j(`section`,{...d,...t?{"aria-busy":!0}:{},className:[`lockerverse-signup`,n?`lockerverse-signup__status`:null,a].filter(Boolean).join(` `),"data-lockerverse-theme":u,style:p,children:e})}function se({client:e,signup:t,...n}){let{branding:r,googlePlacesApiKey:a,onSignupComplete:s}=n,c=v(),l=y(!0),u=y(null),p=y(!1),[h,g]=b({phase:`idle`}),[x,S]=b(()=>ae(t)),[C,w]=b({}),[T,E]=b();if(_(()=>(l.current=!0,()=>{l.current=!1}),[]),_(()=>{h.phase!==`submitting`&&C.phone&&u.current?.focus()},[C.phone,h.phase]),!t.isActive)return M(Q,{status:!0,viewProps:n,children:[j(`h1`,{children:`Signup closed`}),j(`p`,{children:`This signup is not accepting submissions.`})]});if(h.phase===`submitted`)return M(Q,{status:!0,viewProps:n,children:[r?j($,{branding:r}):null,j(`span`,{"aria-hidden":`true`,className:`lockerverse-signup__success`,children:`โœ“`}),j(`h1`,{children:`Thank you`}),j(`p`,{children:`Your signup has been received.`})]});let D=e=>S(t=>({...t,...e})),O=h.phase===`submitting`,k=h.phase===`submit_error`?h.error.message:void 0;return M(Q,{viewProps:n,children:[t.coverImageUrl?j(`img`,{alt:``,className:`lockerverse-signup__cover`,height:192,src:t.coverImageUrl,width:440}):null,r?j($,{branding:r}):null,M(`header`,{children:[t.title?.trim()?j(`h1`,{children:t.title}):null,t.description?j(`p`,{children:t.description}):null]}),M(`form`,{noValidate:!0,onSubmit:async n=>{if(n.preventDefault(),p.current)return;let r=Y(t,x);if(w(r.errors),Object.keys(r.errors).length>0||!r.value){let e=n.currentTarget;queueMicrotask(()=>oe(e,r.errors));return}let a=r.value,o={address:t.fields.address.enabled&&!q(a.address)?a.address:null,answers:d(t.customFields,a.customFields),email:t.fields.email.enabled&&a.email||null,honeypot:a.honeypot,name:a.name,participantCount:t.fields.participantCount.enabled?a.participantCount:null,phone:t.fields.phone.enabled&&a.phone||null},c=JSON.stringify(o),u=T?.payloadKey===c?T.reference:globalThis.crypto.randomUUID(),m;p.current=!0,g({phase:`submitting`});try{m=await e.submit(o,{submissionReference:u})}catch(e){if(!l.current)return;let t=e,n=f(t.serverCode);if(n){w(e=>({...e,phone:n})),g({phase:`idle`}),E(void 0);return}g({error:t,phase:`submit_error`}),t.recoveryRecommended?E({payloadKey:c,reference:u}):E(void 0);return}finally{p.current=!1}l.current&&(E(void 0),g({phase:`submitted`}),i(s,m))},children:[j(`input`,{"aria-hidden":`true`,autoComplete:`off`,className:`lockerverse-signup__honeypot`,onChange:e=>D({honeypot:e.currentTarget.value}),tabIndex:-1,value:x.honeypot}),M(`div`,{className:`lockerverse-signup__fields`,children:[M(`label`,{htmlFor:`${c}-name`,children:[j(`span`,{children:`Name`}),j(`input`,{"aria-describedby":C.name?`${c}-name-error`:void 0,"aria-invalid":C.name?`true`:void 0,autoComplete:`name`,id:`${c}-name`,name:`name`,onChange:e=>D({name:e.currentTarget.value}),required:!0,value:x.name}),j(X,{error:C.name,id:`${c}-name-error`})]}),t.fields.email.enabled?M(`label`,{htmlFor:`${c}-email`,children:[j(`span`,{children:`Email`}),j(`input`,{"aria-describedby":C.email?`${c}-email-error`:void 0,"aria-invalid":C.email?`true`:void 0,autoComplete:`email`,id:`${c}-email`,name:`email`,onChange:e=>D({email:e.currentTarget.value}),required:t.fields.email.required,type:`email`,value:x.email}),j(X,{error:C.email,id:`${c}-email-error`})]}):null,t.fields.phone.enabled?M(`div`,{className:`lockerverse-signup__phone-field`,children:[j(`label`,{htmlFor:`${c}-phone`,children:j(`span`,{children:`Phone`})}),M(`div`,{className:`lockerverse-signup__phone-control`,children:[j(`select`,{"aria-label":`Phone number country`,name:`phoneCountry`,onChange:e=>{D({phoneCountry:e.currentTarget.value}),u.current?.focus()},value:x.phoneCountry,children:m.map(e=>j(`option`,{value:e.value,children:e.label},e.value))}),j(`input`,{"aria-describedby":C.phone?`${c}-phone-error`:void 0,"aria-invalid":C.phone?`true`:void 0,autoComplete:`tel`,id:`${c}-phone`,name:`phone`,onChange:e=>D({phone:e.currentTarget.value}),placeholder:`(201) 555-0123`,ref:u,required:t.fields.phone.required,type:`tel`,value:x.phone})]}),j(X,{error:C.phone,id:`${c}-phone-error`})]}):null,t.fields.participantCount.enabled?M(`label`,{htmlFor:`${c}-participant-count`,children:[j(`span`,{children:`Guest count`}),j(`input`,{"aria-describedby":C.participantCount?`${c}-participant-count-error`:void 0,"aria-invalid":C.participantCount?`true`:void 0,id:`${c}-participant-count`,min:1,name:`participantCount`,onChange:e=>D({participantCount:e.currentTarget.value}),required:t.fields.participantCount.required,type:`number`,value:x.participantCount}),j(X,{error:C.participantCount,id:`${c}-participant-count-error`})]}):null,t.fields.address.enabled?M(`div`,{className:`lockerverse-signup__field-group`,children:[j(te,{apiKey:a,errorId:C.address?`${c}-address-error`:void 0,invalid:!!C.address,onChange:e=>D({address:e}),required:t.fields.address.required,value:x.address}),j(X,{error:C.address,id:`${c}-address-error`})]}):null,j(o,{choiceClassName:`lockerverse-signup__choice`,errorClassName:`lockerverse-signup__field-error`,errors:C,fields:t.customFields,idPrefix:c,onChange:e=>D({customFields:e}),values:x.customFields})]}),k?M(`p`,{className:`lockerverse-signup__submit-error`,role:`alert`,children:[k,` Try again.`]}):null,j(`button`,{className:`lockerverse-signup__submit`,disabled:O,type:`submit`,children:O?`Submittingโ€ฆ`:`Submit`})]})]})}function ce({widget:e,...t}){return e.error?M(Q,{status:!0,viewProps:t,children:[j(`h1`,{children:`Signup unavailable`}),j(`p`,{role:`alert`,children:e.error.message}),j(`button`,{onClick:e.refresh,type:`button`,children:`Retry`})]}):e.loading||!e.signup?j(Q,{loading:!0,viewProps:t,children:j(c,{fieldCount:4,label:`Loading signupโ€ฆ`})}):j(se,{client:e.client,signup:e.signup,...t})}function $({branding:e}){return M(`div`,{className:`lockerverse-signup__branding`,children:[e.imageUrl?j(`img`,{alt:``,height:48,src:e.imageUrl,width:48}):null,j(`strong`,{children:e.name})]})}function le(e){let{onError:t}=e;a(`signup`,{apiBaseUrl:e.apiBaseUrl,communitySlug:e.communitySlug,environment:e.environment,slug:e.signupSlug});let n=y(t);n.current=t;let[r]=b(()=>{let t={...e,onError:e=>n.current?.(e)};return N(t)}),[i,o]=b(0),[s,c]=b({error:null,signup:null});_(()=>{let e=!0;return r.load().then(t=>{e&&c({error:null,signup:t})},t=>{e&&c({error:t,signup:null})}),()=>{e=!1}},[r,i]);let l=g(()=>{c({error:null,signup:null}),o(e=>e+1)},[]);return{client:r,error:s.error,loading:s.signup===null&&s.error===null,refresh:l,signup:s.signup}}export{ce as LockerverseSignup,le as useLockerverseSignup};
1
+ import{t as e}from"./immutable-resource-identity.js";import{a as t,c as n,o as r,s as i,t as a}from"./host-callback.js";import{a as o,c as s,i as c,l,n as u,o as d,r as f,s as p,t as m,u as h}from"./phone.js";import{useCallback as g,useEffect as _,useId as v,useRef as y,useState as b}from"react";import{jsx as x,jsxs as S}from"react/jsx-runtime";import{check as C,nonEmpty as w,nullable as T,object as E,pipe as D,regex as O,safeParse as k,string as A,transform as j,trim as M}from"valibot";import{createLockerverseSignupClient as ee}from"@lockerverse/sdk/signup";const N=`lockerverse-signup-google-places`,P=[`premise`,`subpremise`,`street_address`,`route`];let F=null;function I(e){let t=window;if(t.google?.maps?.importLibrary)return;t.google||={};let n=t.google;n.maps||={};let r=n.maps,i=null;r.importLibrary=n=>(i||=new Promise((t,i)=>{let a=document.getElementById(N);if(r.__lockerverseSignupReady=t,a){a.addEventListener(`error`,()=>i(Error(`Unable to load Google Places.`)),{once:!0});return}let o=document.createElement(`script`),s=new URLSearchParams({callback:`google.maps.__lockerverseSignupReady`,key:e,libraries:n,v:`weekly`});o.async=!0,o.id=N,o.src=`https://maps.googleapis.com/maps/api/js?${s}`,o.onerror=()=>i(Error(`Unable to load Google Places.`)),document.head.append(o)}),i.then(()=>{let e=t.google?.maps?.importLibrary;if(!e)throw Error(`Unable to load Google Places.`);return e(n)}).catch(e=>{throw i=null,document.getElementById(N)?.remove(),e}))}function L(e){return F||=(async()=>{try{I(e);let t=window.google?.maps?.importLibrary;if(!t)throw Error(`Unable to load Google Places.`);return await t(`places`)}catch(e){throw F=null,e}})(),F}function R(e,t,n=`longText`){return e.find(e=>e.types.includes(t))?.[n]??``}function z(e,t){let n=t.addressComponents??[],r=[R(n,`street_number`),R(n,`route`)].filter(Boolean).join(` `);return{...e,city:R(n,`locality`)||R(n,`postal_town`)||R(n,`sublocality_level_1`),country:R(n,`country`,`shortText`)||`US`,line1:r||t.formattedAddress?.split(`,`)[0]||``,line2:R(n,`subpremise`),postalCode:[R(n,`postal_code`),R(n,`postal_code_suffix`)].filter(Boolean).join(`-`),state:R(n,`administrative_area_level_1`,`shortText`)}}function B({apiKey:e,errorId:t,invalid:n,onChange:r,required:i,value:a}){let o=v(),s=`${o}-suggestions`,[c,l]=b(-1),[u,d]=b(!1),[f,p]=b(!1),[m,h]=b([]),g=y(0),C=y(0),w=y(null);_(()=>()=>{g.current+=1},[]),_(()=>{let t=C.current+1;C.current=t;let n=a.line1.trim();if(l(-1),p(!1),!(e&&u&&n.length>=3)){h([]);return}let r=window.setTimeout(async()=>{if(t===C.current){p(!0);try{let{AutocompleteSessionToken:r,AutocompleteSuggestion:i}=await L(e);w.current??=new r;let a=await i.fetchAutocompleteSuggestions({includedPrimaryTypes:P,includedRegionCodes:[`US`],input:n,region:`US`,sessionToken:w.current});t===C.current&&h(a.suggestions.flatMap(({placePrediction:e})=>e?[{id:e.placeId,label:e.mainText?.text??e.text.text,prediction:e,secondaryLabel:e.secondaryText?.text??``}]:[]))}catch{t===C.current&&h([])}finally{t===C.current&&p(!1)}}},250);return()=>{window.clearTimeout(r)}},[e,u,a.line1]);let T=e=>{g.current+=1,r({...a,...e})},E=async e=>{let t=g.current+1;g.current=t;let n=e.prediction.toPlace();try{if(await n.fetchFields({fields:[`addressComponents`,`formattedAddress`]}),t!==g.current)return;r(z(a,n)),w.current=null,h([]),l(-1),d(!1)}catch{if(t!==g.current)return;h([]),l(-1)}};return S(`fieldset`,{"aria-describedby":n?t:void 0,"aria-invalid":n?`true`:void 0,className:`lockerverse-signup__address`,children:[x(`legend`,{children:`Address`}),S(`label`,{htmlFor:`${o}-line1`,children:[x(`span`,{children:`Street address`}),S(`div`,{className:`lockerverse-signup__address-search`,children:[x(`input`,{"aria-activedescendant":c>=0?`${o}-suggestion-${c}`:void 0,"aria-autocomplete":`list`,"aria-controls":s,"aria-describedby":n?t:void 0,"aria-expanded":u&&m.length>0,"aria-invalid":n?`true`:void 0,autoComplete:`street-address`,id:`${o}-line1`,name:`address.line1`,onBlur:()=>window.setTimeout(()=>d(!1),120),onChange:e=>T({line1:e.currentTarget.value}),onFocus:()=>d(!0),onKeyDown:e=>{if(e.key===`Escape`){e.preventDefault(),h([]),l(-1);return}if(m.length===0)return;if(e.key===`ArrowDown`){e.preventDefault(),l(e=>e<m.length-1?e+1:0);return}if(e.key===`ArrowUp`){e.preventDefault(),l(e=>e>0?e-1:m.length-1);return}let t=m[c];e.key===`Enter`&&t&&(e.preventDefault(),E(t).catch(()=>void 0))},required:i,role:`combobox`,value:a.line1}),f?x(`span`,{className:`lockerverse-signup__address-loading`,children:`Searchingโ€ฆ`}):null,m.length>0?x(`div`,{className:`lockerverse-signup__address-suggestions`,id:s,role:`listbox`,children:m.map((e,t)=>S(`button`,{"aria-selected":c===t,id:`${o}-suggestion-${t}`,onMouseDown:t=>{t.preventDefault(),E(e).catch(()=>void 0)},role:`option`,type:`button`,children:[x(`strong`,{children:e.label}),e.secondaryLabel?x(`span`,{children:e.secondaryLabel}):null]},e.id))}):null]})]}),S(`label`,{htmlFor:`${o}-line2`,children:[x(`span`,{children:`Apartment, suite, or unit`}),x(`input`,{autoComplete:`address-line2`,id:`${o}-line2`,onChange:e=>T({line2:e.currentTarget.value}),placeholder:`Optional`,value:a.line2??``})]}),S(`div`,{className:`lockerverse-signup__address-row`,children:[S(`label`,{htmlFor:`${o}-city`,children:[x(`span`,{children:`City`}),x(`input`,{autoComplete:`address-level2`,id:`${o}-city`,onChange:e=>T({city:e.currentTarget.value}),required:i,value:a.city})]}),S(`label`,{htmlFor:`${o}-state`,children:[x(`span`,{children:`State`}),x(`input`,{autoComplete:`address-level1`,id:`${o}-state`,onChange:e=>T({state:e.currentTarget.value}),required:i,value:a.state})]})]}),S(`div`,{className:`lockerverse-signup__address-row`,children:[S(`label`,{htmlFor:`${o}-postal`,children:[x(`span`,{children:`Postal code`}),x(`input`,{autoComplete:`postal-code`,id:`${o}-postal`,onChange:e=>T({postalCode:e.currentTarget.value}),required:i,value:a.postalCode})]}),S(`label`,{htmlFor:`${o}-country`,children:[x(`span`,{children:`Country`}),x(`input`,{autoComplete:`country`,id:`${o}-country`,maxLength:2,onChange:e=>T({country:e.currentTarget.value.toUpperCase()}),required:i,value:a.country})]})]})]})}const V=/^[1-9]\d*$/,H=/^(?:$|[1-9]\d*)$/,U=D(A(),M(),w(`Name is required.`)),W=D(A(),M(),O(H,`Guest count must be a positive whole number.`),j(e=>e?Number(e):null),C(e=>e===null||Number.isSafeInteger(e),`Guest count must be a positive whole number.`)),G=D(A(),M(),w(`Guest count is required.`),O(V,`Guest count must be a positive whole number.`),j(Number),C(e=>Number.isSafeInteger(e),`Guest count must be a positive whole number.`)),K=E({city:A(),country:A(),line1:A(),line2:T(A()),postalCode:A(),state:A()}),q=D(K,C(Y,`Complete the address.`)),te={city:``,country:`US`,line1:``,line2:null,postalCode:``,state:``},ne=D(K,C(e=>J(e)||Y(e),`Complete the address or leave it blank.`));function J(e){return![e.city,e.line1,e.line2,e.postalCode,e.state].some(e=>e?.trim())}function Y(e){return[e.city,e.country,e.line1,e.postalCode,e.state].every(e=>e.trim())}function re(e,a){let o={...a,address:e.fields.address.enabled?a.address:te,email:e.fields.email.enabled?a.email:``,participantCount:e.fields.participantCount.enabled?a.participantCount:``,phone:e.fields.phone.enabled?u(a.phone,a.phoneCountry):``},c=E({address:e.fields.address.enabled&&e.fields.address.required?q:ne,email:e.fields.email.enabled&&e.fields.email.required?i:t,name:U,participantCount:e.fields.participantCount.enabled&&e.fields.participantCount.required?G:W,phone:e.fields.phone.enabled&&e.fields.phone.required?n:r}),l=k(c,o),d=s(e.customFields,a.customFields);if(!l.success)for(let e of l.issues){let t=e.path?.[0]?.key,n=[`address`,`email`,`name`,`participantCount`,`phone`].find(e=>e===t);n&&!d[n]&&(d[n]=e.message)}return l.success?{errors:d,value:{...a,...l.output}}:{errors:d,value:null}}const ie={city:``,country:`US`,line1:``,line2:``,postalCode:``,state:``};function ae(e){return{address:ie,customFields:p(e.customFields),email:``,honeypot:``,name:``,participantCount:``,phone:``,phoneCountry:`US`}}function X({error:e,id:t}){return e?x(`span`,{className:`lockerverse-signup__field-error`,id:t,role:`alert`,children:e}):null}function Z(e,t){let n=e.elements.namedItem(t);if(n instanceof HTMLElement)return!n.matches(`:disabled`)&&(n.focus(),!0);if(n instanceof RadioNodeList){let e=Array.from(n).find(e=>e instanceof HTMLElement&&!e.matches(`:disabled`));return e?.focus(),!!e}return!1}function oe(e,t){let n=[[`name`,`name`],[`email`,`email`],[`phone`,`phone`],[`participantCount`,`participantCount`],[`address`,`address.line1`]];for(let[r,i]of n)if(t[r]&&Z(e,i))return;let r=new Set(n.map(([e])=>e)),i=Object.keys(t).find(e=>!r.has(e));i&&Z(e,`custom:${i}`)}function Q({children:e,loading:t=!1,status:n=!1,viewProps:r}){let{branding:i,className:a,googlePlacesApiKey:o,onSignupComplete:s,style:c,theme:u=`dark`,...d}=r,f=h(c?.[`--lockerverse-accent`]??c?.[`--lockerverse-signup-accent`]??i?.accentColor??`#5751f2`),p={...c};if((c?.[`--lockerverse-accent`]!==void 0||c?.[`--lockerverse-signup-accent`]!==void 0||i?.accentColor)&&(p[`--lockerverse-accent`]=f),c?.[`--lockerverse-accent-contrast`]===void 0&&c?.[`--lockerverse-signup-accent-contrast`]===void 0){let e=l(f);e&&(p[`--lockerverse-accent-contrast`]=e)}return x(`section`,{...d,...t?{"aria-busy":!0}:{},className:[`lockerverse-signup`,n?`lockerverse-signup__status`:null,a].filter(Boolean).join(` `),"data-lockerverse-theme":u,style:p,children:e})}function se({client:e,signup:t,...n}){let{branding:r,googlePlacesApiKey:i,onSignupComplete:s}=n,c=v(),l=y(!0),u=y(null),p=y(!1),[h,g]=b({phase:`idle`}),[C,w]=b(()=>ae(t)),[T,E]=b({}),[D,O]=b();if(_(()=>(l.current=!0,()=>{l.current=!1}),[]),_(()=>{h.phase!==`submitting`&&T.phone&&u.current?.focus()},[T.phone,h.phase]),!t.isActive)return S(Q,{status:!0,viewProps:n,children:[x(`h1`,{children:`Signup closed`}),x(`p`,{children:`This signup is not accepting submissions.`})]});if(h.phase===`submitted`)return S(Q,{status:!0,viewProps:n,children:[r?x($,{branding:r}):null,x(`span`,{"aria-hidden":`true`,className:`lockerverse-signup__success`,children:`โœ“`}),x(`h1`,{children:`Thank you`}),x(`p`,{children:`Your signup has been received.`})]});let k=e=>w(t=>({...t,...e})),A=h.phase===`submitting`,j=h.phase===`submit_error`?h.error.message:void 0;return S(Q,{viewProps:n,children:[t.coverImageUrl?x(`img`,{alt:``,className:`lockerverse-signup__cover`,height:192,src:t.coverImageUrl,width:440}):null,r?x($,{branding:r}):null,S(`header`,{children:[t.title?.trim()?x(`h1`,{children:t.title}):null,t.description?x(`p`,{children:t.description}):null]}),S(`form`,{noValidate:!0,onSubmit:async n=>{if(n.preventDefault(),p.current)return;let r=re(t,C);if(E(r.errors),Object.keys(r.errors).length>0||!r.value){let e=n.currentTarget;queueMicrotask(()=>oe(e,r.errors));return}let i=r.value,o={address:t.fields.address.enabled&&!J(i.address)?i.address:null,answers:d(t.customFields,i.customFields),email:t.fields.email.enabled&&i.email||null,honeypot:i.honeypot,name:i.name,participantCount:t.fields.participantCount.enabled?i.participantCount:null,phone:t.fields.phone.enabled&&i.phone||null},c=JSON.stringify(o),u=D?.payloadKey===c?D.reference:globalThis.crypto.randomUUID(),m;p.current=!0,g({phase:`submitting`});try{m=await e.submit(o,{submissionReference:u})}catch(e){if(!l.current)return;let t=e,n=f(t.serverCode);if(n){E(e=>({...e,phone:n})),g({phase:`idle`}),O(void 0);return}g({error:t,phase:`submit_error`}),t.recoveryRecommended?O({payloadKey:c,reference:u}):O(void 0);return}finally{p.current=!1}l.current&&(O(void 0),g({phase:`submitted`}),a(s,m))},children:[x(`input`,{"aria-hidden":`true`,autoComplete:`off`,className:`lockerverse-signup__honeypot`,onChange:e=>k({honeypot:e.currentTarget.value}),tabIndex:-1,value:C.honeypot}),S(`div`,{className:`lockerverse-signup__fields`,children:[S(`label`,{htmlFor:`${c}-name`,children:[x(`span`,{children:`Name`}),x(`input`,{"aria-describedby":T.name?`${c}-name-error`:void 0,"aria-invalid":T.name?`true`:void 0,autoComplete:`name`,id:`${c}-name`,name:`name`,onChange:e=>k({name:e.currentTarget.value}),required:!0,value:C.name}),x(X,{error:T.name,id:`${c}-name-error`})]}),t.fields.email.enabled?S(`label`,{htmlFor:`${c}-email`,children:[x(`span`,{children:`Email`}),x(`input`,{"aria-describedby":T.email?`${c}-email-error`:void 0,"aria-invalid":T.email?`true`:void 0,autoComplete:`email`,id:`${c}-email`,name:`email`,onChange:e=>k({email:e.currentTarget.value}),required:t.fields.email.required,type:`email`,value:C.email}),x(X,{error:T.email,id:`${c}-email-error`})]}):null,t.fields.phone.enabled?S(`div`,{className:`lockerverse-signup__phone-field`,children:[x(`label`,{htmlFor:`${c}-phone`,children:x(`span`,{children:`Phone`})}),S(`div`,{className:`lockerverse-signup__phone-control`,children:[x(`select`,{"aria-label":`Phone number country`,name:`phoneCountry`,onChange:e=>{k({phoneCountry:e.currentTarget.value}),u.current?.focus()},value:C.phoneCountry,children:m.map(e=>x(`option`,{value:e.value,children:e.label},e.value))}),x(`input`,{"aria-describedby":T.phone?`${c}-phone-error`:void 0,"aria-invalid":T.phone?`true`:void 0,autoComplete:`tel`,id:`${c}-phone`,name:`phone`,onChange:e=>k({phone:e.currentTarget.value}),placeholder:`(201) 555-0123`,ref:u,required:t.fields.phone.required,type:`tel`,value:C.phone})]}),x(X,{error:T.phone,id:`${c}-phone-error`})]}):null,t.fields.participantCount.enabled?S(`label`,{htmlFor:`${c}-participant-count`,children:[x(`span`,{children:`Guest count`}),x(`input`,{"aria-describedby":T.participantCount?`${c}-participant-count-error`:void 0,"aria-invalid":T.participantCount?`true`:void 0,id:`${c}-participant-count`,min:1,name:`participantCount`,onChange:e=>k({participantCount:e.currentTarget.value}),required:t.fields.participantCount.required,type:`number`,value:C.participantCount}),x(X,{error:T.participantCount,id:`${c}-participant-count-error`})]}):null,t.fields.address.enabled?S(`div`,{className:`lockerverse-signup__field-group`,children:[x(B,{apiKey:i,errorId:T.address?`${c}-address-error`:void 0,invalid:!!T.address,onChange:e=>k({address:e}),required:t.fields.address.required,value:C.address}),x(X,{error:T.address,id:`${c}-address-error`})]}):null,x(o,{choiceClassName:`lockerverse-signup__choice`,errorClassName:`lockerverse-signup__field-error`,errors:T,fields:t.customFields,idPrefix:c,onChange:e=>k({customFields:e}),values:C.customFields})]}),j?S(`p`,{className:`lockerverse-signup__submit-error`,role:`alert`,children:[j,` Try again.`]}):null,x(`button`,{className:`lockerverse-signup__submit`,disabled:A,type:`submit`,children:A?`Submittingโ€ฆ`:`Submit`})]})]})}function ce({widget:e,...t}){return e.error?S(Q,{status:!0,viewProps:t,children:[x(`h1`,{children:`Signup unavailable`}),x(`p`,{role:`alert`,children:e.error.message}),x(`button`,{onClick:e.refresh,type:`button`,children:`Retry`})]}):e.loading||!e.signup?x(Q,{loading:!0,viewProps:t,children:x(c,{fieldCount:4,label:`Loading signupโ€ฆ`})}):x(se,{client:e.client,signup:e.signup,...t})}function $({branding:e}){return S(`div`,{className:`lockerverse-signup__branding`,children:[e.imageUrl?x(`img`,{alt:``,height:48,src:e.imageUrl,width:48}):null,x(`strong`,{children:e.name})]})}function le(t){let{onError:n}=t;e(`signup`,{apiBaseUrl:t.apiBaseUrl,communitySlug:t.communitySlug,environment:t.environment,slug:t.signupSlug});let r=y(n);r.current=n;let[i]=b(()=>{let e={...t,onError:e=>r.current?.(e)};return ee(e)}),[a,o]=b(0),[s,c]=b({error:null,signup:null});_(()=>{let e=!0;return i.load().then(t=>{e&&c({error:null,signup:t})},t=>{e&&c({error:t,signup:null})}),()=>{e=!1}},[i,a]);let l=g(()=>{c({error:null,signup:null}),o(e=>e+1)},[]);return{client:i,error:s.error,loading:s.signup===null&&s.error===null,refresh:l,signup:s.signup}}export{ce as LockerverseSignup,le as useLockerverseSignup};
2
2
  //# sourceMappingURL=signup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"signup.js","names":["googleWindow"],"sources":["../src/signup-address-field.tsx","../src/signup-validation.ts","../src/lockerverse-signup.tsx","../src/use-lockerverse-signup.ts"],"sourcesContent":["import { type KeyboardEvent, useEffect, useId, useRef, useState } from \"react\";\nimport type { SignupAddressValues } from \"./signup-validation.ts\";\n\ntype GoogleAddressComponent = {\n longText?: string;\n shortText?: string;\n types: string[];\n};\n\ntype GoogleSessionToken = Record<never, never>;\n\ntype GooglePlace = {\n addressComponents?: GoogleAddressComponent[];\n formattedAddress?: string;\n fetchFields: (options: { fields: string[] }) => Promise<void>;\n};\n\ntype GooglePlacePrediction = {\n placeId: string;\n mainText?: { text: string };\n secondaryText?: { text: string };\n text: { text: string };\n toPlace: () => GooglePlace;\n};\n\ntype GooglePlacesLibrary = {\n AutocompleteSessionToken: new () => GoogleSessionToken;\n AutocompleteSuggestion: {\n fetchAutocompleteSuggestions: (options: {\n input: string;\n includedPrimaryTypes: string[];\n includedRegionCodes: string[];\n region: string;\n sessionToken: GoogleSessionToken;\n }) => Promise<{\n suggestions: { placePrediction?: GooglePlacePrediction }[];\n }>;\n };\n};\n\ntype GoogleMapsWindow = Window & {\n google?: {\n maps?: {\n __lockerverseSignupReady?: () => void;\n importLibrary?: (libraryName: string) => Promise<GooglePlacesLibrary>;\n };\n };\n};\n\ntype AddressSuggestion = {\n id: string;\n label: string;\n secondaryLabel: string;\n prediction: GooglePlacePrediction;\n};\n\nconst GOOGLE_MAPS_SCRIPT_ID = \"lockerverse-signup-google-places\";\nconst GOOGLE_ADDRESS_TYPES = [\n \"premise\",\n \"subpremise\",\n \"street_address\",\n \"route\",\n];\nlet googlePlacesLoader: Promise<GooglePlacesLibrary> | null = null;\n\nfunction installGoogleMaps(apiKey: string) {\n const googleWindow: GoogleMapsWindow = window;\n if (googleWindow.google?.maps?.importLibrary) {\n return;\n }\n googleWindow.google ||= {};\n const googleObject = googleWindow.google;\n googleObject.maps ||= {};\n const mapsObject = googleObject.maps;\n let scriptPromise: Promise<void> | null = null;\n mapsObject.importLibrary = (libraryName: string) => {\n scriptPromise ||= new Promise((resolve, reject) => {\n const existingScript = document.getElementById(GOOGLE_MAPS_SCRIPT_ID);\n mapsObject.__lockerverseSignupReady = resolve;\n if (existingScript) {\n existingScript.addEventListener(\n \"error\",\n () => reject(new Error(\"Unable to load Google Places.\")),\n { once: true }\n );\n return;\n }\n const script = document.createElement(\"script\");\n const parameters = new URLSearchParams({\n callback: \"google.maps.__lockerverseSignupReady\",\n key: apiKey,\n libraries: libraryName,\n v: \"weekly\",\n });\n script.async = true;\n script.id = GOOGLE_MAPS_SCRIPT_ID;\n script.src = `https://maps.googleapis.com/maps/api/js?${parameters}`;\n script.onerror = () => reject(new Error(\"Unable to load Google Places.\"));\n document.head.append(script);\n });\n return scriptPromise\n .then(() => {\n const importLibrary = googleWindow.google?.maps?.importLibrary;\n if (!importLibrary) {\n throw new Error(\"Unable to load Google Places.\");\n }\n return importLibrary(libraryName);\n })\n .catch((error) => {\n scriptPromise = null;\n document.getElementById(GOOGLE_MAPS_SCRIPT_ID)?.remove();\n throw error;\n });\n };\n}\n\nfunction loadGooglePlaces(apiKey: string) {\n googlePlacesLoader ||= (async () => {\n try {\n installGoogleMaps(apiKey);\n const googleWindow: GoogleMapsWindow = window;\n const importLibrary = googleWindow.google?.maps?.importLibrary;\n if (!importLibrary) {\n throw new Error(\"Unable to load Google Places.\");\n }\n return await importLibrary(\"places\");\n } catch (error) {\n googlePlacesLoader = null;\n throw error;\n }\n })();\n return googlePlacesLoader;\n}\n\nfunction getAddressPart(\n components: GoogleAddressComponent[],\n type: string,\n key: \"longText\" | \"shortText\" = \"longText\"\n) {\n return (\n components.find((component) => component.types.includes(type))?.[key] ?? \"\"\n );\n}\n\nfunction parseAddress(current: SignupAddressValues, place: GooglePlace) {\n const components = place.addressComponents ?? [];\n const street = [\n getAddressPart(components, \"street_number\"),\n getAddressPart(components, \"route\"),\n ]\n .filter(Boolean)\n .join(\" \");\n return {\n ...current,\n city:\n getAddressPart(components, \"locality\") ||\n getAddressPart(components, \"postal_town\") ||\n getAddressPart(components, \"sublocality_level_1\"),\n country: getAddressPart(components, \"country\", \"shortText\") || \"US\",\n line1: street || place.formattedAddress?.split(\",\")[0] || \"\",\n line2: getAddressPart(components, \"subpremise\"),\n postalCode: [\n getAddressPart(components, \"postal_code\"),\n getAddressPart(components, \"postal_code_suffix\"),\n ]\n .filter(Boolean)\n .join(\"-\"),\n state: getAddressPart(\n components,\n \"administrative_area_level_1\",\n \"shortText\"\n ),\n } satisfies SignupAddressValues;\n}\n\nexport function SignupAddressField({\n apiKey,\n errorId,\n invalid,\n onChange,\n required,\n value,\n}: {\n apiKey: string | undefined;\n errorId: string | undefined;\n invalid: boolean;\n onChange: (address: SignupAddressValues) => void;\n required: boolean;\n value: SignupAddressValues;\n}) {\n const id = useId();\n const listboxId = `${id}-suggestions`;\n const [activeSuggestionIndex, setActiveSuggestionIndex] = useState(-1);\n const [focused, setFocused] = useState(false);\n const [loading, setLoading] = useState(false);\n const [suggestions, setSuggestions] = useState<AddressSuggestion[]>([]);\n const detailRequestGeneration = useRef(0);\n const searchGeneration = useRef(0);\n const sessionToken = useRef<GoogleSessionToken | null>(null);\n\n useEffect(\n () => () => {\n detailRequestGeneration.current += 1;\n },\n []\n );\n\n useEffect(() => {\n const generation = searchGeneration.current + 1;\n searchGeneration.current = generation;\n const query = value.line1.trim();\n setActiveSuggestionIndex(-1);\n setLoading(false);\n if (!(apiKey && focused && query.length >= 3)) {\n setSuggestions([]);\n return;\n }\n const timeout = window.setTimeout(async () => {\n if (generation !== searchGeneration.current) {\n return;\n }\n setLoading(true);\n try {\n const { AutocompleteSessionToken, AutocompleteSuggestion } =\n await loadGooglePlaces(apiKey);\n sessionToken.current ??= new AutocompleteSessionToken();\n const response =\n await AutocompleteSuggestion.fetchAutocompleteSuggestions({\n includedPrimaryTypes: GOOGLE_ADDRESS_TYPES,\n includedRegionCodes: [\"US\"],\n input: query,\n region: \"US\",\n sessionToken: sessionToken.current,\n });\n if (generation === searchGeneration.current) {\n setSuggestions(\n response.suggestions.flatMap(({ placePrediction }) =>\n placePrediction\n ? [\n {\n id: placePrediction.placeId,\n label:\n placePrediction.mainText?.text ??\n placePrediction.text.text,\n prediction: placePrediction,\n secondaryLabel: placePrediction.secondaryText?.text ?? \"\",\n },\n ]\n : []\n )\n );\n }\n } catch {\n if (generation === searchGeneration.current) {\n setSuggestions([]);\n }\n } finally {\n if (generation === searchGeneration.current) {\n setLoading(false);\n }\n }\n }, 250);\n return () => {\n window.clearTimeout(timeout);\n };\n }, [apiKey, focused, value.line1]);\n\n const update = (patch: Partial<SignupAddressValues>) => {\n detailRequestGeneration.current += 1;\n onChange({ ...value, ...patch });\n };\n\n const selectSuggestion = async (suggestion: AddressSuggestion) => {\n const generation = detailRequestGeneration.current + 1;\n detailRequestGeneration.current = generation;\n const place = suggestion.prediction.toPlace();\n try {\n await place.fetchFields({\n fields: [\"addressComponents\", \"formattedAddress\"],\n });\n if (generation !== detailRequestGeneration.current) {\n return;\n }\n onChange(parseAddress(value, place));\n sessionToken.current = null;\n setSuggestions([]);\n setActiveSuggestionIndex(-1);\n setFocused(false);\n } catch {\n if (generation !== detailRequestGeneration.current) {\n return;\n }\n setSuggestions([]);\n setActiveSuggestionIndex(-1);\n }\n };\n\n const handleAddressKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n setSuggestions([]);\n setActiveSuggestionIndex(-1);\n return;\n }\n if (suggestions.length === 0) {\n return;\n }\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n setActiveSuggestionIndex((current) =>\n current < suggestions.length - 1 ? current + 1 : 0\n );\n return;\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setActiveSuggestionIndex((current) =>\n current > 0 ? current - 1 : suggestions.length - 1\n );\n return;\n }\n const suggestion = suggestions[activeSuggestionIndex];\n if (event.key === \"Enter\" && suggestion) {\n event.preventDefault();\n selectSuggestion(suggestion).catch(() => undefined);\n }\n };\n\n return (\n <fieldset\n aria-describedby={invalid ? errorId : undefined}\n aria-invalid={invalid ? \"true\" : undefined}\n className=\"lockerverse-signup__address\"\n >\n <legend>Address</legend>\n <label htmlFor={`${id}-line1`}>\n <span>Street address</span>\n <div className=\"lockerverse-signup__address-search\">\n <input\n aria-activedescendant={\n activeSuggestionIndex >= 0\n ? `${id}-suggestion-${activeSuggestionIndex}`\n : undefined\n }\n aria-autocomplete=\"list\"\n aria-controls={listboxId}\n aria-describedby={invalid ? errorId : undefined}\n aria-expanded={focused && suggestions.length > 0}\n aria-invalid={invalid ? \"true\" : undefined}\n autoComplete=\"street-address\"\n id={`${id}-line1`}\n name=\"address.line1\"\n onBlur={() => window.setTimeout(() => setFocused(false), 120)}\n onChange={(event) => update({ line1: event.currentTarget.value })}\n onFocus={() => setFocused(true)}\n onKeyDown={handleAddressKeyDown}\n required={required}\n role=\"combobox\"\n value={value.line1}\n />\n {loading ? (\n <span className=\"lockerverse-signup__address-loading\">\n Searchingโ€ฆ\n </span>\n ) : null}\n {suggestions.length > 0 ? (\n <div\n className=\"lockerverse-signup__address-suggestions\"\n id={listboxId}\n role=\"listbox\"\n >\n {suggestions.map((suggestion, index) => (\n <button\n aria-selected={activeSuggestionIndex === index}\n id={`${id}-suggestion-${index}`}\n key={suggestion.id}\n onMouseDown={(event) => {\n event.preventDefault();\n selectSuggestion(suggestion).catch(() => undefined);\n }}\n role=\"option\"\n type=\"button\"\n >\n <strong>{suggestion.label}</strong>\n {suggestion.secondaryLabel ? (\n <span>{suggestion.secondaryLabel}</span>\n ) : null}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n </label>\n <label htmlFor={`${id}-line2`}>\n <span>Apartment, suite, or unit</span>\n <input\n autoComplete=\"address-line2\"\n id={`${id}-line2`}\n onChange={(event) => update({ line2: event.currentTarget.value })}\n placeholder=\"Optional\"\n value={value.line2 ?? \"\"}\n />\n </label>\n <div className=\"lockerverse-signup__address-row\">\n <label htmlFor={`${id}-city`}>\n <span>City</span>\n <input\n autoComplete=\"address-level2\"\n id={`${id}-city`}\n onChange={(event) => update({ city: event.currentTarget.value })}\n required={required}\n value={value.city}\n />\n </label>\n <label htmlFor={`${id}-state`}>\n <span>State</span>\n <input\n autoComplete=\"address-level1\"\n id={`${id}-state`}\n onChange={(event) => update({ state: event.currentTarget.value })}\n required={required}\n value={value.state}\n />\n </label>\n </div>\n <div className=\"lockerverse-signup__address-row\">\n <label htmlFor={`${id}-postal`}>\n <span>Postal code</span>\n <input\n autoComplete=\"postal-code\"\n id={`${id}-postal`}\n onChange={(event) =>\n update({ postalCode: event.currentTarget.value })\n }\n required={required}\n value={value.postalCode}\n />\n </label>\n <label htmlFor={`${id}-country`}>\n <span>Country</span>\n <input\n autoComplete=\"country\"\n id={`${id}-country`}\n maxLength={2}\n onChange={(event) =>\n update({ country: event.currentTarget.value.toUpperCase() })\n }\n required={required}\n value={value.country}\n />\n </label>\n </div>\n </fieldset>\n );\n}\n","import type {\n LockerverseSignup,\n LockerverseSignupAddress,\n} from \"@lockerverse/sdk/signup\";\nimport {\n check,\n nonEmpty,\n nullable,\n object,\n pipe,\n regex,\n safeParse,\n string,\n transform,\n trim,\n} from \"valibot\";\nimport {\n optionalEmailSchema,\n optionalPhoneSchema,\n requiredEmailSchema,\n requiredPhoneSchema,\n} from \"./contact-validation.ts\";\nimport {\n type CustomFieldValues,\n validateCustomFields,\n} from \"./custom-fields.tsx\";\nimport { getInternationalPhone } from \"./phone.ts\";\n\nconst POSITIVE_INTEGER_PATTERN = /^[1-9]\\d*$/;\nconst OPTIONAL_POSITIVE_INTEGER_PATTERN = /^(?:$|[1-9]\\d*)$/;\n\nexport type SignupAddressValues = Omit<LockerverseSignupAddress, \"line2\"> & {\n line2: string | null;\n};\n\nexport type SignupFormValues = {\n address: SignupAddressValues;\n customFields: CustomFieldValues;\n email: string;\n honeypot: string;\n name: string;\n participantCount: string;\n phone: string;\n phoneCountry: string;\n};\n\nconst nameSchema = pipe(string(), trim(), nonEmpty(\"Name is required.\"));\nconst optionalParticipantCountSchema = pipe(\n string(),\n trim(),\n regex(\n OPTIONAL_POSITIVE_INTEGER_PATTERN,\n \"Guest count must be a positive whole number.\"\n ),\n transform((value) => (value ? Number(value) : null)),\n check(\n (value) => value === null || Number.isSafeInteger(value),\n \"Guest count must be a positive whole number.\"\n )\n);\nconst requiredParticipantCountSchema = pipe(\n string(),\n trim(),\n nonEmpty(\"Guest count is required.\"),\n regex(\n POSITIVE_INTEGER_PATTERN,\n \"Guest count must be a positive whole number.\"\n ),\n transform(Number),\n check(\n (value) => Number.isSafeInteger(value),\n \"Guest count must be a positive whole number.\"\n )\n);\nconst addressFieldsSchema = object({\n city: string(),\n country: string(),\n line1: string(),\n line2: nullable(string()),\n postalCode: string(),\n state: string(),\n});\nconst requiredAddressSchema = pipe(\n addressFieldsSchema,\n check(isAddressComplete, \"Complete the address.\")\n);\n\nconst EMPTY_ADDRESS: SignupAddressValues = {\n city: \"\",\n country: \"US\",\n line1: \"\",\n line2: null,\n postalCode: \"\",\n state: \"\",\n};\nconst optionalAddressSchema = pipe(\n addressFieldsSchema,\n check(\n (address) => isAddressEmpty(address) || isAddressComplete(address),\n \"Complete the address or leave it blank.\"\n )\n);\n\nexport function isAddressEmpty(address: SignupAddressValues) {\n return ![\n address.city,\n address.line1,\n address.line2,\n address.postalCode,\n address.state,\n ].some((value) => value?.trim());\n}\n\nfunction isAddressComplete(address: SignupAddressValues) {\n return [\n address.city,\n address.country,\n address.line1,\n address.postalCode,\n address.state,\n ].every((value) => value.trim());\n}\n\nexport function validateSignupForm(\n signup: LockerverseSignup,\n values: SignupFormValues\n) {\n const normalizedValues = {\n ...values,\n address: signup.fields.address.enabled ? values.address : EMPTY_ADDRESS,\n email: signup.fields.email.enabled ? values.email : \"\",\n participantCount: signup.fields.participantCount.enabled\n ? values.participantCount\n : \"\",\n phone: signup.fields.phone.enabled\n ? getInternationalPhone(values.phone, values.phoneCountry)\n : \"\",\n };\n const schema = object({\n address:\n signup.fields.address.enabled && signup.fields.address.required\n ? requiredAddressSchema\n : optionalAddressSchema,\n email:\n signup.fields.email.enabled && signup.fields.email.required\n ? requiredEmailSchema\n : optionalEmailSchema,\n name: nameSchema,\n participantCount:\n signup.fields.participantCount.enabled &&\n signup.fields.participantCount.required\n ? requiredParticipantCountSchema\n : optionalParticipantCountSchema,\n phone:\n signup.fields.phone.enabled && signup.fields.phone.required\n ? requiredPhoneSchema\n : optionalPhoneSchema,\n });\n const result = safeParse(schema, normalizedValues);\n const errors = validateCustomFields(signup.customFields, values.customFields);\n if (!result.success) {\n for (const issue of result.issues) {\n const field = issue.path?.[0]?.key;\n const fieldName = [\n \"address\",\n \"email\",\n \"name\",\n \"participantCount\",\n \"phone\",\n ].find((name) => name === field);\n if (fieldName && !errors[fieldName]) {\n errors[fieldName] = issue.message;\n }\n }\n }\n return result.success\n ? { errors, value: { ...values, ...result.output } }\n : { errors, value: null };\n}\n","import type {\n LockerverseSdkError,\n LockerverseSignupClient,\n LockerverseSignup as LockerverseSignupDefinition,\n LockerverseSignupSubmissionResult,\n} from \"@lockerverse/sdk/signup\";\nimport {\n type FormEvent,\n type ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { getAccentContrast, normalizeAccentColor } from \"./accent-contrast.ts\";\nimport {\n buildCustomFieldAnswers,\n CustomFields,\n createCustomFieldValues,\n} from \"./custom-fields.tsx\";\nimport { FormSkeleton } from \"./form-skeleton.tsx\";\nimport { notifyHostCallback } from \"./host-callback.ts\";\nimport { getPhoneServerError, PHONE_COUNTRIES } from \"./phone.ts\";\nimport { SignupAddressField } from \"./signup-address-field.tsx\";\nimport type { LockerverseSignupProps } from \"./signup-types.ts\";\nimport {\n type SignupFormValues as FormValues,\n isAddressEmpty,\n type SignupAddressValues,\n validateSignupForm,\n} from \"./signup-validation.ts\";\n\nconst DEFAULT_ADDRESS: SignupAddressValues = {\n city: \"\",\n country: \"US\",\n line1: \"\",\n line2: \"\",\n postalCode: \"\",\n state: \"\",\n};\n\nconst DEFAULT_ACCENT = \"#5751f2\";\n\nfunction createInitialValues(signup: LockerverseSignupDefinition): FormValues {\n return {\n address: DEFAULT_ADDRESS,\n customFields: createCustomFieldValues(signup.customFields),\n email: \"\",\n honeypot: \"\",\n name: \"\",\n participantCount: \"\",\n phone: \"\",\n phoneCountry: \"US\",\n };\n}\n\nfunction FieldError({ error, id }: { error: string | undefined; id: string }) {\n return error ? (\n <span className=\"lockerverse-signup__field-error\" id={id} role=\"alert\">\n {error}\n </span>\n ) : null;\n}\n\nfunction focusNamedControl(form: HTMLFormElement, name: string) {\n const control = form.elements.namedItem(name);\n if (control instanceof HTMLElement) {\n if (!control.matches(\":disabled\")) {\n control.focus();\n return true;\n }\n return false;\n }\n if (control instanceof RadioNodeList) {\n const focusable = Array.from(control).find(\n (item) => item instanceof HTMLElement && !item.matches(\":disabled\")\n );\n focusable?.focus();\n return Boolean(focusable);\n }\n return false;\n}\n\nfunction focusFirstSignupValidationError(\n form: HTMLFormElement,\n errors: Record<string, string>\n) {\n const builtInFields: [string, string][] = [\n [\"name\", \"name\"],\n [\"email\", \"email\"],\n [\"phone\", \"phone\"],\n [\"participantCount\", \"participantCount\"],\n [\"address\", \"address.line1\"],\n ];\n for (const [errorKey, controlName] of builtInFields) {\n if (errors[errorKey] && focusNamedControl(form, controlName)) {\n return;\n }\n }\n const builtInKeys = new Set(builtInFields.map(([errorKey]) => errorKey));\n const customFieldId = Object.keys(errors).find(\n (errorKey) => !builtInKeys.has(errorKey)\n );\n if (customFieldId) {\n focusNamedControl(form, `custom:${customFieldId}`);\n }\n}\n\ntype SignupViewProps = Omit<LockerverseSignupProps, \"widget\">;\n\nfunction SignupShell({\n children,\n loading = false,\n status = false,\n viewProps,\n}: {\n children: ReactNode;\n loading?: boolean;\n status?: boolean;\n viewProps: SignupViewProps;\n}) {\n const {\n branding,\n className,\n googlePlacesApiKey: _googlePlacesApiKey,\n onSignupComplete: _onSignupComplete,\n style,\n theme = \"dark\",\n ...sectionProps\n } = viewProps;\n const accent = normalizeAccentColor(\n style?.[\"--lockerverse-accent\"] ??\n style?.[\"--lockerverse-signup-accent\"] ??\n branding?.accentColor ??\n DEFAULT_ACCENT\n );\n const signupStyle: LockerverseSignupProps[\"style\"] = { ...style };\n if (\n style?.[\"--lockerverse-accent\"] !== undefined ||\n style?.[\"--lockerverse-signup-accent\"] !== undefined ||\n branding?.accentColor\n ) {\n signupStyle[\"--lockerverse-accent\"] = accent;\n }\n if (\n style?.[\"--lockerverse-accent-contrast\"] === undefined &&\n style?.[\"--lockerverse-signup-accent-contrast\"] === undefined\n ) {\n const accentContrast = getAccentContrast(accent);\n if (accentContrast) {\n signupStyle[\"--lockerverse-accent-contrast\"] = accentContrast;\n }\n }\n return (\n <section\n {...sectionProps}\n {...(loading ? { \"aria-busy\": true } : {})}\n className={[\n \"lockerverse-signup\",\n status ? \"lockerverse-signup__status\" : null,\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={signupStyle}\n >\n {children}\n </section>\n );\n}\n\ntype SignupSubmissionState =\n | { phase: \"idle\" }\n | { phase: \"submitting\" }\n | {\n error: LockerverseSdkError;\n phase: \"submit_error\";\n }\n | {\n phase: \"submitted\";\n };\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: The component renders server-defined field branches in one public form boundary.\nfunction SignupForm({\n client,\n signup,\n ...viewProps\n}: SignupViewProps & {\n client: LockerverseSignupClient;\n signup: LockerverseSignupDefinition;\n}) {\n const { branding, googlePlacesApiKey, onSignupComplete } = viewProps;\n const idPrefix = useId();\n const mountedRef = useRef(true);\n const phoneRef = useRef<HTMLInputElement>(null);\n const submittingRef = useRef(false);\n const [state, setState] = useState<SignupSubmissionState>({ phase: \"idle\" });\n const [values, setValues] = useState<FormValues>(() =>\n createInitialValues(signup)\n );\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [submissionRetry, setSubmissionRetry] = useState<{\n payloadKey: string;\n reference: string;\n }>();\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n if (state.phase !== \"submitting\" && errors.phone) {\n phoneRef.current?.focus();\n }\n }, [errors.phone, state.phase]);\n\n if (!signup.isActive) {\n return (\n <SignupShell status viewProps={viewProps}>\n <h1>Signup closed</h1>\n <p>This signup is not accepting submissions.</p>\n </SignupShell>\n );\n }\n\n if (state.phase === \"submitted\") {\n return (\n <SignupShell status viewProps={viewProps}>\n {branding ? <Branding branding={branding} /> : null}\n <span aria-hidden=\"true\" className=\"lockerverse-signup__success\">\n โœ“\n </span>\n <h1>Thank you</h1>\n <p>Your signup has been received.</p>\n </SignupShell>\n );\n }\n\n const update = (patch: Partial<FormValues>) =>\n setValues((current) => ({ ...current, ...patch }));\n const submitting = state.phase === \"submitting\";\n const submitError =\n state.phase === \"submit_error\" ? state.error.message : undefined;\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Submission maps the enabled server-defined fields to one SDK request.\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n // biome-ignore lint/suspicious/noUnnecessaryConditions: The ref blocks a second submit before React commits the submitting state.\n if (submittingRef.current) {\n return;\n }\n const validation = validateSignupForm(signup, values);\n setErrors(validation.errors);\n if (Object.keys(validation.errors).length > 0 || !validation.value) {\n const form = event.currentTarget;\n queueMicrotask(() =>\n focusFirstSignupValidationError(form, validation.errors)\n );\n return;\n }\n const validatedValues = validation.value;\n const submission = {\n address:\n signup.fields.address.enabled &&\n !isAddressEmpty(validatedValues.address)\n ? validatedValues.address\n : null,\n answers: buildCustomFieldAnswers(\n signup.customFields,\n validatedValues.customFields\n ),\n email: signup.fields.email.enabled ? validatedValues.email || null : null,\n honeypot: validatedValues.honeypot,\n name: validatedValues.name,\n participantCount: signup.fields.participantCount.enabled\n ? validatedValues.participantCount\n : null,\n phone: signup.fields.phone.enabled ? validatedValues.phone || null : null,\n };\n const payloadKey = JSON.stringify(submission);\n const submissionReference =\n submissionRetry?.payloadKey === payloadKey\n ? submissionRetry.reference\n : globalThis.crypto.randomUUID();\n let result: LockerverseSignupSubmissionResult;\n submittingRef.current = true;\n setState({ phase: \"submitting\" });\n try {\n result = await client.submit(submission, { submissionReference });\n } catch (error) {\n if (!mountedRef.current) {\n return;\n }\n // SAFETY: LockerverseSignupClient normalizes each submission rejection to LockerverseSdkError.\n const sdkError = error as LockerverseSdkError;\n const phoneError = getPhoneServerError(sdkError.serverCode);\n if (phoneError) {\n setErrors((current) => ({ ...current, phone: phoneError }));\n setState({ phase: \"idle\" });\n setSubmissionRetry(undefined);\n return;\n }\n setState({ error: sdkError, phase: \"submit_error\" });\n if (sdkError.recoveryRecommended) {\n setSubmissionRetry({\n payloadKey,\n reference: submissionReference,\n });\n } else {\n setSubmissionRetry(undefined);\n }\n return;\n } finally {\n submittingRef.current = false;\n }\n // biome-ignore lint/suspicious/noUnnecessaryConditions: The ref changes during unmount while this request is pending.\n if (!mountedRef.current) {\n return;\n }\n setSubmissionRetry(undefined);\n setState({ phase: \"submitted\" });\n notifyHostCallback(onSignupComplete, result);\n };\n\n return (\n <SignupShell viewProps={viewProps}>\n {signup.coverImageUrl ? (\n <img\n alt=\"\"\n className=\"lockerverse-signup__cover\"\n height={192}\n src={signup.coverImageUrl}\n width={440}\n />\n ) : null}\n {branding ? <Branding branding={branding} /> : null}\n <header>\n {signup.title?.trim() ? <h1>{signup.title}</h1> : null}\n {signup.description ? <p>{signup.description}</p> : null}\n </header>\n <form noValidate onSubmit={handleSubmit}>\n <input\n aria-hidden=\"true\"\n autoComplete=\"off\"\n className=\"lockerverse-signup__honeypot\"\n onChange={(event) => update({ honeypot: event.currentTarget.value })}\n tabIndex={-1}\n value={values.honeypot}\n />\n <div className=\"lockerverse-signup__fields\">\n <label htmlFor={`${idPrefix}-name`}>\n <span>Name</span>\n <input\n aria-describedby={\n errors.name ? `${idPrefix}-name-error` : undefined\n }\n aria-invalid={errors.name ? \"true\" : undefined}\n autoComplete=\"name\"\n id={`${idPrefix}-name`}\n name=\"name\"\n onChange={(event) => update({ name: event.currentTarget.value })}\n required\n value={values.name}\n />\n <FieldError error={errors.name} id={`${idPrefix}-name-error`} />\n </label>\n {signup.fields.email.enabled ? (\n <label htmlFor={`${idPrefix}-email`}>\n <span>Email</span>\n <input\n aria-describedby={\n errors.email ? `${idPrefix}-email-error` : undefined\n }\n aria-invalid={errors.email ? \"true\" : undefined}\n autoComplete=\"email\"\n id={`${idPrefix}-email`}\n name=\"email\"\n onChange={(event) =>\n update({ email: event.currentTarget.value })\n }\n required={signup.fields.email.required}\n type=\"email\"\n value={values.email}\n />\n <FieldError error={errors.email} id={`${idPrefix}-email-error`} />\n </label>\n ) : null}\n {signup.fields.phone.enabled ? (\n <div className=\"lockerverse-signup__phone-field\">\n <label htmlFor={`${idPrefix}-phone`}>\n <span>Phone</span>\n </label>\n <div className=\"lockerverse-signup__phone-control\">\n <select\n aria-label=\"Phone number country\"\n name=\"phoneCountry\"\n onChange={(event) => {\n update({ phoneCountry: event.currentTarget.value });\n phoneRef.current?.focus();\n }}\n value={values.phoneCountry}\n >\n {PHONE_COUNTRIES.map((country) => (\n <option key={country.value} value={country.value}>\n {country.label}\n </option>\n ))}\n </select>\n <input\n aria-describedby={\n errors.phone ? `${idPrefix}-phone-error` : undefined\n }\n aria-invalid={errors.phone ? \"true\" : undefined}\n autoComplete=\"tel\"\n id={`${idPrefix}-phone`}\n name=\"phone\"\n onChange={(event) =>\n update({ phone: event.currentTarget.value })\n }\n placeholder=\"(201) 555-0123\"\n ref={phoneRef}\n required={signup.fields.phone.required}\n type=\"tel\"\n value={values.phone}\n />\n </div>\n <FieldError error={errors.phone} id={`${idPrefix}-phone-error`} />\n </div>\n ) : null}\n {signup.fields.participantCount.enabled ? (\n <label htmlFor={`${idPrefix}-participant-count`}>\n <span>Guest count</span>\n <input\n aria-describedby={\n errors.participantCount\n ? `${idPrefix}-participant-count-error`\n : undefined\n }\n aria-invalid={errors.participantCount ? \"true\" : undefined}\n id={`${idPrefix}-participant-count`}\n min={1}\n name=\"participantCount\"\n onChange={(event) =>\n update({ participantCount: event.currentTarget.value })\n }\n required={signup.fields.participantCount.required}\n type=\"number\"\n value={values.participantCount}\n />\n <FieldError\n error={errors.participantCount}\n id={`${idPrefix}-participant-count-error`}\n />\n </label>\n ) : null}\n {signup.fields.address.enabled ? (\n <div className=\"lockerverse-signup__field-group\">\n <SignupAddressField\n apiKey={googlePlacesApiKey}\n errorId={\n errors.address ? `${idPrefix}-address-error` : undefined\n }\n invalid={Boolean(errors.address)}\n onChange={(address) => update({ address })}\n required={signup.fields.address.required}\n value={values.address}\n />\n <FieldError\n error={errors.address}\n id={`${idPrefix}-address-error`}\n />\n </div>\n ) : null}\n <CustomFields\n choiceClassName=\"lockerverse-signup__choice\"\n errorClassName=\"lockerverse-signup__field-error\"\n errors={errors}\n fields={signup.customFields}\n idPrefix={idPrefix}\n onChange={(customFields) => update({ customFields })}\n values={values.customFields}\n />\n </div>\n {submitError ? (\n <p className=\"lockerverse-signup__submit-error\" role=\"alert\">\n {submitError} Try again.\n </p>\n ) : null}\n <button\n className=\"lockerverse-signup__submit\"\n disabled={submitting}\n type=\"submit\"\n >\n {submitting ? \"Submittingโ€ฆ\" : \"Submit\"}\n </button>\n </form>\n </SignupShell>\n );\n}\n\nexport function LockerverseSignup({\n widget,\n ...viewProps\n}: LockerverseSignupProps) {\n if (widget.error) {\n return (\n <SignupShell status viewProps={viewProps}>\n <h1>Signup unavailable</h1>\n <p role=\"alert\">{widget.error.message}</p>\n <button onClick={widget.refresh} type=\"button\">\n Retry\n </button>\n </SignupShell>\n );\n }\n if (widget.loading || !widget.signup) {\n return (\n <SignupShell loading viewProps={viewProps}>\n <FormSkeleton fieldCount={4} label=\"Loading signupโ€ฆ\" />\n </SignupShell>\n );\n }\n return (\n <SignupForm client={widget.client} signup={widget.signup} {...viewProps} />\n );\n}\n\nfunction Branding({\n branding,\n}: {\n branding: NonNullable<LockerverseSignupProps[\"branding\"]>;\n}) {\n return (\n <div className=\"lockerverse-signup__branding\">\n {branding.imageUrl ? (\n <img alt=\"\" height={48} src={branding.imageUrl} width={48} />\n ) : null}\n <strong>{branding.name}</strong>\n </div>\n );\n}\n","import {\n type CreateLockerverseSignupOptions,\n createLockerverseSignupClient,\n type LockerverseSdkError,\n type LockerverseSignup,\n type LockerverseSignupClient,\n} from \"@lockerverse/sdk/signup\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useImmutableResourceIdentity } from \"./immutable-resource-identity.ts\";\n\ntype SignupLoadState = {\n error: LockerverseSdkError | null;\n signup: LockerverseSignup | null;\n};\n\nexport type UseLockerverseSignupResult = {\n client: LockerverseSignupClient;\n error: LockerverseSdkError | null;\n loading: boolean;\n refresh: () => void;\n signup: LockerverseSignup | null;\n};\n\nexport function useLockerverseSignup(\n options: CreateLockerverseSignupOptions\n): UseLockerverseSignupResult {\n const { onError } = options;\n useImmutableResourceIdentity(\"signup\", {\n apiBaseUrl: options.apiBaseUrl,\n communitySlug: options.communitySlug,\n environment: options.environment,\n slug: options.signupSlug,\n });\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const [client] = useState(() => {\n const clientOptions: CreateLockerverseSignupOptions = {\n ...options,\n onError: (error) => onErrorRef.current?.(error),\n };\n return createLockerverseSignupClient(clientOptions);\n });\n const [revision, setRevision] = useState(0);\n const [state, setState] = useState<SignupLoadState>({\n error: null,\n signup: null,\n });\n\n useEffect(() => {\n let active = true;\n client.load().then(\n (signup) => {\n if (active) {\n setState({\n error: null,\n signup,\n });\n }\n },\n (error: LockerverseSdkError) => {\n if (active) {\n setState({\n error,\n signup: null,\n });\n }\n }\n );\n return () => {\n active = false;\n };\n }, [client, revision]);\n\n const refresh = useCallback(() => {\n setState({\n error: null,\n signup: null,\n });\n setRevision((value) => value + 1);\n }, []);\n\n return {\n client,\n error: state.error,\n loading: state.signup === null && state.error === null,\n refresh,\n signup: state.signup,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"signup.js","names":["googleWindow"],"sources":["../src/signup-address-field.tsx","../src/signup-validation.ts","../src/lockerverse-signup.tsx","../src/use-lockerverse-signup.ts"],"sourcesContent":["import { type KeyboardEvent, useEffect, useId, useRef, useState } from \"react\";\nimport type { SignupAddressValues } from \"./signup-validation.ts\";\n\ntype GoogleAddressComponent = {\n longText?: string;\n shortText?: string;\n types: string[];\n};\n\ntype GoogleSessionToken = Record<never, never>;\n\ntype GooglePlace = {\n addressComponents?: GoogleAddressComponent[];\n formattedAddress?: string;\n fetchFields: (options: { fields: string[] }) => Promise<void>;\n};\n\ntype GooglePlacePrediction = {\n placeId: string;\n mainText?: { text: string };\n secondaryText?: { text: string };\n text: { text: string };\n toPlace: () => GooglePlace;\n};\n\ntype GooglePlacesLibrary = {\n AutocompleteSessionToken: new () => GoogleSessionToken;\n AutocompleteSuggestion: {\n fetchAutocompleteSuggestions: (options: {\n input: string;\n includedPrimaryTypes: string[];\n includedRegionCodes: string[];\n region: string;\n sessionToken: GoogleSessionToken;\n }) => Promise<{\n suggestions: { placePrediction?: GooglePlacePrediction }[];\n }>;\n };\n};\n\ntype GoogleMapsWindow = Window & {\n google?: {\n maps?: {\n __lockerverseSignupReady?: () => void;\n importLibrary?: (libraryName: string) => Promise<GooglePlacesLibrary>;\n };\n };\n};\n\ntype AddressSuggestion = {\n id: string;\n label: string;\n secondaryLabel: string;\n prediction: GooglePlacePrediction;\n};\n\nconst GOOGLE_MAPS_SCRIPT_ID = \"lockerverse-signup-google-places\";\nconst GOOGLE_ADDRESS_TYPES = [\n \"premise\",\n \"subpremise\",\n \"street_address\",\n \"route\",\n];\nlet googlePlacesLoader: Promise<GooglePlacesLibrary> | null = null;\n\nfunction installGoogleMaps(apiKey: string) {\n const googleWindow: GoogleMapsWindow = window;\n if (googleWindow.google?.maps?.importLibrary) {\n return;\n }\n googleWindow.google ||= {};\n const googleObject = googleWindow.google;\n googleObject.maps ||= {};\n const mapsObject = googleObject.maps;\n let scriptPromise: Promise<void> | null = null;\n mapsObject.importLibrary = (libraryName: string) => {\n scriptPromise ||= new Promise((resolve, reject) => {\n const existingScript = document.getElementById(GOOGLE_MAPS_SCRIPT_ID);\n mapsObject.__lockerverseSignupReady = resolve;\n if (existingScript) {\n existingScript.addEventListener(\n \"error\",\n () => reject(new Error(\"Unable to load Google Places.\")),\n { once: true }\n );\n return;\n }\n const script = document.createElement(\"script\");\n const parameters = new URLSearchParams({\n callback: \"google.maps.__lockerverseSignupReady\",\n key: apiKey,\n libraries: libraryName,\n v: \"weekly\",\n });\n script.async = true;\n script.id = GOOGLE_MAPS_SCRIPT_ID;\n script.src = `https://maps.googleapis.com/maps/api/js?${parameters}`;\n script.onerror = () => reject(new Error(\"Unable to load Google Places.\"));\n document.head.append(script);\n });\n return scriptPromise\n .then(() => {\n const importLibrary = googleWindow.google?.maps?.importLibrary;\n if (!importLibrary) {\n throw new Error(\"Unable to load Google Places.\");\n }\n return importLibrary(libraryName);\n })\n .catch((error) => {\n scriptPromise = null;\n document.getElementById(GOOGLE_MAPS_SCRIPT_ID)?.remove();\n throw error;\n });\n };\n}\n\nfunction loadGooglePlaces(apiKey: string) {\n googlePlacesLoader ||= (async () => {\n try {\n installGoogleMaps(apiKey);\n const googleWindow: GoogleMapsWindow = window;\n const importLibrary = googleWindow.google?.maps?.importLibrary;\n if (!importLibrary) {\n throw new Error(\"Unable to load Google Places.\");\n }\n return await importLibrary(\"places\");\n } catch (error) {\n googlePlacesLoader = null;\n throw error;\n }\n })();\n return googlePlacesLoader;\n}\n\nfunction getAddressPart(\n components: GoogleAddressComponent[],\n type: string,\n key: \"longText\" | \"shortText\" = \"longText\"\n) {\n return (\n components.find((component) => component.types.includes(type))?.[key] ?? \"\"\n );\n}\n\nfunction parseAddress(current: SignupAddressValues, place: GooglePlace) {\n const components = place.addressComponents ?? [];\n const street = [\n getAddressPart(components, \"street_number\"),\n getAddressPart(components, \"route\"),\n ]\n .filter(Boolean)\n .join(\" \");\n return {\n ...current,\n city:\n getAddressPart(components, \"locality\") ||\n getAddressPart(components, \"postal_town\") ||\n getAddressPart(components, \"sublocality_level_1\"),\n country: getAddressPart(components, \"country\", \"shortText\") || \"US\",\n line1: street || place.formattedAddress?.split(\",\")[0] || \"\",\n line2: getAddressPart(components, \"subpremise\"),\n postalCode: [\n getAddressPart(components, \"postal_code\"),\n getAddressPart(components, \"postal_code_suffix\"),\n ]\n .filter(Boolean)\n .join(\"-\"),\n state: getAddressPart(\n components,\n \"administrative_area_level_1\",\n \"shortText\"\n ),\n } satisfies SignupAddressValues;\n}\n\nexport function SignupAddressField({\n apiKey,\n errorId,\n invalid,\n onChange,\n required,\n value,\n}: {\n apiKey: string | undefined;\n errorId: string | undefined;\n invalid: boolean;\n onChange: (address: SignupAddressValues) => void;\n required: boolean;\n value: SignupAddressValues;\n}) {\n const id = useId();\n const listboxId = `${id}-suggestions`;\n const [activeSuggestionIndex, setActiveSuggestionIndex] = useState(-1);\n const [focused, setFocused] = useState(false);\n const [loading, setLoading] = useState(false);\n const [suggestions, setSuggestions] = useState<AddressSuggestion[]>([]);\n const detailRequestGeneration = useRef(0);\n const searchGeneration = useRef(0);\n const sessionToken = useRef<GoogleSessionToken | null>(null);\n\n useEffect(\n () => () => {\n detailRequestGeneration.current += 1;\n },\n []\n );\n\n useEffect(() => {\n const generation = searchGeneration.current + 1;\n searchGeneration.current = generation;\n const query = value.line1.trim();\n setActiveSuggestionIndex(-1);\n setLoading(false);\n if (!(apiKey && focused && query.length >= 3)) {\n setSuggestions([]);\n return;\n }\n const timeout = window.setTimeout(async () => {\n if (generation !== searchGeneration.current) {\n return;\n }\n setLoading(true);\n try {\n const { AutocompleteSessionToken, AutocompleteSuggestion } =\n await loadGooglePlaces(apiKey);\n sessionToken.current ??= new AutocompleteSessionToken();\n const response =\n await AutocompleteSuggestion.fetchAutocompleteSuggestions({\n includedPrimaryTypes: GOOGLE_ADDRESS_TYPES,\n includedRegionCodes: [\"US\"],\n input: query,\n region: \"US\",\n sessionToken: sessionToken.current,\n });\n if (generation === searchGeneration.current) {\n setSuggestions(\n response.suggestions.flatMap(({ placePrediction }) =>\n placePrediction\n ? [\n {\n id: placePrediction.placeId,\n label:\n placePrediction.mainText?.text ??\n placePrediction.text.text,\n prediction: placePrediction,\n secondaryLabel: placePrediction.secondaryText?.text ?? \"\",\n },\n ]\n : []\n )\n );\n }\n } catch {\n if (generation === searchGeneration.current) {\n setSuggestions([]);\n }\n } finally {\n if (generation === searchGeneration.current) {\n setLoading(false);\n }\n }\n }, 250);\n return () => {\n window.clearTimeout(timeout);\n };\n }, [apiKey, focused, value.line1]);\n\n const update = (patch: Partial<SignupAddressValues>) => {\n detailRequestGeneration.current += 1;\n onChange({ ...value, ...patch });\n };\n\n const selectSuggestion = async (suggestion: AddressSuggestion) => {\n const generation = detailRequestGeneration.current + 1;\n detailRequestGeneration.current = generation;\n const place = suggestion.prediction.toPlace();\n try {\n await place.fetchFields({\n fields: [\"addressComponents\", \"formattedAddress\"],\n });\n if (generation !== detailRequestGeneration.current) {\n return;\n }\n onChange(parseAddress(value, place));\n sessionToken.current = null;\n setSuggestions([]);\n setActiveSuggestionIndex(-1);\n setFocused(false);\n } catch {\n if (generation !== detailRequestGeneration.current) {\n return;\n }\n setSuggestions([]);\n setActiveSuggestionIndex(-1);\n }\n };\n\n const handleAddressKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n setSuggestions([]);\n setActiveSuggestionIndex(-1);\n return;\n }\n if (suggestions.length === 0) {\n return;\n }\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n setActiveSuggestionIndex((current) =>\n current < suggestions.length - 1 ? current + 1 : 0\n );\n return;\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setActiveSuggestionIndex((current) =>\n current > 0 ? current - 1 : suggestions.length - 1\n );\n return;\n }\n const suggestion = suggestions[activeSuggestionIndex];\n if (event.key === \"Enter\" && suggestion) {\n event.preventDefault();\n selectSuggestion(suggestion).catch(() => undefined);\n }\n };\n\n return (\n <fieldset\n aria-describedby={invalid ? errorId : undefined}\n aria-invalid={invalid ? \"true\" : undefined}\n className=\"lockerverse-signup__address\"\n >\n <legend>Address</legend>\n <label htmlFor={`${id}-line1`}>\n <span>Street address</span>\n <div className=\"lockerverse-signup__address-search\">\n <input\n aria-activedescendant={\n activeSuggestionIndex >= 0\n ? `${id}-suggestion-${activeSuggestionIndex}`\n : undefined\n }\n aria-autocomplete=\"list\"\n aria-controls={listboxId}\n aria-describedby={invalid ? errorId : undefined}\n aria-expanded={focused && suggestions.length > 0}\n aria-invalid={invalid ? \"true\" : undefined}\n autoComplete=\"street-address\"\n id={`${id}-line1`}\n name=\"address.line1\"\n onBlur={() => window.setTimeout(() => setFocused(false), 120)}\n onChange={(event) => update({ line1: event.currentTarget.value })}\n onFocus={() => setFocused(true)}\n onKeyDown={handleAddressKeyDown}\n required={required}\n role=\"combobox\"\n value={value.line1}\n />\n {loading ? (\n <span className=\"lockerverse-signup__address-loading\">\n Searchingโ€ฆ\n </span>\n ) : null}\n {suggestions.length > 0 ? (\n <div\n className=\"lockerverse-signup__address-suggestions\"\n id={listboxId}\n role=\"listbox\"\n >\n {suggestions.map((suggestion, index) => (\n <button\n aria-selected={activeSuggestionIndex === index}\n id={`${id}-suggestion-${index}`}\n key={suggestion.id}\n onMouseDown={(event) => {\n event.preventDefault();\n selectSuggestion(suggestion).catch(() => undefined);\n }}\n role=\"option\"\n type=\"button\"\n >\n <strong>{suggestion.label}</strong>\n {suggestion.secondaryLabel ? (\n <span>{suggestion.secondaryLabel}</span>\n ) : null}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n </label>\n <label htmlFor={`${id}-line2`}>\n <span>Apartment, suite, or unit</span>\n <input\n autoComplete=\"address-line2\"\n id={`${id}-line2`}\n onChange={(event) => update({ line2: event.currentTarget.value })}\n placeholder=\"Optional\"\n value={value.line2 ?? \"\"}\n />\n </label>\n <div className=\"lockerverse-signup__address-row\">\n <label htmlFor={`${id}-city`}>\n <span>City</span>\n <input\n autoComplete=\"address-level2\"\n id={`${id}-city`}\n onChange={(event) => update({ city: event.currentTarget.value })}\n required={required}\n value={value.city}\n />\n </label>\n <label htmlFor={`${id}-state`}>\n <span>State</span>\n <input\n autoComplete=\"address-level1\"\n id={`${id}-state`}\n onChange={(event) => update({ state: event.currentTarget.value })}\n required={required}\n value={value.state}\n />\n </label>\n </div>\n <div className=\"lockerverse-signup__address-row\">\n <label htmlFor={`${id}-postal`}>\n <span>Postal code</span>\n <input\n autoComplete=\"postal-code\"\n id={`${id}-postal`}\n onChange={(event) =>\n update({ postalCode: event.currentTarget.value })\n }\n required={required}\n value={value.postalCode}\n />\n </label>\n <label htmlFor={`${id}-country`}>\n <span>Country</span>\n <input\n autoComplete=\"country\"\n id={`${id}-country`}\n maxLength={2}\n onChange={(event) =>\n update({ country: event.currentTarget.value.toUpperCase() })\n }\n required={required}\n value={value.country}\n />\n </label>\n </div>\n </fieldset>\n );\n}\n","import type {\n LockerverseSignup,\n LockerverseSignupAddress,\n} from \"@lockerverse/sdk/signup\";\nimport {\n check,\n nonEmpty,\n nullable,\n object,\n pipe,\n regex,\n safeParse,\n string,\n transform,\n trim,\n} from \"valibot\";\nimport {\n optionalEmailSchema,\n optionalPhoneSchema,\n requiredEmailSchema,\n requiredPhoneSchema,\n} from \"./contact-validation.ts\";\nimport {\n type CustomFieldValues,\n validateCustomFields,\n} from \"./custom-fields.tsx\";\nimport { getInternationalPhone } from \"./phone.ts\";\n\nconst POSITIVE_INTEGER_PATTERN = /^[1-9]\\d*$/;\nconst OPTIONAL_POSITIVE_INTEGER_PATTERN = /^(?:$|[1-9]\\d*)$/;\n\nexport type SignupAddressValues = Omit<LockerverseSignupAddress, \"line2\"> & {\n line2: string | null;\n};\n\nexport type SignupFormValues = {\n address: SignupAddressValues;\n customFields: CustomFieldValues;\n email: string;\n honeypot: string;\n name: string;\n participantCount: string;\n phone: string;\n phoneCountry: string;\n};\n\nconst nameSchema = pipe(string(), trim(), nonEmpty(\"Name is required.\"));\nconst optionalParticipantCountSchema = pipe(\n string(),\n trim(),\n regex(\n OPTIONAL_POSITIVE_INTEGER_PATTERN,\n \"Guest count must be a positive whole number.\"\n ),\n transform((value) => (value ? Number(value) : null)),\n check(\n (value) => value === null || Number.isSafeInteger(value),\n \"Guest count must be a positive whole number.\"\n )\n);\nconst requiredParticipantCountSchema = pipe(\n string(),\n trim(),\n nonEmpty(\"Guest count is required.\"),\n regex(\n POSITIVE_INTEGER_PATTERN,\n \"Guest count must be a positive whole number.\"\n ),\n transform(Number),\n check(\n (value) => Number.isSafeInteger(value),\n \"Guest count must be a positive whole number.\"\n )\n);\nconst addressFieldsSchema = object({\n city: string(),\n country: string(),\n line1: string(),\n line2: nullable(string()),\n postalCode: string(),\n state: string(),\n});\nconst requiredAddressSchema = pipe(\n addressFieldsSchema,\n check(isAddressComplete, \"Complete the address.\")\n);\n\nconst EMPTY_ADDRESS: SignupAddressValues = {\n city: \"\",\n country: \"US\",\n line1: \"\",\n line2: null,\n postalCode: \"\",\n state: \"\",\n};\nconst optionalAddressSchema = pipe(\n addressFieldsSchema,\n check(\n (address) => isAddressEmpty(address) || isAddressComplete(address),\n \"Complete the address or leave it blank.\"\n )\n);\n\nexport function isAddressEmpty(address: SignupAddressValues) {\n return ![\n address.city,\n address.line1,\n address.line2,\n address.postalCode,\n address.state,\n ].some((value) => value?.trim());\n}\n\nfunction isAddressComplete(address: SignupAddressValues) {\n return [\n address.city,\n address.country,\n address.line1,\n address.postalCode,\n address.state,\n ].every((value) => value.trim());\n}\n\nexport function validateSignupForm(\n signup: LockerverseSignup,\n values: SignupFormValues\n) {\n const normalizedValues = {\n ...values,\n address: signup.fields.address.enabled ? values.address : EMPTY_ADDRESS,\n email: signup.fields.email.enabled ? values.email : \"\",\n participantCount: signup.fields.participantCount.enabled\n ? values.participantCount\n : \"\",\n phone: signup.fields.phone.enabled\n ? getInternationalPhone(values.phone, values.phoneCountry)\n : \"\",\n };\n const schema = object({\n address:\n signup.fields.address.enabled && signup.fields.address.required\n ? requiredAddressSchema\n : optionalAddressSchema,\n email:\n signup.fields.email.enabled && signup.fields.email.required\n ? requiredEmailSchema\n : optionalEmailSchema,\n name: nameSchema,\n participantCount:\n signup.fields.participantCount.enabled &&\n signup.fields.participantCount.required\n ? requiredParticipantCountSchema\n : optionalParticipantCountSchema,\n phone:\n signup.fields.phone.enabled && signup.fields.phone.required\n ? requiredPhoneSchema\n : optionalPhoneSchema,\n });\n const result = safeParse(schema, normalizedValues);\n const errors = validateCustomFields(signup.customFields, values.customFields);\n if (!result.success) {\n for (const issue of result.issues) {\n const field = issue.path?.[0]?.key;\n const fieldName = [\n \"address\",\n \"email\",\n \"name\",\n \"participantCount\",\n \"phone\",\n ].find((name) => name === field);\n if (fieldName && !errors[fieldName]) {\n errors[fieldName] = issue.message;\n }\n }\n }\n return result.success\n ? { errors, value: { ...values, ...result.output } }\n : { errors, value: null };\n}\n","import type {\n LockerverseSdkError,\n LockerverseSignupClient,\n LockerverseSignup as LockerverseSignupDefinition,\n LockerverseSignupSubmissionResult,\n} from \"@lockerverse/sdk/signup\";\nimport {\n type FormEvent,\n type ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { getAccentContrast, normalizeAccentColor } from \"./accent-contrast.ts\";\nimport {\n buildCustomFieldAnswers,\n CustomFields,\n createCustomFieldValues,\n} from \"./custom-fields.tsx\";\nimport { FormSkeleton } from \"./form-skeleton.tsx\";\nimport { notifyHostCallback } from \"./host-callback.ts\";\nimport { getPhoneServerError, PHONE_COUNTRIES } from \"./phone.ts\";\nimport { SignupAddressField } from \"./signup-address-field.tsx\";\nimport type { LockerverseSignupProps } from \"./signup-types.ts\";\nimport {\n type SignupFormValues as FormValues,\n isAddressEmpty,\n type SignupAddressValues,\n validateSignupForm,\n} from \"./signup-validation.ts\";\n\nconst DEFAULT_ADDRESS: SignupAddressValues = {\n city: \"\",\n country: \"US\",\n line1: \"\",\n line2: \"\",\n postalCode: \"\",\n state: \"\",\n};\n\nconst DEFAULT_ACCENT = \"#5751f2\";\n\nfunction createInitialValues(signup: LockerverseSignupDefinition): FormValues {\n return {\n address: DEFAULT_ADDRESS,\n customFields: createCustomFieldValues(signup.customFields),\n email: \"\",\n honeypot: \"\",\n name: \"\",\n participantCount: \"\",\n phone: \"\",\n phoneCountry: \"US\",\n };\n}\n\nfunction FieldError({ error, id }: { error: string | undefined; id: string }) {\n return error ? (\n <span className=\"lockerverse-signup__field-error\" id={id} role=\"alert\">\n {error}\n </span>\n ) : null;\n}\n\nfunction focusNamedControl(form: HTMLFormElement, name: string) {\n const control = form.elements.namedItem(name);\n if (control instanceof HTMLElement) {\n if (!control.matches(\":disabled\")) {\n control.focus();\n return true;\n }\n return false;\n }\n if (control instanceof RadioNodeList) {\n const focusable = Array.from(control).find(\n (item) => item instanceof HTMLElement && !item.matches(\":disabled\")\n );\n focusable?.focus();\n return Boolean(focusable);\n }\n return false;\n}\n\nfunction focusFirstSignupValidationError(\n form: HTMLFormElement,\n errors: Record<string, string>\n) {\n const builtInFields: [string, string][] = [\n [\"name\", \"name\"],\n [\"email\", \"email\"],\n [\"phone\", \"phone\"],\n [\"participantCount\", \"participantCount\"],\n [\"address\", \"address.line1\"],\n ];\n for (const [errorKey, controlName] of builtInFields) {\n if (errors[errorKey] && focusNamedControl(form, controlName)) {\n return;\n }\n }\n const builtInKeys = new Set(builtInFields.map(([errorKey]) => errorKey));\n const customFieldId = Object.keys(errors).find(\n (errorKey) => !builtInKeys.has(errorKey)\n );\n if (customFieldId) {\n focusNamedControl(form, `custom:${customFieldId}`);\n }\n}\n\ntype SignupViewProps = Omit<LockerverseSignupProps, \"widget\">;\n\nfunction SignupShell({\n children,\n loading = false,\n status = false,\n viewProps,\n}: {\n children: ReactNode;\n loading?: boolean;\n status?: boolean;\n viewProps: SignupViewProps;\n}) {\n const {\n branding,\n className,\n googlePlacesApiKey: _googlePlacesApiKey,\n onSignupComplete: _onSignupComplete,\n style,\n theme = \"dark\",\n ...sectionProps\n } = viewProps;\n const accent = normalizeAccentColor(\n style?.[\"--lockerverse-accent\"] ??\n style?.[\"--lockerverse-signup-accent\"] ??\n branding?.accentColor ??\n DEFAULT_ACCENT\n );\n const signupStyle: LockerverseSignupProps[\"style\"] = { ...style };\n if (\n style?.[\"--lockerverse-accent\"] !== undefined ||\n style?.[\"--lockerverse-signup-accent\"] !== undefined ||\n branding?.accentColor\n ) {\n signupStyle[\"--lockerverse-accent\"] = accent;\n }\n if (\n style?.[\"--lockerverse-accent-contrast\"] === undefined &&\n style?.[\"--lockerverse-signup-accent-contrast\"] === undefined\n ) {\n const accentContrast = getAccentContrast(accent);\n if (accentContrast) {\n signupStyle[\"--lockerverse-accent-contrast\"] = accentContrast;\n }\n }\n return (\n <section\n {...sectionProps}\n {...(loading ? { \"aria-busy\": true } : {})}\n className={[\n \"lockerverse-signup\",\n status ? \"lockerverse-signup__status\" : null,\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={signupStyle}\n >\n {children}\n </section>\n );\n}\n\ntype SignupSubmissionState =\n | { phase: \"idle\" }\n | { phase: \"submitting\" }\n | {\n error: LockerverseSdkError;\n phase: \"submit_error\";\n }\n | {\n phase: \"submitted\";\n };\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: The component renders server-defined field branches in one public form boundary.\nfunction SignupForm({\n client,\n signup,\n ...viewProps\n}: SignupViewProps & {\n client: LockerverseSignupClient;\n signup: LockerverseSignupDefinition;\n}) {\n const { branding, googlePlacesApiKey, onSignupComplete } = viewProps;\n const idPrefix = useId();\n const mountedRef = useRef(true);\n const phoneRef = useRef<HTMLInputElement>(null);\n const submittingRef = useRef(false);\n const [state, setState] = useState<SignupSubmissionState>({ phase: \"idle\" });\n const [values, setValues] = useState<FormValues>(() =>\n createInitialValues(signup)\n );\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [submissionRetry, setSubmissionRetry] = useState<{\n payloadKey: string;\n reference: string;\n }>();\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n if (state.phase !== \"submitting\" && errors.phone) {\n phoneRef.current?.focus();\n }\n }, [errors.phone, state.phase]);\n\n if (!signup.isActive) {\n return (\n <SignupShell status viewProps={viewProps}>\n <h1>Signup closed</h1>\n <p>This signup is not accepting submissions.</p>\n </SignupShell>\n );\n }\n\n if (state.phase === \"submitted\") {\n return (\n <SignupShell status viewProps={viewProps}>\n {branding ? <Branding branding={branding} /> : null}\n <span aria-hidden=\"true\" className=\"lockerverse-signup__success\">\n โœ“\n </span>\n <h1>Thank you</h1>\n <p>Your signup has been received.</p>\n </SignupShell>\n );\n }\n\n const update = (patch: Partial<FormValues>) =>\n setValues((current) => ({ ...current, ...patch }));\n const submitting = state.phase === \"submitting\";\n const submitError =\n state.phase === \"submit_error\" ? state.error.message : undefined;\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Submission maps the enabled server-defined fields to one SDK request.\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n // biome-ignore lint/suspicious/noUnnecessaryConditions: The ref blocks a second submit before React commits the submitting state.\n if (submittingRef.current) {\n return;\n }\n const validation = validateSignupForm(signup, values);\n setErrors(validation.errors);\n if (Object.keys(validation.errors).length > 0 || !validation.value) {\n const form = event.currentTarget;\n queueMicrotask(() =>\n focusFirstSignupValidationError(form, validation.errors)\n );\n return;\n }\n const validatedValues = validation.value;\n const submission = {\n address:\n signup.fields.address.enabled &&\n !isAddressEmpty(validatedValues.address)\n ? validatedValues.address\n : null,\n answers: buildCustomFieldAnswers(\n signup.customFields,\n validatedValues.customFields\n ),\n email: signup.fields.email.enabled ? validatedValues.email || null : null,\n honeypot: validatedValues.honeypot,\n name: validatedValues.name,\n participantCount: signup.fields.participantCount.enabled\n ? validatedValues.participantCount\n : null,\n phone: signup.fields.phone.enabled ? validatedValues.phone || null : null,\n };\n const payloadKey = JSON.stringify(submission);\n const submissionReference =\n submissionRetry?.payloadKey === payloadKey\n ? submissionRetry.reference\n : globalThis.crypto.randomUUID();\n let result: LockerverseSignupSubmissionResult;\n submittingRef.current = true;\n setState({ phase: \"submitting\" });\n try {\n result = await client.submit(submission, { submissionReference });\n } catch (error) {\n if (!mountedRef.current) {\n return;\n }\n // SAFETY: LockerverseSignupClient normalizes each submission rejection to LockerverseSdkError.\n const sdkError = error as LockerverseSdkError;\n const phoneError = getPhoneServerError(sdkError.serverCode);\n if (phoneError) {\n setErrors((current) => ({ ...current, phone: phoneError }));\n setState({ phase: \"idle\" });\n setSubmissionRetry(undefined);\n return;\n }\n setState({ error: sdkError, phase: \"submit_error\" });\n if (sdkError.recoveryRecommended) {\n setSubmissionRetry({\n payloadKey,\n reference: submissionReference,\n });\n } else {\n setSubmissionRetry(undefined);\n }\n return;\n } finally {\n submittingRef.current = false;\n }\n // biome-ignore lint/suspicious/noUnnecessaryConditions: The ref changes during unmount while this request is pending.\n if (!mountedRef.current) {\n return;\n }\n setSubmissionRetry(undefined);\n setState({ phase: \"submitted\" });\n notifyHostCallback(onSignupComplete, result);\n };\n\n return (\n <SignupShell viewProps={viewProps}>\n {signup.coverImageUrl ? (\n <img\n alt=\"\"\n className=\"lockerverse-signup__cover\"\n height={192}\n src={signup.coverImageUrl}\n width={440}\n />\n ) : null}\n {branding ? <Branding branding={branding} /> : null}\n <header>\n {signup.title?.trim() ? <h1>{signup.title}</h1> : null}\n {signup.description ? <p>{signup.description}</p> : null}\n </header>\n <form noValidate onSubmit={handleSubmit}>\n <input\n aria-hidden=\"true\"\n autoComplete=\"off\"\n className=\"lockerverse-signup__honeypot\"\n onChange={(event) => update({ honeypot: event.currentTarget.value })}\n tabIndex={-1}\n value={values.honeypot}\n />\n <div className=\"lockerverse-signup__fields\">\n <label htmlFor={`${idPrefix}-name`}>\n <span>Name</span>\n <input\n aria-describedby={\n errors.name ? `${idPrefix}-name-error` : undefined\n }\n aria-invalid={errors.name ? \"true\" : undefined}\n autoComplete=\"name\"\n id={`${idPrefix}-name`}\n name=\"name\"\n onChange={(event) => update({ name: event.currentTarget.value })}\n required\n value={values.name}\n />\n <FieldError error={errors.name} id={`${idPrefix}-name-error`} />\n </label>\n {signup.fields.email.enabled ? (\n <label htmlFor={`${idPrefix}-email`}>\n <span>Email</span>\n <input\n aria-describedby={\n errors.email ? `${idPrefix}-email-error` : undefined\n }\n aria-invalid={errors.email ? \"true\" : undefined}\n autoComplete=\"email\"\n id={`${idPrefix}-email`}\n name=\"email\"\n onChange={(event) =>\n update({ email: event.currentTarget.value })\n }\n required={signup.fields.email.required}\n type=\"email\"\n value={values.email}\n />\n <FieldError error={errors.email} id={`${idPrefix}-email-error`} />\n </label>\n ) : null}\n {signup.fields.phone.enabled ? (\n <div className=\"lockerverse-signup__phone-field\">\n <label htmlFor={`${idPrefix}-phone`}>\n <span>Phone</span>\n </label>\n <div className=\"lockerverse-signup__phone-control\">\n <select\n aria-label=\"Phone number country\"\n name=\"phoneCountry\"\n onChange={(event) => {\n update({ phoneCountry: event.currentTarget.value });\n phoneRef.current?.focus();\n }}\n value={values.phoneCountry}\n >\n {PHONE_COUNTRIES.map((country) => (\n <option key={country.value} value={country.value}>\n {country.label}\n </option>\n ))}\n </select>\n <input\n aria-describedby={\n errors.phone ? `${idPrefix}-phone-error` : undefined\n }\n aria-invalid={errors.phone ? \"true\" : undefined}\n autoComplete=\"tel\"\n id={`${idPrefix}-phone`}\n name=\"phone\"\n onChange={(event) =>\n update({ phone: event.currentTarget.value })\n }\n placeholder=\"(201) 555-0123\"\n ref={phoneRef}\n required={signup.fields.phone.required}\n type=\"tel\"\n value={values.phone}\n />\n </div>\n <FieldError error={errors.phone} id={`${idPrefix}-phone-error`} />\n </div>\n ) : null}\n {signup.fields.participantCount.enabled ? (\n <label htmlFor={`${idPrefix}-participant-count`}>\n <span>Guest count</span>\n <input\n aria-describedby={\n errors.participantCount\n ? `${idPrefix}-participant-count-error`\n : undefined\n }\n aria-invalid={errors.participantCount ? \"true\" : undefined}\n id={`${idPrefix}-participant-count`}\n min={1}\n name=\"participantCount\"\n onChange={(event) =>\n update({ participantCount: event.currentTarget.value })\n }\n required={signup.fields.participantCount.required}\n type=\"number\"\n value={values.participantCount}\n />\n <FieldError\n error={errors.participantCount}\n id={`${idPrefix}-participant-count-error`}\n />\n </label>\n ) : null}\n {signup.fields.address.enabled ? (\n <div className=\"lockerverse-signup__field-group\">\n <SignupAddressField\n apiKey={googlePlacesApiKey}\n errorId={\n errors.address ? `${idPrefix}-address-error` : undefined\n }\n invalid={Boolean(errors.address)}\n onChange={(address) => update({ address })}\n required={signup.fields.address.required}\n value={values.address}\n />\n <FieldError\n error={errors.address}\n id={`${idPrefix}-address-error`}\n />\n </div>\n ) : null}\n <CustomFields\n choiceClassName=\"lockerverse-signup__choice\"\n errorClassName=\"lockerverse-signup__field-error\"\n errors={errors}\n fields={signup.customFields}\n idPrefix={idPrefix}\n onChange={(customFields) => update({ customFields })}\n values={values.customFields}\n />\n </div>\n {submitError ? (\n <p className=\"lockerverse-signup__submit-error\" role=\"alert\">\n {submitError} Try again.\n </p>\n ) : null}\n <button\n className=\"lockerverse-signup__submit\"\n disabled={submitting}\n type=\"submit\"\n >\n {submitting ? \"Submittingโ€ฆ\" : \"Submit\"}\n </button>\n </form>\n </SignupShell>\n );\n}\n\nexport function LockerverseSignup({\n widget,\n ...viewProps\n}: LockerverseSignupProps) {\n if (widget.error) {\n return (\n <SignupShell status viewProps={viewProps}>\n <h1>Signup unavailable</h1>\n <p role=\"alert\">{widget.error.message}</p>\n <button onClick={widget.refresh} type=\"button\">\n Retry\n </button>\n </SignupShell>\n );\n }\n if (widget.loading || !widget.signup) {\n return (\n <SignupShell loading viewProps={viewProps}>\n <FormSkeleton fieldCount={4} label=\"Loading signupโ€ฆ\" />\n </SignupShell>\n );\n }\n return (\n <SignupForm client={widget.client} signup={widget.signup} {...viewProps} />\n );\n}\n\nfunction Branding({\n branding,\n}: {\n branding: NonNullable<LockerverseSignupProps[\"branding\"]>;\n}) {\n return (\n <div className=\"lockerverse-signup__branding\">\n {branding.imageUrl ? (\n <img alt=\"\" height={48} src={branding.imageUrl} width={48} />\n ) : null}\n <strong>{branding.name}</strong>\n </div>\n );\n}\n","import {\n type CreateLockerverseSignupOptions,\n createLockerverseSignupClient,\n type LockerverseSdkError,\n type LockerverseSignup,\n type LockerverseSignupClient,\n} from \"@lockerverse/sdk/signup\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useImmutableResourceIdentity } from \"./immutable-resource-identity.ts\";\n\ntype SignupLoadState = {\n error: LockerverseSdkError | null;\n signup: LockerverseSignup | null;\n};\n\nexport type UseLockerverseSignupResult = {\n client: LockerverseSignupClient;\n error: LockerverseSdkError | null;\n loading: boolean;\n refresh: () => void;\n signup: LockerverseSignup | null;\n};\n\nexport function useLockerverseSignup(\n options: CreateLockerverseSignupOptions\n): UseLockerverseSignupResult {\n const { onError } = options;\n useImmutableResourceIdentity(\"signup\", {\n apiBaseUrl: options.apiBaseUrl,\n communitySlug: options.communitySlug,\n environment: options.environment,\n slug: options.signupSlug,\n });\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const [client] = useState(() => {\n const clientOptions: CreateLockerverseSignupOptions = {\n ...options,\n onError: (error) => onErrorRef.current?.(error),\n };\n return createLockerverseSignupClient(clientOptions);\n });\n const [revision, setRevision] = useState(0);\n const [state, setState] = useState<SignupLoadState>({\n error: null,\n signup: null,\n });\n\n useEffect(() => {\n let active = true;\n client.load().then(\n (signup) => {\n if (active) {\n setState({\n error: null,\n signup,\n });\n }\n },\n (error: LockerverseSdkError) => {\n if (active) {\n setState({\n error,\n signup: null,\n });\n }\n }\n );\n return () => {\n active = false;\n };\n }, [client, revision]);\n\n const refresh = useCallback(() => {\n setState({\n error: null,\n signup: null,\n });\n setRevision((value) => value + 1);\n }, []);\n\n return {\n client,\n error: state.error,\n loading: state.signup === null && state.error === null,\n refresh,\n signup: state.signup,\n };\n}\n"],"mappings":"qjBAwDA,MAAM,EAAwB,mCACxB,EAAuB,CAC3B,UACA,aACA,iBACA,OACF,EACA,IAAI,EAA0D,KAE9D,SAAS,EAAkB,EAAgB,CACzC,IAAM,EAAiC,OACvC,GAAI,EAAa,QAAQ,MAAM,cAC7B,OAEF,EAAa,SAAW,CAAC,EACzB,IAAM,EAAe,EAAa,OAClC,EAAa,OAAS,CAAC,EACvB,IAAM,EAAa,EAAa,KAC5B,EAAsC,KAC1C,EAAW,cAAiB,IAC1B,IAAkB,IAAI,SAAS,EAAS,IAAW,CACjD,IAAM,EAAiB,SAAS,eAAe,CAAqB,EAEpE,GADA,EAAW,yBAA2B,EAClC,EAAgB,CAClB,EAAe,iBACb,YACM,EAAW,MAAM,+BAA+B,CAAC,EACvD,CAAE,KAAM,EAAK,CACf,EACA,MACF,CACA,IAAM,EAAS,SAAS,cAAc,QAAQ,EACxC,EAAa,IAAI,gBAAgB,CACrC,SAAU,uCACV,IAAK,EACL,UAAW,EACX,EAAG,QACL,CAAC,EACD,EAAO,MAAQ,GACf,EAAO,GAAK,EACZ,EAAO,IAAM,2CAA2C,IACxD,EAAO,YAAgB,EAAW,MAAM,+BAA+B,CAAC,EACxE,SAAS,KAAK,OAAO,CAAM,CAC7B,CAAC,EACM,EACJ,SAAW,CACV,IAAM,EAAgB,EAAa,QAAQ,MAAM,cACjD,GAAI,CAAC,EACH,MAAU,MAAM,+BAA+B,EAEjD,OAAO,EAAc,CAAW,CAClC,CAAC,CAAC,CACD,MAAO,GAAU,CAGhB,KAFA,GAAgB,KAChB,SAAS,eAAe,CAAqB,CAAC,EAAE,OAAO,EACjD,CACR,CAAC,EAEP,CAEA,SAAS,EAAiB,EAAgB,CAexC,MAdA,MAAwB,SAAY,CAClC,GAAI,CACF,EAAkB,CAAM,EAExB,IAAM,EAAgBA,OAAa,QAAQ,MAAM,cACjD,GAAI,CAAC,EACH,MAAU,MAAM,+BAA+B,EAEjD,OAAO,MAAM,EAAc,QAAQ,CACrC,OAAS,EAAO,CAEd,KADA,GAAqB,KACf,CACR,CACF,EAAA,CAAG,EACI,CACT,CAEA,SAAS,EACP,EACA,EACA,EAAgC,WAChC,CACA,OACE,EAAW,KAAM,GAAc,EAAU,MAAM,SAAS,CAAI,CAAC,CAAC,GAAG,IAAQ,EAE7E,CAEA,SAAS,EAAa,EAA8B,EAAoB,CACtE,IAAM,EAAa,EAAM,mBAAqB,CAAC,EACzC,EAAS,CACb,EAAe,EAAY,eAAe,EAC1C,EAAe,EAAY,OAAO,CACpC,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,EACX,MAAO,CACL,GAAG,EACH,KACE,EAAe,EAAY,UAAU,GACrC,EAAe,EAAY,aAAa,GACxC,EAAe,EAAY,qBAAqB,EAClD,QAAS,EAAe,EAAY,UAAW,WAAW,GAAK,KAC/D,MAAO,GAAU,EAAM,kBAAkB,MAAM,GAAG,CAAC,CAAC,IAAM,GAC1D,MAAO,EAAe,EAAY,YAAY,EAC9C,WAAY,CACV,EAAe,EAAY,aAAa,EACxC,EAAe,EAAY,oBAAoB,CACjD,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,EACX,MAAO,EACL,EACA,8BACA,WACF,CACF,CACF,CAEA,SAAgB,EAAmB,CACjC,SACA,UACA,UACA,WACA,WACA,SAQC,CACD,IAAM,EAAK,EAAM,EACX,EAAY,GAAG,EAAG,cAClB,CAAC,EAAuB,GAA4B,EAAS,EAAE,EAC/D,CAAC,EAAS,GAAc,EAAS,EAAK,EACtC,CAAC,EAAS,GAAc,EAAS,EAAK,EACtC,CAAC,EAAa,GAAkB,EAA8B,CAAC,CAAC,EAChE,EAA0B,EAAO,CAAC,EAClC,EAAmB,EAAO,CAAC,EAC3B,EAAe,EAAkC,IAAI,EAE3D,UACc,CACV,EAAwB,SAAW,CACrC,EACA,CAAC,CACH,EAEA,MAAgB,CACd,IAAM,EAAa,EAAiB,QAAU,EAC9C,EAAiB,QAAU,EAC3B,IAAM,EAAQ,EAAM,MAAM,KAAK,EAG/B,GAFA,EAAyB,EAAE,EAC3B,EAAW,EAAK,EACZ,EAAE,GAAU,GAAW,EAAM,QAAU,GAAI,CAC7C,EAAe,CAAC,CAAC,EACjB,MACF,CACA,IAAM,EAAU,OAAO,WAAW,SAAY,CACxC,OAAe,EAAiB,QAGpC,GAAW,EAAI,EACf,GAAI,CACF,GAAM,CAAE,2BAA0B,0BAChC,MAAM,EAAiB,CAAM,EAC/B,EAAa,UAAY,IAAI,EAC7B,IAAM,EACJ,MAAM,EAAuB,6BAA6B,CACxD,qBAAsB,EACtB,oBAAqB,CAAC,IAAI,EAC1B,MAAO,EACP,OAAQ,KACR,aAAc,EAAa,OAC7B,CAAC,EACC,IAAe,EAAiB,SAClC,EACE,EAAS,YAAY,SAAS,CAAE,qBAC9B,EACI,CACE,CACE,GAAI,EAAgB,QACpB,MACE,EAAgB,UAAU,MAC1B,EAAgB,KAAK,KACvB,WAAY,EACZ,eAAgB,EAAgB,eAAe,MAAQ,EACzD,CACF,EACA,CAAC,CACP,CACF,CAEJ,MAAQ,CACF,IAAe,EAAiB,SAClC,EAAe,CAAC,CAAC,CAErB,QAAU,CACJ,IAAe,EAAiB,SAClC,EAAW,EAAK,CAEpB,CAvCe,CAwCjB,EAAG,GAAG,EACN,UAAa,CACX,OAAO,aAAa,CAAO,CAC7B,CACF,EAAG,CAAC,EAAQ,EAAS,EAAM,KAAK,CAAC,EAEjC,IAAM,EAAU,GAAwC,CACtD,EAAwB,SAAW,EACnC,EAAS,CAAE,GAAG,EAAO,GAAG,CAAM,CAAC,CACjC,EAEM,EAAmB,KAAO,IAAkC,CAChE,IAAM,EAAa,EAAwB,QAAU,EACrD,EAAwB,QAAU,EAClC,IAAM,EAAQ,EAAW,WAAW,QAAQ,EAC5C,GAAI,CAIF,GAHA,MAAM,EAAM,YAAY,CACtB,OAAQ,CAAC,oBAAqB,kBAAkB,CAClD,CAAC,EACG,IAAe,EAAwB,QACzC,OAEF,EAAS,EAAa,EAAO,CAAK,CAAC,EACnC,EAAa,QAAU,KACvB,EAAe,CAAC,CAAC,EACjB,EAAyB,EAAE,EAC3B,EAAW,EAAK,CAClB,MAAQ,CACN,GAAI,IAAe,EAAwB,QACzC,OAEF,EAAe,CAAC,CAAC,EACjB,EAAyB,EAAE,CAC7B,CACF,EAiCA,OACE,EAAC,WAAD,CACE,mBAAkB,EAAU,EAAU,IAAA,GACtC,eAAc,EAAU,OAAS,IAAA,GACjC,UAAU,8BAHZ,SAAA,CAKE,EAAC,SAAD,CAAA,SAAQ,SAAe,CAAA,EACvB,EAAC,QAAD,CAAO,QAAS,GAAG,EAAG,QAAtB,SAAA,CACE,EAAC,OAAD,CAAA,SAAM,gBAAoB,CAAA,EAC1B,EAAC,MAAD,CAAK,UAAU,qCAAf,SAAA,CACE,EAAC,QAAD,CACE,wBACE,GAAyB,EACrB,GAAG,EAAG,cAAc,IACpB,IAAA,GAEN,oBAAkB,OAClB,gBAAe,EACf,mBAAkB,EAAU,EAAU,IAAA,GACtC,gBAAe,GAAW,EAAY,OAAS,EAC/C,eAAc,EAAU,OAAS,IAAA,GACjC,aAAa,iBACb,GAAI,GAAG,EAAG,QACV,KAAK,gBACL,WAAc,OAAO,eAAiB,EAAW,EAAK,EAAG,GAAG,EAC5D,SAAW,GAAU,EAAO,CAAE,MAAO,EAAM,cAAc,KAAM,CAAC,EAChE,YAAe,EAAW,EAAI,EAC9B,UA1DoB,GAA2C,CACvE,GAAI,EAAM,MAAQ,SAAU,CAC1B,EAAM,eAAe,EACrB,EAAe,CAAC,CAAC,EACjB,EAAyB,EAAE,EAC3B,MACF,CACA,GAAI,EAAY,SAAW,EACzB,OAEF,GAAI,EAAM,MAAQ,YAAa,CAC7B,EAAM,eAAe,EACrB,EAA0B,GACxB,EAAU,EAAY,OAAS,EAAI,EAAU,EAAI,CACnD,EACA,MACF,CACA,GAAI,EAAM,MAAQ,UAAW,CAC3B,EAAM,eAAe,EACrB,EAA0B,GACxB,EAAU,EAAI,EAAU,EAAI,EAAY,OAAS,CACnD,EACA,MACF,CACA,IAAM,EAAa,EAAY,GAC3B,EAAM,MAAQ,SAAW,IAC3B,EAAM,eAAe,EACrB,EAAiB,CAAU,CAAC,CAAC,UAAY,IAAA,EAAS,EAEtD,EA8BoB,WACV,KAAK,WACL,MAAO,EAAM,KACd,CAAA,EACA,EACC,EAAC,OAAD,CAAM,UAAU,sCAAsC,SAAA,YAEhD,CAAA,EACJ,KACH,EAAY,OAAS,EACpB,EAAC,MAAD,CACE,UAAU,0CACV,GAAI,EACJ,KAAK,UAEJ,SAAA,EAAY,KAAK,EAAY,IAC5B,EAAC,SAAD,CACE,gBAAe,IAA0B,EACzC,GAAI,GAAG,EAAG,cAAc,IAExB,YAAc,GAAU,CACtB,EAAM,eAAe,EACrB,EAAiB,CAAU,CAAC,CAAC,UAAY,IAAA,EAAS,CACpD,EACA,KAAK,SACL,KAAK,SATP,SAAA,CAWE,EAAC,SAAD,CAAA,SAAS,EAAW,KAAc,CAAA,EACjC,EAAW,eACV,EAAC,OAAD,CAAA,SAAO,EAAW,cAAqB,CAAA,EACrC,IACE,CAZD,EAAA,EAAW,EAYV,CACT,CACE,CAAA,EACH,IACD,CACA,CAAA,CAAA,IACP,EAAC,QAAD,CAAO,QAAS,GAAG,EAAG,QAAtB,SAAA,CACE,EAAC,OAAD,CAAA,SAAM,2BAA+B,CAAA,EACrC,EAAC,QAAD,CACE,aAAa,gBACb,GAAI,GAAG,EAAG,QACV,SAAW,GAAU,EAAO,CAAE,MAAO,EAAM,cAAc,KAAM,CAAC,EAChE,YAAY,WACZ,MAAO,EAAM,OAAS,EACvB,CAAA,CACI,IACP,EAAC,MAAD,CAAK,UAAU,kCAAf,SAAA,CACE,EAAC,QAAD,CAAO,QAAS,GAAG,EAAG,OAAtB,SAAA,CACE,EAAC,OAAD,CAAA,SAAM,MAAU,CAAA,EAChB,EAAC,QAAD,CACE,aAAa,iBACb,GAAI,GAAG,EAAG,OACV,SAAW,GAAU,EAAO,CAAE,KAAM,EAAM,cAAc,KAAM,CAAC,EACrD,WACV,MAAO,EAAM,IACd,CAAA,CACI,CACP,CAAA,EAAA,EAAC,QAAD,CAAO,QAAS,GAAG,EAAG,QAAtB,SAAA,CACE,EAAC,OAAD,CAAA,SAAM,OAAW,CAAA,EACjB,EAAC,QAAD,CACE,aAAa,iBACb,GAAI,GAAG,EAAG,QACV,SAAW,GAAU,EAAO,CAAE,MAAO,EAAM,cAAc,KAAM,CAAC,EACtD,WACV,MAAO,EAAM,KACd,CAAA,CACI,CACJ,CAAA,CAAA,IACL,EAAC,MAAD,CAAK,UAAU,kCAAf,SAAA,CACE,EAAC,QAAD,CAAO,QAAS,GAAG,EAAG,SAAtB,SAAA,CACE,EAAC,OAAD,CAAA,SAAM,aAAiB,CAAA,EACvB,EAAC,QAAD,CACE,aAAa,cACb,GAAI,GAAG,EAAG,SACV,SAAW,GACT,EAAO,CAAE,WAAY,EAAM,cAAc,KAAM,CAAC,EAExC,WACV,MAAO,EAAM,UACd,CAAA,CACI,CACP,CAAA,EAAA,EAAC,QAAD,CAAO,QAAS,GAAG,EAAG,UAAtB,SAAA,CACE,EAAC,OAAD,CAAA,SAAM,SAAa,CAAA,EACnB,EAAC,QAAD,CACE,aAAa,UACb,GAAI,GAAG,EAAG,UACV,UAAW,EACX,SAAW,GACT,EAAO,CAAE,QAAS,EAAM,cAAc,MAAM,YAAY,CAAE,CAAC,EAEnD,WACV,MAAO,EAAM,OACd,CAAA,CACI,CACJ,CAAA,CAAA,GACG,GAEd,CC1aA,MAAM,EAA2B,aAC3B,EAAoC,mBAiBpC,EAAa,EAAK,EAAO,EAAG,EAAK,EAAG,EAAS,mBAAmB,CAAC,EACjE,EAAiC,EACrC,EAAO,EACP,EAAK,EACL,EACE,EACA,8CACF,EACA,EAAW,GAAW,EAAQ,OAAO,CAAK,EAAI,IAAK,EACnD,EACG,GAAU,IAAU,MAAQ,OAAO,cAAc,CAAK,EACvD,8CACF,CACF,EACM,EAAiC,EACrC,EAAO,EACP,EAAK,EACL,EAAS,0BAA0B,EACnC,EACE,EACA,8CACF,EACA,EAAU,MAAM,EAChB,EACG,GAAU,OAAO,cAAc,CAAK,EACrC,8CACF,CACF,EACM,EAAsB,EAAO,CACjC,KAAM,EAAO,EACb,QAAS,EAAO,EAChB,MAAO,EAAO,EACd,MAAO,EAAS,EAAO,CAAC,EACxB,WAAY,EAAO,EACnB,MAAO,EAAO,CAChB,CAAC,EACK,EAAwB,EAC5B,EACA,EAAM,EAAmB,uBAAuB,CAClD,EAEM,GAAqC,CACzC,KAAM,GACN,QAAS,KACT,MAAO,GACP,MAAO,KACP,WAAY,GACZ,MAAO,EACT,EACM,GAAwB,EAC5B,EACA,EACG,GAAY,EAAe,CAAO,GAAK,EAAkB,CAAO,EACjE,yCACF,CACF,EAEA,SAAgB,EAAe,EAA8B,CAC3D,MAAO,CAAC,CACN,EAAQ,KACR,EAAQ,MACR,EAAQ,MACR,EAAQ,WACR,EAAQ,KACV,CAAC,CAAC,KAAM,GAAU,GAAO,KAAK,CAAC,CACjC,CAEA,SAAS,EAAkB,EAA8B,CACvD,MAAO,CACL,EAAQ,KACR,EAAQ,QACR,EAAQ,MACR,EAAQ,WACR,EAAQ,KACV,CAAC,CAAC,MAAO,GAAU,EAAM,KAAK,CAAC,CACjC,CAEA,SAAgB,GACd,EACA,EACA,CACA,IAAM,EAAmB,CACvB,GAAG,EACH,QAAS,EAAO,OAAO,QAAQ,QAAU,EAAO,QAAU,GAC1D,MAAO,EAAO,OAAO,MAAM,QAAU,EAAO,MAAQ,GACpD,iBAAkB,EAAO,OAAO,iBAAiB,QAC7C,EAAO,iBACP,GACJ,MAAO,EAAO,OAAO,MAAM,QACvB,EAAsB,EAAO,MAAO,EAAO,YAAY,EACvD,EACN,EACM,EAAS,EAAO,CACpB,QACE,EAAO,OAAO,QAAQ,SAAW,EAAO,OAAO,QAAQ,SACnD,EACA,GACN,MACE,EAAO,OAAO,MAAM,SAAW,EAAO,OAAO,MAAM,SAC/C,EACA,EACN,KAAM,EACN,iBACE,EAAO,OAAO,iBAAiB,SAC/B,EAAO,OAAO,iBAAiB,SAC3B,EACA,EACN,MACE,EAAO,OAAO,MAAM,SAAW,EAAO,OAAO,MAAM,SAC/C,EACA,CACR,CAAC,EACK,EAAS,EAAU,EAAQ,CAAgB,EAC3C,EAAS,EAAqB,EAAO,aAAc,EAAO,YAAY,EAC5E,GAAI,CAAC,EAAO,QACV,IAAK,IAAM,KAAS,EAAO,OAAQ,CACjC,IAAM,EAAQ,EAAM,OAAO,EAAE,EAAE,IACzB,EAAY,CAChB,UACA,QACA,OACA,mBACA,OACF,CAAC,CAAC,KAAM,GAAS,IAAS,CAAK,EAC3B,GAAa,CAAC,EAAO,KACvB,EAAO,GAAa,EAAM,QAE9B,CAEF,OAAO,EAAO,QACV,CAAE,SAAQ,MAAO,CAAE,GAAG,EAAQ,GAAG,EAAO,MAAO,CAAE,EACjD,CAAE,SAAQ,MAAO,IAAK,CAC5B,CClJA,MAAM,GAAuC,CAC3C,KAAM,GACN,QAAS,KACT,MAAO,GACP,MAAO,GACP,WAAY,GACZ,MAAO,EACT,EAIA,SAAS,GAAoB,EAAiD,CAC5E,MAAO,CACL,QAAS,GACT,aAAc,EAAwB,EAAO,YAAY,EACzD,MAAO,GACP,SAAU,GACV,KAAM,GACN,iBAAkB,GAClB,MAAO,GACP,aAAc,IAChB,CACF,CAEA,SAAS,EAAW,CAAE,QAAO,MAAiD,CAC5E,OAAO,EACL,EAAC,OAAD,CAAM,UAAU,kCAAsC,KAAI,KAAK,QAC5D,SAAA,CACG,CAAA,EACJ,IACN,CAEA,SAAS,EAAkB,EAAuB,EAAc,CAC9D,IAAM,EAAU,EAAK,SAAS,UAAU,CAAI,EAC5C,GAAI,aAAmB,YAKrB,MAJA,CAAK,EAAQ,QAAQ,WAAW,IAC9B,EAAQ,MAAM,EACP,IAIX,GAAI,aAAmB,cAAe,CACpC,IAAM,EAAY,MAAM,KAAK,CAAO,CAAC,CAAC,KACnC,GAAS,aAAgB,aAAe,CAAC,EAAK,QAAQ,WAAW,CACpE,EAEA,OADA,GAAW,MAAM,EACV,EAAQ,CACjB,CACA,MAAO,EACT,CAEA,SAAS,GACP,EACA,EACA,CACA,IAAM,EAAoC,CACxC,CAAC,OAAQ,MAAM,EACf,CAAC,QAAS,OAAO,EACjB,CAAC,QAAS,OAAO,EACjB,CAAC,mBAAoB,kBAAkB,EACvC,CAAC,UAAW,eAAe,CAC7B,EACA,IAAK,GAAM,CAAC,EAAU,KAAgB,EACpC,GAAI,EAAO,IAAa,EAAkB,EAAM,CAAW,EACzD,OAGJ,IAAM,EAAc,IAAI,IAAI,EAAc,KAAK,CAAC,KAAc,CAAQ,CAAC,EACjE,EAAgB,OAAO,KAAK,CAAM,CAAC,CAAC,KACvC,GAAa,CAAC,EAAY,IAAI,CAAQ,CACzC,EACI,GACF,EAAkB,EAAM,UAAU,GAAe,CAErD,CAIA,SAAS,EAAY,CACnB,WACA,UAAU,GACV,SAAS,GACT,aAMC,CACD,GAAM,CACJ,WACA,YACA,mBAAoB,EACpB,iBAAkB,EAClB,QACA,QAAQ,OACR,GAAG,GACD,EACE,EAAS,EACb,IAAQ,yBACN,IAAQ,gCACR,GAAU,aACV,SACJ,EACM,EAA+C,CAAE,GAAG,CAAM,EAQhE,IANE,IAAQ,0BAA4B,IAAA,IACpC,IAAQ,iCAAmC,IAAA,IAC3C,GAAU,eAEV,EAAY,wBAA0B,GAGtC,IAAQ,mCAAqC,IAAA,IAC7C,IAAQ,0CAA4C,IAAA,GACpD,CACA,IAAM,EAAiB,EAAkB,CAAM,EAC3C,IACF,EAAY,iCAAmC,EAEnD,CACA,OACE,EAAC,UAAD,CACE,GAAI,EACJ,GAAK,EAAU,CAAE,YAAa,EAAK,EAAI,CAAC,EACxC,UAAW,CACT,qBACA,EAAS,6BAA+B,KACxC,CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,EACX,yBAAwB,EACxB,MAAO,EAEN,UACM,CAAA,CAEb,CAcA,SAAS,GAAW,CAClB,SACA,SACA,GAAG,GAIF,CACD,GAAM,CAAE,WAAU,qBAAoB,oBAAqB,EACrD,EAAW,EAAM,EACjB,EAAa,EAAO,EAAI,EACxB,EAAW,EAAyB,IAAI,EACxC,EAAgB,EAAO,EAAK,EAC5B,CAAC,EAAO,GAAY,EAAgC,CAAE,MAAO,MAAO,CAAC,EACrE,CAAC,EAAQ,GAAa,MAC1B,GAAoB,CAAM,CAC5B,EACM,CAAC,EAAQ,GAAa,EAAiC,CAAC,CAAC,EACzD,CAAC,EAAiB,GAAsB,EAG3C,EAeH,GAbA,OACE,EAAW,QAAU,OACR,CACX,EAAW,QAAU,EACvB,GACC,CAAC,CAAC,EAEL,MAAgB,CACV,EAAM,QAAU,cAAgB,EAAO,OACzC,EAAS,SAAS,MAAM,CAE5B,EAAG,CAAC,EAAO,MAAO,EAAM,KAAK,CAAC,EAE1B,CAAC,EAAO,SACV,OACE,EAAC,EAAD,CAAa,OAAA,GAAkB,YAA/B,SAAA,CACE,EAAC,KAAD,CAAA,SAAI,eAAiB,CAAA,EACrB,EAAC,IAAD,CAAA,SAAG,2CAA4C,CAAA,CACpC,IAIjB,GAAI,EAAM,QAAU,YAClB,OACE,EAAC,EAAD,CAAa,OAAA,GAAkB,YAA/B,SAAA,CACG,EAAW,EAAC,EAAD,CAAoB,UAAW,CAAA,EAAI,KAC/C,EAAC,OAAD,CAAM,cAAY,OAAO,UAAU,8BAA8B,SAAA,GAE3D,CAAA,EACN,EAAC,KAAD,CAAA,SAAI,WAAa,CAAA,EACjB,EAAC,IAAD,CAAA,SAAG,gCAAiC,CAAA,CACzB,IAIjB,IAAM,EAAU,GACd,EAAW,IAAa,CAAE,GAAG,EAAS,GAAG,CAAM,EAAE,EAC7C,EAAa,EAAM,QAAU,aAC7B,EACJ,EAAM,QAAU,eAAiB,EAAM,MAAM,QAAU,IAAA,GAiFzD,OACE,EAAC,EAAD,CAAwB,YAAxB,SAAA,CACG,EAAO,cACN,EAAC,MAAD,CACE,IAAI,GACJ,UAAU,4BACV,OAAQ,IACR,IAAK,EAAO,cACZ,MAAO,GACR,CAAA,EACC,KACH,EAAW,EAAC,EAAD,CAAoB,UAAW,CAAA,EAAI,KAC/C,EAAC,SAAD,CAAA,SAAA,CACG,EAAO,OAAO,KAAK,EAAI,EAAC,KAAD,CAAA,SAAK,EAAO,KAAU,CAAA,EAAI,KACjD,EAAO,YAAc,EAAC,IAAD,CAAA,SAAI,EAAO,WAAe,CAAA,EAAI,IAC9C,CAAA,CAAA,EACR,EAAC,OAAD,CAAM,WAAA,GAAW,SAAU,KA/FH,IAAsC,CAGhE,GAFA,EAAM,eAAe,EAEjB,EAAc,QAChB,OAEF,IAAM,EAAa,GAAmB,EAAQ,CAAM,EAEpD,GADA,EAAU,EAAW,MAAM,EACvB,OAAO,KAAK,EAAW,MAAM,CAAC,CAAC,OAAS,GAAK,CAAC,EAAW,MAAO,CAClE,IAAM,EAAO,EAAM,cACnB,mBACE,GAAgC,EAAM,EAAW,MAAM,CACzD,EACA,MACF,CACA,IAAM,EAAkB,EAAW,MAC7B,EAAa,CACjB,QACE,EAAO,OAAO,QAAQ,SACtB,CAAC,EAAe,EAAgB,OAAO,EACnC,EAAgB,QAChB,KACN,QAAS,EACP,EAAO,aACP,EAAgB,YAClB,EACA,MAAO,EAAO,OAAO,MAAM,SAAU,EAAgB,OAAgB,KACrE,SAAU,EAAgB,SAC1B,KAAM,EAAgB,KACtB,iBAAkB,EAAO,OAAO,iBAAiB,QAC7C,EAAgB,iBAChB,KACJ,MAAO,EAAO,OAAO,MAAM,SAAU,EAAgB,OAAgB,IACvE,EACM,EAAa,KAAK,UAAU,CAAU,EACtC,EACJ,GAAiB,aAAe,EAC5B,EAAgB,UAChB,WAAW,OAAO,WAAW,EAC/B,EACJ,EAAc,QAAU,GACxB,EAAS,CAAE,MAAO,YAAa,CAAC,EAChC,GAAI,CACF,EAAS,MAAM,EAAO,OAAO,EAAY,CAAE,qBAAoB,CAAC,CAClE,OAAS,EAAO,CACd,GAAI,CAAC,EAAW,QACd,OAGF,IAAM,EAAW,EACX,EAAa,EAAoB,EAAS,UAAU,EAC1D,GAAI,EAAY,CACd,EAAW,IAAa,CAAE,GAAG,EAAS,MAAO,CAAW,EAAE,EAC1D,EAAS,CAAE,MAAO,MAAO,CAAC,EAC1B,EAAmB,IAAA,EAAS,EAC5B,MACF,CACA,EAAS,CAAE,MAAO,EAAU,MAAO,cAAe,CAAC,EAC/C,EAAS,oBACX,EAAmB,CACjB,aACA,UAAW,CACb,CAAC,EAED,EAAmB,IAAA,EAAS,EAE9B,MACF,QAAU,CACR,EAAc,QAAU,EAC1B,CAEK,EAAW,UAGhB,EAAmB,IAAA,EAAS,EAC5B,EAAS,CAAE,MAAO,WAAY,CAAC,EAC/B,EAAmB,EAAkB,CAAM,EAC7C,EAkBI,SAAA,CACE,EAAC,QAAD,CACE,cAAY,OACZ,aAAa,MACb,UAAU,+BACV,SAAW,GAAU,EAAO,CAAE,SAAU,EAAM,cAAc,KAAM,CAAC,EACnE,SAAU,GACV,MAAO,EAAO,QACf,CAAA,EACD,EAAC,MAAD,CAAK,UAAU,6BAAf,SAAA,CACE,EAAC,QAAD,CAAO,QAAS,GAAG,EAAS,OAA5B,SAAA,CACE,EAAC,OAAD,CAAA,SAAM,MAAU,CAAA,EAChB,EAAC,QAAD,CACE,mBACE,EAAO,KAAO,GAAG,EAAS,aAAe,IAAA,GAE3C,eAAc,EAAO,KAAO,OAAS,IAAA,GACrC,aAAa,OACb,GAAI,GAAG,EAAS,OAChB,KAAK,OACL,SAAW,GAAU,EAAO,CAAE,KAAM,EAAM,cAAc,KAAM,CAAC,EAC/D,SAAA,GACA,MAAO,EAAO,IACf,CAAA,EACD,EAAC,EAAD,CAAY,MAAO,EAAO,KAAM,GAAI,GAAG,EAAS,YAAe,CAAA,CAC1D,IACN,EAAO,OAAO,MAAM,QACnB,EAAC,QAAD,CAAO,QAAS,GAAG,EAAS,QAA5B,SAAA,CACE,EAAC,OAAD,CAAA,SAAM,OAAW,CAAA,EACjB,EAAC,QAAD,CACE,mBACE,EAAO,MAAQ,GAAG,EAAS,cAAgB,IAAA,GAE7C,eAAc,EAAO,MAAQ,OAAS,IAAA,GACtC,aAAa,QACb,GAAI,GAAG,EAAS,QAChB,KAAK,QACL,SAAW,GACT,EAAO,CAAE,MAAO,EAAM,cAAc,KAAM,CAAC,EAE7C,SAAU,EAAO,OAAO,MAAM,SAC9B,KAAK,QACL,MAAO,EAAO,KACf,CAAA,EACD,EAAC,EAAD,CAAY,MAAO,EAAO,MAAO,GAAI,GAAG,EAAS,aAAgB,CAAA,CAC5D,CACL,CAAA,EAAA,KACH,EAAO,OAAO,MAAM,QACnB,EAAC,MAAD,CAAK,UAAU,kCAAf,SAAA,CACE,EAAC,QAAD,CAAO,QAAS,GAAG,EAAS,QAC1B,SAAA,EAAC,OAAD,CAAA,SAAM,OAAW,CAAA,CACZ,CAAA,EACP,EAAC,MAAD,CAAK,UAAU,oCAAf,SAAA,CACE,EAAC,SAAD,CACE,aAAW,uBACX,KAAK,eACL,SAAW,GAAU,CACnB,EAAO,CAAE,aAAc,EAAM,cAAc,KAAM,CAAC,EAClD,EAAS,SAAS,MAAM,CAC1B,EACA,MAAO,EAAO,aAEb,SAAA,EAAgB,IAAK,GACpB,EAAC,SAAD,CAA4B,MAAO,EAAQ,MACxC,SAAA,EAAQ,KACH,EAFK,EAAQ,KAEb,CACT,CACK,CAAA,EACR,EAAC,QAAD,CACE,mBACE,EAAO,MAAQ,GAAG,EAAS,cAAgB,IAAA,GAE7C,eAAc,EAAO,MAAQ,OAAS,IAAA,GACtC,aAAa,MACb,GAAI,GAAG,EAAS,QAChB,KAAK,QACL,SAAW,GACT,EAAO,CAAE,MAAO,EAAM,cAAc,KAAM,CAAC,EAE7C,YAAY,iBACZ,IAAK,EACL,SAAU,EAAO,OAAO,MAAM,SAC9B,KAAK,MACL,MAAO,EAAO,KACf,CAAA,CACE,IACL,EAAC,EAAD,CAAY,MAAO,EAAO,MAAO,GAAI,GAAG,EAAS,aAAgB,CAAA,CAC9D,CACH,CAAA,EAAA,KACH,EAAO,OAAO,iBAAiB,QAC9B,EAAC,QAAD,CAAO,QAAS,GAAG,EAAS,oBAA5B,SAAA,CACE,EAAC,OAAD,CAAA,SAAM,aAAiB,CAAA,EACvB,EAAC,QAAD,CACE,mBACE,EAAO,iBACH,GAAG,EAAS,0BACZ,IAAA,GAEN,eAAc,EAAO,iBAAmB,OAAS,IAAA,GACjD,GAAI,GAAG,EAAS,oBAChB,IAAK,EACL,KAAK,mBACL,SAAW,GACT,EAAO,CAAE,iBAAkB,EAAM,cAAc,KAAM,CAAC,EAExD,SAAU,EAAO,OAAO,iBAAiB,SACzC,KAAK,SACL,MAAO,EAAO,gBACf,CAAA,EACD,EAAC,EAAD,CACE,MAAO,EAAO,iBACd,GAAI,GAAG,EAAS,yBACjB,CAAA,CACI,CACL,CAAA,EAAA,KACH,EAAO,OAAO,QAAQ,QACrB,EAAC,MAAD,CAAK,UAAU,kCAAf,SAAA,CACE,EAAC,EAAD,CACE,OAAQ,EACR,QACE,EAAO,QAAU,GAAG,EAAS,gBAAkB,IAAA,GAEjD,QAAS,EAAQ,EAAO,QACxB,SAAW,GAAY,EAAO,CAAE,SAAQ,CAAC,EACzC,SAAU,EAAO,OAAO,QAAQ,SAChC,MAAO,EAAO,OACf,CAAA,EACD,EAAC,EAAD,CACE,MAAO,EAAO,QACd,GAAI,GAAG,EAAS,eACjB,CAAA,CACE,CACH,CAAA,EAAA,KACJ,EAAC,EAAD,CACE,gBAAgB,6BAChB,eAAe,kCACP,SACR,OAAQ,EAAO,aACL,WACV,SAAW,GAAiB,EAAO,CAAE,cAAa,CAAC,EACnD,OAAQ,EAAO,YAChB,CAAA,CACE,IACJ,EACC,EAAC,IAAD,CAAG,UAAU,mCAAmC,KAAK,QAArD,SAAA,CACG,EAAY,aACZ,CACD,CAAA,EAAA,KACJ,EAAC,SAAD,CACE,UAAU,6BACV,SAAU,EACV,KAAK,SAEJ,SAAA,EAAa,cAAgB,QACxB,CAAA,CACJ,GACK,GAEjB,CAEA,SAAgB,GAAkB,CAChC,SACA,GAAG,GACsB,CAmBzB,OAlBI,EAAO,MAEP,EAAC,EAAD,CAAa,OAAA,GAAkB,YAA/B,SAAA,CACE,EAAC,KAAD,CAAA,SAAI,oBAAsB,CAAA,EAC1B,EAAC,IAAD,CAAG,KAAK,QAAS,SAAA,EAAO,MAAM,OAAW,CAAA,EACzC,EAAC,SAAD,CAAQ,QAAS,EAAO,QAAS,KAAK,SAAS,SAAA,OAEvC,CAAA,CACG,IAGb,EAAO,SAAW,CAAC,EAAO,OAE1B,EAAC,EAAD,CAAa,QAAA,GAAmB,YAC9B,SAAA,EAAC,EAAD,CAAc,WAAY,EAAG,MAAM,iBAAmB,CAAA,CAC3C,CAAA,EAIf,EAAC,GAAD,CAAY,OAAQ,EAAO,OAAQ,OAAQ,EAAO,OAAQ,GAAI,CAAY,CAAA,CAE9E,CAEA,SAAS,EAAS,CAChB,YAGC,CACD,OACE,EAAC,MAAD,CAAK,UAAU,+BAAf,SAAA,CACG,EAAS,SACR,EAAC,MAAD,CAAK,IAAI,GAAG,OAAQ,GAAI,IAAK,EAAS,SAAU,MAAO,EAAK,CAAA,EAC1D,KACJ,EAAC,SAAD,CAAA,SAAS,EAAS,IAAa,CAAA,CAC5B,GAET,CCxgBA,SAAgB,GACd,EAC4B,CAC5B,GAAM,CAAE,WAAY,EACpB,EAA6B,SAAU,CACrC,WAAY,EAAQ,WACpB,cAAe,EAAQ,cACvB,YAAa,EAAQ,YACrB,KAAM,EAAQ,UAChB,CAAC,EACD,IAAM,EAAa,EAAO,CAAO,EACjC,EAAW,QAAU,EACrB,GAAM,CAAC,GAAU,MAAe,CAC9B,IAAM,EAAgD,CACpD,GAAG,EACH,QAAU,GAAU,EAAW,UAAU,CAAK,CAChD,EACA,OAAO,GAA8B,CAAa,CACpD,CAAC,EACK,CAAC,EAAU,GAAe,EAAS,CAAC,EACpC,CAAC,EAAO,GAAY,EAA0B,CAClD,MAAO,KACP,OAAQ,IACV,CAAC,EAED,MAAgB,CACd,IAAI,EAAS,GAmBb,OAlBA,EAAO,KAAK,CAAC,CAAC,KACX,GAAW,CACN,GACF,EAAS,CACP,MAAO,KACP,QACF,CAAC,CAEL,EACC,GAA+B,CAC1B,GACF,EAAS,CACP,QACA,OAAQ,IACV,CAAC,CAEL,CACF,MACa,CACX,EAAS,EACX,CACF,EAAG,CAAC,EAAQ,CAAQ,CAAC,EAErB,IAAM,EAAU,MAAkB,CAChC,EAAS,CACP,MAAO,KACP,OAAQ,IACV,CAAC,EACD,EAAa,GAAU,EAAQ,CAAC,CAClC,EAAG,CAAC,CAAC,EAEL,MAAO,CACL,SACA,MAAO,EAAM,MACb,QAAS,EAAM,SAAW,MAAQ,EAAM,QAAU,KAClD,UACA,OAAQ,EAAM,MAChB,CACF"}
@@ -0,0 +1,2 @@
1
+ import{useCallback as e,useEffect as t,useRef as n,useState as r,useSyncExternalStore as i}from"react";import a from"sanitize-html";import{jsx as o}from"react/jsx-runtime";const s=/<\/?(?:p|br|strong|em|u|s|ul|ol|li|blockquote|pre|code|hr|h[1-6]|a)(?:\s|\/?>)/i;function c(e,t=!0){return s.test(e)?a(e,{allowedAttributes:{a:t?[`href`]:[],ol:[`start`]},allowedSchemes:[`http`,`https`,`mailto`,`tel`],allowedTags:[`p`,`br`,`strong`,`em`,`u`,`s`,`ul`,`ol`,`li`,`blockquote`,`pre`,`code`,`hr`,`h1`,`h2`,`h3`,`h4`,`h5`,`h6`,...t?[`a`]:[]],allowProtocolRelative:!1}):e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/\r\n|\r|\n/g,`<br>`)}function l(e){return s.test(e)?a(e.replace(/<\/?(?:p|br|li|ul|ol|blockquote|pre|hr|h[1-6])(?:\s[^>]*)?\/?>/gi,` `),{allowedAttributes:{},allowedTags:[]}).replace(/&nbsp;/g,` `).replace(/&lt;/g,`<`).replace(/&gt;/g,`>`).replace(/&quot;/g,`"`).replace(/&#39;/g,`'`).replace(/&amp;/g,`&`).replace(/\s+/g,` `).trim():e.trim()}function u({description:e,links:t=!0,className:n,id:r}){return o(`div`,{className:[`lockerverse-auctions__description`,n].filter(Boolean).join(` `),dangerouslySetInnerHTML:{__html:c(e,t)},id:r})}function d(e,t=e.status){let n=t===`draft`,r=n?e.startAt:e.endAt,i=new Date(r);if(!Number.isFinite(i.getTime()))return``;let a=(n?e.configuration.startTimeEnabled:e.configuration.endTimeEnabled)??!0,o=new Intl.DateTimeFormat(`en-US`,{day:`numeric`,month:`short`,timeZone:`America/New_York`,year:`numeric`}).format(i);return a?`${o} at ${new Intl.DateTimeFormat(`en-US`,{hour:`numeric`,minute:`2-digit`,timeZone:`America/New_York`,timeZoneName:`short`}).format(i)}`:o}function f(e){return new Intl.NumberFormat(`en-US`,{currency:`USD`,maximumFractionDigits:2,minimumFractionDigits:0,style:`currency`}).format(e/100)}function p(e,t){return e.status===`finished`||t?.status===`finished`?`finished`:e.status===`draft`||t?.status===`draft`?`draft`:Date.parse(e.endAt)<=Date.now()?`finished`:Date.parse(e.startAt)>Date.now()?`draft`:`active`}function m(e){return e.isSoldOut||e.saleMode===`buy_now`&&e.availableQuantity===0}function h(){let e=n(null),[i,a]=r(!1);return t(()=>{let t=e.current;if(!(t&&`IntersectionObserver`in window))return;let n=!1,r=()=>a(n&&!document.hidden),i=new IntersectionObserver(([e])=>{n=!!(e?.isIntersecting&&e.intersectionRatio>0),r()});return i.observe(t),document.addEventListener(`visibilitychange`,r),()=>{i.disconnect(),document.removeEventListener(`visibilitychange`,r)}},[]),{ref:e,visible:i}}const g=new Map;let _,v=0;function y(){clearTimeout(_),_=void 0;let e=Date.now(),t=1/0;for(let n of g.values())for(let r of n)r>e&&(t=Math.min(t,r));Number.isFinite(t)&&(_=setTimeout(b,Math.min(t-e+1,2147483647)))}function b(){v+=1;for(let e of g.keys())e();y()}function x(){document.hidden||b()}const S=()=>v,C=()=>0;function w(t,n){let r=e(e=>(g.size||document.addEventListener(`visibilitychange`,x),g.set(e,[Date.parse(t),Date.parse(n)]),y(),()=>{g.delete(e),y(),g.size||document.removeEventListener(`visibilitychange`,x)}),[t,n]);i(r,S,C)}export{p as a,l as c,f as i,h as n,m as o,d as r,u as s,w as t};
2
+ //# sourceMappingURL=use-auction-boundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-auction-boundary.js","names":[],"sources":["../src/auction-description-html.ts","../src/auction-description.tsx","../src/auction-display.ts","../src/use-auction-visibility.ts","../src/use-auction-boundary.ts"],"sourcesContent":["import sanitizeHtml from \"sanitize-html\";\n\nconst richDescriptionPattern =\n /<\\/?(?:p|br|strong|em|u|s|ul|ol|li|blockquote|pre|code|hr|h[1-6]|a)(?:\\s|\\/?>)/i;\n\nexport function auctionDescriptionHtml(\n description: string,\n links = true\n): string {\n if (!richDescriptionPattern.test(description)) {\n return description\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\\r\\n|\\r|\\n/g, \"<br>\");\n }\n\n return sanitizeHtml(description, {\n allowedAttributes: { a: links ? [\"href\"] : [], ol: [\"start\"] },\n allowedSchemes: [\"http\", \"https\", \"mailto\", \"tel\"],\n allowedTags: [\n \"p\",\n \"br\",\n \"strong\",\n \"em\",\n \"u\",\n \"s\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"pre\",\n \"code\",\n \"hr\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n ...(links ? [\"a\"] : []),\n ],\n allowProtocolRelative: false,\n });\n}\n\nexport function auctionDescriptionText(description: string): string {\n if (!richDescriptionPattern.test(description)) {\n return description.trim();\n }\n return sanitizeHtml(\n description.replace(\n /<\\/?(?:p|br|li|ul|ol|blockquote|pre|hr|h[1-6])(?:\\s[^>]*)?\\/?>/gi,\n \" \"\n ),\n {\n allowedAttributes: {},\n allowedTags: [],\n }\n )\n .replace(/&nbsp;/g, \" \")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&amp;/g, \"&\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n","import { auctionDescriptionHtml } from \"./auction-description-html.ts\";\n\nexport function AuctionDescription({\n description,\n links = true,\n className,\n id,\n}: {\n description: string;\n links?: boolean;\n className?: string | undefined;\n id?: string | undefined;\n}) {\n return (\n <div\n className={[\"lockerverse-auctions__description\", className]\n .filter(Boolean)\n .join(\" \")}\n // biome-ignore lint/security/noDangerouslySetInnerHtml: The shared allowlist strips scripts, event handlers, attributes, and unsafe link protocols before rendering.\n dangerouslySetInnerHTML={{\n __html: auctionDescriptionHtml(description, links),\n }}\n id={id}\n />\n );\n}\n","import type {\n LockerverseAuction,\n LockerverseAuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\n\n// Match the public web app. Keep display policy here for all SDK auction surfaces.\nexport function formatAuctionBoundary(\n auction: LockerverseAuction,\n status: LockerverseAuctionStatus = auction.status\n) {\n const starts = status === \"draft\";\n const value = starts ? auction.startAt : auction.endAt;\n const date = new Date(value);\n if (!Number.isFinite(date.getTime())) {\n return \"\";\n }\n const showTime =\n (starts\n ? auction.configuration.startTimeEnabled\n : auction.configuration.endTimeEnabled) ?? true;\n const dateLabel = new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n month: \"short\",\n timeZone: \"America/New_York\",\n year: \"numeric\",\n }).format(date);\n if (!showTime) {\n return dateLabel;\n }\n const timeLabel = new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZone: \"America/New_York\",\n timeZoneName: \"short\",\n }).format(date);\n return `${dateLabel} at ${timeLabel}`;\n}\n\nexport function formatAuctionMoney(cents: number) {\n return new Intl.NumberFormat(\"en-US\", {\n currency: \"USD\",\n maximumFractionDigits: 2,\n minimumFractionDigits: 0,\n style: \"currency\",\n }).format(cents / 100);\n}\n\nexport function getAuctionDisplayStatus(\n auction: LockerverseAuction,\n item?: LockerverseAuctionItem\n): LockerverseAuctionStatus {\n if (auction.status === \"finished\" || item?.status === \"finished\") {\n return \"finished\";\n }\n if (auction.status === \"draft\" || item?.status === \"draft\") {\n return \"draft\";\n }\n if (Date.parse(auction.endAt) <= Date.now()) {\n return \"finished\";\n }\n if (Date.parse(auction.startAt) > Date.now()) {\n return \"draft\";\n }\n return \"active\";\n}\n\nexport function isAuctionItemSoldOut(item: LockerverseAuctionItem) {\n return (\n item.isSoldOut ||\n (item.saleMode === \"buy_now\" && item.availableQuantity === 0)\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\n\n/** Automatic motion stays off during SSR and in browsers without observation.\n * Manual gallery navigation remains available in those environments. */\nexport function useAuctionVisibility<ElementType extends HTMLElement>() {\n const ref = useRef<ElementType>(null);\n const [visible, setVisible] = useState(false);\n useEffect(() => {\n const element = ref.current;\n // biome-ignore lint/suspicious/noUnnecessaryConditions: React assigns this ref after rendering.\n if (!(element && \"IntersectionObserver\" in window)) {\n return;\n }\n let intersecting = false;\n const update = () => setVisible(intersecting && !document.hidden);\n const observer = new IntersectionObserver(([entry]) => {\n intersecting = Boolean(\n entry?.isIntersecting && entry.intersectionRatio > 0\n );\n update();\n });\n observer.observe(element);\n document.addEventListener(\"visibilitychange\", update);\n return () => {\n observer.disconnect();\n document.removeEventListener(\"visibilitychange\", update);\n };\n }, []);\n return { ref, visible };\n}\n","import { useCallback, useSyncExternalStore } from \"react\";\n\n// One timer serves every mounted auction surface, including standalone cards.\nconst subscriptions = new Map<() => void, readonly number[]>();\nlet timer: ReturnType<typeof setTimeout> | undefined;\nlet revision = 0;\nconst MAX_DELAY = 2_147_483_647;\n\nfunction schedule() {\n clearTimeout(timer);\n timer = undefined;\n const now = Date.now();\n let next = Number.POSITIVE_INFINITY;\n for (const boundaries of subscriptions.values()) {\n for (const boundary of boundaries) {\n if (boundary > now) {\n next = Math.min(next, boundary);\n }\n }\n }\n if (Number.isFinite(next)) {\n timer = setTimeout(notify, Math.min(next - now + 1, MAX_DELAY));\n }\n}\nfunction notify() {\n revision += 1;\n for (const listener of subscriptions.keys()) {\n listener();\n }\n schedule();\n}\nfunction onVisibilityChange() {\n if (!document.hidden) {\n notify();\n }\n}\nconst getSnapshot = () => revision;\nconst getServerSnapshot = () => 0;\n\n/** Re-render at known boundaries without polling or changing server status. */\nexport function useAuctionBoundary(startAt: string, endAt: string) {\n const subscribe = useCallback(\n (listener: () => void) => {\n if (!subscriptions.size) {\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n }\n subscriptions.set(listener, [Date.parse(startAt), Date.parse(endAt)]);\n schedule();\n return () => {\n subscriptions.delete(listener);\n schedule();\n if (!subscriptions.size) {\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n }\n };\n },\n [startAt, endAt]\n );\n useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { CreateLockerverseAuctionOptions, LockerverseAuction, LockerverseAuctionClient, LockerverseSdkError } from "@lockerverse/sdk/auctions";
2
+ //#region src/use-lockerverse-auctions.d.ts
3
+ type UseLockerverseAuctionsResult = {
4
+ client: LockerverseAuctionClient;
5
+ auctions: LockerverseAuction[] | null;
6
+ loading: boolean;
7
+ error: LockerverseSdkError | null;
8
+ refresh: () => void;
9
+ };
10
+ declare function useLockerverseAuctions(options: CreateLockerverseAuctionOptions): UseLockerverseAuctionsResult;
11
+ //#endregion
12
+ export { useLockerverseAuctions as n, UseLockerverseAuctionsResult as t };
13
+ //# sourceMappingURL=use-lockerverse-auctions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-lockerverse-auctions.d.ts","names":[],"sources":["../src/use-lockerverse-auctions.ts"],"mappings":";;KAUY;EACV,QAAQ;EACR,UAAU;EACV;EACA,OAAO;EACP;;iBAQc,uBACd,SAAS,kCACR"}
@@ -0,0 +1,2 @@
1
+ import{t as e}from"./immutable-resource-identity.js";import{useCallback as t,useEffect as n,useRef as r,useState as i}from"react";import{createLockerverseAuctionClient as a}from"@lockerverse/sdk/auctions";function o(o){e(`auctions`,{apiBaseUrl:o.apiBaseUrl,communitySlug:o.communitySlug,environment:o.environment,slug:``});let s=r(o.onError);s.current=o.onError;let[c]=i(()=>a({...o,onError:e=>s.current?.(e)})),[l,u]=i(0),[d,f]=i({auctions:null,error:null});n(()=>{let e=!0;return c.list().then(t=>{e&&f({auctions:t,error:null})},t=>{e&&f({auctions:null,error:t})}),()=>{e=!1}},[c,l]);let p=t(()=>{f({auctions:null,error:null}),u(e=>e+1)},[]);return{...d,client:c,loading:d.auctions===null&&d.error===null,refresh:p}}export{o as t};
2
+ //# sourceMappingURL=use-lockerverse-auctions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-lockerverse-auctions.js","names":[],"sources":["../src/use-lockerverse-auctions.ts"],"sourcesContent":["import {\n type CreateLockerverseAuctionOptions,\n createLockerverseAuctionClient,\n type LockerverseAuction,\n type LockerverseAuctionClient,\n type LockerverseSdkError,\n} from \"@lockerverse/sdk/auctions\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useImmutableResourceIdentity } from \"./immutable-resource-identity.ts\";\n\nexport type UseLockerverseAuctionsResult = {\n client: LockerverseAuctionClient;\n auctions: LockerverseAuction[] | null;\n loading: boolean;\n error: LockerverseSdkError | null;\n refresh: () => void;\n};\n\ntype AuctionLoadState = Pick<\n UseLockerverseAuctionsResult,\n \"auctions\" | \"error\"\n>;\n\nexport function useLockerverseAuctions(\n options: CreateLockerverseAuctionOptions\n): UseLockerverseAuctionsResult {\n useImmutableResourceIdentity(\"auctions\", {\n apiBaseUrl: options.apiBaseUrl,\n communitySlug: options.communitySlug,\n environment: options.environment,\n slug: \"\",\n });\n const onErrorRef = useRef(options.onError);\n onErrorRef.current = options.onError;\n const [client] = useState(() =>\n createLockerverseAuctionClient({\n ...options,\n onError: (error) => onErrorRef.current?.(error),\n })\n );\n const [revision, setRevision] = useState(0);\n const [state, setState] = useState<AuctionLoadState>({\n auctions: null,\n error: null,\n });\n useEffect(() => {\n let active = true;\n client.list().then(\n (auctions) => {\n if (active) {\n setState({ auctions, error: null });\n }\n },\n (error: LockerverseSdkError) => {\n if (active) {\n setState({ auctions: null, error });\n }\n }\n );\n return () => {\n active = false;\n };\n }, [client, revision]);\n const refresh = useCallback(() => {\n setState({ auctions: null, error: null });\n setRevision((value) => value + 1);\n }, []);\n return {\n ...state,\n client,\n loading: state.auctions === null && state.error === null,\n refresh,\n };\n}\n"],"mappings":"6MAuBA,SAAgB,EACd,EAC8B,CAC9B,EAA6B,WAAY,CACvC,WAAY,EAAQ,WACpB,cAAe,EAAQ,cACvB,YAAa,EAAQ,YACrB,KAAM,EACR,CAAC,EACD,IAAM,EAAa,EAAO,EAAQ,OAAO,EACzC,EAAW,QAAU,EAAQ,QAC7B,GAAM,CAAC,GAAU,MACf,EAA+B,CAC7B,GAAG,EACH,QAAU,GAAU,EAAW,UAAU,CAAK,CAChD,CAAC,CACH,EACM,CAAC,EAAU,GAAe,EAAS,CAAC,EACpC,CAAC,EAAO,GAAY,EAA2B,CACnD,SAAU,KACV,MAAO,IACT,CAAC,EACD,MAAgB,CACd,IAAI,EAAS,GAab,OAZA,EAAO,KAAK,CAAC,CAAC,KACX,GAAa,CACR,GACF,EAAS,CAAE,WAAU,MAAO,IAAK,CAAC,CAEtC,EACC,GAA+B,CAC1B,GACF,EAAS,CAAE,SAAU,KAAM,OAAM,CAAC,CAEtC,CACF,MACa,CACX,EAAS,EACX,CACF,EAAG,CAAC,EAAQ,CAAQ,CAAC,EACrB,IAAM,EAAU,MAAkB,CAChC,EAAS,CAAE,SAAU,KAAM,MAAO,IAAK,CAAC,EACxC,EAAa,GAAU,EAAQ,CAAC,CAClC,EAAG,CAAC,CAAC,EACL,MAAO,CACL,GAAG,EACH,SACA,QAAS,EAAM,WAAa,MAAQ,EAAM,QAAU,KACpD,SACF,CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lockerverse/react",
3
- "version": "0.2.101",
3
+ "version": "0.2.103",
4
4
  "description": "Tree-shakable React payment and signup UI for Lockerverse",
5
5
  "repository": {
6
6
  "type": "git",
@@ -14,7 +14,11 @@
14
14
  "./dist/auctions.css",
15
15
  "./dist/auction-catalog.css",
16
16
  "./dist/auction-gallery.css",
17
- "./dist/auction-checkout.css"
17
+ "./dist/auction-checkout.css",
18
+ "./dist/auction.css",
19
+ "./dist/auction-item.css",
20
+ "./dist/auction-base.css",
21
+ "./dist/auction-item-layout.css"
18
22
  ],
19
23
  "type": "module",
20
24
  "exports": {
@@ -68,6 +72,24 @@
68
72
  "./auctions.css": {
69
73
  "types": "./dist/styles.d.ts",
70
74
  "default": "./dist/auctions.css"
75
+ },
76
+ "./auction": {
77
+ "types": "./dist/auction.d.ts",
78
+ "import": "./dist/auction.js",
79
+ "default": "./dist/auction.js"
80
+ },
81
+ "./auction-data": {
82
+ "types": "./dist/auction-data.d.ts",
83
+ "import": "./dist/auction-data.js",
84
+ "default": "./dist/auction-data.js"
85
+ },
86
+ "./auction.css": {
87
+ "types": "./dist/styles.d.ts",
88
+ "default": "./dist/auction.css"
89
+ },
90
+ "./auction-item.css": {
91
+ "types": "./dist/styles.d.ts",
92
+ "default": "./dist/auction-item.css"
71
93
  }
72
94
  },
73
95
  "module": "./dist/index.js",
@@ -81,9 +103,10 @@
81
103
  "embla-carousel-autoplay": "8.6.0",
82
104
  "embla-carousel-react": "8.6.0",
83
105
  "libphonenumber-js": "1.13.11",
106
+ "lucide-react": "0.536.0",
84
107
  "sanitize-html": "2.17.7",
85
108
  "valibot": "1.4.2",
86
- "@lockerverse/sdk": "0.2.101"
109
+ "@lockerverse/sdk": "0.2.103"
87
110
  },
88
111
  "devDependencies": {
89
112
  "@size-limit/file": "13.0.3",
@@ -1,2 +0,0 @@
1
- import{jsx as e,jsxs as t}from"react/jsx-runtime";import n from"sanitize-html";function r(e,t=e.status){let n=t===`draft`,r=n?e.startAt:e.endAt,i=new Date(r);if(!Number.isFinite(i.getTime()))return``;let a=(n?e.configuration.startTimeEnabled:e.configuration.endTimeEnabled)??!0,o=new Intl.DateTimeFormat(`en-US`,{day:`numeric`,month:`short`,timeZone:`America/New_York`,year:`numeric`}).format(i);return a?`${o} at ${new Intl.DateTimeFormat(`en-US`,{hour:`numeric`,minute:`2-digit`,timeZone:`America/New_York`,timeZoneName:`short`}).format(i)}`:o}function i(e){return new Intl.NumberFormat(`en-US`,{currency:`USD`,maximumFractionDigits:2,minimumFractionDigits:0,style:`currency`}).format(e/100)}function a(e,t){return e.status===`finished`||t?.status===`finished`||Date.parse(e.endAt)<=Date.now()?`finished`:e.status===`draft`||t?.status===`draft`||Date.parse(e.startAt)>Date.now()?`draft`:`active`}function o({kind:n}){return t(`svg`,{"aria-hidden":`true`,fill:`none`,height:`16`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.6`,viewBox:`0 0 24 24`,width:`16`,children:[n===`clock`?e(`circle`,{cx:`12`,cy:`12`,r:`9`}):null,e(`path`,{d:{arrow:`M5 12h14m-6-6 6 6-6 6`,back:`m15 6-6 6 6 6`,bag:`M5 7h14l1 14H4L5 7Zm4 0V5a3 3 0 0 1 6 0v2`,clock:`M12 8v4l3 2`,gavel:`m14 3 7 7m-9-5 7 7M3 21l10-10M3 17l4 4M10 7l7 7`,items:`M9 6h11M9 12h11M9 18h11M3 6h1M3 12h1M3 18h1`,shield:`M12 22s8-4 8-11V5l-8-3-8 3v6c0 7 8 11 8 11Zm-4-11 3 3 5-5`,timer:`M10 2h4M12 8v4l2 2M3 11a9 9 0 1 0 3-6M3 3v5h5`}[n]})]})}const s=/<\/?(?:p|br|strong|em|u|s|ul|ol|li|blockquote|pre|code|hr|h[1-6]|a)(?:\s|\/?>)/i;function c(e,t=!0){return s.test(e)?n(e,{allowedAttributes:{a:t?[`href`]:[],ol:[`start`]},allowedSchemes:[`http`,`https`,`mailto`,`tel`],allowedTags:[`p`,`br`,`strong`,`em`,`u`,`s`,`ul`,`ol`,`li`,`blockquote`,`pre`,`code`,`hr`,`h1`,`h2`,`h3`,`h4`,`h5`,`h6`,...t?[`a`]:[]],allowProtocolRelative:!1}):e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/\r\n|\r|\n/g,`<br>`)}function l(e){return s.test(e)?n(e.replace(/<\/?(?:p|br|li|ul|ol|blockquote|pre|hr|h[1-6])(?:\s[^>]*)?\/?>/gi,` `),{allowedAttributes:{},allowedTags:[]}).replace(/&nbsp;/g,` `).replace(/&lt;/g,`<`).replace(/&gt;/g,`>`).replace(/&quot;/g,`"`).replace(/&#39;/g,`'`).replace(/&amp;/g,`&`).replace(/\s+/g,` `).trim():e.trim()}function u({description:t,links:n=!0,className:r,id:i}){return e(`div`,{className:[`lockerverse-auctions__description`,r].filter(Boolean).join(` `),dangerouslySetInnerHTML:{__html:c(t,n)},id:i})}export{i as a,r as i,l as n,a as o,o as r,u as t};
2
- //# sourceMappingURL=auction-description.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auction-description.js","names":[],"sources":["../src/auction-display.ts","../src/auction-icons.tsx","../src/auction-description-html.ts","../src/auction-description.tsx"],"sourcesContent":["import type {\n LockerverseAuction,\n LockerverseAuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\n\n// Match the public web app. Keep display policy here for all SDK auction surfaces.\nexport function formatAuctionBoundary(\n auction: LockerverseAuction,\n status: LockerverseAuctionStatus = auction.status\n) {\n const starts = status === \"draft\";\n const value = starts ? auction.startAt : auction.endAt;\n const date = new Date(value);\n if (!Number.isFinite(date.getTime())) {\n return \"\";\n }\n const showTime =\n (starts\n ? auction.configuration.startTimeEnabled\n : auction.configuration.endTimeEnabled) ?? true;\n const dateLabel = new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n month: \"short\",\n timeZone: \"America/New_York\",\n year: \"numeric\",\n }).format(date);\n if (!showTime) {\n return dateLabel;\n }\n const timeLabel = new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZone: \"America/New_York\",\n timeZoneName: \"short\",\n }).format(date);\n return `${dateLabel} at ${timeLabel}`;\n}\n\nexport function formatAuctionMoney(cents: number) {\n return new Intl.NumberFormat(\"en-US\", {\n currency: \"USD\",\n maximumFractionDigits: 2,\n minimumFractionDigits: 0,\n style: \"currency\",\n }).format(cents / 100);\n}\n\nexport function getAuctionDisplayStatus(\n auction: LockerverseAuction,\n item?: LockerverseAuctionItem\n): LockerverseAuctionStatus {\n if (\n auction.status === \"finished\" ||\n item?.status === \"finished\" ||\n Date.parse(auction.endAt) <= Date.now()\n ) {\n return \"finished\";\n }\n if (\n auction.status === \"draft\" ||\n item?.status === \"draft\" ||\n Date.parse(auction.startAt) > Date.now()\n ) {\n return \"draft\";\n }\n return \"active\";\n}\n","export function AuctionIcon({\n kind,\n}: {\n kind:\n | \"arrow\"\n | \"back\"\n | \"items\"\n | \"gavel\"\n | \"clock\"\n | \"bag\"\n | \"shield\"\n | \"timer\";\n}) {\n const paths = {\n arrow: \"M5 12h14m-6-6 6 6-6 6\",\n back: \"m15 6-6 6 6 6\",\n bag: \"M5 7h14l1 14H4L5 7Zm4 0V5a3 3 0 0 1 6 0v2\",\n clock: \"M12 8v4l3 2\",\n gavel: \"m14 3 7 7m-9-5 7 7M3 21l10-10M3 17l4 4M10 7l7 7\",\n items: \"M9 6h11M9 12h11M9 18h11M3 6h1M3 12h1M3 18h1\",\n shield: \"M12 22s8-4 8-11V5l-8-3-8 3v6c0 7 8 11 8 11Zm-4-11 3 3 5-5\",\n timer: \"M10 2h4M12 8v4l2 2M3 11a9 9 0 1 0 3-6M3 3v5h5\",\n };\n return (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"16\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.6\"\n viewBox=\"0 0 24 24\"\n width=\"16\"\n >\n {kind === \"clock\" ? <circle cx=\"12\" cy=\"12\" r=\"9\" /> : null}\n <path d={paths[kind]} />\n </svg>\n );\n}\n","import sanitizeHtml from \"sanitize-html\";\n\nconst richDescriptionPattern =\n /<\\/?(?:p|br|strong|em|u|s|ul|ol|li|blockquote|pre|code|hr|h[1-6]|a)(?:\\s|\\/?>)/i;\n\nexport function auctionDescriptionHtml(\n description: string,\n links = true\n): string {\n if (!richDescriptionPattern.test(description)) {\n return description\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\\r\\n|\\r|\\n/g, \"<br>\");\n }\n\n return sanitizeHtml(description, {\n allowedAttributes: { a: links ? [\"href\"] : [], ol: [\"start\"] },\n allowedSchemes: [\"http\", \"https\", \"mailto\", \"tel\"],\n allowedTags: [\n \"p\",\n \"br\",\n \"strong\",\n \"em\",\n \"u\",\n \"s\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"pre\",\n \"code\",\n \"hr\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n ...(links ? [\"a\"] : []),\n ],\n allowProtocolRelative: false,\n });\n}\n\nexport function auctionDescriptionText(description: string): string {\n if (!richDescriptionPattern.test(description)) {\n return description.trim();\n }\n return sanitizeHtml(\n description.replace(\n /<\\/?(?:p|br|li|ul|ol|blockquote|pre|hr|h[1-6])(?:\\s[^>]*)?\\/?>/gi,\n \" \"\n ),\n {\n allowedAttributes: {},\n allowedTags: [],\n }\n )\n .replace(/&nbsp;/g, \" \")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&amp;/g, \"&\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n","import { auctionDescriptionHtml } from \"./auction-description-html.ts\";\n\nexport function AuctionDescription({\n description,\n links = true,\n className,\n id,\n}: {\n description: string;\n links?: boolean;\n className?: string | undefined;\n id?: string | undefined;\n}) {\n return (\n <div\n className={[\"lockerverse-auctions__description\", className]\n .filter(Boolean)\n .join(\" \")}\n // biome-ignore lint/security/noDangerouslySetInnerHtml: The shared allowlist strips scripts, event handlers, attributes, and unsafe link protocols before rendering.\n dangerouslySetInnerHTML={{\n __html: auctionDescriptionHtml(description, links),\n }}\n id={id}\n />\n );\n}\n"],"mappings":"+EAOA,SAAgB,EACd,EACA,EAAmC,EAAQ,OAC3C,CACA,IAAM,EAAS,IAAW,QACpB,EAAQ,EAAS,EAAQ,QAAU,EAAQ,MAC3C,EAAO,IAAI,KAAK,CAAK,EAC3B,GAAI,CAAC,OAAO,SAAS,EAAK,QAAQ,CAAC,EACjC,MAAO,GAET,IAAM,GACH,EACG,EAAQ,cAAc,iBACtB,EAAQ,cAAc,iBAAmB,GACzC,EAAY,IAAI,KAAK,eAAe,QAAS,CACjD,IAAK,UACL,MAAO,QACP,SAAU,mBACV,KAAM,SACR,CAAC,CAAC,CAAC,OAAO,CAAI,EAUd,OATK,EASE,GAAG,EAAU,MANF,IAAI,KAAK,eAAe,QAAS,CACjD,KAAM,UACN,OAAQ,UACR,SAAU,mBACV,aAAc,OAChB,CAAC,CAAC,CAAC,OAAO,CACwB,IARzB,CASX,CAEA,SAAgB,EAAmB,EAAe,CAChD,OAAO,IAAI,KAAK,aAAa,QAAS,CACpC,SAAU,MACV,sBAAuB,EACvB,sBAAuB,EACvB,MAAO,UACT,CAAC,CAAC,CAAC,OAAO,EAAQ,GAAG,CACvB,CAEA,SAAgB,EACd,EACA,EAC0B,CAe1B,OAbE,EAAQ,SAAW,YACnB,GAAM,SAAW,YACjB,KAAK,MAAM,EAAQ,KAAK,GAAK,KAAK,IAAI,EAE/B,WAGP,EAAQ,SAAW,SACnB,GAAM,SAAW,SACjB,KAAK,MAAM,EAAQ,OAAO,EAAI,KAAK,IAAI,EAEhC,QAEF,QACT,CCnEA,SAAgB,EAAY,CAC1B,QAWC,CAWD,OACE,EAAC,MAAD,CACE,cAAY,OACZ,KAAK,OACL,OAAO,KACP,OAAO,eACP,cAAc,QACd,eAAe,QACf,YAAY,MACZ,QAAQ,YACR,MAAM,KATR,SAAA,CAWG,IAAS,QAAU,EAAC,SAAD,CAAQ,GAAG,KAAK,GAAG,KAAK,EAAE,GAAK,CAAA,EAAI,KACvD,EAAC,OAAD,CAAM,EAAG,CAtBX,MAAO,wBACP,KAAM,gBACN,IAAK,4CACL,MAAO,cACP,MAAO,kDACP,MAAO,8CACP,OAAQ,4DACR,MAAO,+CAeQ,EAAE,EAAQ,CAAA,CACpB,GAET,CCrCA,MAAM,EACJ,kFAEF,SAAgB,EACd,EACA,EAAQ,GACA,CASR,OARK,EAAuB,KAAK,CAAW,EAQrC,EAAa,EAAa,CAC/B,kBAAmB,CAAE,EAAG,EAAQ,CAAC,MAAM,EAAI,CAAC,EAAG,GAAI,CAAC,OAAO,CAAE,EAC7D,eAAgB,CAAC,OAAQ,QAAS,SAAU,KAAK,EACjD,YAAa,CACX,IACA,KACA,SACA,KACA,IACA,IACA,KACA,KACA,KACA,aACA,MACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,GAAI,EAAQ,CAAC,GAAG,EAAI,CAAC,CACvB,EACA,sBAAuB,EACzB,CAAC,EAjCQ,EACJ,QAAQ,KAAM,OAAO,CAAC,CACtB,QAAQ,KAAM,MAAM,CAAC,CACrB,QAAQ,KAAM,MAAM,CAAC,CACrB,QAAQ,cAAe,MAAM,CA8BpC,CAEA,SAAgB,EAAuB,EAA6B,CAIlE,OAHK,EAAuB,KAAK,CAAW,EAGrC,EACL,EAAY,QACV,mEACA,GACF,EACA,CACE,kBAAmB,CAAC,EACpB,YAAa,CAAC,CAChB,CACF,CAAC,CACE,QAAQ,UAAW,GAAG,CAAC,CACvB,QAAQ,QAAS,GAAG,CAAC,CACrB,QAAQ,QAAS,GAAG,CAAC,CACrB,QAAQ,UAAW,GAAG,CAAC,CACvB,QAAQ,SAAU,GAAG,CAAC,CACtB,QAAQ,SAAU,GAAG,CAAC,CACtB,QAAQ,OAAQ,GAAG,CAAC,CACpB,KAAK,EAnBC,EAAY,KAAK,CAoB5B,CClEA,SAAgB,EAAmB,CACjC,cACA,QAAQ,GACR,YACA,MAMC,CACD,OACE,EAAC,MAAD,CACE,UAAW,CAAC,oCAAqC,CAAS,CAAC,CACxD,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,EAEX,wBAAyB,CACvB,OAAQ,EAAuB,EAAa,CAAK,CACnD,EACI,IACL,CAAA,CAEL"}