your-ai-workflow-firebase-os 1.14.45 → 1.14.47

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 (46) hide show
  1. package/README.md +2 -12
  2. package/dist/{AddressField-DbrwfMvS.cjs → AddressField-BzmLcEhE.cjs} +1 -1
  3. package/dist/{AddressField-BoDWg30H.js → AddressField-d7Cpg2JC.js} +8 -8
  4. package/dist/{ContactPopup-C_lwIlmU.js → ContactPopup-D8_r38FI.js} +3741 -3453
  5. package/dist/ContactPopup-VmCagv2D.cjs +12 -0
  6. package/dist/{PhoneInputField-BL2E6_J4.js → PhoneInputField-BOpt0trc.js} +2 -2
  7. package/dist/PhoneInputField-BWm23-p0.js +2 -0
  8. package/dist/{PhoneInputField-CyVvMoD5.cjs → PhoneInputField-Nnv8zYte.cjs} +1 -1
  9. package/dist/{PhoneInputField-D0bgDRd3.cjs → PhoneInputField-rzyp9HGK.cjs} +1 -1
  10. package/dist/{address-D6MYmA1-.js → address-BDU-ls1U.js} +24 -19
  11. package/dist/address-CCq55BsD.cjs +1 -0
  12. package/dist/{bake-BA9DEVEa.js → bake-C7SBOpEZ.js} +1 -1
  13. package/dist/{bake-C0Ipfalr.cjs → bake-D_199UUW.cjs} +1 -1
  14. package/dist/{fileBytes-BdWlpHYO.cjs → fileBytes-Bk0o1FSN.cjs} +1 -1
  15. package/dist/{fileBytes-BgA3JBkt.js → fileBytes-siV6J6-M.js} +1 -1
  16. package/dist/index.d.ts +3 -5
  17. package/dist/{lucide-react-CS_DerLf.js → lucide-react-CB7uZ-Ri.js} +1 -1
  18. package/dist/lucide-react-DURrEG5A.cjs +1 -0
  19. package/dist/renderer.cjs.js +1 -1
  20. package/dist/renderer.es.js +1 -1
  21. package/dist/server/index.d.ts +34 -9
  22. package/dist/server.cjs.js +5 -7
  23. package/dist/server.es.js +501 -1029
  24. package/dist/verifiedAccount-7qAaWa23.cjs +1 -0
  25. package/dist/verifiedAccount-C1yeBMPI.js +9 -0
  26. package/dist/vite.cjs.js +1 -1
  27. package/dist/vite.es.js +238 -205
  28. package/dist/your-ai-workflow-firebase-os.cjs.js +39 -44
  29. package/dist/your-ai-workflow-firebase-os.css +1 -1
  30. package/dist/your-ai-workflow-firebase-os.es.js +7960 -8127
  31. package/package.json +1 -1
  32. package/src/index.css +36 -1
  33. package/dist/ContactPopup-ymbT1DWO.cjs +0 -12
  34. package/dist/PhoneInputField-DWzWPYJE.js +0 -2
  35. package/dist/address-COc6hg_p.cjs +0 -1
  36. package/dist/aiModels-8xixybJz.js +0 -145
  37. package/dist/aiModels-Bb68y--G.cjs +0 -1
  38. package/dist/lucide-react-Ciu4WjH9.cjs +0 -1
  39. package/dist/verifiedAccount-KkGH0khL.js +0 -172
  40. package/dist/verifiedAccount-XDnfSTn5.cjs +0 -1
  41. /package/dist/{dist-CNztuGOG.cjs → dist-Cankgl0L.cjs} +0 -0
  42. /package/dist/{dist-C4ycpl2h.js → dist-DFAeyUdQ.js} +0 -0
  43. /package/dist/{pdf-DCVJgrkU.js → pdf-BZfsdx8L.js} +0 -0
  44. /package/dist/{pdf-BzpovRy7.cjs → pdf-S21vLyrS.cjs} +0 -0
  45. /package/dist/{pdf.worker.min-DA-qak4Y.cjs → pdf.worker.min-Bzlw1yS4.cjs} +0 -0
  46. /package/dist/{pdf.worker.min-C1w16YEr.js → pdf.worker.min-nRocGdAg.js} +0 -0
package/README.md CHANGED
@@ -33,7 +33,8 @@ That's it. **One component. Zero configuration files.**
33
33
  | 📁 **File Storage** | An admin-only Assets screen for public images, plus a drive preset any page can be built on |
34
34
  | 📬 **Forms** | Created with their pages on `/pages` — say in one box what a form should ask and what happens after (or name one you already have) and the AI builds it with the page; see and hand-edit every form afterwards on `/forms`. Questions can ask for a file — a CV, a photo, a receipt — and the upload works signed out |
35
35
  | 📥 **Inbox** | Every form entry in one list at `/inbox`, filtered "From anyone" or "From signed-in users"; an attached file opens from the entry by its own name |
36
- | 💳 **Payments** | Stripe checkout in one line — a Take payments switch at the top of `/payments` pauses every Pay button and checkout at once (read by the server, so a built page stops too), then the owner configures what they sell under What you sell on `/payments` (things paid for once — each a name and a price, grouped under one entry — or plans and their Stripe ids), answers How your payments work in one box per payment (start to finish; whatever is skipped, the AI decides), then adds payments to a page from that page's own Payments section on `/pages` — one they already have, a one-time payment made right there (it lands on `/payments` too), a subscription (a page with none sends the owner to `/payments` with a subscription already chosen, and back with it added), or a Custom payment only that page has, whose amount the page works out (`<PayButton amount={total}>`, e.g. a basket's total at checkout) — and the page's sentence carries the exact `<PayButton>` tags and the owner's words — public and signed-in pages sell with `<PayButton>`, internal and admin pages show the team the sales through `useSales()`, and before-paying questions go through the app's own forms. Connection says Test mode connected and nothing about webhooks while the owner practises; the Go live switch under it is always there and, once flipped, walks the test→live change — the live secret key, live price ids only when a subscription is sold (test ids kept, and the id-swap prompt for the assistant generated), and last the webhook, locked until step 3 of `/publish` is ticked because Stripe needs the published address, which it then hands over with a copy button — buyers get a built-in `/billing` page that appears after their first purchase, and every cancel/switch/invoice screen is Stripe's own billing portal |
36
+ | 💳 **Payments** | Stripe checkout in one line — a Take payments switch at the top of `/payments` pauses every Pay button and checkout at once (read by the server, so a built page stops too), then the owner configures what they sell under What you sell on `/payments` (things paid for once — each a name and a price, grouped under one entry — or plans and their Stripe ids), answers How your payments work in one box per payment (start to finish; whatever is skipped, the AI decides), then adds payments to a page from that page's own Payments section on `/pages` — offered first, a Dynamic payment only that page has, whose amount the page works out (`<PayButton amount={total}>`, e.g. a basket's total at checkout); then one they already have, a one-time payment made right there (it lands on `/payments` too), or a subscription (a page with none sends the owner to `/payments` with a subscription already chosen, and back with it added) — and the page's sentence carries the exact `<PayButton>` tags and the owner's words — public and signed-in pages sell with `<PayButton>`, internal and admin pages show the team the sales through `useSales()`, and before-paying questions go through the app's own forms. Connection says Test mode connected and nothing about webhooks while the owner practises; the Go live switch under it is always there and, once flipped, walks the test→live change — the live secret key, live price ids only when a subscription is sold (test ids kept, and the id-swap prompt for the assistant generated), and last the webhook, locked until step 3 of `/publish` is ticked because Stripe needs the published address, which it then hands over with a copy button — buyers get a built-in `/billing` page that appears after their first purchase, and every cancel/switch/invoice screen is Stripe's own billing portal |
37
+ | 🧾 **Transactions** | The ledger, `/transactions`: every charge and subscription live from Stripe, each row opening on everything the page collected — the answers given before the Pay button (they ride the button's `metadata`) and the order a public shop sent back through its form, joined to the payment by the entry id the button carried — plus who paid, how, where it goes and the receipt; an order started and never paid for stays listed as No payment. A payment's forms carry `transaction: true`, so their entries land here and never in the Inbox |
37
38
  | 📅 **Schedule** | Calendly-style booking, built in — on `/schedule` the owner keeps SCHEDULES: a week of hours per team member, in that person's own time zone, with the days they are away marked on it. Under them, BOOKING LINKS: one meeting each, booked in a chosen set of hours — its name, its length, how far ahead, how much notice, what it asks the visitor beyond their name and email, and a one-time payment taken first when they want one. Every link has a shipped booking page at `/book/{id}` to send to anyone: the app's theme and name, a full calendar in the visitor's own time zone, and Stripe checkout before the time is confirmed when a payment is attached. One set of hours carries as many links as you like, and they share one availability, so a time taken under any of them is gone from all; Your booking pages makes one address that offers several. The calendar at the top of `/schedule` shows everything booked on a month grid — Paid beside the paid ones, Cancel to free the time — read by an admin as the whole team or as any one person, and whoever booked reads the same calendar under My bookings. On `/pages` a page can be built on somebody's hours (Schedules on that page: a rota, or a page people book time on — the hours are read live, so changing the week changes the page) or carry a plain link to a booking link or page already made (Booking links), and any form can ask a Pick-a-time question. The assistant never builds a calendar, a time picker or a bookings collection |
38
39
  | 🔗 **Payment links** | Every one-time payment has a shipped page at `/pay/{id}` in the app's theme and name — under Payment links on `/payments` the owner adds one from a name, a line about it and a price, copies the link and sends it to anyone; Customise this page makes a real page on `/pages` and hands over the sentence that builds it, and the link goes there once it is built |
39
40
  | ✉️ **Email** | Resend in one line — a Send email switch at the top of `/email` stops every send at once (the server reads it before each one); while it is on, every page can send email once it is connected: `emailOwner()` tells the owner what happened, `emailPerson()` confirms to the person a record names, `emailAnyone()` lets a team page write to any address (a signed-in admin or team member only), receipts and sale alerts send themselves off a Pay button's settings, and `/email` says what the app can do with email and where owner mail goes |
@@ -91,11 +92,6 @@ RESEND_API_KEY=""
91
92
  APP_NAME=""
92
93
  ADMIN_EMAILS=""
93
94
  EMAIL_FROM=""
94
-
95
- # AI models — server side only, never sent to the browser. One is enough.
96
- GEMINI_KEY=""
97
- CLAUDE_KEY=""
98
- OPENAI_KEY=""
99
95
  ```
100
96
 
101
97
  4. `npm install express dotenv stripe` and `npm install -D tsx @types/express`, copy
@@ -108,12 +104,6 @@ The Setup screen carries the same block behind a copy button. The switch at the
108
104
  and Apply, or about `.env` and restarting; the choice is remembered and the Payments and Email
109
105
  screens read it too.
110
106
 
111
- `GEMINI_KEY`, `CLAUDE_KEY` and `OPENAI_KEY` are only needed if you later want your pages to use AI —
112
- one is enough, and the AI Models screen walks you through it. None of them has a `VITE_` prefix, on
113
- purpose: the server reads them, the browser never sees them. They are deliberately **not** named
114
- `GEMINI_API_KEY` or anything else ending in `_API_KEY` — `GEMINI_API_KEY` is the name AI Studio uses
115
- for its own key, which this app never reads.
116
-
117
107
  ### What the build enforces
118
108
 
119
109
  The package ships a Vite plugin, `yourAiFirebase()`, that puts the project's structure out of the assistant's reach. `src/App.tsx` and `src/main.tsx` are owned files: the plugin serves its own canonical source for both and rewrites them on disk whenever they differ, so an edit there has no effect. Pages, forms and content files are discovered from `src/your-ai-workflow-firebase-os/configs/` and `microcomponents/` through a virtual module, so a deleted registry import can no longer make a page vanish. And every discovered file is validated before the build: a config file with the wrong name, a `route` that is not one string starting with `/`, an address used twice, a `*Tab.config.ts` without a valid `pageType`, a missing `*Config` export, a `systemName` that does not match the file, or a content file with no default export fails the build with one sentence that names the fix. A bare `<img>` in a content file fails it too: pictures go through `<Picture>`, which holds its space before the picture lands, fetches the light copy written beside every upload, and crosses over when its `src` changes rather than blanking — the thing that made a product page's colour swatches flash. A hand-written `<form>` in a content file only warns — its entries would never reach the Inbox.
@@ -1 +1 @@
1
- require(`./chunk-CiTBaPhY.cjs`);const e=require(`./lucide-react-Ciu4WjH9.cjs`),t=require(`./address-COc6hg_p.cjs`),n=require(`./dist-CNztuGOG.cjs`);let r=require(`react`),i=require(`react/jsx-runtime`);var a=null;function o(){return a||(a=n.t.map(e=>{let t=n.n(e);return{iso2:t.iso2,name:t.name}}).sort((e,t)=>e.name.localeCompare(t.name)),a)}var s=e=>o().find(t=>t.iso2===String(e||``).toLowerCase())?.name||``,c={"united states of america":`us`,usa:`us`,"u.s.":`us`,"u.s.a.":`us`,uk:`gb`,"great britain":`gb`,england:`gb`,scotland:`gb`,wales:`gb`,"northern ireland":`gb`,"russian federation":`ru`,deutschland:`de`,españa:`es`,italia:`it`,brasil:`br`,"south korea":`kr`,"republic of korea":`kr`,"north korea":`kp`,czechia:`cz`,"czech republic":`cz`,"viet nam":`vn`,türkiye:`tr`,"the netherlands":`nl`,holland:`nl`,uae:`ae`,"united arab emirates":`ae`,"hong kong sar":`hk`,macau:`mo`,"ivory coast":`ci`,"côte d'ivoire":`ci`,eswatini:`sz`,"myanmar (burma)":`mm`,burma:`mm`};function l(e){let t=String(e||``).trim().toLowerCase();if(!t)return``;if(/^[a-z]{2}$/.test(t)&&o().some(e=>e.iso2===t))return t;if(c[t])return c[t];let n=o().find(e=>e.name.toLowerCase()===t);return n?n.iso2:o().find(e=>t.startsWith(e.name.toLowerCase())||e.name.toLowerCase().startsWith(t))?.iso2||``}function u(e){let t=l(e);return t?s(t):String(e||``).trim()}var d=`https://photon.komoot.io/api/`;function f(e){let t=(e.street||``).trim(),n=(e.housenumber||``).trim();return t?n?`${n} ${t}`:t:(e.name||``).trim()}var p=e=>(e.city||e.town||e.village||e.district||e.county||``).trim();function m(e,t){let n=e.properties;if(!n)return null;let r=f(n),i=p(n);if(!r&&!i)return null;let a=(n.state||``).trim(),o=(n.postcode||``).trim(),s=(n.country||``).trim(),c=[a,o].filter(Boolean).join(` `);return{id:`${n.osm_type||`x`}${n.osm_id??t}-${t}`,label:[r,i,c,s].filter(Boolean).join(`, `),street:r,city:i,region:a,postcode:o,country:s,countryCode:(n.countrycode||``).trim().toLowerCase()}}function h(e){let t=new Set;return e.filter(e=>{let n=e.label.toLowerCase();return t.has(n)?!1:(t.add(n),!0)})}async function g(e,t={}){let n=String(e||``).trim();if(n.length<3)return[];let r=`${d}?q=${encodeURIComponent(n)}&limit=${t.limit??6}`;try{let e=await fetch(r,{signal:t.signal});if(!e.ok)return[];let n=await e.json();return h((Array.isArray(n?.features)?n.features:[]).map(m).filter(e=>e!==null))}catch{return[]}}var _=`text-[13px] font-medium text-foreground/50 select-none mb-1.5 ml-1`,v={borderRadius:`var(--input-radius, 0.75rem)`},y=`flex items-center h-12 w-full px-4 text-[15px] text-foreground transition-all duration-300 glass-panel`,b=`block h-12 w-full px-4 py-2 text-[15px] text-foreground transition-all duration-300 placeholder:text-foreground/40 focus:outline-none focus:border-accent glow-focus disabled:cursor-not-allowed disabled:opacity-50 glass-panel`,x=`flex-1 min-w-0 bg-transparent border-none outline-none shadow-none p-0 text-[15px] text-foreground placeholder:text-foreground/40 no-glow`;function S(e){let[t,n]=(0,r.useState)(!1),[i,a]=(0,r.useState)(!1),[o,s]=(0,r.useState)([]),[c,l]=(0,r.useState)(-1),u=(0,r.useRef)(!1),d=(0,r.useRef)(!1),f=(0,r.useRef)(null);return(0,r.useEffect)(()=>{if(u.current){u.current=!1;return}if(!d.current){s([]),a(!1),n(!1);return}let t=e.trim();if(t.length<3){s([]),a(!1),n(!1);return}let r=new AbortController;a(!0);let i=setTimeout(async()=>{let e=await g(t,{signal:r.signal});r.signal.aborted||(s(e),l(-1),a(!1),n(e.length>0))},250);return()=>{r.abort(),clearTimeout(i)}},[e]),(0,r.useEffect)(()=>{if(!t)return;let e=e=>{f.current?.contains(e.target)||n(!1)};return document.addEventListener(`pointerdown`,e,!0),()=>document.removeEventListener(`pointerdown`,e,!0)},[t]),{open:t,setOpen:n,busy:i,rows:o,active:c,setActive:l,boxRef:f,typed:d,take:e=>{u.current=!0,e(),n(!1),s([]),l(-1)},onKeyDown:(e,r)=>{if(e.key===`Escape`&&t){e.stopPropagation(),n(!1);return}!t||!o.length||(e.key===`ArrowDown`?(e.preventDefault(),l(e=>(e+1)%o.length)):e.key===`ArrowUp`?(e.preventDefault(),l(e=>(e<=0?o.length:e)-1)):e.key===`Enter`&&c>=0&&(e.preventDefault(),r(o[c])))}}}function C({label:t,value:n,disabled:a,onPick:s}){let[c,u]=(0,r.useState)(!1),[d,f]=(0,r.useState)(``),p=(0,r.useRef)(null),m=(0,r.useRef)(null);(0,r.useEffect)(()=>{if(!c){f(``);return}m.current?.focus();let e=e=>{p.current?.contains(e.target)||u(!1)};return document.addEventListener(`pointerdown`,e,!0),()=>document.removeEventListener(`pointerdown`,e,!0)},[c]);let h=d.trim().toLowerCase(),g=h?o().filter(e=>e.name.toLowerCase().includes(h)):o(),_=l(n);return(0,i.jsxs)(`div`,{className:`relative w-full`,ref:p,children:[(0,i.jsxs)(`button`,{type:`button`,disabled:a,onClick:()=>u(e=>!e),"aria-haspopup":`listbox`,"aria-expanded":c,"aria-label":t,className:`${y} justify-between gap-2 text-left cursor-pointer hover:border-accent/40 disabled:cursor-not-allowed disabled:opacity-50`,style:v,children:[(0,i.jsx)(`span`,{className:`truncate ${n?`text-foreground`:`text-foreground/40`}`,children:n||`Country`}),(0,i.jsx)(e.in,{className:`w-3.5 h-3.5 shrink-0 text-foreground/50 transition-transform duration-300 ${c?`rotate-180`:``}`})]}),c&&(0,i.jsxs)(`div`,{role:`listbox`,"aria-label":t,className:`absolute z-[999999] top-[calc(100%+8px)] left-0 w-full glass-popover overflow-hidden`,style:v,children:[(0,i.jsxs)(`div`,{className:`flex items-center gap-2 px-3 h-11 border-b border-[var(--panel-border)]/50`,children:[(0,i.jsx)(e.I,{className:`w-3.5 h-3.5 shrink-0 text-foreground/35`}),(0,i.jsx)(`input`,{ref:m,value:d,onChange:e=>f(e.target.value),onKeyDown:e=>{if(e.key===`Escape`){e.stopPropagation(),u(!1);return}e.key===`Enter`&&(e.preventDefault(),g[0]&&(s(g[0].name),u(!1)))},placeholder:`Search countries`,"aria-label":`Search countries`,autoComplete:`off`,className:`${x} text-[14px]`})]}),(0,i.jsxs)(`div`,{className:`max-h-56 overflow-y-auto no-scrollbar p-1`,children:[n&&!h&&(0,i.jsxs)(`div`,{role:`option`,"aria-selected":!1,onClick:()=>{s(``),u(!1)},className:`flex items-center gap-2.5 px-3 py-2.5 text-[13px] font-medium text-foreground/60 hover:bg-foreground/5 cursor-pointer`,style:{borderRadius:`calc(var(--input-radius, 0.75rem) - 0.25rem)`},children:[(0,i.jsx)(e.a,{className:`w-3.5 h-3.5 shrink-0 text-foreground/35`}),(0,i.jsx)(`span`,{className:`truncate`,children:`No country`})]}),g.map(e=>(0,i.jsx)(`div`,{role:`option`,"aria-selected":e.iso2===_,onClick:()=>{s(e.name),u(!1)},className:`flex items-center px-3 py-2.5 transition-colors font-medium text-[13px] cursor-pointer ${e.iso2===_?`bg-accent/10 text-accent font-bold`:`text-foreground/80 hover:bg-foreground/5 hover:text-foreground`}`,style:{borderRadius:`calc(var(--input-radius, 0.75rem) - 0.25rem)`},children:(0,i.jsx)(`span`,{className:`truncate`,children:e.name})},e.iso2)),g.length===0&&(0,i.jsx)(`div`,{className:`px-3 py-2.5 text-[13px] text-foreground/40`,children:`No match`})]})]})]})}function w({id:n,label:r,value:a,onChange:o,required:s=!1,disabled:c=!1,placeholder:d,error:f}){let p=S(a.street),m=t.i(l(a.country)),h=e=>o({...a,...e}),g=e=>p.take(()=>o({street:e.street,city:e.city,region:e.region,postcode:e.postcode,country:u(e.countryCode||e.country)||a.country})),w=(e,t,n,o,s)=>(0,i.jsx)(`div`,{className:o,children:(0,i.jsx)(`input`,{type:`text`,disabled:c,value:a[e],onChange:t=>h({[e]:t.target.value}),placeholder:n,"aria-label":`${r} — ${t}`,autoComplete:s,className:b,style:v})},e),T=m.postal?`col-span-1`:`col-span-2`,E=m.region?`col-span-1`:`col-span-2`,D=!!(a.country||a.city||a.region||a.postcode);return(0,i.jsxs)(`div`,{className:`flex flex-col w-full`,ref:p.boxRef,children:[(0,i.jsxs)(`label`,{className:_,htmlFor:n,children:[r,` `,s&&(0,i.jsx)(`span`,{className:`text-red-500`,children:`*`})]}),(0,i.jsxs)(`div`,{className:`relative w-full`,children:[(0,i.jsxs)(`div`,{className:`${y} gap-2.5 focus-within:border-accent glow-focus ${f?`border-red-500/50`:``}`,style:v,children:[(0,i.jsx)(e.st,{className:`w-4 h-4 shrink-0 text-foreground/40`}),(0,i.jsx)(`input`,{id:n,type:`text`,required:s,disabled:c,value:a.street,onChange:e=>{p.typed.current=!0,h({street:e.target.value})},onFocus:()=>{p.rows.length&&p.setOpen(!0)},onKeyDown:e=>p.onKeyDown(e,g),role:`combobox`,"aria-expanded":p.open,"aria-autocomplete":`list`,"aria-controls":`${n}-list`,placeholder:d||`Start typing your address`,autoComplete:`address-line1`,className:x}),p.busy&&(0,i.jsx)(e.mt,{className:`w-3.5 h-3.5 shrink-0 text-foreground/30 animate-spin`})]}),p.open&&(0,i.jsx)(`div`,{id:`${n}-list`,role:`listbox`,"aria-label":r,className:`absolute z-[999999] top-[calc(100%+8px)] left-0 w-full glass-popover overflow-hidden p-1`,style:v,children:p.rows.map((t,n)=>(0,i.jsxs)(`div`,{role:`option`,"aria-selected":n===p.active,onMouseEnter:()=>p.setActive(n),onClick:()=>g(t),className:`flex items-center gap-2.5 px-3 py-2.5 transition-colors text-[13px] font-medium cursor-pointer ${n===p.active?`bg-accent/10 text-accent`:`text-foreground/80 hover:bg-foreground/5`}`,style:{borderRadius:`calc(var(--input-radius, 0.75rem) - 0.25rem)`},children:[(0,i.jsx)(e.st,{className:`w-3.5 h-3.5 shrink-0 text-foreground/35`}),(0,i.jsx)(`span`,{className:`truncate`,children:t.label})]},t.id))})]}),(0,i.jsx)(`div`,{className:`mt-2.5`,children:(0,i.jsx)(C,{label:`${r} — country`,value:a.country,disabled:c,onPick:e=>h({country:e})})}),D&&(0,i.jsxs)(`div`,{className:`grid grid-cols-2 gap-2.5 mt-2.5`,children:[w(`city`,`city`,t.t[m.locality],`col-span-2`,`address-level2`),m.region&&w(`region`,`region`,t.t[m.region],T,`address-level1`),m.postal&&w(`postcode`,`postcode`,t.t[m.postal],E,`postal-code`)]}),f&&(0,i.jsx)(`p`,{className:`text-xs text-red-500 font-medium mt-1.5 ml-1`,children:f})]})}exports.AddressField=w,exports.default=w;
1
+ require(`./chunk-CiTBaPhY.cjs`);const e=require(`./lucide-react-DURrEG5A.cjs`),t=require(`./address-CCq55BsD.cjs`),n=require(`./dist-Cankgl0L.cjs`);let r=require(`react`),i=require(`react/jsx-runtime`);var a=null;function o(){return a||(a=n.t.map(e=>{let t=n.n(e);return{iso2:t.iso2,name:t.name}}).sort((e,t)=>e.name.localeCompare(t.name)),a)}var s=e=>o().find(t=>t.iso2===String(e||``).toLowerCase())?.name||``,c={"united states of america":`us`,usa:`us`,"u.s.":`us`,"u.s.a.":`us`,uk:`gb`,"great britain":`gb`,england:`gb`,scotland:`gb`,wales:`gb`,"northern ireland":`gb`,"russian federation":`ru`,deutschland:`de`,españa:`es`,italia:`it`,brasil:`br`,"south korea":`kr`,"republic of korea":`kr`,"north korea":`kp`,czechia:`cz`,"czech republic":`cz`,"viet nam":`vn`,türkiye:`tr`,"the netherlands":`nl`,holland:`nl`,uae:`ae`,"united arab emirates":`ae`,"hong kong sar":`hk`,macau:`mo`,"ivory coast":`ci`,"côte d'ivoire":`ci`,eswatini:`sz`,"myanmar (burma)":`mm`,burma:`mm`};function l(e){let t=String(e||``).trim().toLowerCase();if(!t)return``;if(/^[a-z]{2}$/.test(t)&&o().some(e=>e.iso2===t))return t;if(c[t])return c[t];let n=o().find(e=>e.name.toLowerCase()===t);return n?n.iso2:o().find(e=>t.startsWith(e.name.toLowerCase())||e.name.toLowerCase().startsWith(t))?.iso2||``}function u(e){let t=l(e);return t?s(t):String(e||``).trim()}var d=`https://photon.komoot.io/api/`;function f(e){let t=(e.street||``).trim(),n=(e.housenumber||``).trim();return t?n?`${n} ${t}`:t:(e.name||``).trim()}var p=e=>(e.city||e.town||e.village||e.district||e.county||``).trim();function m(e,t){let n=e.properties;if(!n)return null;let r=f(n),i=p(n);if(!r&&!i)return null;let a=(n.state||``).trim(),o=(n.postcode||``).trim(),s=(n.country||``).trim(),c=[a,o].filter(Boolean).join(` `);return{id:`${n.osm_type||`x`}${n.osm_id??t}-${t}`,label:[r,i,c,s].filter(Boolean).join(`, `),street:r,city:i,region:a,postcode:o,country:s,countryCode:(n.countrycode||``).trim().toLowerCase()}}function h(e){let t=new Set;return e.filter(e=>{let n=e.label.toLowerCase();return t.has(n)?!1:(t.add(n),!0)})}async function g(e,t={}){let n=String(e||``).trim();if(n.length<3)return[];let r=`${d}?q=${encodeURIComponent(n)}&limit=${t.limit??6}`;try{let e=await fetch(r,{signal:t.signal});if(!e.ok)return[];let n=await e.json();return h((Array.isArray(n?.features)?n.features:[]).map(m).filter(e=>e!==null))}catch{return[]}}var _=`text-[13px] font-medium text-foreground/50 select-none mb-1.5 ml-1`,v={borderRadius:`var(--input-radius, 0.75rem)`},y=`flex items-center h-12 w-full px-4 text-[15px] text-foreground transition-all duration-300 glass-panel`,b=`block h-12 w-full px-4 py-2 text-[15px] text-foreground transition-all duration-300 placeholder:text-foreground/40 focus:outline-none focus:border-accent glow-focus disabled:cursor-not-allowed disabled:opacity-50 glass-panel`,x=`flex-1 min-w-0 bg-transparent border-none outline-none shadow-none p-0 text-[15px] text-foreground placeholder:text-foreground/40 no-glow`;function S(e){let[t,n]=(0,r.useState)(!1),[i,a]=(0,r.useState)(!1),[o,s]=(0,r.useState)([]),[c,l]=(0,r.useState)(-1),u=(0,r.useRef)(!1),d=(0,r.useRef)(!1),f=(0,r.useRef)(null);return(0,r.useEffect)(()=>{if(u.current){u.current=!1;return}if(!d.current){s([]),a(!1),n(!1);return}let t=e.trim();if(t.length<3){s([]),a(!1),n(!1);return}let r=new AbortController;a(!0);let i=setTimeout(async()=>{let e=await g(t,{signal:r.signal});r.signal.aborted||(s(e),l(-1),a(!1),n(e.length>0))},250);return()=>{r.abort(),clearTimeout(i)}},[e]),(0,r.useEffect)(()=>{if(!t)return;let e=e=>{f.current?.contains(e.target)||n(!1)};return document.addEventListener(`pointerdown`,e,!0),()=>document.removeEventListener(`pointerdown`,e,!0)},[t]),{open:t,setOpen:n,busy:i,rows:o,active:c,setActive:l,boxRef:f,typed:d,take:e=>{u.current=!0,e(),n(!1),s([]),l(-1)},onKeyDown:(e,r)=>{if(e.key===`Escape`&&t){e.stopPropagation(),n(!1);return}!t||!o.length||(e.key===`ArrowDown`?(e.preventDefault(),l(e=>(e+1)%o.length)):e.key===`ArrowUp`?(e.preventDefault(),l(e=>(e<=0?o.length:e)-1)):e.key===`Enter`&&c>=0&&(e.preventDefault(),r(o[c])))}}}function C({label:t,value:n,disabled:a,onPick:s}){let[c,u]=(0,r.useState)(!1),[d,f]=(0,r.useState)(``),p=(0,r.useRef)(null),m=(0,r.useRef)(null);(0,r.useEffect)(()=>{if(!c){f(``);return}m.current?.focus();let e=e=>{p.current?.contains(e.target)||u(!1)};return document.addEventListener(`pointerdown`,e,!0),()=>document.removeEventListener(`pointerdown`,e,!0)},[c]);let h=d.trim().toLowerCase(),g=h?o().filter(e=>e.name.toLowerCase().includes(h)):o(),_=l(n);return(0,i.jsxs)(`div`,{className:`relative w-full`,ref:p,children:[(0,i.jsxs)(`button`,{type:`button`,disabled:a,onClick:()=>u(e=>!e),"aria-haspopup":`listbox`,"aria-expanded":c,"aria-label":t,className:`${y} justify-between gap-2 text-left cursor-pointer hover:border-accent/40 disabled:cursor-not-allowed disabled:opacity-50`,style:v,children:[(0,i.jsx)(`span`,{className:`truncate ${n?`text-foreground`:`text-foreground/40`}`,children:n||`Country`}),(0,i.jsx)(e.nn,{className:`w-3.5 h-3.5 shrink-0 text-foreground/50 transition-transform duration-300 ${c?`rotate-180`:``}`})]}),c&&(0,i.jsxs)(`div`,{role:`listbox`,"aria-label":t,className:`absolute z-[999999] top-[calc(100%+8px)] left-0 w-full glass-popover overflow-hidden`,style:v,children:[(0,i.jsxs)(`div`,{className:`flex items-center gap-2 px-3 h-11 border-b border-[var(--panel-border)]/50`,children:[(0,i.jsx)(e.F,{className:`w-3.5 h-3.5 shrink-0 text-foreground/35`}),(0,i.jsx)(`input`,{ref:m,value:d,onChange:e=>f(e.target.value),onKeyDown:e=>{if(e.key===`Escape`){e.stopPropagation(),u(!1);return}e.key===`Enter`&&(e.preventDefault(),g[0]&&(s(g[0].name),u(!1)))},placeholder:`Search countries`,"aria-label":`Search countries`,autoComplete:`off`,className:`${x} text-[14px]`})]}),(0,i.jsxs)(`div`,{className:`max-h-56 overflow-y-auto no-scrollbar p-1`,children:[n&&!h&&(0,i.jsxs)(`div`,{role:`option`,"aria-selected":!1,onClick:()=>{s(``),u(!1)},className:`flex items-center gap-2.5 px-3 py-2.5 text-[13px] font-medium text-foreground/60 hover:bg-foreground/5 cursor-pointer`,style:{borderRadius:`calc(var(--input-radius, 0.75rem) - 0.25rem)`},children:[(0,i.jsx)(e.o,{className:`w-3.5 h-3.5 shrink-0 text-foreground/35`}),(0,i.jsx)(`span`,{className:`truncate`,children:`No country`})]}),g.map(e=>(0,i.jsx)(`div`,{role:`option`,"aria-selected":e.iso2===_,onClick:()=>{s(e.name),u(!1)},className:`flex items-center px-3 py-2.5 transition-colors font-medium text-[13px] cursor-pointer ${e.iso2===_?`bg-accent/10 text-accent font-bold`:`text-foreground/80 hover:bg-foreground/5 hover:text-foreground`}`,style:{borderRadius:`calc(var(--input-radius, 0.75rem) - 0.25rem)`},children:(0,i.jsx)(`span`,{className:`truncate`,children:e.name})},e.iso2)),g.length===0&&(0,i.jsx)(`div`,{className:`px-3 py-2.5 text-[13px] text-foreground/40`,children:`No match`})]})]})]})}function w({id:n,label:r,value:a,onChange:o,required:s=!1,disabled:c=!1,placeholder:d,error:f}){let p=S(a.street),m=t.a(l(a.country)),h=e=>o({...a,...e}),g=e=>p.take(()=>o({street:e.street,city:e.city,region:e.region,postcode:e.postcode,country:u(e.countryCode||e.country)||a.country})),w=(e,t,n,o,s)=>(0,i.jsx)(`div`,{className:o,children:(0,i.jsx)(`input`,{type:`text`,disabled:c,value:a[e],onChange:t=>h({[e]:t.target.value}),placeholder:n,"aria-label":`${r} — ${t}`,autoComplete:s,className:b,style:v})},e),T=m.postal?`col-span-1`:`col-span-2`,E=m.region?`col-span-1`:`col-span-2`,D=!!(a.country||a.city||a.region||a.postcode);return(0,i.jsxs)(`div`,{className:`flex flex-col w-full`,ref:p.boxRef,children:[(0,i.jsxs)(`label`,{className:_,htmlFor:n,children:[r,` `,s&&(0,i.jsx)(`span`,{className:`text-red-500`,children:`*`})]}),(0,i.jsxs)(`div`,{className:`relative w-full`,children:[(0,i.jsxs)(`div`,{className:`${y} gap-2.5 focus-within:border-accent glow-focus ${f?`border-red-500/50`:``}`,style:v,children:[(0,i.jsx)(e.ot,{className:`w-4 h-4 shrink-0 text-foreground/40`}),(0,i.jsx)(`input`,{id:n,type:`text`,required:s,disabled:c,value:a.street,onChange:e=>{p.typed.current=!0,h({street:e.target.value})},onFocus:()=>{p.rows.length&&p.setOpen(!0)},onKeyDown:e=>p.onKeyDown(e,g),role:`combobox`,"aria-expanded":p.open,"aria-autocomplete":`list`,"aria-controls":`${n}-list`,placeholder:d||`Start typing your address`,autoComplete:`address-line1`,className:x}),p.busy&&(0,i.jsx)(e.pt,{className:`w-3.5 h-3.5 shrink-0 text-foreground/30 animate-spin`})]}),p.open&&(0,i.jsx)(`div`,{id:`${n}-list`,role:`listbox`,"aria-label":r,className:`absolute z-[999999] top-[calc(100%+8px)] left-0 w-full glass-popover overflow-hidden p-1`,style:v,children:p.rows.map((t,n)=>(0,i.jsxs)(`div`,{role:`option`,"aria-selected":n===p.active,onMouseEnter:()=>p.setActive(n),onClick:()=>g(t),className:`flex items-center gap-2.5 px-3 py-2.5 transition-colors text-[13px] font-medium cursor-pointer ${n===p.active?`bg-accent/10 text-accent`:`text-foreground/80 hover:bg-foreground/5`}`,style:{borderRadius:`calc(var(--input-radius, 0.75rem) - 0.25rem)`},children:[(0,i.jsx)(e.ot,{className:`w-3.5 h-3.5 shrink-0 text-foreground/35`}),(0,i.jsx)(`span`,{className:`truncate`,children:t.label})]},t.id))})]}),(0,i.jsx)(`div`,{className:`mt-2.5`,children:(0,i.jsx)(C,{label:`${r} — country`,value:a.country,disabled:c,onPick:e=>h({country:e})})}),D&&(0,i.jsxs)(`div`,{className:`grid grid-cols-2 gap-2.5 mt-2.5`,children:[w(`city`,`city`,t.t[m.locality],`col-span-2`,`address-level2`),m.region&&w(`region`,`region`,t.t[m.region],T,`address-level1`),m.postal&&w(`postcode`,`postcode`,t.t[m.postal],E,`postal-code`)]}),f&&(0,i.jsx)(`p`,{className:`text-xs text-red-500 font-medium mt-1.5 ml-1`,children:f})]})}exports.AddressField=w,exports.default=w;
@@ -1,6 +1,6 @@
1
- import { I as e, a as t, in as n, mt as r, st as i } from "./lucide-react-CS_DerLf.js";
2
- import { i as a, t as o } from "./address-D6MYmA1-.js";
3
- import { n as s, t as c } from "./dist-C4ycpl2h.js";
1
+ import { F as e, nn as t, o as n, ot as r, pt as i } from "./lucide-react-CB7uZ-Ri.js";
2
+ import { a, t as o } from "./address-BDU-ls1U.js";
3
+ import { n as s, t as c } from "./dist-DFAeyUdQ.js";
4
4
  import { useEffect as l, useRef as u, useState as d } from "react";
5
5
  import { jsx as f, jsxs as p } from "react/jsx-runtime";
6
6
  //#region src/lib/countryList.ts
@@ -195,7 +195,7 @@ function M({ label: r, value: i, disabled: a, onPick: o }) {
195
195
  children: [/* @__PURE__ */ f("span", {
196
196
  className: `truncate ${i ? "text-foreground" : "text-foreground/40"}`,
197
197
  children: i || "Country"
198
- }), /* @__PURE__ */ f(n, { className: `w-3.5 h-3.5 shrink-0 text-foreground/50 transition-transform duration-300 ${s ? "rotate-180" : ""}` })]
198
+ }), /* @__PURE__ */ f(t, { className: `w-3.5 h-3.5 shrink-0 text-foreground/50 transition-transform duration-300 ${s ? "rotate-180" : ""}` })]
199
199
  }), s && /* @__PURE__ */ p("div", {
200
200
  role: "listbox",
201
201
  "aria-label": r,
@@ -230,7 +230,7 @@ function M({ label: r, value: i, disabled: a, onPick: o }) {
230
230
  },
231
231
  className: "flex items-center gap-2.5 px-3 py-2.5 text-[13px] font-medium text-foreground/60 hover:bg-foreground/5 cursor-pointer",
232
232
  style: { borderRadius: "calc(var(--input-radius, 0.75rem) - 0.25rem)" },
233
- children: [/* @__PURE__ */ f(t, { className: "w-3.5 h-3.5 shrink-0 text-foreground/35" }), /* @__PURE__ */ f("span", {
233
+ children: [/* @__PURE__ */ f(n, { className: "w-3.5 h-3.5 shrink-0 text-foreground/35" }), /* @__PURE__ */ f("span", {
234
234
  className: "truncate",
235
235
  children: "No country"
236
236
  })]
@@ -303,7 +303,7 @@ function N({ id: e, label: t, value: n, onChange: s, required: c = !1, disabled:
303
303
  className: `${O} gap-2.5 focus-within:border-accent glow-focus ${d ? "border-red-500/50" : ""}`,
304
304
  style: D,
305
305
  children: [
306
- /* @__PURE__ */ f(i, { className: "w-4 h-4 shrink-0 text-foreground/40" }),
306
+ /* @__PURE__ */ f(r, { className: "w-4 h-4 shrink-0 text-foreground/40" }),
307
307
  /* @__PURE__ */ f("input", {
308
308
  id: e,
309
309
  type: "text",
@@ -325,7 +325,7 @@ function N({ id: e, label: t, value: n, onChange: s, required: c = !1, disabled:
325
325
  autoComplete: "address-line1",
326
326
  className: A
327
327
  }),
328
- m.busy && /* @__PURE__ */ f(r, { className: "w-3.5 h-3.5 shrink-0 text-foreground/30 animate-spin" })
328
+ m.busy && /* @__PURE__ */ f(i, { className: "w-3.5 h-3.5 shrink-0 text-foreground/30 animate-spin" })
329
329
  ]
330
330
  }), m.open && /* @__PURE__ */ f("div", {
331
331
  id: `${e}-list`,
@@ -340,7 +340,7 @@ function N({ id: e, label: t, value: n, onChange: s, required: c = !1, disabled:
340
340
  onClick: () => _(e),
341
341
  className: `flex items-center gap-2.5 px-3 py-2.5 transition-colors text-[13px] font-medium cursor-pointer ${t === m.active ? "bg-accent/10 text-accent" : "text-foreground/80 hover:bg-foreground/5"}`,
342
342
  style: { borderRadius: "calc(var(--input-radius, 0.75rem) - 0.25rem)" },
343
- children: [/* @__PURE__ */ f(i, { className: "w-3.5 h-3.5 shrink-0 text-foreground/35" }), /* @__PURE__ */ f("span", {
343
+ children: [/* @__PURE__ */ f(r, { className: "w-3.5 h-3.5 shrink-0 text-foreground/35" }), /* @__PURE__ */ f("span", {
344
344
  className: "truncate",
345
345
  children: e.label
346
346
  })]