@zorgo/next 1.3.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.mts +9 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.js +44 -66
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +43 -65
- package/dist/cli.mjs.map +1 -1
- package/dist/components.d.mts +735 -5
- package/dist/components.d.ts +735 -5
- package/dist/components.js +3692 -525
- package/dist/components.js.map +1 -1
- package/dist/components.mjs +3663 -540
- package/dist/components.mjs.map +1 -1
- package/dist/images.d.mts +25 -13
- package/dist/images.d.ts +25 -13
- package/dist/images.js +18 -8
- package/dist/images.js.map +1 -1
- package/dist/images.mjs +15 -8
- package/dist/images.mjs.map +1 -1
- package/dist/index.d.mts +315 -9
- package/dist/index.d.ts +315 -9
- package/dist/index.js +58 -52
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +58 -52
- package/dist/index.mjs.map +1 -1
- package/dist/item-page.d.mts +6 -0
- package/dist/item-page.d.ts +6 -0
- package/dist/item-page.js +4 -2
- package/dist/item-page.js.map +1 -1
- package/dist/item-page.mjs +4 -2
- package/dist/item-page.mjs.map +1 -1
- package/dist/legal.d.mts +31 -0
- package/dist/legal.d.ts +31 -0
- package/dist/legal.js +322 -0
- package/dist/legal.js.map +1 -0
- package/dist/legal.mjs +293 -0
- package/dist/legal.mjs.map +1 -0
- package/dist/seo.d.mts +56 -1
- package/dist/seo.d.ts +56 -1
- package/dist/seo.js +111 -2
- package/dist/seo.js.map +1 -1
- package/dist/seo.mjs +106 -1
- package/dist/seo.mjs.map +1 -1
- package/dist/server.d.mts +27 -1
- package/dist/server.d.ts +27 -1
- package/dist/server.js +322 -102
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +322 -104
- package/dist/server.mjs.map +1 -1
- package/dist/slugs.d.mts +2 -1
- package/dist/slugs.d.ts +2 -1
- package/dist/slugs.js +2 -0
- package/dist/slugs.js.map +1 -1
- package/dist/slugs.mjs +1 -0
- package/dist/tree/README.md +2 -2
- package/dist/tree/app/error.tsx +12 -3
- package/dist/tree/app/global-error.tsx +21 -4
- package/dist/tree/app/globals.css +41 -0
- package/dist/tree/app/not-found.tsx +17 -3
- package/dist/tree/app/privacy/page.tsx.gen.ts +28 -9
- package/dist/tree/app/terms/page.tsx.gen.ts +26 -10
- package/dist/tree/gitignore +6 -1
- package/dist/tree/next.config.ts +6 -5
- package/dist/tree/open-next.config.ts +7 -0
- package/dist/tree/package.json.gen.ts +8 -2
- package/package.json +7 -2
- package/dist/tree/app/globals.css.gen.ts +0 -124
package/dist/components.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/client/index.ts","../src/components/client/CookieConsent.tsx","../../../node_modules/@headlessui/react/dist/utils/env.js","../../../node_modules/@headlessui/react/dist/hooks/use-disposables.js","../../../node_modules/@headlessui/react/dist/utils/micro-task.js","../../../node_modules/@headlessui/react/dist/utils/disposables.js","../../../node_modules/@headlessui/react/dist/hooks/use-event.js","../../../node_modules/@headlessui/react/dist/hooks/use-latest-value.js","../../../node_modules/@headlessui/react/dist/hooks/use-iso-morphic-effect.js","../../../node_modules/@headlessui/react/dist/utils/render.js","../../../node_modules/@headlessui/react/dist/utils/class-names.js","../../../node_modules/@headlessui/react/dist/utils/match.js","../../../node_modules/@headlessui/react/dist/hooks/use-sync-refs.js","../../../node_modules/@headlessui/react/dist/hooks/use-transition.js","../../../node_modules/@headlessui/react/dist/hooks/use-flags.js","../../../node_modules/@headlessui/react/dist/internal/open-closed.js","../../../node_modules/@headlessui/react/dist/hooks/use-server-handoff-complete.js","../../../node_modules/@headlessui/react/dist/hooks/use-is-mounted.js","../../../node_modules/@headlessui/react/dist/components/transition/transition.js","../src/components/client/GridMenu.tsx","../src/images.ts","../src/components/client/AccordionMenu.tsx","../src/components/client/ItemForm/classes.ts","../src/components/client/ItemForm/ClientItemForm.tsx","../src/components/client/ItemForm/Breadcrumbs.tsx","../src/components/client/ItemForm/CommentsSection.tsx","../src/components/client/ItemForm/ComponentsSection.tsx","../src/components/client/ItemForm/OptionButton.tsx","../src/components/client/ItemForm/PortionPicker.tsx","../src/components/client/ItemForm/PortionSection.tsx","../src/components/client/ItemForm/QuantitySection.tsx","../src/components/client/ItemForm/RuleSection.tsx","../src/components/client/ItemForm/SubmitButton.tsx","../src/components/client/ItemForm/VariantSection.tsx","../src/components/client/FindLocation.tsx","../src/components/client/CheckoutForm/classes.ts","../src/components/client/CheckoutForm/CheckoutForm.tsx","../src/components/client/CheckoutForm/CheckoutShell.tsx","../src/components/client/CheckoutForm/DetailsStep.tsx","../src/components/client/CheckoutForm/CheckoutSteps.tsx","../src/components/client/CheckoutForm/ConsentFields.tsx","../src/components/client/CheckoutForm/ContactFields.tsx","../src/components/client/CheckoutForm/OrderLine.tsx","../src/components/client/CheckoutForm/OrderTotals.tsx","../src/components/client/CheckoutForm/PromoCode.tsx","../src/components/client/CheckoutForm/PaymentStep.tsx","../src/components/client/CheckoutForm/StatusPanel.tsx"],"sourcesContent":["// Un-obfuscated component bundle (dist/components.*) — see tsup.config.ts.\n// Consumers import from \"@zorgo/next/components\"; the consumer's Tailwind scans\n// this bundle via @source. Add new components here.\nexport { CookieConsent } from \"./CookieConsent\";\nexport {\n\tGridMenu,\n\ttype GridMenuItemClasses,\n\tGRID_MENU_DEFAULT_ITEM_CLASSES,\n\tmergeGridMenuItemClasses,\n} from \"./GridMenu\";\nexport {\n\tAccordionMenu,\n\ttype AccordionMenuItemClasses,\n\tACCORDION_MENU_DEFAULT_ITEM_CLASSES,\n\tmergeAccordionMenuItemClasses,\n} from \"./AccordionMenu\";\n// ClientItemForm plus the sections it is built from — Breadcrumbs,\n// PortionPicker, VariantSection, RuleSection, … — so a custom form can reuse\n// the pieces it wants. See ./ItemForm/index.ts.\nexport * from \"./ItemForm\";\n// Pre-1.2 names. ItemCustomizationClient was a wrapper that only supplied the\n// post-submit navigation ClientItemForm now defaults to. Drop these once every\n// site is on the new names.\nexport {\n\tClientItemForm as ItemCustomizationForm,\n\tClientItemForm as ItemCustomizationClient,\n\ttype ClientItemFormItemClasses as ItemCustomizationFormItemClasses,\n\tCLIENT_ITEM_FORM_DEFAULT_ITEM_CLASSES as ITEM_CUSTOMIZATION_FORM_DEFAULT_ITEM_CLASSES,\n\tmergeClientItemFormItemClasses as mergeItemCustomizationFormItemClasses,\n} from \"./ItemForm\";\nexport {\n\tFindLocation,\n\ttype FindLocationItemClasses,\n\tFIND_LOCATION_DEFAULT_ITEM_CLASSES,\n\tmergeFindLocationItemClasses,\n} from \"./FindLocation\";\n// CheckoutForm plus the pieces it is built from — OrderLine, OrderTotals,\n// PromoCode, ContactFields, … — so a custom checkout can reuse the pieces it\n// wants. See ./CheckoutForm/index.ts.\nexport * from \"./CheckoutForm\";\n\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { Transition } from \"@headlessui/react\";\nimport { useCustomer } from \"@zorgo/universal/hooks/hooks\";\n\nexport function CookieConsent() {\n\tconst { consentAnswered, setConsent } = useCustomer();\n\tconst [mounted, setMounted] = useState(false);\n\tuseEffect(() => { setMounted(true); }, []);\n\n\tif (!mounted) return null;\n\n\treturn (\n\t\t<Transition\n\t\t\tshow={!consentAnswered}\n\t\t\tenter=\"transition-opacity duration-300\"\n\t\t\tenterFrom=\"opacity-0\"\n\t\t\tenterTo=\"opacity-100\"\n\t\t\tleave=\"transition-opacity duration-200\"\n\t\t\tleaveFrom=\"opacity-100\"\n\t\t\tleaveTo=\"opacity-0\">\n\t\t\t<div\n\t\t\t\tclassName=\"fixed inset-x-0 bottom-0 z-[9999] flex flex-col items-center justify-center gap-4 bg-black/85 px-6 py-4 text-center text-sm text-white backdrop-blur md:flex-row\"\n\t\t\t\trole=\"alert\"\n\t\t\t\taria-live=\"polite\">\n\t\t\t\t<p className=\"m-0\">\n\t\t\t\t\tWe use cookies to improve your experience and collect anonymous usage\n\t\t\t\t\tdata.\n\t\t\t\t</p>\n\t\t\t\t<div className=\"flex shrink-0 flex-wrap items-center justify-center gap-2\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"whitespace-nowrap rounded-md px-4 py-2 text-sm font-medium text-zinc-500 hover:border-zinc-600 hover:bg-zinc-900 hover:text-zinc-400\"\n\t\t\t\t\t\tonClick={() => setConsent(false)}>\n\t\t\t\t\t\tReject\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"whitespace-nowrap rounded-md bg-white px-5 py-2 text-sm font-semibold text-black transition-colors hover:bg-gray-400\"\n\t\t\t\t\t\tonClick={() => setConsent(true)}>\n\t\t\t\t\t\tAccept\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Transition>\n\t);\n}\n","var i=Object.defineProperty;var d=(t,e,n)=>e in t?i(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var r=(t,e,n)=>(d(t,typeof e!=\"symbol\"?e+\"\":e,n),n);class o{constructor(){r(this,\"current\",this.detect());r(this,\"handoffState\",\"pending\");r(this,\"currentId\",0)}set(e){this.current!==e&&(this.handoffState=\"pending\",this.currentId=0,this.current=e)}reset(){this.set(this.detect())}nextId(){return++this.currentId}get isServer(){return this.current===\"server\"}get isClient(){return this.current===\"client\"}detect(){return typeof window==\"undefined\"||typeof document==\"undefined\"?\"server\":\"client\"}handoff(){this.handoffState===\"pending\"&&(this.handoffState=\"complete\")}get isHandoffComplete(){return this.handoffState===\"complete\"}}let s=new o;export{s as env};\n","import{useEffect as s,useState as o}from\"react\";import{disposables as t}from'../utils/disposables.js';function p(){let[e]=o(t);return s(()=>()=>e.dispose(),[e]),e}export{p as useDisposables};\n","function t(e){typeof queueMicrotask==\"function\"?queueMicrotask(e):Promise.resolve().then(e).catch(o=>setTimeout(()=>{throw o}))}export{t as microTask};\n","import{microTask as a}from'./micro-task.js';function o(){let s=[],r={addEventListener(e,t,n,i){return e.addEventListener(t,n,i),r.add(()=>e.removeEventListener(t,n,i))},requestAnimationFrame(...e){let t=requestAnimationFrame(...e);return r.add(()=>cancelAnimationFrame(t))},nextFrame(...e){return r.requestAnimationFrame(()=>r.requestAnimationFrame(...e))},setTimeout(...e){let t=setTimeout(...e);return r.add(()=>clearTimeout(t))},microTask(...e){let t={current:!0};return a(()=>{t.current&&e[0]()}),r.add(()=>{t.current=!1})},style(e,t,n){let i=e.style.getPropertyValue(t);return Object.assign(e.style,{[t]:n}),this.add(()=>{Object.assign(e.style,{[t]:i})})},group(e){let t=o();return e(t),this.add(()=>t.dispose())},add(e){return s.includes(e)||s.push(e),()=>{let t=s.indexOf(e);if(t>=0)for(let n of s.splice(t,1))n()}},dispose(){for(let e of s.splice(0))e()}};return r}export{o as disposables};\n","import a from\"react\";import{useLatestValue as n}from'./use-latest-value.js';let o=function(t){let e=n(t);return a.useCallback((...r)=>e.current(...r),[e])};export{o as useEvent};\n","import{useRef as t}from\"react\";import{useIsoMorphicEffect as o}from'./use-iso-morphic-effect.js';function s(e){let r=t(e);return o(()=>{r.current=e},[e]),r}export{s as useLatestValue};\n","import{useEffect as f,useLayoutEffect as c}from\"react\";import{env as i}from'../utils/env.js';let n=(e,t)=>{i.isServer?f(e,t):c(e,t)};export{n as useIsoMorphicEffect};\n","import E,{Fragment as j,cloneElement as v,createElement as S,forwardRef as w,isValidElement as k,useCallback as x,useRef as M}from\"react\";import{classNames as N}from'./class-names.js';import{match as O}from'./match.js';var A=(a=>(a[a.None=0]=\"None\",a[a.RenderStrategy=1]=\"RenderStrategy\",a[a.Static=2]=\"Static\",a))(A||{}),C=(e=>(e[e.Unmount=0]=\"Unmount\",e[e.Hidden=1]=\"Hidden\",e))(C||{});function K(){let n=$();return x(r=>U({mergeRefs:n,...r}),[n])}function U({ourProps:n,theirProps:r,slot:e,defaultTag:a,features:s,visible:t=!0,name:l,mergeRefs:i}){i=i!=null?i:I;let o=P(r,n);if(t)return F(o,e,a,l,i);let y=s!=null?s:0;if(y&2){let{static:f=!1,...u}=o;if(f)return F(u,e,a,l,i)}if(y&1){let{unmount:f=!0,...u}=o;return O(f?0:1,{[0](){return null},[1](){return F({...u,hidden:!0,style:{display:\"none\"}},e,a,l,i)}})}return F(o,e,a,l,i)}function F(n,r={},e,a,s){let{as:t=e,children:l,refName:i=\"ref\",...o}=h(n,[\"unmount\",\"static\"]),y=n.ref!==void 0?{[i]:n.ref}:{},f=typeof l==\"function\"?l(r):l;\"className\"in o&&o.className&&typeof o.className==\"function\"&&(o.className=o.className(r)),o[\"aria-labelledby\"]&&o[\"aria-labelledby\"]===o.id&&(o[\"aria-labelledby\"]=void 0);let u={};if(r){let d=!1,p=[];for(let[c,T]of Object.entries(r))typeof T==\"boolean\"&&(d=!0),T===!0&&p.push(c.replace(/([A-Z])/g,g=>`-${g.toLowerCase()}`));if(d){u[\"data-headlessui-state\"]=p.join(\" \");for(let c of p)u[`data-${c}`]=\"\"}}if(b(t)&&(Object.keys(m(o)).length>0||Object.keys(m(u)).length>0))if(!k(f)||Array.isArray(f)&&f.length>1||D(f)){if(Object.keys(m(o)).length>0)throw new Error(['Passing props on \"Fragment\"!',\"\",`The current component <${a} /> is rendering a \"Fragment\".`,\"However we need to passthrough the following props:\",Object.keys(m(o)).concat(Object.keys(m(u))).map(d=>` - ${d}`).join(`\n`),\"\",\"You can apply a few solutions:\",['Add an `as=\"...\"` prop, to ensure that we render an actual element instead of a \"Fragment\".',\"Render a single element as the child so that we can forward the props onto that element.\"].map(d=>` - ${d}`).join(`\n`)].join(`\n`))}else{let d=f.props,p=d==null?void 0:d.className,c=typeof p==\"function\"?(...R)=>N(p(...R),o.className):N(p,o.className),T=c?{className:c}:{},g=P(f.props,m(h(o,[\"ref\"])));for(let R in u)R in g&&delete u[R];return v(f,Object.assign({},g,u,y,{ref:s(H(f),y.ref)},T))}return S(t,Object.assign({},h(o,[\"ref\"]),!b(t)&&y,!b(t)&&u),f)}function $(){let n=M([]),r=x(e=>{for(let a of n.current)a!=null&&(typeof a==\"function\"?a(e):a.current=e)},[]);return(...e)=>{if(!e.every(a=>a==null))return n.current=e,r}}function I(...n){return n.every(r=>r==null)?void 0:r=>{for(let e of n)e!=null&&(typeof e==\"function\"?e(r):e.current=r)}}function P(...n){var a;if(n.length===0)return{};if(n.length===1)return n[0];let r={},e={};for(let s of n)for(let t in s)t.startsWith(\"on\")&&typeof s[t]==\"function\"?((a=e[t])!=null||(e[t]=[]),e[t].push(s[t])):r[t]=s[t];if(r.disabled||r[\"aria-disabled\"])for(let s in e)/^(on(?:Click|Pointer|Mouse|Key)(?:Down|Up|Press)?)$/.test(s)&&(e[s]=[t=>{var l;return(l=t==null?void 0:t.preventDefault)==null?void 0:l.call(t)}]);for(let s in e)Object.assign(r,{[s](t,...l){let i=e[s];for(let o of i){if((t instanceof Event||(t==null?void 0:t.nativeEvent)instanceof Event)&&t.defaultPrevented)return;o(t,...l)}}});return r}function V(...n){var a;if(n.length===0)return{};if(n.length===1)return n[0];let r={},e={};for(let s of n)for(let t in s)t.startsWith(\"on\")&&typeof s[t]==\"function\"?((a=e[t])!=null||(e[t]=[]),e[t].push(s[t])):r[t]=s[t];for(let s in e)Object.assign(r,{[s](...t){let l=e[s];for(let i of l)i==null||i(...t)}});return r}function Y(n){var r;return Object.assign(w(n),{displayName:(r=n.displayName)!=null?r:n.name})}function m(n){let r=Object.assign({},n);for(let e in r)r[e]===void 0&&delete r[e];return r}function h(n,r=[]){let e=Object.assign({},n);for(let a of r)a in e&&delete e[a];return e}function H(n){return E.version.split(\".\")[0]>=\"19\"?n.props.ref:n.ref}function b(n){return n===j||n===Symbol.for(\"react.fragment\")}function D(n){return b(n.type)}export{A as RenderFeatures,C as RenderStrategy,m as compact,Y as forwardRefWithAs,b as isFragment,D as isFragmentInstance,V as mergeProps,K as useRender};\n","function t(...r){return Array.from(new Set(r.flatMap(n=>typeof n==\"string\"?n.split(\" \"):[]))).filter(Boolean).join(\" \")}export{t as classNames};\n","function u(r,n,...a){if(r in n){let e=n[r];return typeof e==\"function\"?e(...a):e}let t=new Error(`Tried to handle \"${r}\" but there is no handler defined. Only defined handlers are: ${Object.keys(n).map(e=>`\"${e}\"`).join(\", \")}.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,u),t}export{u as match};\n","import{useEffect as l,useRef as i}from\"react\";import{useEvent as r}from'./use-event.js';let u=Symbol();function T(t,n=!0){return Object.assign(t,{[u]:n})}function y(...t){let n=i(t);l(()=>{n.current=t},[t]);let c=r(e=>{for(let o of n.current)o!=null&&(typeof o==\"function\"?o(e):o.current=e)});return t.every(e=>e==null||(e==null?void 0:e[u]))?void 0:c}export{T as optionalRef,y as useSyncRefs};\n","var T,S;import{useRef as c,useState as b}from\"react\";import{disposables as m}from'../utils/disposables.js';import{useDisposables as g}from'./use-disposables.js';import{useFlags as y}from'./use-flags.js';import{useIsoMorphicEffect as L}from'./use-iso-morphic-effect.js';typeof process!=\"undefined\"&&typeof globalThis!=\"undefined\"&&typeof Element!=\"undefined\"&&((T=process==null?void 0:process.env)==null?void 0:T[\"NODE_ENV\"])===\"test\"&&typeof((S=Element==null?void 0:Element.prototype)==null?void 0:S.getAnimations)==\"undefined\"&&(Element.prototype.getAnimations=function(){return console.warn([\"Headless UI has polyfilled `Element.prototype.getAnimations` for your tests.\",\"Please install a proper polyfill e.g. `jsdom-testing-mocks`, to silence these warnings.\",\"\",\"Example usage:\",\"```js\",\"import { mockAnimationsApi } from 'jsdom-testing-mocks'\",\"mockAnimationsApi()\",\"```\"].join(`\n`)),[]});var A=(i=>(i[i.None=0]=\"None\",i[i.Closed=1]=\"Closed\",i[i.Enter=2]=\"Enter\",i[i.Leave=4]=\"Leave\",i))(A||{});function x(e){let r={};for(let t in e)e[t]===!0&&(r[`data-${t}`]=\"\");return r}function N(e,r,t,n){let[i,a]=b(t),{hasFlag:s,addFlag:o,removeFlag:l}=y(e&&i?3:0),u=c(!1),f=c(!1),E=g();return L(()=>{var d;if(e){if(t&&a(!0),!r){t&&o(3);return}return(d=n==null?void 0:n.start)==null||d.call(n,t),C(r,{inFlight:u,prepare(){f.current?f.current=!1:f.current=u.current,u.current=!0,!f.current&&(t?(o(3),l(4)):(o(4),l(2)))},run(){f.current?t?(l(3),o(4)):(l(4),o(3)):t?l(1):o(1)},done(){var p;f.current&&D(r)||(u.current=!1,l(7),t||a(!1),(p=n==null?void 0:n.end)==null||p.call(n,t))}})}},[e,t,r,E]),e?[i,{closed:s(1),enter:s(2),leave:s(4),transition:s(2)||s(4)}]:[t,{closed:void 0,enter:void 0,leave:void 0,transition:void 0}]}function C(e,{prepare:r,run:t,done:n,inFlight:i}){let a=m();return j(e,{prepare:r,inFlight:i}),a.nextFrame(()=>{t(),a.requestAnimationFrame(()=>{a.add(M(e,n))})}),a.dispose}function M(e,r){var a,s;let t=m();if(!e)return t.dispose;let n=!1;t.add(()=>{n=!0});let i=(s=(a=e.getAnimations)==null?void 0:a.call(e).filter(o=>o instanceof CSSTransition))!=null?s:[];return i.length===0?(r(),t.dispose):(Promise.allSettled(i.map(o=>o.finished)).then(()=>{n||r()}),t.dispose)}function j(e,{inFlight:r,prepare:t}){if(r!=null&&r.current){t();return}let n=e.style.transition;e.style.transition=\"none\",t(),e.offsetHeight,e.style.transition=n}function D(e){var t,n;return((n=(t=e.getAnimations)==null?void 0:t.call(e))!=null?n:[]).some(i=>i instanceof CSSTransition&&i.playState!==\"finished\")}export{x as transitionDataAttributes,N as useTransition};\n","import{useCallback as t,useState as b}from\"react\";function c(u=0){let[r,a]=b(u),g=t(e=>a(e),[]),s=t(e=>a(l=>l|e),[]),m=t(e=>(r&e)===e,[r]),n=t(e=>a(l=>l&~e),[]),F=t(e=>a(l=>l^e),[]);return{flags:r,setFlag:g,addFlag:s,hasFlag:m,removeFlag:n,toggleFlag:F}}export{c as useFlags};\n","import r,{createContext as l,useContext as d}from\"react\";let n=l(null);n.displayName=\"OpenClosedContext\";var i=(e=>(e[e.Open=1]=\"Open\",e[e.Closed=2]=\"Closed\",e[e.Closing=4]=\"Closing\",e[e.Opening=8]=\"Opening\",e))(i||{});function u(){return d(n)}function c({value:o,children:t}){return r.createElement(n.Provider,{value:o},t)}function s({children:o}){return r.createElement(n.Provider,{value:null},o)}export{c as OpenClosedProvider,s as ResetOpenClosedProvider,i as State,u as useOpenClosed};\n","import*as t from\"react\";import{env as f}from'../utils/env.js';function s(){let r=typeof document==\"undefined\";return\"useSyncExternalStore\"in t?(o=>o.useSyncExternalStore)(t)(()=>()=>{},()=>!1,()=>!r):!1}function l(){let r=s(),[e,n]=t.useState(f.isHandoffComplete);return e&&f.isHandoffComplete===!1&&n(!1),t.useEffect(()=>{e!==!0&&n(!0)},[e]),t.useEffect(()=>f.handoff(),[]),r?!1:e}export{l as useServerHandoffComplete};\n","import{useRef as r}from\"react\";import{useIsoMorphicEffect as t}from'./use-iso-morphic-effect.js';function f(){let e=r(!1);return t(()=>(e.current=!0,()=>{e.current=!1}),[]),e}export{f as useIsMounted};\n","\"use client\";import c,{Fragment as k,createContext as ne,useContext as q,useEffect as ge,useMemo as ie,useRef as b,useState as O}from\"react\";import{useDisposables as ve}from'../../hooks/use-disposables.js';import{useEvent as E}from'../../hooks/use-event.js';import{useIsMounted as be}from'../../hooks/use-is-mounted.js';import{useIsoMorphicEffect as D}from'../../hooks/use-iso-morphic-effect.js';import{useLatestValue as Ee}from'../../hooks/use-latest-value.js';import{useServerHandoffComplete as re}from'../../hooks/use-server-handoff-complete.js';import{useSyncRefs as oe}from'../../hooks/use-sync-refs.js';import{transitionDataAttributes as Se,useTransition as Re}from'../../hooks/use-transition.js';import{OpenClosedProvider as ye,State as x,useOpenClosed as se}from'../../internal/open-closed.js';import{classNames as Pe}from'../../utils/class-names.js';import{match as le}from'../../utils/match.js';import{RenderFeatures as xe,RenderStrategy as P,compact as Ne,forwardRefWithAs as J,isFragment as _e,useRender as ae}from'../../utils/render.js';function ue(e){var t;return!!(e.enter||e.enterFrom||e.enterTo||e.leave||e.leaveFrom||e.leaveTo)||!_e((t=e.as)!=null?t:de)||c.Children.count(e.children)===1}let V=ne(null);V.displayName=\"TransitionContext\";var De=(n=>(n.Visible=\"visible\",n.Hidden=\"hidden\",n))(De||{});function He(){let e=q(V);if(e===null)throw new Error(\"A <Transition.Child /> is used but it is missing a parent <Transition /> or <Transition.Root />.\");return e}function Ae(){let e=q(w);if(e===null)throw new Error(\"A <Transition.Child /> is used but it is missing a parent <Transition /> or <Transition.Root />.\");return e}let w=ne(null);w.displayName=\"NestingContext\";function M(e){return\"children\"in e?M(e.children):e.current.filter(({el:t})=>t.current!==null).filter(({state:t})=>t===\"visible\").length>0}function Te(e,t){let n=Ee(e),l=b([]),S=be(),R=ve(),d=E((o,i=P.Hidden)=>{let a=l.current.findIndex(({el:s})=>s===o);a!==-1&&(le(i,{[P.Unmount](){l.current.splice(a,1)},[P.Hidden](){l.current[a].state=\"hidden\"}}),R.microTask(()=>{var s;!M(l)&&S.current&&((s=n.current)==null||s.call(n))}))}),y=E(o=>{let i=l.current.find(({el:a})=>a===o);return i?i.state!==\"visible\"&&(i.state=\"visible\"):l.current.push({el:o,state:\"visible\"}),()=>d(o,P.Unmount)}),C=b([]),p=b(Promise.resolve()),h=b({enter:[],leave:[]}),g=E((o,i,a)=>{C.current.splice(0),t&&(t.chains.current[i]=t.chains.current[i].filter(([s])=>s!==o)),t==null||t.chains.current[i].push([o,new Promise(s=>{C.current.push(s)})]),t==null||t.chains.current[i].push([o,new Promise(s=>{Promise.all(h.current[i].map(([r,f])=>f)).then(()=>s())})]),i===\"enter\"?p.current=p.current.then(()=>t==null?void 0:t.wait.current).then(()=>a(i)):a(i)}),v=E((o,i,a)=>{Promise.all(h.current[i].splice(0).map(([s,r])=>r)).then(()=>{var s;(s=C.current.shift())==null||s()}).then(()=>a(i))});return ie(()=>({children:l,register:y,unregister:d,onStart:g,onStop:v,wait:p,chains:h}),[y,d,l,g,v,h,p])}let de=k,fe=xe.RenderStrategy;function Fe(e,t){var ee,te;let{transition:n=!0,beforeEnter:l,afterEnter:S,beforeLeave:R,afterLeave:d,enter:y,enterFrom:C,enterTo:p,entered:h,leave:g,leaveFrom:v,leaveTo:o,...i}=e,[a,s]=O(null),r=b(null),f=ue(e),U=oe(...f?[r,t,s]:t===null?[]:[t]),H=(ee=i.unmount)==null||ee?P.Unmount:P.Hidden,{show:u,appear:z,initial:K}=He(),[m,j]=O(u?\"visible\":\"hidden\"),Q=Ae(),{register:A,unregister:F}=Q;D(()=>A(r),[A,r]),D(()=>{if(H===P.Hidden&&r.current){if(u&&m!==\"visible\"){j(\"visible\");return}return le(m,{[\"hidden\"]:()=>F(r),[\"visible\"]:()=>A(r)})}},[m,r,A,F,u,H]);let G=re();D(()=>{if(f&&G&&m===\"visible\"&&r.current===null)throw new Error(\"Did you forget to passthrough the `ref` to the actual DOM node?\")},[r,m,G,f]);let ce=K&&!z,Y=z&&u&&K,B=b(!1),I=Te(()=>{B.current||(j(\"hidden\"),F(r))},Q),Z=E(W=>{B.current=!0;let L=W?\"enter\":\"leave\";I.onStart(r,L,_=>{_===\"enter\"?l==null||l():_===\"leave\"&&(R==null||R())})}),$=E(W=>{let L=W?\"enter\":\"leave\";B.current=!1,I.onStop(r,L,_=>{_===\"enter\"?S==null||S():_===\"leave\"&&(d==null||d())}),L===\"leave\"&&!M(I)&&(j(\"hidden\"),F(r))});ge(()=>{f&&n||(Z(u),$(u))},[u,f,n]);let pe=(()=>!(!n||!f||!G||ce))(),[,T]=Re(pe,a,u,{start:Z,end:$}),Ce=Ne({ref:U,className:((te=Pe(i.className,Y&&y,Y&&C,T.enter&&y,T.enter&&T.closed&&C,T.enter&&!T.closed&&p,T.leave&&g,T.leave&&!T.closed&&v,T.leave&&T.closed&&o,!T.transition&&u&&h))==null?void 0:te.trim())||void 0,...Se(T)}),N=0;m===\"visible\"&&(N|=x.Open),m===\"hidden\"&&(N|=x.Closed),u&&m===\"hidden\"&&(N|=x.Opening),!u&&m===\"visible\"&&(N|=x.Closing);let he=ae();return c.createElement(w.Provider,{value:I},c.createElement(ye,{value:N},he({ourProps:Ce,theirProps:i,defaultTag:de,features:fe,visible:m===\"visible\",name:\"Transition.Child\"})))}function Ie(e,t){let{show:n,appear:l=!1,unmount:S=!0,...R}=e,d=b(null),y=ue(e),C=oe(...y?[d,t]:t===null?[]:[t]);re();let p=se();if(n===void 0&&p!==null&&(n=(p&x.Open)===x.Open),n===void 0)throw new Error(\"A <Transition /> is used but it is missing a `show={true | false}` prop.\");let[h,g]=O(n?\"visible\":\"hidden\"),v=Te(()=>{n||g(\"hidden\")}),[o,i]=O(!0),a=b([n]);D(()=>{o!==!1&&a.current[a.current.length-1]!==n&&(a.current.push(n),i(!1))},[a,n]);let s=ie(()=>({show:n,appear:l,initial:o}),[n,l,o]);D(()=>{n?g(\"visible\"):!M(v)&&d.current!==null&&g(\"hidden\")},[n,v]);let r={unmount:S},f=E(()=>{var u;o&&i(!1),(u=e.beforeEnter)==null||u.call(e)}),U=E(()=>{var u;o&&i(!1),(u=e.beforeLeave)==null||u.call(e)}),H=ae();return c.createElement(w.Provider,{value:v},c.createElement(V.Provider,{value:s},H({ourProps:{...r,as:k,children:c.createElement(me,{ref:C,...r,...R,beforeEnter:f,beforeLeave:U})},theirProps:{},defaultTag:k,features:fe,visible:h===\"visible\",name:\"Transition\"})))}function Le(e,t){let n=q(V)!==null,l=se()!==null;return c.createElement(c.Fragment,null,!n&&l?c.createElement(X,{ref:t,...e}):c.createElement(me,{ref:t,...e}))}let X=J(Ie),me=J(Fe),Oe=J(Le),Ke=Object.assign(X,{Child:Oe,Root:X});export{Ke as Transition,Oe as TransitionChild};\n","\"use client\";\n\nimport Image from \"next/image\";\nimport Link from \"next/link\";\nimport type { Category, MenuItem } from \"@zorgo/universal/interfaces\";\nimport { menuItemSlug } from \"@zorgo/universal/utils/menuSlugs\";\nimport { menuImageUrl } from \"@zorgo/universal/utils/menuUtils\";\nimport { ITEM_IMAGE_PREFIX } from \"../../images\";\n\nfunction cn(...parts: Array<string | undefined>) {\n return parts.filter(Boolean).join(\" \");\n}\n\nfunction money(cents: number) {\n return `$${(cents / 100).toFixed(2)}`;\n}\n\n/** Per-slot Tailwind classes for the grid menu layout. */\nexport type GridMenuItemClasses = Partial<{\n baseContainer: string;\n categoryContainer: string;\n categoryTitle: string;\n itemCardContainer: string;\n itemCard: string;\n itemCardImage: string;\n itemCardTextContainer: string;\n itemCardName: string;\n itemCardPrice: string;\n itemCardOldPrice: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeGridMenuItemClasses}.\n */\nexport const GRID_MENU_DEFAULT_ITEM_CLASSES: Required<GridMenuItemClasses> = {\n baseContainer: \"flex flex-col gap-16\",\n categoryContainer: \"flex flex-col gap-8\",\n categoryTitle: \"text-4xl text-center font-extrabold text-primary\",\n itemCardContainer:\n \"flex flex-row flex-wrap gap-8 content-center justify-center py-4 max-w-7xl mx-auto\",\n itemCard:\n \"flex flex-col gap-4 no-underline w-60 hover:translate-y-[-2px] hover:opacity-75 transition-all duration-300\",\n itemCardImage:\n \"w-full aspect-square bg-background-recessed rounded-2xl overflow-hidden\",\n itemCardTextContainer: \"flex flex-col opacity-75 px-4 w-full\",\n itemCardName: \"text-xl font-semibold\",\n itemCardPrice: \"text-lg\",\n itemCardOldPrice: \"text-lg line-through opacity-60\",\n};\n\nexport function mergeGridMenuItemClasses(overrides?: GridMenuItemClasses) {\n const d = GRID_MENU_DEFAULT_ITEM_CLASSES;\n return {\n baseContainer: cn(d.baseContainer, overrides?.baseContainer),\n categoryContainer: cn(\n d.categoryContainer,\n overrides?.categoryContainer,\n ),\n categoryTitle: cn(d.categoryTitle, overrides?.categoryTitle),\n itemCardContainer: cn(\n d.itemCardContainer,\n overrides?.itemCardContainer,\n ),\n itemCard: cn(d.itemCard, overrides?.itemCard),\n itemCardImage: cn(d.itemCardImage, overrides?.itemCardImage),\n itemCardTextContainer: cn(\n d.itemCardTextContainer,\n overrides?.itemCardTextContainer,\n ),\n itemCardName: cn(d.itemCardName, overrides?.itemCardName),\n itemCardPrice: cn(d.itemCardPrice, overrides?.itemCardPrice),\n itemCardOldPrice: cn(d.itemCardOldPrice, overrides?.itemCardOldPrice),\n };\n}\n\nexport function GridMenu({\n items,\n categories,\n itemClasses,\n}: {\n items: MenuItem[];\n categories: Category[];\n itemClasses?: GridMenuItemClasses;\n}) {\n const slots = mergeGridMenuItemClasses(itemClasses);\n\n return (\n <div className={slots.baseContainer}>\n {categories.map((category) => {\n const itemsInCategory = items.filter(\n (item) => item.category_id === category.category_id,\n );\n if (itemsInCategory.length === 0) {\n return null;\n }\n return (\n <div\n key={category.category_id}\n className={slots.categoryContainer}\n >\n <h1 className={slots.categoryTitle}>{category.name}</h1>\n\n <div className={slots.itemCardContainer}>\n {itemsInCategory.map((item) => (\n <ItemCard\n key={item.base_item_id}\n item={item}\n imageUrl={menuImageUrl(item.images?.[0])}\n slots={slots}\n />\n ))}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction ItemCard({\n item,\n imageUrl,\n slots,\n}: {\n item: MenuItem;\n imageUrl?: string | null;\n slots: ReturnType<typeof mergeGridMenuItemClasses>;\n}) {\n // display_price is baked onto the variant by the SDK when a promo is live\n const variant = item.variants[0];\n const onSale =\n variant?.display_price != null && variant.display_price < variant.price;\n\n return (\n <Link\n href={`/menu/${menuItemSlug(item.name, item.base_item_id)}`}\n className={slots.itemCard}\n >\n <div className={slots.itemCardImage}>\n {imageUrl && (\n <Image\n src={imageUrl}\n alt={item.name}\n width={640}\n height={640}\n // Bucket fallbacks have no width variants to snap to.\n unoptimized={!imageUrl.startsWith(ITEM_IMAGE_PREFIX)}\n // Card width tracks the grid, so state the widest realistic\n // slot per breakpoint rather than letting Next assume 100vw.\n sizes=\"(min-width: 1024px) 320px, (min-width: 640px) 50vw, 100vw\"\n className=\"w-full h-full object-cover\"\n />\n )}\n </div>\n\n <div className={slots.itemCardTextContainer}>\n <p className={slots.itemCardName}>{item.name}</p>\n {variant && (\n <>\n {onSale ? (\n <>\n <p className={slots.itemCardPrice}>\n {money(variant.display_price!)}\n </p>\n <p className={slots.itemCardOldPrice}>\n {money(variant.price)}\n </p>\n </>\n ) : (\n <p className={slots.itemCardPrice}>\n {money(variant.price)}\n </p>\n )}\n </>\n )}\n </div>\n </Link>\n );\n}\n","export { menuImageUrl } from \"@zorgo/universal/utils/menuUtils\";\nexport type { BaseItemImage } from \"@zorgo/universal/interfaces\";\n\n/**\n * The variant widths prebuild emits. The loader below and the encoder in\n * internal/itemImages.ts read the same list, so a requested width can never\n * snap to a rung that was never written.\n */\nexport const ITEM_IMAGE_WIDTHS = [384, 640, 1080] as const;\n\n/** Public prefix menuImageUrl returns for a localized image. */\nexport const ITEM_IMAGE_PREFIX = \"/images/items/\";\n\n/**\n * next/image custom loader (`images.loaderFile` in a scaffolded site's\n * next.config.ts). Prebuilt images get the nearest rung that covers the\n * requested width; everything else — a bucket URL for an image prebuild could\n * not localize, the logo, any site-authored asset — passes through untouched\n * and is simply served unoptimized.\n *\n * Sync and pure by contract: next/image calls it during render for every\n * srcset candidate.\n */\nexport default function itemImageLoader({\n\tsrc,\n\twidth,\n}: {\n\tsrc: string;\n\twidth: number;\n}): string {\n\tif (!src.startsWith(ITEM_IMAGE_PREFIX)) return src;\n\tconst rung =\n\t\tITEM_IMAGE_WIDTHS.find((candidate) => candidate >= width) ??\n\t\tITEM_IMAGE_WIDTHS[ITEM_IMAGE_WIDTHS.length - 1];\n\treturn `${src}-${rung}.avif`;\n}\n\nexport { itemImageLoader };\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { useState } from \"react\";\nimport { ChevronDown, ChevronUp } from \"lucide-react\";\nimport type { Category, MenuItem } from \"@zorgo/universal/interfaces\";\nimport { menuItemSlug } from \"@zorgo/universal/utils/menuSlugs\";\n\nfunction cn(...parts: Array<string | undefined>) {\n return parts.filter(Boolean).join(\" \");\n}\n\nfunction money(cents: number) {\n return `$${(cents / 100).toFixed(2)}`;\n}\n\n/** Per-slot Tailwind classes for the accordion menu layout. */\nexport type AccordionMenuItemClasses = Partial<{\n baseContainer: string;\n categoryContainer: string;\n categoryTrigger: string;\n categoryTitle: string;\n categoryIndicator: string;\n itemsContainer: string;\n itemCard: string;\n itemCardTextContainer: string;\n itemCardName: string;\n itemCardDescription: string;\n itemCardPriceContainer: string;\n itemCardPrice: string;\n itemCardOldPrice: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeAccordionMenuItemClasses}.\n */\nexport const ACCORDION_MENU_DEFAULT_ITEM_CLASSES: Required<AccordionMenuItemClasses> =\n {\n baseContainer: \"flex flex-col gap-4\",\n categoryContainer:\n \"flex flex-col gap-4 p-4 bg-background-elevated border-3 border-foreground/[15%] rounded-xl shadow-sm\",\n categoryTrigger: \"flex flex-row items-center justify-between p-4\",\n categoryTitle: \"text-2xl font-bold\",\n categoryIndicator: \"h-8 w-8\",\n itemsContainer: \"flex-col gap-4\",\n itemCard:\n \"flex items-center justify-between gap-4 p-4 bg-background rounded-xl hover:translate-x-1 transition-all duration-300\",\n itemCardTextContainer: \"flex flex-col gap-2 opacity-75\",\n itemCardName: \"text-lg font-semibold\",\n itemCardDescription: \"text-lg opacity-75\",\n itemCardPriceContainer: \"flex flex-col gap-2 opacity-75\",\n itemCardPrice: \"text-lg font-semibold\",\n itemCardOldPrice: \"text-lg opacity-75 line-through\",\n };\n\nexport function mergeAccordionMenuItemClasses(\n overrides?: AccordionMenuItemClasses,\n) {\n const d = ACCORDION_MENU_DEFAULT_ITEM_CLASSES;\n return {\n baseContainer: cn(d.baseContainer, overrides?.baseContainer),\n categoryContainer: cn(\n d.categoryContainer,\n overrides?.categoryContainer,\n ),\n categoryTrigger: cn(d.categoryTrigger, overrides?.categoryTrigger),\n categoryTitle: cn(d.categoryTitle, overrides?.categoryTitle),\n categoryIndicator: cn(\n d.categoryIndicator,\n overrides?.categoryIndicator,\n ),\n itemsContainer: cn(d.itemsContainer, overrides?.itemsContainer),\n itemCard: cn(d.itemCard, overrides?.itemCard),\n itemCardTextContainer: cn(\n d.itemCardTextContainer,\n overrides?.itemCardTextContainer,\n ),\n itemCardName: cn(d.itemCardName, overrides?.itemCardName),\n itemCardDescription: cn(\n d.itemCardDescription,\n overrides?.itemCardDescription,\n ),\n itemCardPriceContainer: cn(\n d.itemCardPriceContainer,\n overrides?.itemCardPriceContainer,\n ),\n itemCardPrice: cn(d.itemCardPrice, overrides?.itemCardPrice),\n itemCardOldPrice: cn(d.itemCardOldPrice, overrides?.itemCardOldPrice),\n };\n}\n\nexport function AccordionMenu({\n items,\n categories,\n itemClasses,\n}: {\n items: MenuItem[];\n categories: Category[];\n itemClasses?: AccordionMenuItemClasses;\n}) {\n const slots = mergeAccordionMenuItemClasses(itemClasses);\n\n return (\n <div className={slots.baseContainer}>\n {categories.map((category) => {\n const itemsInCategory = items.filter(\n (item) => item.category_id === category.category_id,\n );\n if (itemsInCategory.length === 0) {\n return null;\n }\n return (\n <MenuCategory\n key={category.category_id}\n category={category}\n itemsInCategory={itemsInCategory}\n slots={slots}\n />\n );\n })}\n </div>\n );\n}\n\nfunction MenuCategory({\n category,\n itemsInCategory,\n slots,\n}: {\n category: Category;\n itemsInCategory: MenuItem[];\n slots: ReturnType<typeof mergeAccordionMenuItemClasses>;\n}) {\n const [isExpanded, setIsExpanded] = useState(false);\n\n return (\n <div className={slots.categoryContainer}>\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n className={slots.categoryTrigger}\n >\n <h2 className={slots.categoryTitle}>{category.name}</h2>\n {isExpanded ? (\n <ChevronUp className={slots.categoryIndicator} />\n ) : (\n <ChevronDown className={slots.categoryIndicator} />\n )}\n </button>\n <div\n className={cn(\n isExpanded ? \"flex\" : \"hidden\",\n slots.itemsContainer,\n )}\n >\n {itemsInCategory.map((item) => (\n <ItemCard\n key={item.base_item_id}\n item={item}\n slots={slots}\n />\n ))}\n </div>\n </div>\n );\n}\n\nfunction ItemCard({\n item,\n slots,\n}: {\n item: MenuItem;\n slots: ReturnType<typeof mergeAccordionMenuItemClasses>;\n}) {\n const variant = item.variants[0];\n const onSale =\n variant?.display_price != null && variant.display_price < variant.price;\n\n return (\n <Link\n href={`/menu/${menuItemSlug(item.name, item.base_item_id)}`}\n className={slots.itemCard}\n >\n <div className={slots.itemCardTextContainer}>\n <p className={slots.itemCardName}>{item.name}</p>\n {item.description && (\n <p className={slots.itemCardDescription}>\n {item.description}\n </p>\n )}\n </div>\n {variant && (\n <div className={slots.itemCardPriceContainer}>\n {onSale ? (\n <>\n <p className={slots.itemCardPrice}>\n {money(variant.display_price!)}\n </p>\n <p className={slots.itemCardOldPrice}>\n {money(variant.price)}\n </p>\n </>\n ) : (\n <p className={slots.itemCardPrice}>\n {money(variant.price)}\n </p>\n )}\n </div>\n )}\n </Link>\n );\n}\n","export function cn(...parts: Array<string | undefined | false>) {\n return parts.filter(Boolean).join(\" \");\n}\n\nexport function money(cents: number) {\n return `$${(cents / 100).toFixed(2)}`;\n}\n\n/** Per-slot Tailwind classes for the item customization form. */\nexport type ClientItemFormItemClasses = Partial<{\n baseContainer: string;\n title: string;\n description: string;\n section: string;\n sectionTitle: string;\n optionsRow: string;\n optionButton: string;\n optionButtonSelected: string;\n optionButtonUnselected: string;\n optionButtonLabel: string;\n optionButtonUpcharge: string;\n servingsRow: string;\n servingsLabel: string;\n servingsControls: string;\n incrementButton: string;\n servingsValue: string;\n ruleError: string;\n portionHint: string;\n commentsTextarea: string;\n quantityRow: string;\n submitButton: string;\n notFound: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeClientItemFormItemClasses}.\n */\nexport const CLIENT_ITEM_FORM_DEFAULT_ITEM_CLASSES: Required<ClientItemFormItemClasses> =\n {\n baseContainer: \"flex flex-col gap-8\",\n title: \"text-4xl font-extrabold text-primary\",\n description: \"opacity-70 text-xl\",\n section:\n \"flex flex-col gap-2 shadow-sm rounded-xl p-4 bg-background-elevated border-3 border-foreground/[15%]\",\n sectionTitle: \"font-bold text-2xl py-4\",\n optionsRow: \"flex flex-row flex-wrap gap-2\",\n optionButton:\n \"flex flex-col items-start gap-0.5 p-3 px-4 rounded-xl border-3 text-lg hover:translate-y-[-2px] transition-all duration-300\",\n optionButtonSelected: \"bg-background-recessed border-transparent\",\n optionButtonUnselected:\n \"bg-background-elevated border-foreground/[15%]\",\n optionButtonLabel: \"font-semibold leading-tight\",\n optionButtonUpcharge: \"opacity-60\",\n servingsRow: \"flex flex-row items-center justify-between gap-4 text-xl\",\n servingsLabel: \"opacity-75\",\n servingsControls: \"flex flex-row items-center gap-2\",\n incrementButton:\n \"bg-background text-foreground w-10 h-10 rounded-xl flex items-center justify-center hover:bg-foreground hover:text-background transition-all duration-300\",\n servingsValue: \"w-8 md:w-12 font-semibold opacity-75 text-center\",\n ruleError: \"text-sm text-red-500\",\n portionHint: \"text-base font-normal opacity-60\",\n commentsTextarea:\n \"p-4 rounded-xl border-3 border-foreground/[15%] outline-none resize-none\",\n quantityRow: \"flex flex-row items-center gap-4 text-xl\",\n submitButton:\n \"bg-primary text-primary-foreground p-4 rounded-xl text-lg font-semibold hover:bg-primary/80 disabled:opacity-50 disabled:cursor-not-allowed transition-all duration-300\",\n notFound: \"\",\n };\n\nexport function mergeClientItemFormItemClasses(\n overrides?: ClientItemFormItemClasses,\n) {\n const d = CLIENT_ITEM_FORM_DEFAULT_ITEM_CLASSES;\n return {\n baseContainer: cn(d.baseContainer, overrides?.baseContainer),\n title: cn(d.title, overrides?.title),\n description: cn(d.description, overrides?.description),\n section: cn(d.section, overrides?.section),\n sectionTitle: cn(d.sectionTitle, overrides?.sectionTitle),\n optionsRow: cn(d.optionsRow, overrides?.optionsRow),\n optionButton: cn(d.optionButton, overrides?.optionButton),\n optionButtonSelected: cn(\n d.optionButtonSelected,\n overrides?.optionButtonSelected,\n ),\n optionButtonUnselected: cn(\n d.optionButtonUnselected,\n overrides?.optionButtonUnselected,\n ),\n optionButtonLabel: cn(\n d.optionButtonLabel,\n overrides?.optionButtonLabel,\n ),\n optionButtonUpcharge: cn(\n d.optionButtonUpcharge,\n overrides?.optionButtonUpcharge,\n ),\n servingsRow: cn(d.servingsRow, overrides?.servingsRow),\n servingsLabel: cn(d.servingsLabel, overrides?.servingsLabel),\n servingsControls: cn(d.servingsControls, overrides?.servingsControls),\n incrementButton: cn(d.incrementButton, overrides?.incrementButton),\n servingsValue: cn(d.servingsValue, overrides?.servingsValue),\n ruleError: cn(d.ruleError, overrides?.ruleError),\n portionHint: cn(d.portionHint, overrides?.portionHint),\n commentsTextarea: cn(d.commentsTextarea, overrides?.commentsTextarea),\n quantityRow: cn(d.quantityRow, overrides?.quantityRow),\n submitButton: cn(d.submitButton, overrides?.submitButton),\n notFound: cn(d.notFound, overrides?.notFound),\n };\n}\n\n/**\n * Fully-resolved classes. Every section takes this (not the partial overrides)\n * so a subcomponent used on its own and one composed into ClientItemForm merge\n * the defaults exactly once.\n */\nexport type ClientItemFormSlots = ReturnType<\n typeof mergeClientItemFormItemClasses\n>;\n\nexport const CLIENT_ITEM_FORM_SLOTS: ClientItemFormSlots =\n mergeClientItemFormItemClasses();\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { useItemCustomization, useMenu } from \"@zorgo/universal/hooks/hooks\";\nimport type { OrderItem } from \"@zorgo/universal/interfaces\";\nimport { Breadcrumbs } from \"./Breadcrumbs\";\nimport { CommentsSection } from \"./CommentsSection\";\nimport { ComponentsSection } from \"./ComponentsSection\";\nimport { PortionSection } from \"./PortionSection\";\nimport { QuantitySection } from \"./QuantitySection\";\nimport { RuleSection } from \"./RuleSection\";\nimport { SubmitButton } from \"./SubmitButton\";\nimport { VariantSection } from \"./VariantSection\";\nimport {\n mergeClientItemFormItemClasses,\n type ClientItemFormItemClasses,\n} from \"./classes\";\n\n/**\n * The stock item form. Every section here is exported on its own — a site that\n * wants its own layout composes these instead of forking the file.\n */\nexport function ClientItemForm({\n baseItemId,\n seed,\n editIndex,\n itemClasses,\n onSubmitSuccess,\n}: {\n baseItemId: number;\n seed?: OrderItem;\n editIndex?: number;\n itemClasses?: ClientItemFormItemClasses;\n /** Defaults to navigating back to /menu. */\n onSubmitSuccess?: () => void;\n}) {\n const router = useRouter();\n const slots = mergeClientItemFormItemClasses(itemClasses);\n\n const {\n item,\n variant,\n variants,\n setVariant,\n ruleGroups,\n unmetRule,\n canSubmit,\n submit,\n quantity,\n setQuantity,\n comments,\n setComments,\n setComponentServings,\n price,\n salePrice,\n isEditMode,\n draft,\n portionScheme,\n placeOption,\n recutSelections,\n } = useItemCustomization(baseItemId, seed, editIndex);\n\n const { categories } = useMenu();\n\n // how the item is cut and which section is being edited are this form's\n // cursor, not order data — a portion only exists as a string on a row\n const [cut, setCut] = useState(1);\n const [activeSection, setActiveSection] = useState<number | null>(null);\n const divisions = portionScheme\n ? Math.min(Math.max(cut, portionScheme.min_divisions), portionScheme.max_divisions)\n : 1;\n\n if (!item) {\n return <div className={slots.notFound}>Item not found.</div>;\n }\n\n const category = categories.find((c) => c.category_id === item.category_id);\n\n return (\n <div className={slots.baseContainer}>\n <Breadcrumbs\n items={[\n { label: \"Menu\", href: \"/menu\" },\n ...(category ? [{ label: category.name }] : []),\n { label: item.name },\n ]}\n />\n <h1 className={slots.title}>{item.name}</h1>\n {item.description && (\n <p className={slots.description}>{item.description}</p>\n )}\n\n <VariantSection\n variants={variants}\n variant={variant}\n setVariant={setVariant}\n slots={slots}\n />\n\n <ComponentsSection\n variant={variant}\n draft={draft}\n setComponentServings={setComponentServings}\n activeSection={activeSection}\n divisions={divisions}\n scheme={portionScheme}\n slots={slots}\n />\n\n {portionScheme && (\n <PortionSection\n scheme={portionScheme}\n divisions={divisions}\n activeSection={activeSection}\n setActiveSection={setActiveSection}\n setDivisions={(next) => {\n recutSelections(next);\n setCut(next);\n // an uncut item has no section to edit\n setActiveSection((s) =>\n s != null && (next === 1 || s > next) ? null : s,\n );\n }}\n slots={slots}\n />\n )}\n\n {ruleGroups.map((rule) => (\n <RuleSection\n key={rule.rule_id}\n rule={rule}\n activeSection={activeSection}\n divisions={divisions}\n scheme={portionScheme}\n placeOption={placeOption}\n slots={slots}\n />\n ))}\n\n <CommentsSection\n comments={comments}\n setComments={setComments}\n slots={slots}\n />\n\n <QuantitySection\n quantity={quantity}\n setQuantity={setQuantity}\n slots={slots}\n />\n\n <SubmitButton\n canSubmit={canSubmit}\n unmetRule={unmetRule}\n price={price}\n salePrice={salePrice}\n isEditMode={isEditMode}\n onSubmit={() => {\n submit();\n if (onSubmitSuccess) onSubmitSuccess();\n else router.push(\"/menu\");\n }}\n slots={slots}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { ChevronRight } from \"lucide-react\";\n\nfunction cn(...parts: Array<string | undefined>) {\n return parts.filter(Boolean).join(\" \");\n}\n\nexport interface BreadcrumbItem {\n label: string;\n /** Omit (or leave undefined) to render the crumb as plain, non-clickable text. */\n href?: string;\n}\n\n/** Per-slot Tailwind classes for the breadcrumb trail. */\nexport type BreadcrumbsItemClasses = Partial<{\n baseContainer: string;\n crumbLink: string;\n crumbText: string;\n separator: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeBreadcrumbsItemClasses}.\n */\nexport const BREADCRUMBS_DEFAULT_ITEM_CLASSES: Required<BreadcrumbsItemClasses> =\n {\n baseContainer: \"flex flex-row items-center gap-2 text-sm opacity-75\",\n crumbLink: \"hover:opacity-75 transition-all duration-300 underline-offset-2 hover:underline\",\n crumbText: \"font-semibold\",\n separator: \"h-4 w-4 opacity-50\",\n };\n\nexport function mergeBreadcrumbsItemClasses(\n overrides?: BreadcrumbsItemClasses,\n) {\n const d = BREADCRUMBS_DEFAULT_ITEM_CLASSES;\n return {\n baseContainer: cn(d.baseContainer, overrides?.baseContainer),\n crumbLink: cn(d.crumbLink, overrides?.crumbLink),\n crumbText: cn(d.crumbText, overrides?.crumbText),\n separator: cn(d.separator, overrides?.separator),\n };\n}\n\n/** Minimal, presentational breadcrumb trail (e.g. Menu -> Category -> Item). */\nexport function Breadcrumbs({\n items,\n itemClasses,\n}: {\n items: BreadcrumbItem[];\n itemClasses?: BreadcrumbsItemClasses;\n}) {\n const slots = mergeBreadcrumbsItemClasses(itemClasses);\n\n return (\n <nav aria-label=\"Breadcrumb\" className={slots.baseContainer}>\n {items.map((item, index) => (\n <span key={`${item.label}-${index}`} className=\"flex flex-row items-center gap-2\">\n {index > 0 && <ChevronRight className={slots.separator} />}\n {item.href ? (\n <Link href={item.href} className={slots.crumbLink}>\n {item.label}\n </Link>\n ) : (\n <span className={slots.crumbText}>{item.label}</span>\n )}\n </span>\n ))}\n </nav>\n );\n}\n","\"use client\";\n\nimport { CLIENT_ITEM_FORM_SLOTS, type ClientItemFormSlots } from \"./classes\";\n\n/** Free-text special instructions. */\nexport function CommentsSection({\n comments,\n setComments,\n title = \"Comments\",\n placeholder = \"Special instructions...\",\n rows = 2,\n slots = CLIENT_ITEM_FORM_SLOTS,\n}: {\n comments: string;\n setComments: (comments: string) => void;\n title?: string;\n placeholder?: string;\n rows?: number;\n slots?: ClientItemFormSlots;\n}) {\n return (\n <div className={slots.section}>\n <h2 className={slots.sectionTitle}>{title}</h2>\n <textarea\n value={comments}\n onChange={(e) => setComments(e.target.value)}\n placeholder={placeholder}\n className={slots.commentsTextarea}\n rows={rows}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport type { ItemVariant, OrderItem } from \"@zorgo/universal/interfaces\";\nimport type { PortionScheme } from \"@zorgo/universal/schemas\";\nimport { portionLabel } from \"@zorgo/universal/utils/portionUtils\";\nimport { OptionButton } from \"./OptionButton\";\nimport { CLIENT_ITEM_FORM_SLOTS, type ClientItemFormSlots } from \"./classes\";\n\n/**\n * What the variant already includes, each togglable on or off — for the whole\n * item, or for whichever section is being edited (\"no cheese on the left\").\n */\nexport function ComponentsSection({\n variant,\n draft,\n setComponentServings,\n activeSection = null,\n divisions = 1,\n scheme,\n title = \"Includes\",\n slots = CLIENT_ITEM_FORM_SLOTS,\n}: {\n variant: ItemVariant;\n draft?: OrderItem | null;\n setComponentServings: (\n componentId: number,\n servings: number,\n portion?: string | null,\n ) => void;\n /** Section being edited; null = the whole item. */\n activeSection?: number | null;\n divisions?: number;\n /** Names the section a removal applies to. */\n scheme?: PortionScheme | null;\n title?: string;\n slots?: ClientItemFormSlots;\n}) {\n const components = variant.components ?? [];\n if (components.length === 0) return null;\n\n const portion = activeSection != null ? `${activeSection}/${divisions}` : null;\n\n return (\n <div className={slots.section}>\n <h2 className={slots.sectionTitle}>{title}</h2>\n <div className={slots.optionsRow}>\n {components.map((component) => {\n const defaultServings = component.servings_per_item ?? 1;\n // the row for the section being edited, falling back to the\n // whole-item row when this component isn't split\n const rows = (draft?.components ?? []).filter(\n (c) => c.id === component.id,\n );\n const row =\n rows.find((c) => c.portion === portion) ??\n rows.find((c) => !c.portion);\n const servings = row?.quantity_servings ?? defaultServings;\n const selected = servings > 0;\n // removed from somewhere else, while the whole item is shown\n const removedElsewhere =\n !portion && rows.some((c) => c.quantity_servings === 0);\n\n return (\n <OptionButton\n key={component.id}\n label={component.name}\n subtext={\n removedElsewhere && scheme\n ? `No ${component.name.toLowerCase()} on ${rows\n .filter((c) => c.quantity_servings === 0)\n .map((c) =>\n portionLabel(c.portion, scheme).toLowerCase(),\n )\n .join(\", \")}`\n : undefined\n }\n selected={selected}\n onClick={() =>\n setComponentServings(\n component.id,\n selected ? 0 : defaultServings,\n portion,\n )\n }\n slots={slots}\n />\n );\n })}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { CLIENT_ITEM_FORM_SLOTS, cn, type ClientItemFormSlots } from \"./classes\";\n\nexport function OptionButton({\n label,\n subtext,\n selected,\n onClick,\n slots = CLIENT_ITEM_FORM_SLOTS,\n}: {\n label: string;\n subtext?: string;\n selected: boolean;\n onClick: () => void;\n slots?: ClientItemFormSlots;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n slots.optionButton,\n selected\n ? slots.optionButtonSelected\n : slots.optionButtonUnselected,\n )}\n >\n <span className={slots.optionButtonLabel}>{label}</span>\n {subtext && (\n <span className={slots.optionButtonUpcharge}>{subtext}</span>\n )}\n </button>\n );\n}\n","\"use client\";\n\nimport type { PortionScheme } from \"@zorgo/universal/schemas\";\nimport {\n divisionsFor,\n portionLabel,\n radialSectionPath,\n} from \"@zorgo/universal/utils/portionUtils\";\n\nfunction cn(...parts: Array<string | undefined | false>) {\n return parts.filter(Boolean).join(\" \");\n}\n\n/**\n * Section pickers. One per geometry, all with the same props and all dumb: they\n * draw `divisions` sections, highlight `active`, shade `covered`, and call\n * `onSelect`. Every indexing rule lives in the scheme and in portionUtils —\n * a renderer never decides what section 2 means. See docs/portions.md §4.\n */\nexport interface PortionShapeProps {\n divisions: number;\n active: number | null;\n /** Sections already carrying the selection being edited, shaded not selected. */\n covered?: number[];\n onSelect: (index: number | null) => void;\n}\n\nconst SECTION_FILL = \"var(--color-background-elevated, #fff)\";\n\nfunction sectionClass(isActive: boolean, isCovered: boolean) {\n return cn(\n \"transition-all duration-200 cursor-pointer\",\n isActive\n ? \"fill-primary stroke-primary\"\n : isCovered\n ? \"fill-primary/30 stroke-foreground/20\"\n : \"stroke-foreground/20 hover:fill-primary/10\",\n );\n}\n\n/** Contiguous arcs from 12 o'clock, counter-clockwise. */\nfunction RadialPicker({ divisions, active, covered = [], onSelect }: PortionShapeProps) {\n return (\n <svg viewBox=\"0 0 100 100\" className=\"w-32 h-32\" role=\"group\">\n {Array.from({ length: divisions }, (_, i) => {\n const index = i + 1;\n return (\n <path\n key={index}\n d={radialSectionPath(index, divisions)}\n strokeWidth={2}\n style={{ fill: SECTION_FILL }}\n className={sectionClass(active === index, covered.includes(index))}\n onClick={() => onSelect(active === index ? null : index)}\n />\n );\n })}\n </svg>\n );\n}\n\n/** CSS grid, column-major fill: down the left column, then the next. */\nfunction GridPicker({ divisions, active, covered = [], onSelect }: PortionShapeProps) {\n const cols = Math.ceil(Math.sqrt(divisions));\n const rows = Math.ceil(divisions / cols);\n\n return (\n <div\n className=\"grid gap-1 w-32 h-32\"\n style={{\n gridTemplateColumns: `repeat(${cols}, 1fr)`,\n gridTemplateRows: `repeat(${rows}, 1fr)`,\n gridAutoFlow: \"column\",\n }}\n >\n {Array.from({ length: divisions }, (_, i) => {\n const index = i + 1;\n return (\n <button\n key={index}\n type=\"button\"\n aria-pressed={active === index}\n onClick={() => onSelect(active === index ? null : index)}\n className={cn(\n \"rounded-lg border-3 transition-all duration-200\",\n active === index\n ? \"bg-primary border-primary\"\n : covered.includes(index)\n ? \"bg-primary/30 border-foreground/15\"\n : \"bg-background-elevated border-foreground/15 hover:bg-primary/10\",\n )}\n />\n );\n })}\n </div>\n );\n}\n\n/** Horizontal bar segments, one end to the other. */\nfunction LinearPicker({ divisions, active, covered = [], onSelect }: PortionShapeProps) {\n return (\n <div className=\"flex flex-row w-full max-w-xs h-12 gap-1\">\n {Array.from({ length: divisions }, (_, i) => {\n const index = i + 1;\n return (\n <button\n key={index}\n type=\"button\"\n aria-pressed={active === index}\n onClick={() => onSelect(active === index ? null : index)}\n className={cn(\n \"flex-1 rounded-lg border-3 transition-all duration-200\",\n active === index\n ? \"bg-primary border-primary\"\n : covered.includes(index)\n ? \"bg-primary/30 border-foreground/15\"\n : \"bg-background-elevated border-foreground/15 hover:bg-primary/10\",\n )}\n />\n );\n })}\n </div>\n );\n}\n\n/** Equal shares of a countable quantity — no geometry, just labelled buttons. */\nfunction CountPicker({\n divisions,\n active,\n covered = [],\n onSelect,\n scheme,\n}: PortionShapeProps & { scheme: Pick<PortionScheme, \"geometry\"> }) {\n return (\n <div className=\"flex flex-row flex-wrap gap-2\">\n {Array.from({ length: divisions }, (_, i) => {\n const index = i + 1;\n return (\n <button\n key={index}\n type=\"button\"\n aria-pressed={active === index}\n onClick={() => onSelect(active === index ? null : index)}\n className={cn(\n \"px-4 py-2 rounded-xl border-3 font-semibold transition-all duration-200\",\n active === index\n ? \"bg-primary text-primary-foreground border-primary\"\n : covered.includes(index)\n ? \"bg-primary/30 border-foreground/15\"\n : \"bg-background-elevated border-foreground/15 hover:bg-primary/10\",\n )}\n >\n {portionLabel(`${index}/${divisions}`, scheme)}\n </button>\n );\n })}\n </div>\n );\n}\n\nexport interface PortionPickerProps extends PortionShapeProps {\n scheme: PortionScheme;\n onDivisionsChange: (divisions: number) => void;\n className?: string;\n}\n\n/**\n * The one portion control: a cut selector plus the geometry's shape. Adding a\n * geometry means adding a `portion_geometry` enum value and a case here, in the\n * same change — which is exactly why geometry is a closed enum.\n */\nexport function PortionPicker({\n scheme,\n divisions,\n active,\n covered,\n onSelect,\n onDivisionsChange,\n className,\n}: PortionPickerProps) {\n const cuts = divisionsFor(scheme);\n const shapeProps = { divisions, active, covered, onSelect };\n\n return (\n <div className={cn(\"flex flex-col gap-4 items-center\", className)}>\n {cuts.length > 1 && (\n <div className=\"flex flex-row gap-2\">\n {cuts.map((count) => (\n <button\n key={count}\n type=\"button\"\n aria-pressed={divisions === count}\n onClick={() => onDivisionsChange(count)}\n className={cn(\n \"px-4 py-2 rounded-xl border-3 font-semibold transition-all duration-200\",\n divisions === count\n ? \"bg-primary text-primary-foreground border-primary\"\n : \"bg-background-elevated border-foreground/15 hover:bg-primary/10\",\n )}\n >\n {count === 1 ? \"Whole\" : `${count} parts`}\n </button>\n ))}\n </div>\n )}\n\n {/* an uncut item has exactly one section, which is the whole item —\n there is nothing to select until the customer cuts it */}\n {divisions > 1 && (\n <>\n {scheme.geometry === \"radial\" && (\n <RadialPicker {...shapeProps} />\n )}\n {scheme.geometry === \"grid\" && <GridPicker {...shapeProps} />}\n {scheme.geometry === \"linear\" && (\n <LinearPicker {...shapeProps} />\n )}\n {scheme.geometry === \"count\" && (\n <CountPicker {...shapeProps} scheme={scheme} />\n )}\n </>\n )}\n\n <p className=\"opacity-70\">\n {active == null\n ? divisions > 1\n ? \"Editing the whole item — tap a section to edit just that part\"\n : \"Editing the whole item\"\n : `Editing ${portionLabel(`${active}/${divisions}`, scheme).toLowerCase()}`}\n </p>\n </div>\n );\n}\n","\"use client\";\n\nimport type { PortionScheme } from \"@zorgo/universal/schemas\";\nimport { PortionPicker } from \"./PortionPicker\";\nimport { CLIENT_ITEM_FORM_SLOTS, type ClientItemFormSlots } from \"./classes\";\n\n/** The item's cut selector, wrapped in a titled form section. */\nexport function PortionSection({\n scheme,\n divisions,\n activeSection,\n setActiveSection,\n setDivisions,\n slots = CLIENT_ITEM_FORM_SLOTS,\n}: {\n scheme: PortionScheme;\n divisions: number;\n activeSection: number | null;\n setActiveSection: (section: number | null) => void;\n setDivisions: (divisions: number) => void;\n slots?: ClientItemFormSlots;\n}) {\n return (\n <div className={slots.section}>\n <h2 className={slots.sectionTitle}>{scheme.name}</h2>\n <PortionPicker\n scheme={scheme}\n divisions={divisions}\n active={activeSection}\n onSelect={setActiveSection}\n onDivisionsChange={setDivisions}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { Minus, Plus } from \"lucide-react\";\nimport { CLIENT_ITEM_FORM_SLOTS, type ClientItemFormSlots } from \"./classes\";\n\n/** Line quantity stepper. The hook already floors quantity at 1. */\nexport function QuantitySection({\n quantity,\n setQuantity,\n title = \"How many?\",\n slots = CLIENT_ITEM_FORM_SLOTS,\n}: {\n quantity: number;\n setQuantity: (next: number | ((current: number) => number)) => void;\n title?: string;\n slots?: ClientItemFormSlots;\n}) {\n return (\n <div className={slots.section}>\n <h2 className={slots.sectionTitle}>{title}</h2>\n <div className={slots.quantityRow}>\n <button\n type=\"button\"\n className={slots.incrementButton}\n onClick={() => setQuantity((q) => q - 1)}\n >\n <Minus className=\"h-4 w-4\" />\n </button>\n <p className={slots.servingsValue}>{quantity}</p>\n <button\n type=\"button\"\n className={slots.incrementButton}\n onClick={() => setQuantity((q) => q + 1)}\n >\n <Plus className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport type { CustomizationRule } from \"@zorgo/universal/interfaces\";\nimport type { PortionScheme } from \"@zorgo/universal/schemas\";\nimport { parsePortionKey, portionLabel } from \"@zorgo/universal/utils/portionUtils\";\nimport { OptionButton } from \"./OptionButton\";\nimport { CLIENT_ITEM_FORM_SLOTS, money, type ClientItemFormSlots } from \"./classes\";\n\n/** One rule group (toppings, sides, …) and its unmet-requirement message. */\nexport function RuleSection({\n rule,\n activeSection = null,\n divisions = 1,\n scheme,\n placeOption,\n slots = CLIENT_ITEM_FORM_SLOTS,\n}: {\n rule: CustomizationRule;\n /** Section currently being edited, so a whole-item-only rule can say so. */\n activeSection?: number | null;\n /** How the item is currently cut, for the portion this section writes. */\n divisions?: number;\n /** Names the section an option sits on; omit when the item can't be cut. */\n scheme?: PortionScheme | null;\n /** Defaults to the option's own whole-item toggle. */\n placeOption?: (\n ruleId: number,\n baseKey: string,\n portion: string | null,\n max?: number,\n ) => void;\n slots?: ClientItemFormSlots;\n}) {\n // a rule that can't be split ignores the active section entirely — you\n // can't have thin crust on one half\n const portion =\n rule.portionable && activeSection != null\n ? `${activeSection}/${divisions}`\n : null;\n\n return (\n <div className={slots.section}>\n <h2 className={slots.sectionTitle}>\n {rule.group_name}\n {/* a section is active but this rule can't be split —\n say so rather than silently applying it to everything */}\n {activeSection != null && !rule.portionable && (\n <span className={slots.portionHint}> — whole item only</span>\n )}\n </h2>\n\n <div className={slots.optionsRow}>\n {rule.options.map((option) => (\n <OptionButton\n key={parsePortionKey(option.key).baseKey}\n label={option.name}\n subtext={\n // where it sits beats what it costs — the price is\n // already in the running total\n option.portion && scheme\n ? portionLabel(option.portion, scheme)\n : option.upcharge > 0\n ? `+${money(option.upcharge)}`\n : undefined\n }\n selected={option.selected}\n onClick={() =>\n placeOption\n ? placeOption(\n rule.rule_id,\n parsePortionKey(option.key).baseKey,\n portion,\n rule.max,\n )\n : option.toggle()\n }\n slots={slots}\n />\n ))}\n </div>\n\n {rule.message() && (\n <p className={slots.ruleError}>{rule.message()}</p>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport type { CustomizationRule } from \"@zorgo/universal/interfaces\";\nimport { CLIENT_ITEM_FORM_SLOTS, money, type ClientItemFormSlots } from \"./classes\";\n\n/** Add-to-cart button: names the first unmet rule, otherwise the price. */\nexport function SubmitButton({\n canSubmit,\n unmetRule,\n price,\n salePrice,\n isEditMode,\n onSubmit,\n slots = CLIENT_ITEM_FORM_SLOTS,\n}: {\n canSubmit: boolean;\n unmetRule?: CustomizationRule | null;\n price: number;\n salePrice?: number | null;\n isEditMode?: boolean;\n onSubmit: () => void;\n slots?: ClientItemFormSlots;\n}) {\n return (\n <button\n type=\"button\"\n disabled={!canSubmit}\n onClick={onSubmit}\n className={slots.submitButton}\n >\n {unmetRule\n ? `Choose ${unmetRule.group_name}`\n : `${isEditMode ? \"Save changes\" : \"Add to cart\"} — ${money(salePrice ?? price)}`}\n </button>\n );\n}\n","\"use client\";\n\nimport type { ItemVariant } from \"@zorgo/universal/interfaces\";\nimport { OptionButton } from \"./OptionButton\";\nimport { CLIENT_ITEM_FORM_SLOTS, money, type ClientItemFormSlots } from \"./classes\";\n\n/** Size / variant picker. Renders nothing when there is only one variant. */\nexport function VariantSection({\n variants,\n variant,\n setVariant,\n title = \"Variants\",\n slots = CLIENT_ITEM_FORM_SLOTS,\n}: {\n variants: ItemVariant[];\n variant: ItemVariant;\n setVariant: (variant: ItemVariant) => void;\n title?: string;\n slots?: ClientItemFormSlots;\n}) {\n if (variants.length <= 1) return null;\n\n return (\n <div className={slots.section}>\n <h2 className={slots.sectionTitle}>{title}</h2>\n <div className={slots.optionsRow}>\n {variants.map((v) => (\n <OptionButton\n key={v.item_id}\n label={v.name}\n subtext={money(v.price)}\n selected={v.item_id === variant.item_id}\n onClick={() => setVariant(v)}\n slots={slots}\n />\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { Search } from \"lucide-react\";\nimport type { Location } from \"@zorgo/universal/interfaces\";\n\nfunction cn(...parts: Array<string | undefined>) {\n return parts.filter(Boolean).join(\" \");\n}\n\nfunction searchableText(location: Location) {\n return `${location.name} ${location.address ?? \"\"}`.toLowerCase();\n}\n\n/** Rank: 0 = starts-with, 1 = includes, 2 = no match. Lower is better. */\nfunction matchRank(location: Location, query: string): number {\n const text = searchableText(location);\n const q = query.trim().toLowerCase();\n if (!q) return 0;\n if (text.startsWith(q) || location.name.toLowerCase().startsWith(q)) {\n return 0;\n }\n if (text.includes(q)) return 1;\n return 2;\n}\n\nfunction rankLocations(\n locations: Location[],\n query: string,\n pinnedLocationId?: number | null,\n): Location[] {\n const q = query.trim();\n const ranked = q\n ? [...locations].sort((a, b) => {\n const rankDiff = matchRank(a, q) - matchRank(b, q);\n if (rankDiff !== 0) return rankDiff;\n return a.name.localeCompare(b.name);\n })\n : [...locations];\n\n if (pinnedLocationId == null) return ranked;\n\n const pinnedIndex = ranked.findIndex(\n (location) => location.location_id === pinnedLocationId,\n );\n if (pinnedIndex <= 0) return ranked;\n\n const [pinned] = ranked.splice(pinnedIndex, 1);\n if (!pinned) return ranked;\n return [pinned, ...ranked];\n}\n\n/** Per-slot Tailwind classes for the find-location layout. */\nexport type FindLocationItemClasses = Partial<{\n baseContainer: string;\n searchContainer: string;\n searchIcon: string;\n searchInput: string;\n noMatchesMessage: string;\n emptyMessage: string;\n list: string;\n locationRow: string;\n locationRowSelected: string;\n locationRowUnselected: string;\n locationButton: string;\n locationName: string;\n locationAddress: string;\n selectButton: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeFindLocationItemClasses}.\n */\nexport const FIND_LOCATION_DEFAULT_ITEM_CLASSES: Required<FindLocationItemClasses> =\n {\n baseContainer: \"flex flex-col gap-6\",\n searchContainer: \"relative flex items-center\",\n searchIcon:\n \"absolute left-4 h-5 w-5 text-foreground opacity-50 pointer-events-none\",\n searchInput:\n \"w-full rounded-xl bg-background-recessed opacity-75 py-3 pl-12 pr-4 text-lg text-foreground placeholder:opacity-50 outline-none focus:opacity-100 transition-all duration-300\",\n noMatchesMessage: \"text-center opacity-75 text-sm\",\n emptyMessage: \"text-center opacity-75 py-8\",\n list: \"flex flex-col gap-3\",\n locationRow:\n \"flex items-center justify-between gap-4 p-4 rounded-xl border-3 border-foreground/[15%] shadow-sm hover:translate-x-1 transition-all duration-300 w-full\",\n locationRowSelected: \"bg-background-elevated\",\n locationRowUnselected: \"bg-background-recessed\",\n locationButton:\n \"flex flex-col gap-1 text-left flex-1 min-w-0\",\n locationName: \"text-lg font-semibold text-foreground\",\n locationAddress: \"text-base opacity-75 whitespace-pre-line\",\n selectButton:\n \"text-lg font-semibold px-4 py-3 rounded-xl bg-primary text-primary-foreground hover:opacity-75 transition-all duration-300 shrink-0\",\n };\n\nexport function mergeFindLocationItemClasses(\n overrides?: FindLocationItemClasses,\n) {\n const d = FIND_LOCATION_DEFAULT_ITEM_CLASSES;\n return {\n baseContainer: cn(d.baseContainer, overrides?.baseContainer),\n searchContainer: cn(d.searchContainer, overrides?.searchContainer),\n searchIcon: cn(d.searchIcon, overrides?.searchIcon),\n searchInput: cn(d.searchInput, overrides?.searchInput),\n noMatchesMessage: cn(d.noMatchesMessage, overrides?.noMatchesMessage),\n emptyMessage: cn(d.emptyMessage, overrides?.emptyMessage),\n list: cn(d.list, overrides?.list),\n locationRow: cn(d.locationRow, overrides?.locationRow),\n locationRowSelected: cn(\n d.locationRowSelected,\n overrides?.locationRowSelected,\n ),\n locationRowUnselected: cn(\n d.locationRowUnselected,\n overrides?.locationRowUnselected,\n ),\n locationButton: cn(d.locationButton, overrides?.locationButton),\n locationName: cn(d.locationName, overrides?.locationName),\n locationAddress: cn(d.locationAddress, overrides?.locationAddress),\n selectButton: cn(d.selectButton, overrides?.selectButton),\n };\n}\n\nexport function FindLocation({\n locations,\n initialSelected,\n onSelect,\n itemClasses,\n}: {\n locations: Location[];\n /** Seeds the internal highlight and stays pinned at the top of the list. */\n initialSelected?: Location | null;\n onSelect: (location: Location) => void;\n itemClasses?: FindLocationItemClasses;\n}) {\n const [query, setQuery] = useState(\"\");\n const [selected, setSelected] = useState<Location | null>(\n () => initialSelected ?? null,\n );\n const slots = mergeFindLocationItemClasses(itemClasses);\n const pinnedLocationId = initialSelected?.location_id;\n\n const ranked = useMemo(\n () => rankLocations(locations, query, pinnedLocationId),\n [locations, query, pinnedLocationId],\n );\n\n const trimmedQuery = query.trim();\n const noMatches =\n trimmedQuery.length > 0 &&\n locations.every((location) => matchRank(location, trimmedQuery) === 2);\n\n return (\n <div className={slots.baseContainer}>\n <div className={slots.searchContainer}>\n <Search className={slots.searchIcon} strokeWidth={2} />\n <input\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search by name or address\"\n className={slots.searchInput}\n aria-label=\"Search locations\"\n />\n </div>\n\n {noMatches && (\n <p className={slots.noMatchesMessage}>\n No locations match “{trimmedQuery}”. Showing all\n locations anyway.\n </p>\n )}\n\n {ranked.length === 0 ? (\n <p className={slots.emptyMessage}>No locations available.</p>\n ) : (\n <ul className={slots.list}>\n {ranked.map((location) => {\n const isSelected =\n selected?.location_id === location.location_id;\n return (\n <li\n key={location.location_id}\n className={cn(\n slots.locationRow,\n isSelected\n ? slots.locationRowSelected\n : slots.locationRowUnselected,\n )}\n >\n <button\n type=\"button\"\n onClick={() => setSelected(location)}\n aria-pressed={isSelected}\n className={slots.locationButton}\n >\n <p className={slots.locationName}>\n {location.name}\n </p>\n {location.address && (\n <p className={slots.locationAddress}>\n {location.address}\n </p>\n )}\n </button>\n {isSelected && (\n <button\n type=\"button\"\n onClick={() => onSelect(location)}\n className={slots.selectButton}\n >\n Select\n </button>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n}\n","import { cn } from \"../ItemForm/classes\";\n\n/** Per-slot Tailwind classes for the checkout form. */\nexport type CheckoutFormItemClasses = Partial<{\n\tshell: string;\n\tshellInner: string;\n\tpageTitle: string;\n\tprimaryButton: string;\n\tsecondaryButton: string;\n\tincrementButton: string;\n\tsurface: string;\n\tfieldInput: string;\n\tfieldContainer: string;\n\tfieldLabel: string;\n\tfieldError: string;\n\tstatusPanel: string;\n\tstatusTitle: string;\n\tstatusMessage: string;\n\tstatusMessageError: string;\n\tstatusActions: string;\n\tstepSection: string;\n\tsectionTitle: string;\n\tcartList: string;\n\ttotals: string;\n\ttotalsRow: string;\n\ttotalsDivider: string;\n\ttotalsTotalRow: string;\n\tform: string;\n\tformActions: string;\n\tsubmitError: string;\n\tpaymentSurface: string;\n\tsteps: string;\n\tstepBadge: string;\n\tstepBadgeActive: string;\n\tstepBadgeInactive: string;\n\tstepLabel: string;\n\tstepLabelActive: string;\n\tstepLabelInactive: string;\n\tstepDivider: string;\n\tstepDividerActive: string;\n\tstepDividerInactive: string;\n\tcartLine: string;\n\tcartLineName: string;\n\tcartLineSelection: string;\n\tcartLinePrice: string;\n\tcartLineControls: string;\n\tcartLineQuantity: string;\n\tpromoApplied: string;\n\tpromoAppliedLabel: string;\n\tpromoRow: string;\n\tpromoInput: string;\n\tpromoError: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeCheckoutFormItemClasses}.\n */\nexport const CHECKOUT_FORM_DEFAULT_ITEM_CLASSES: Required<CheckoutFormItemClasses> =\n\t{\n\t\tshell: \"\",\n\t\tshellInner: \"max-w-2xl mx-auto w-full flex flex-col gap-6\",\n\t\tpageTitle: \"text-4xl font-extrabold text-primary text-center mb-8\",\n\t\tprimaryButton:\n\t\t\t\"text-lg font-semibold px-4 py-3 rounded-xl bg-primary text-primary-foreground hover:opacity-75 transition-all duration-300 disabled:opacity-50 disabled:cursor-not-allowed\",\n\t\tsecondaryButton:\n\t\t\t\"text-lg font-semibold px-4 py-3 rounded-xl bg-background-recessed text-foreground border-3 border-foreground/[15%] hover:opacity-75 transition-all duration-300\",\n\t\tincrementButton:\n\t\t\t\"bg-background-recessed text-foreground w-10 h-10 rounded-xl flex items-center justify-center hover:bg-foreground hover:text-background transition-all duration-300\",\n\t\tsurface:\n\t\t\t\"rounded-xl bg-background-elevated border-3 border-foreground/[15%] shadow-sm\",\n\t\tfieldInput:\n\t\t\t\"w-full bg-transparent outline-none text-lg font-semibold text-foreground placeholder:opacity-50\",\n\t\tfieldContainer:\n\t\t\t\"flex flex-col gap-1 w-full p-4 rounded-xl bg-background-elevated border-3 border-foreground/[15%]\",\n\t\tfieldLabel: \"text-xl opacity-50 text-foreground\",\n\t\tfieldError: \"text-xl text-red-500\",\n\t\tstatusPanel: \"flex flex-col gap-6 items-center text-center p-8 w-full\",\n\t\tstatusTitle: \"text-3xl font-semibold\",\n\t\tstatusMessage: \"text-xl max-w-md opacity-60\",\n\t\tstatusMessageError: \"text-xl max-w-md text-red-500\",\n\t\tstatusActions: \"w-full max-w-sm flex flex-col gap-3\",\n\t\tstepSection: \"flex flex-col gap-6\",\n\t\tsectionTitle: \"text-3xl font-semibold mt-8\",\n\t\tcartList: \"flex flex-col gap-3\",\n\t\ttotals: \"flex flex-col gap-2 p-4\",\n\t\ttotalsRow: \"flex flex-row justify-between text-xl opacity-75\",\n\t\ttotalsDivider: \"h-[2px] bg-foreground/20 rounded-xl w-full\",\n\t\ttotalsTotalRow:\n\t\t\t\"flex flex-row justify-between text-2xl font-semibold pt-2\",\n\t\tform: \"flex flex-col gap-4 w-full\",\n\t\tformActions: \"flex flex-row items-center justify-between gap-3\",\n\t\tsubmitError: \"text-sm text-red-500\",\n\t\tpaymentSurface: \"p-4\",\n\t\tsteps: \"flex flex-row items-center gap-2 w-full\",\n\t\tstepBadge:\n\t\t\t\"w-10 h-10 rounded-full flex items-center justify-center text-xl font-semibold transition-all duration-300\",\n\t\tstepBadgeActive: \"bg-foreground text-background\",\n\t\tstepBadgeInactive: \"bg-background-recessed text-foreground opacity-60\",\n\t\tstepLabel: \"text-xl transition-all duration-300\",\n\t\tstepLabelActive: \"font-semibold\",\n\t\tstepLabelInactive: \"opacity-60\",\n\t\tstepDivider: \"flex-1 h-[2px] transition-all duration-300\",\n\t\tstepDividerActive: \"bg-foreground\",\n\t\tstepDividerInactive: \"bg-foreground/15\",\n\t\tcartLine: \"flex flex-row items-start justify-between gap-4 p-4 w-full\",\n\t\tcartLineName: \"text-xl font-semibold text-foreground\",\n\t\tcartLineSelection: \"text-lg opacity-50\",\n\t\tcartLinePrice: \"text-lg font-semibold opacity-75\",\n\t\tcartLineControls:\n\t\t\t\"flex flex-col flex-col-reverse md:flex-row items-center gap-3 shrink-0\",\n\t\tcartLineQuantity: \"w-8 text-xl font-semibold text-center\",\n\t\tpromoApplied:\n\t\t\t\"flex flex-row items-center justify-between gap-4 p-4 w-full\",\n\t\tpromoAppliedLabel: \"flex-1 text-lg font-semibold\",\n\t\tpromoRow: \"flex flex-row gap-3\",\n\t\tpromoInput:\n\t\t\t\"flex-1 rounded-xl bg-background-recessed border-3 border-transparent py-3 px-4 text-lg font-semibold text-foreground placeholder:opacity-50 outline-none focus:border-foreground/15 transition-all duration-300\",\n\t\tpromoError: \"text-xl text-red-500\",\n\t};\n\nexport function mergeCheckoutFormItemClasses(\n\toverrides?: CheckoutFormItemClasses,\n) {\n\tconst d = CHECKOUT_FORM_DEFAULT_ITEM_CLASSES;\n\treturn Object.fromEntries(\n\t\t(Object.keys(d) as Array<keyof CheckoutFormItemClasses>).map((key) => [\n\t\t\tkey,\n\t\t\tcn(d[key], overrides?.[key]),\n\t\t]),\n\t) as Required<CheckoutFormItemClasses>;\n}\n\n/**\n * Fully-resolved classes. Every subcomponent takes this (not the partial\n * overrides) so a piece used on its own and one composed into CheckoutForm\n * merge the defaults exactly once.\n */\nexport type CheckoutFormSlots = Required<CheckoutFormItemClasses>;\n\nexport const CHECKOUT_FORM_SLOTS: CheckoutFormSlots =\n\tmergeCheckoutFormItemClasses();\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport Link from \"next/link\";\nimport { Elements } from \"@stripe/react-stripe-js\";\nimport {\n\tuseCart,\n\tuseLocation,\n\tuseModal,\n\tusePayment,\n} from \"@zorgo/universal/hooks/hooks\";\nimport { cn } from \"../ItemForm/classes\";\nimport { CheckoutShell } from \"./CheckoutShell\";\nimport { DetailsStep } from \"./DetailsStep\";\nimport { PaymentStep } from \"./PaymentStep\";\nimport { StatusPanel } from \"./StatusPanel\";\nimport {\n\tmergeCheckoutFormItemClasses,\n\ttype CheckoutFormItemClasses,\n} from \"./classes\";\n\n/**\n * The stock checkout flow: cart + customer details, then Stripe payment.\n * Every piece here is exported on its own — a site that wants its own layout\n * composes these instead of forking the file.\n *\n * The order + payment intent are created on details submit (not on mount),\n * so the collected customer and any applied promo are baked into the charge.\n */\nexport function CheckoutForm({\n\titemClasses,\n\thomeHref = \"/\",\n\tmenuHref = \"/menu\",\n\tcheckoutHref = \"/checkout\",\n}: {\n\titemClasses?: CheckoutFormItemClasses;\n\thomeHref?: string;\n\tmenuHref?: string;\n\tcheckoutHref?: string;\n}) {\n\tconst slots = mergeCheckoutFormItemClasses(itemClasses);\n\tconst {\n\t\tclientSecret,\n\t\tstripe,\n\t\telementOptions,\n\t\tisReady,\n\t\tisLoading,\n\t\terror,\n\t\tgetReturnStatus,\n\t} = usePayment();\n\tconst { isEmpty, resetCart } = useCart();\n\tconst { currentLocation, needsLocationSelection } = useLocation({\n\t\tpromptLocationSelection: true,\n\t});\n\tconst { open } = useModal();\n\n\tconst [returnStatus, setReturnStatus] = useState<ReturnType<\n\t\ttypeof getReturnStatus\n\t> | null>(null);\n\tuseEffect(() => {\n\t\tif (window.location.search.includes(\"redirect_status\")) {\n\t\t\tconst status = getReturnStatus(window.location.href);\n\t\t\tsetReturnStatus(status);\n\t\t\tif (status.succeeded) resetCart();\n\t\t}\n\t}, []);\n\n\tconst linkAction = (href: string, label: string) => (\n\t\t<Link\n\t\t\thref={href}\n\t\t\tclassName={cn(slots.primaryButton, \"block w-full text-center\")}\n\t\t>\n\t\t\t{label}\n\t\t</Link>\n\t);\n\n\tif (returnStatus) {\n\t\treturn (\n\t\t\t<CheckoutShell slots={slots}>\n\t\t\t\t{returnStatus.succeeded ? (\n\t\t\t\t\t<StatusPanel\n\t\t\t\t\t\tslots={slots}\n\t\t\t\t\t\ttitle=\"You're all set\"\n\t\t\t\t\t\tmessage=\"Payment successful. Thank you!\"\n\t\t\t\t\t\taction={linkAction(homeHref, \"Back home\")}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<StatusPanel\n\t\t\t\t\t\tslots={slots}\n\t\t\t\t\t\ttitle=\"Payment didn't go through\"\n\t\t\t\t\t\tmessage={returnStatus.error}\n\t\t\t\t\t\ttone=\"error\"\n\t\t\t\t\t\taction={linkAction(checkoutHref, \"Try again\")}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</CheckoutShell>\n\t\t);\n\t}\n\n\tif (isEmpty && !isLoading && !clientSecret) {\n\t\treturn (\n\t\t\t<CheckoutShell slots={slots}>\n\t\t\t\t<StatusPanel\n\t\t\t\t\tslots={slots}\n\t\t\t\t\ttitle=\"Your cart is empty\"\n\t\t\t\t\tmessage=\"Add something from the menu to get started.\"\n\t\t\t\t\taction={linkAction(menuHref, \"Browse the menu\")}\n\t\t\t\t/>\n\t\t\t</CheckoutShell>\n\t\t);\n\t}\n\n\tif (error) {\n\t\treturn (\n\t\t\t<CheckoutShell slots={slots}>\n\t\t\t\t<StatusPanel\n\t\t\t\t\tslots={slots}\n\t\t\t\t\ttitle=\"Something went wrong\"\n\t\t\t\t\tmessage={error}\n\t\t\t\t\ttone=\"error\"\n\t\t\t\t\taction={linkAction(menuHref, \"Back to menu\")}\n\t\t\t\t/>\n\t\t\t</CheckoutShell>\n\t\t);\n\t}\n\n\tif (needsLocationSelection) {\n\t\treturn (\n\t\t\t<CheckoutShell slots={slots}>\n\t\t\t\t<StatusPanel\n\t\t\t\t\tslots={slots}\n\t\t\t\t\ttitle=\"Choose a location\"\n\t\t\t\t\tmessage=\"Please choose a location to continue checkout.\"\n\t\t\t\t\taction={\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => open(\"FIND_LOCATION_MODAL\")}\n\t\t\t\t\t\t\tclassName={cn(slots.primaryButton, \"w-full\")}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSelect a location\n\t\t\t\t\t\t</button>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</CheckoutShell>\n\t\t);\n\t}\n\n\tif (isReady && elementOptions) {\n\t\treturn (\n\t\t\t<CheckoutShell slots={slots}>\n\t\t\t\t<Elements\n\t\t\t\t\tkey={currentLocation?.stripe_account_id}\n\t\t\t\t\tstripe={stripe!}\n\t\t\t\t\toptions={elementOptions}\n\t\t\t\t>\n\t\t\t\t\t<PaymentStep slots={slots} checkoutHref={checkoutHref} />\n\t\t\t\t</Elements>\n\t\t\t</CheckoutShell>\n\t\t);\n\t}\n\n\treturn (\n\t\t<CheckoutShell slots={slots}>\n\t\t\t<DetailsStep slots={slots} />\n\t\t</CheckoutShell>\n\t);\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { CHECKOUT_FORM_SLOTS, type CheckoutFormSlots } from \"./classes\";\n\n/** Page wrapper + title every checkout state renders inside. */\nexport function CheckoutShell({\n\tchildren,\n\ttitle = \"Checkout\",\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\tchildren: ReactNode;\n\ttitle?: ReactNode;\n\tslots?: CheckoutFormSlots;\n}) {\n\treturn (\n\t\t<div className={slots.shell}>\n\t\t\t<div className={slots.shellInner}>\n\t\t\t\t<h1 className={slots.pageTitle}>{title}</h1>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { DynamicFormShell, SubmitButton } from \"@zorgo/universal/components/Form\";\nimport { useCart, useCustomer, usePayment } from \"@zorgo/universal/hooks/hooks\";\nimport type { Customer } from \"@zorgo/universal/interfaces\";\nimport { cn } from \"../ItemForm/classes\";\nimport { CheckoutSteps } from \"./CheckoutSteps\";\nimport { ConsentFields } from \"./ConsentFields\";\nimport { ContactFields } from \"./ContactFields\";\nimport { OrderLines } from \"./OrderLine\";\nimport { OrderTotals } from \"./OrderTotals\";\nimport { PromoCode } from \"./PromoCode\";\nimport { CHECKOUT_FORM_SLOTS, type CheckoutFormSlots } from \"./classes\";\n\n/** Step 1: review the cart, apply a promo, hand over contact details. */\nexport function DetailsStep({\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\tslots?: CheckoutFormSlots;\n}) {\n\tconst { resetCart } = useCart();\n\tconst { setCustomer } = useCustomer();\n\tconst { startCheckout } = usePayment();\n\tconst [submitError, setSubmitError] = useState<string | undefined>();\n\n\tconst handleSubmit = async (values: Record<string, unknown>) => {\n\t\tconst filledCustomer: Customer = {\n\t\t\tfirst_name: values.firstName as string,\n\t\t\tlast_name: values.lastName as string,\n\t\t\tphone: values.phone as string,\n\t\t\temail: values.email as string,\n\t\t\tallow_marketing: values.marketingConsent as boolean,\n\t\t};\n\t\tsetCustomer(filledCustomer);\n\n\t\ttry {\n\t\t\tawait startCheckout();\n\t\t} catch (err) {\n\t\t\tsetSubmitError(\n\t\t\t\terr instanceof Error ? err.message : \"Could not start payment.\",\n\t\t\t);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className={slots.stepSection}>\n\t\t\t<CheckoutSteps current={1} slots={slots} />\n\n\t\t\t<h2 className={slots.sectionTitle}>Your order</h2>\n\t\t\t<OrderLines slots={slots} />\n\n\t\t\t<OrderTotals slots={slots} />\n\n\t\t\t<PromoCode slots={slots} />\n\n\t\t\t<h2 className={slots.sectionTitle}>Contact information</h2>\n\n\t\t\t<DynamicFormShell onSubmit={handleSubmit} className={slots.form}>\n\t\t\t\t<ContactFields slots={slots} />\n\t\t\t\t<ConsentFields slots={slots} />\n\n\t\t\t\t{submitError && (\n\t\t\t\t\t<p className={slots.submitError}>{submitError}</p>\n\t\t\t\t)}\n\n\t\t\t\t<div className={slots.formActions}>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={resetCart}\n\t\t\t\t\t\tclassName={slots.secondaryButton}\n\t\t\t\t\t>\n\t\t\t\t\t\tClear cart\n\t\t\t\t\t</button>\n\t\t\t\t\t<SubmitButton\n\t\t\t\t\t\tlabel=\"Continue to payment\"\n\t\t\t\t\t\tloadingLabel=\"Setting up...\"\n\t\t\t\t\t\tclassName={cn(\"flex-1\", slots.primaryButton)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</DynamicFormShell>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { cn } from \"../ItemForm/classes\";\nimport { CHECKOUT_FORM_SLOTS, type CheckoutFormSlots } from \"./classes\";\n\n/** Numbered progress header shown above each step. */\nexport function CheckoutSteps({\n\tcurrent,\n\tlabels = [\"Your details\", \"Payment\"],\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\tcurrent: number;\n\tlabels?: string[];\n\tslots?: CheckoutFormSlots;\n}) {\n\treturn (\n\t\t<div className={slots.steps}>\n\t\t\t{labels.map((label, i) => {\n\t\t\t\tconst n = i + 1;\n\t\t\t\tconst active = n <= current;\n\t\t\t\treturn (\n\t\t\t\t\t<div key={label} className=\"contents\">\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\tslots.stepBadge,\n\t\t\t\t\t\t\t\t\tactive\n\t\t\t\t\t\t\t\t\t\t? slots.stepBadgeActive\n\t\t\t\t\t\t\t\t\t\t: slots.stepBadgeInactive,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{n}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\tslots.stepLabel,\n\t\t\t\t\t\t\t\t\tactive\n\t\t\t\t\t\t\t\t\t\t? slots.stepLabelActive\n\t\t\t\t\t\t\t\t\t\t: slots.stepLabelInactive,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{i < labels.length - 1 && (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\tslots.stepDivider,\n\t\t\t\t\t\t\t\t\tcurrent > n\n\t\t\t\t\t\t\t\t\t\t? slots.stepDividerActive\n\t\t\t\t\t\t\t\t\t\t: slots.stepDividerInactive,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { CheckboxField } from \"@zorgo/universal/components/Form\";\nimport { CHECKOUT_FORM_SLOTS, type CheckoutFormSlots } from \"./classes\";\n\n/**\n * Terms + marketing checkboxes. Must be rendered inside a `DynamicFormShell`;\n * the submit handler reads `termsAccepted` / `marketingConsent`.\n */\nexport function ConsentFields({\n\ttermsLabel = \"I have read and agree to the terms of service.\",\n\tmarketingLabel = \"I consent to receive promotions via text and email.\",\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\ttermsLabel?: React.ReactNode;\n\tmarketingLabel?: React.ReactNode;\n\tslots?: CheckoutFormSlots;\n}) {\n\treturn (\n\t\t<>\n\t\t\t<CheckboxField\n\t\t\t\tfieldId=\"termsAccepted\"\n\t\t\t\trequired\n\t\t\t\trequiredText=\"You must agree to the terms of service to continue.\"\n\t\t\t\tfieldErrorClassName={slots.fieldError}\n\t\t\t>\n\t\t\t\t{termsLabel}\n\t\t\t</CheckboxField>\n\t\t\t<CheckboxField fieldId=\"marketingConsent\" required={false}>\n\t\t\t\t{marketingLabel}\n\t\t\t</CheckboxField>\n\t\t</>\n\t);\n}\n","\"use client\";\n\nimport {\n\tNameFields,\n\tPhoneField,\n\tEmailField,\n\tFieldError,\n} from \"@zorgo/universal/components/Form\";\nimport { useCustomer } from \"@zorgo/universal/hooks/hooks\";\nimport { cn } from \"../ItemForm/classes\";\nimport { CHECKOUT_FORM_SLOTS, type CheckoutFormSlots } from \"./classes\";\n\n/**\n * Name / phone / email inputs, seeded from the stored customer. Must be\n * rendered inside a `DynamicFormShell`.\n */\nexport function ContactFields({\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\tslots?: CheckoutFormSlots;\n}) {\n\tconst { customer } = useCustomer();\n\n\tconst fieldStyleProps = {\n\t\tfieldClassName: slots.fieldInput,\n\t\tcontainerClassName: slots.fieldContainer,\n\t\tfieldLabelClassName: slots.fieldLabel,\n\t\tfieldErrorClassName: slots.fieldError,\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<NameFields\n\t\t\t\tfirstNameInitialValue={customer.first_name ?? \"\"}\n\t\t\t\tlastNameInitialValue={customer.last_name ?? \"\"}\n\t\t\t\tfieldClassName={slots.fieldInput}\n\t\t\t\tfieldLabelClassName={slots.fieldLabel}\n\t\t\t\tfieldErrorClassName={slots.fieldError}\n\t\t\t\tchildClassName={cn(\n\t\t\t\t\tslots.fieldContainer,\n\t\t\t\t\t\"md:flex-1 md:min-w-0\",\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<div className=\"flex flex-col w-full gap-1\">\n\t\t\t\t<PhoneField\n\t\t\t\t\tinitialValue={customer.phone ?? \"\"}\n\t\t\t\t\tshowError={false}\n\t\t\t\t\t{...fieldStyleProps}\n\t\t\t\t/>\n\t\t\t\t<FieldError name=\"phone\" className={slots.fieldError} />\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col w-full gap-1\">\n\t\t\t\t<EmailField\n\t\t\t\t\tinitialValue={customer.email ?? \"\"}\n\t\t\t\t\tshowError={false}\n\t\t\t\t\t{...fieldStyleProps}\n\t\t\t\t/>\n\t\t\t\t<FieldError name=\"email\" className={slots.fieldError} />\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","\"use client\";\n\nimport { Minus, Pencil, Plus } from \"lucide-react\";\nimport { useCart, useModal } from \"@zorgo/universal/hooks/hooks\";\nimport type { OrderItem } from \"@zorgo/universal/interfaces\";\nimport { cn, money } from \"../ItemForm/classes\";\nimport { CHECKOUT_FORM_SLOTS, type CheckoutFormSlots } from \"./classes\";\n\n/** One cart line: selections, price, edit + quantity controls. */\nexport function OrderLine({\n\titem,\n\tindex,\n\tonRemove,\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\titem: OrderItem;\n\tindex: number;\n\tonRemove: () => void;\n\tslots?: CheckoutFormSlots;\n}) {\n\tconst { open } = useModal();\n\tconst { updateItem, getItemTotal } = useCart();\n\n\t// Read straight from the store item so edits (from the pencil modal) and\n\t// quantity changes stay reactive — no local hook state to drift out of sync.\n\tconst setQuantity = (next: number) =>\n\t\tnext < 1 ? onRemove() : updateItem({ ...item, quantity: next }, index);\n\n\tconst added = (item.selections ?? []).flatMap((rs) =>\n\t\trs.selections.map((s) => s.name),\n\t);\n\tconst removed = (item.components ?? [])\n\t\t.filter((c) => c.quantity_servings === 0)\n\t\t.map((c) => c.name);\n\n\treturn (\n\t\t<div className={cn(slots.cartLine, slots.surface)}>\n\t\t\t<div className=\"flex flex-col gap-1 flex-1 min-w-0\">\n\t\t\t\t<p className={slots.cartLineName}>{item.name}</p>\n\t\t\t\t{added.length > 0 && (\n\t\t\t\t\t<p className={slots.cartLineSelection}>\n\t\t\t\t\t\tAdd {added.join(\", \")}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t\t{removed.length > 0 && (\n\t\t\t\t\t<p className={slots.cartLineSelection}>\n\t\t\t\t\t\tRemove {removed.join(\", \")}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t\t{item.comments && (\n\t\t\t\t\t<p className={slots.cartLineSelection}>\n\t\t\t\t\t\tComments: {item.comments}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t\t<p className={slots.cartLinePrice}>{money(getItemTotal(item))}</p>\n\t\t\t</div>\n\n\t\t\t<div className={slots.cartLineControls}>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-label=\"Edit item\"\n\t\t\t\t\tclassName={slots.incrementButton}\n\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\topen(\"EDIT_ITEM_MODAL\", {\n\t\t\t\t\t\t\tbaseItemId: item.base_item_id,\n\t\t\t\t\t\t\tseed: item,\n\t\t\t\t\t\t\teditIndex: index,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t<Pencil className=\"w-5 h-5\" />\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={slots.incrementButton}\n\t\t\t\t\tonClick={() => setQuantity(item.quantity - 1)}\n\t\t\t\t>\n\t\t\t\t\t<Minus className=\"w-5 h-5\" />\n\t\t\t\t</button>\n\t\t\t\t<p className={slots.cartLineQuantity}>{item.quantity}</p>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={slots.incrementButton}\n\t\t\t\t\tonClick={() => setQuantity(item.quantity + 1)}\n\t\t\t\t>\n\t\t\t\t\t<Plus className=\"w-5 h-5\" />\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\n/** Every line in the cart. */\nexport function OrderLines({\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\tslots?: CheckoutFormSlots;\n}) {\n\tconst { items, removeItem } = useCart();\n\n\treturn (\n\t\t<div className={slots.cartList}>\n\t\t\t{items.map((item, index) => (\n\t\t\t\t<OrderLine\n\t\t\t\t\tkey={`${item.item_id}-${index}`}\n\t\t\t\t\titem={item}\n\t\t\t\t\tindex={index}\n\t\t\t\t\tonRemove={() => removeItem(index)}\n\t\t\t\t\tslots={slots}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { useCart } from \"@zorgo/universal/hooks/hooks\";\nimport { cn, money } from \"../ItemForm/classes\";\nimport { CHECKOUT_FORM_SLOTS, type CheckoutFormSlots } from \"./classes\";\n\n/** Subtotal, discount, tax, service fee, total. */\nexport function OrderTotals({\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\tslots?: CheckoutFormSlots;\n}) {\n\tconst { subtotal, discount, tax, serviceFee, total } = useCart();\n\n\treturn (\n\t\t<div className={cn(slots.totals, slots.surface)}>\n\t\t\t<div className={slots.totalsRow}>\n\t\t\t\t<span>Subtotal</span>\n\t\t\t\t<span>{money(subtotal)}</span>\n\t\t\t</div>\n\t\t\t{discount > 0 && (\n\t\t\t\t<div className={slots.totalsRow}>\n\t\t\t\t\t<span>Discount</span>\n\t\t\t\t\t<span>{money(-discount)}</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div className={slots.totalsRow}>\n\t\t\t\t<span>Tax</span>\n\t\t\t\t<span>{money(tax)}</span>\n\t\t\t</div>\n\t\t\t{serviceFee > 0 && (\n\t\t\t\t<div className={slots.totalsRow}>\n\t\t\t\t\t<span>Service fee</span>\n\t\t\t\t\t<span>{money(serviceFee)}</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div className={slots.totalsDivider} />\n\t\t\t<div className={slots.totalsTotalRow}>\n\t\t\t\t<span>Total</span>\n\t\t\t\t<span>{money(total)}</span>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { usePromotions } from \"@zorgo/universal/hooks/hooks\";\nimport { cn } from \"../ItemForm/classes\";\nimport { CHECKOUT_FORM_SLOTS, type CheckoutFormSlots } from \"./classes\";\n\n/** Promo code entry; swaps to the applied-promo row once one sticks. */\nexport function PromoCode({\n\tplaceholder = \"Promo code\",\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\tplaceholder?: string;\n\tslots?: CheckoutFormSlots;\n}) {\n\tconst { promoCode, appliedPromo, applyPromo, removePromo, error, loading } =\n\t\tusePromotions();\n\tconst [draft, setDraft] = useState(\"\");\n\n\tif (appliedPromo) {\n\t\treturn (\n\t\t\t<div className={cn(slots.promoApplied, slots.surface)}>\n\t\t\t\t<span className={slots.promoAppliedLabel}>\n\t\t\t\t\t{appliedPromo.name} applied\n\t\t\t\t</span>\n\t\t\t\t{promoCode && (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={removePromo}\n\t\t\t\t\t\tclassName={slots.secondaryButton}\n\t\t\t\t\t>\n\t\t\t\t\t\tRemove\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2 w-full\">\n\t\t\t<div className={slots.promoRow}>\n\t\t\t\t<input\n\t\t\t\t\tvalue={draft}\n\t\t\t\t\tonChange={(e) => setDraft(e.target.value)}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\tclassName={slots.promoInput}\n\t\t\t\t/>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tdisabled={loading || !draft.trim()}\n\t\t\t\t\tonClick={() => applyPromo(draft)}\n\t\t\t\t\tclassName={cn(slots.primaryButton, \"shrink-0\")}\n\t\t\t\t>\n\t\t\t\t\t{loading ? \"Applying…\" : \"Apply\"}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{error && <p className={slots.promoError}>{error}</p>}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { PaymentElement, useElements, useStripe } from \"@stripe/react-stripe-js\";\nimport { DynamicFormShell, SubmitButton } from \"@zorgo/universal/components/Form\";\nimport { useCustomer, usePayment } from \"@zorgo/universal/hooks/hooks\";\nimport { cn, money } from \"../ItemForm/classes\";\nimport { CheckoutSteps } from \"./CheckoutSteps\";\nimport { CHECKOUT_FORM_SLOTS, type CheckoutFormSlots } from \"./classes\";\n\n/** Step 2: the Stripe payment element. Must be rendered inside `<Elements>`. */\nexport function PaymentStep({\n\tslots = CHECKOUT_FORM_SLOTS,\n\tcheckoutHref = \"/checkout\",\n}: {\n\tslots?: CheckoutFormSlots;\n\tcheckoutHref?: string;\n}) {\n\tconst stripe = useStripe();\n\tconst elements = useElements();\n\tconst {\n\t\ttotal,\n\t\tclientSecret,\n\t\tsubmitPayment,\n\t\tpaymentElementOptions,\n\t\tgetReturnUrl,\n\t\tresetCheckout,\n\t} = usePayment();\n\tconst { customer } = useCustomer();\n\tconst [submitError, setSubmitError] = useState<string | undefined>();\n\n\tconst handleSubmit = async () => {\n\t\tif (!stripe || !elements || !clientSecret) return;\n\n\t\tconst { error } = await elements.submit();\n\t\tif (error) {\n\t\t\tsetSubmitError(error.message ?? \"Please check your card details.\");\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst returnUrl = `${getReturnUrl()}${checkoutHref.startsWith(\"/\") ? checkoutHref : `/${checkoutHref}`}`;\n\t\tconst result = await submitPayment(\n\t\t\tstripe,\n\t\t\telements,\n\t\t\tclientSecret,\n\t\t\treturnUrl,\n\t\t\tcustomer,\n\t\t);\n\t\tif (!result.success) setSubmitError(result.error);\n\t};\n\n\treturn (\n\t\t<div className={slots.stepSection}>\n\t\t\t<CheckoutSteps current={2} slots={slots} />\n\n\t\t\t<DynamicFormShell onSubmit={handleSubmit} className={slots.form}>\n\t\t\t\t<div className={cn(slots.paymentSurface, slots.surface)}>\n\t\t\t\t\t<PaymentElement options={paymentElementOptions} />\n\t\t\t\t</div>\n\n\t\t\t\t{submitError && (\n\t\t\t\t\t<p className={slots.submitError}>{submitError}</p>\n\t\t\t\t)}\n\n\t\t\t\t<div className={slots.formActions}>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={resetCheckout}\n\t\t\t\t\t\tclassName={slots.secondaryButton}\n\t\t\t\t\t>\n\t\t\t\t\t\tBack to order\n\t\t\t\t\t</button>\n\t\t\t\t\t<SubmitButton\n\t\t\t\t\t\tlabel={`Pay ${money(total ?? 0)}`}\n\t\t\t\t\t\tloadingLabel=\"Processing...\"\n\t\t\t\t\t\tclassName={cn(\"flex-1\", slots.primaryButton)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</DynamicFormShell>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../ItemForm/classes\";\nimport { CHECKOUT_FORM_SLOTS, type CheckoutFormSlots } from \"./classes\";\n\n/** Terminal states: empty cart, payment result, errors, location prompt. */\nexport function StatusPanel({\n\ttitle,\n\tmessage,\n\taction,\n\ttone = \"default\",\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\ttitle: string;\n\tmessage?: string;\n\taction: ReactNode;\n\ttone?: \"default\" | \"error\";\n\tslots?: CheckoutFormSlots;\n}) {\n\treturn (\n\t\t<div className={cn(slots.statusPanel, slots.surface)}>\n\t\t\t<h2 className={slots.statusTitle}>{title}</h2>\n\t\t\t{message && (\n\t\t\t\t<p\n\t\t\t\t\tclassName={\n\t\t\t\t\t\ttone === \"error\"\n\t\t\t\t\t\t\t? slots.statusMessageError\n\t\t\t\t\t\t\t: slots.statusMessage\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{message}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t<div className={slots.statusActions}>{action}</div>\n\t\t</div>\n\t);\n}\n"],"mappings":"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","names":["money","import_react","t","n","o","o","s","r","t","n","i","o","s","import_react","import_react","import_react","t","f","c","s","r","t","o","t","s","a","r","import_react","t","r","n","r","n","a","t","a","n","x","r","s","t","l","i","o","y","f","u","d","p","c","T","k","v","S","M","n","r","w","a","E","j","import_react","u","t","n","i","l","c","o","u","import_react","import_react","c","u","r","a","b","t","s","l","m","n","F","S","A","i","x","r","t","n","a","b","s","o","l","c","u","f","E","d","C","p","D","j","M","import_react","n","l","i","u","d","c","o","t","r","t","s","r","t","o","l","n","import_react","f","r","import_react","t","c","ne","n","q","w","M","s","l","b","S","f","d","o","i","a","y","C","p","h","r","v","ie","k","O","U","H","u","K","m","j","A","F","Y","I","$","ge","T","x","N","import_menuUtils","import_jsx_runtime","d","Link","Image","import_link","import_react","import_menuSlugs","import_jsx_runtime","cn","money","d","ItemCard","Link","cn","money","d","import_react","import_hooks","import_link","import_lucide_react","import_jsx_runtime","cn","d","Link","import_jsx_runtime","import_jsx_runtime","cn","import_jsx_runtime","c","import_portionUtils","import_jsx_runtime","cn","i","import_jsx_runtime","import_lucide_react","import_jsx_runtime","q","import_portionUtils","import_jsx_runtime","money","import_jsx_runtime","money","import_jsx_runtime","v","money","import_jsx_runtime","c","s","import_react","import_lucide_react","import_jsx_runtime","cn","q","a","b","d","d","cn","import_react","import_link","import_react_stripe_js","import_hooks","import_jsx_runtime","import_react","import_Form","import_hooks","import_jsx_runtime","i","n","cn","import_jsx_runtime","import_Form","import_hooks","import_jsx_runtime","cn","import_lucide_react","import_hooks","import_jsx_runtime","s","c","cn","money","import_hooks","import_jsx_runtime","cn","money","import_react","import_hooks","import_jsx_runtime","cn","import_jsx_runtime","cn","import_react","import_Form","import_hooks","import_jsx_runtime","cn","money","import_jsx_runtime","cn","import_jsx_runtime","Link","cn"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/client/index.ts","../src/components/client/CookieConsent.tsx","../../../node_modules/@headlessui/react/dist/utils/env.js","../../../node_modules/@headlessui/react/dist/hooks/use-disposables.js","../../../node_modules/@headlessui/react/dist/utils/micro-task.js","../../../node_modules/@headlessui/react/dist/utils/disposables.js","../../../node_modules/@headlessui/react/dist/hooks/use-event.js","../../../node_modules/@headlessui/react/dist/hooks/use-latest-value.js","../../../node_modules/@headlessui/react/dist/hooks/use-iso-morphic-effect.js","../../../node_modules/@headlessui/react/dist/utils/render.js","../../../node_modules/@headlessui/react/dist/utils/class-names.js","../../../node_modules/@headlessui/react/dist/utils/match.js","../../../node_modules/@headlessui/react/dist/hooks/use-sync-refs.js","../../../node_modules/@headlessui/react/dist/hooks/use-transition.js","../../../node_modules/@headlessui/react/dist/hooks/use-flags.js","../../../node_modules/@headlessui/react/dist/internal/open-closed.js","../../../node_modules/@headlessui/react/dist/hooks/use-server-handoff-complete.js","../../../node_modules/@headlessui/react/dist/hooks/use-is-mounted.js","../../../node_modules/@headlessui/react/dist/components/transition/transition.js","../src/components/client/ItemCard.tsx","../src/images.ts","../src/components/client/ItemForm/classes.ts","../src/components/client/GridMenu.tsx","../src/components/client/AccordionMenu.tsx","../src/components/client/Accordion.tsx","../src/components/client/ItemForm/ClientItemForm.tsx","../src/components/client/ItemForm/Breadcrumbs.tsx","../src/components/client/ItemForm/CommentsSection.tsx","../src/components/client/ItemForm/ComponentsSection.tsx","../src/components/client/ItemForm/OptionButton.tsx","../src/components/client/ItemForm/PortionPicker.tsx","../src/components/client/ItemForm/PortionSection.tsx","../src/components/client/ItemForm/QuantitySection.tsx","../src/components/client/ItemForm/RuleSection.tsx","../src/components/client/ItemForm/SubmitButton.tsx","../src/components/client/ItemForm/VariantSection.tsx","../src/components/client/OpenStatus.tsx","../../../node_modules/date-fns/locale/en-US/_lib/formatDistance.js","../../../node_modules/date-fns/locale/_lib/buildFormatLongFn.js","../../../node_modules/date-fns/locale/en-US/_lib/formatLong.js","../../../node_modules/date-fns/locale/en-US/_lib/formatRelative.js","../../../node_modules/date-fns/locale/_lib/buildLocalizeFn.js","../../../node_modules/date-fns/locale/en-US/_lib/localize.js","../../../node_modules/date-fns/locale/_lib/buildMatchFn.js","../../../node_modules/date-fns/locale/_lib/buildMatchPatternFn.js","../../../node_modules/date-fns/locale/en-US/_lib/match.js","../../../node_modules/date-fns/locale/en-US.js","../../../node_modules/date-fns/_lib/defaultOptions.js","../../../node_modules/date-fns/constants.js","../../../node_modules/date-fns/constructFrom.js","../../../node_modules/date-fns/toDate.js","../../../node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js","../../../node_modules/date-fns/_lib/normalizeDates.js","../../../node_modules/date-fns/startOfDay.js","../../../node_modules/date-fns/differenceInCalendarDays.js","../../../node_modules/date-fns/startOfYear.js","../../../node_modules/date-fns/getDayOfYear.js","../../../node_modules/date-fns/startOfWeek.js","../../../node_modules/date-fns/startOfISOWeek.js","../../../node_modules/date-fns/getISOWeekYear.js","../../../node_modules/date-fns/startOfISOWeekYear.js","../../../node_modules/date-fns/getISOWeek.js","../../../node_modules/date-fns/getWeekYear.js","../../../node_modules/date-fns/startOfWeekYear.js","../../../node_modules/date-fns/getWeek.js","../../../node_modules/date-fns/_lib/addLeadingZeros.js","../../../node_modules/date-fns/_lib/format/lightFormatters.js","../../../node_modules/date-fns/_lib/format/formatters.js","../../../node_modules/date-fns/_lib/format/longFormatters.js","../../../node_modules/date-fns/_lib/protectedTokens.js","../../../node_modules/date-fns/isDate.js","../../../node_modules/date-fns/isValid.js","../../../node_modules/date-fns/format.js","../../../node_modules/date-fns/getDefaultOptions.js","../../../node_modules/date-fns-tz/dist/esm/_lib/tzIntlTimeZoneName/index.js","../../../node_modules/date-fns-tz/dist/esm/_lib/tzTokenizeDate/index.js","../../../node_modules/date-fns-tz/dist/esm/_lib/newDateUTC/index.js","../../../node_modules/date-fns-tz/dist/esm/_lib/tzParseTimezone/index.js","../../../node_modules/date-fns-tz/dist/esm/format/formatters/index.js","../../../node_modules/date-fns-tz/dist/esm/_lib/getTimezoneOffsetInMilliseconds/index.js","../../../node_modules/date-fns-tz/dist/esm/_lib/tzPattern/index.js","../../../node_modules/date-fns-tz/dist/esm/toDate/index.js","../../../node_modules/date-fns-tz/dist/esm/format/index.js","../../../node_modules/date-fns-tz/dist/esm/toZonedTime/index.js","../../../node_modules/date-fns-tz/dist/esm/formatInTimeZone/index.js","../src/components/client/LocationCard.tsx","../src/components/client/FindLocation.tsx","../src/components/client/CheckoutForm/classes.ts","../src/components/client/CheckoutForm/CheckoutForm.tsx","../src/components/client/CheckoutForm/CheckoutShell.tsx","../src/components/client/CheckoutForm/DetailsStep.tsx","../src/components/client/CheckoutForm/CheckoutSteps.tsx","../src/components/client/CheckoutForm/ConsentFields.tsx","../src/components/client/CheckoutForm/ContactFields.tsx","../src/components/client/CheckoutForm/OrderLine.tsx","../src/components/client/CheckoutForm/OrderTotals.tsx","../src/components/client/CheckoutForm/PromoCode.tsx","../src/components/client/CheckoutForm/PaymentStep.tsx","../src/components/client/CheckoutForm/StatusPanel.tsx","../src/components/client/StickyButton.tsx","../src/components/client/Button.tsx","../src/components/client/NavLink.tsx","../src/components/client/FaqAccordion.tsx","../src/components/client/Gallery.tsx","../src/components/client/Testimonials.tsx","../src/components/client/CategoryTiles.tsx","../src/components/client/Section.tsx","../src/components/client/PageHero.tsx"],"sourcesContent":["// Un-obfuscated component bundle (dist/components.*) — see tsup.config.ts.\n// Consumers import from \"@zorgo/next/components\"; the consumer's Tailwind scans\n// this bundle via @source. Add new components here.\nexport { CookieConsent } from \"./CookieConsent\";\nexport {\n\tItemCard,\n\ttype ItemCardItemClasses,\n\ttype ItemCardProps,\n\tITEM_CARD_DEFAULT_ITEM_CLASSES,\n\tmergeItemCardItemClasses,\n} from \"./ItemCard\";\nexport {\n\tGridMenu,\n\ttype GridMenuItemClasses,\n\tGRID_MENU_DEFAULT_ITEM_CLASSES,\n\tmergeGridMenuItemClasses,\n} from \"./GridMenu\";\nexport {\n\tAccordionMenu,\n\ttype AccordionMenuItemClasses,\n\tACCORDION_MENU_DEFAULT_ITEM_CLASSES,\n\tmergeAccordionMenuItemClasses,\n} from \"./AccordionMenu\";\n// ClientItemForm plus the sections it is built from — Breadcrumbs,\n// PortionPicker, VariantSection, RuleSection, … — so a custom form can reuse\n// the pieces it wants. See ./ItemForm/index.ts.\nexport * from \"./ItemForm\";\n// Pre-1.2 names. ItemCustomizationClient was a wrapper that only supplied the\n// post-submit navigation ClientItemForm now defaults to. Drop these once every\n// site is on the new names.\nexport {\n\tClientItemForm as ItemCustomizationForm,\n\tClientItemForm as ItemCustomizationClient,\n\ttype ClientItemFormItemClasses as ItemCustomizationFormItemClasses,\n\tCLIENT_ITEM_FORM_DEFAULT_ITEM_CLASSES as ITEM_CUSTOMIZATION_FORM_DEFAULT_ITEM_CLASSES,\n\tmergeClientItemFormItemClasses as mergeItemCustomizationFormItemClasses,\n} from \"./ItemForm\";\nexport {\n\tOpenStatus,\n\topenStatus,\n\ttype OpenStatusItemClasses,\n\ttype OpenStatusProps,\n\tOPEN_STATUS_DEFAULT_ITEM_CLASSES,\n\tmergeOpenStatusItemClasses,\n} from \"./OpenStatus\";\nexport {\n\tLocationCard,\n\tLocationsSection,\n\ttype LocationCardItemClasses,\n\ttype LocationCardProps,\n\ttype LocationsSectionProps,\n\tLOCATION_CARD_DEFAULT_ITEM_CLASSES,\n\tmergeLocationCardItemClasses,\n\tlocationMap,\n\tlocationGridClass,\n} from \"./LocationCard\";\nexport {\n\tFindLocation,\n\ttype FindLocationItemClasses,\n\tFIND_LOCATION_DEFAULT_ITEM_CLASSES,\n\tmergeFindLocationItemClasses,\n} from \"./FindLocation\";\n// CheckoutForm plus the pieces it is built from — OrderLine, OrderTotals,\n// PromoCode, ContactFields, … — so a custom checkout can reuse the pieces it\n// wants. See ./CheckoutForm/index.ts.\nexport * from \"./CheckoutForm\";\n\nexport {\n\tStickyButton,\n\tisStickyRoute,\n\ttype StickyButtonItemClasses,\n\ttype StickyButtonProps,\n\tSTICKY_BUTTON_DEFAULT_BAR_CLASS,\n} from \"./StickyButton\";\n\nexport {\n\tAccordionSection,\n\ttype AccordionSectionSlots,\n} from \"./Accordion\";\nexport {\n\tFaqAccordion,\n\ttype Faq,\n\ttype FaqAccordionItemClasses,\n\ttype FaqAccordionProps,\n\tFAQ_ACCORDION_DEFAULT_ITEM_CLASSES,\n\tmergeFaqAccordionItemClasses,\n} from \"./FaqAccordion\";\nexport {\n\tGallery,\n\ttype GalleryImage,\n\ttype GalleryItemClasses,\n\ttype GalleryProps,\n\tGALLERY_DEFAULT_ITEM_CLASSES,\n\tmergeGalleryItemClasses,\n} from \"./Gallery\";\nexport {\n\tTestimonials,\n\ttype Testimonial,\n\ttype TestimonialsItemClasses,\n\ttype TestimonialsProps,\n\tTESTIMONIALS_DEFAULT_ITEM_CLASSES,\n\tmergeTestimonialsItemClasses,\n} from \"./Testimonials\";\nexport {\n\tCategoryTiles,\n\tcategoryAnchor,\n\ttype CategoryTilesItemClasses,\n\ttype CategoryTilesProps,\n\tCATEGORY_TILES_DEFAULT_ITEM_CLASSES,\n\tmergeCategoryTilesItemClasses,\n} from \"./CategoryTiles\";\n\n// Design primitives from the Modish checklist (ZOR-402) — every site inherits\n// these; none of them are meant to be re-forked per franchise.\nexport {\n\tSection,\n\ttype SectionItemClasses,\n\ttype SectionProps,\n\tSECTION_DEFAULT_ITEM_CLASSES,\n\tmergeSectionItemClasses,\n} from \"./Section\";\nexport {\n\tPageHero,\n\ttype PageHeroSize,\n\ttype PageHeroItemClasses,\n\ttype PageHeroProps,\n\tPAGE_HERO_DEFAULT_ITEM_CLASSES,\n\tmergePageHeroItemClasses,\n\theroHeightClass,\n\theroTitleTypeClass,\n} from \"./PageHero\";\nexport {\n\tButton,\n\ttype ButtonVariant,\n\ttype ButtonWidth,\n\ttype ButtonItemClasses,\n\ttype ButtonProps,\n\tBUTTON_DEFAULT_ITEM_CLASSES,\n\tmergeButtonItemClasses,\n\tbuttonWidthClass,\n} from \"./Button\";\nexport {\n\tNavLink,\n\ttype NavLinkItemClasses,\n\ttype NavLinkProps,\n\tNAV_LINK_DEFAULT_ITEM_CLASSES,\n\tmergeNavLinkItemClasses,\n\tisNavLinkActive,\n} from \"./NavLink\";\n\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { Transition } from \"@headlessui/react\";\nimport { useCustomer } from \"@zorgo/universal/hooks/hooks\";\n\nexport function CookieConsent() {\n\tconst { consentAnswered, setConsent } = useCustomer();\n\tconst [mounted, setMounted] = useState(false);\n\tuseEffect(() => { setMounted(true); }, []);\n\n\tif (!mounted) return null;\n\n\treturn (\n\t\t<Transition\n\t\t\tshow={!consentAnswered}\n\t\t\tenter=\"transition-opacity duration-300\"\n\t\t\tenterFrom=\"opacity-0\"\n\t\t\tenterTo=\"opacity-100\"\n\t\t\tleave=\"transition-opacity duration-200\"\n\t\t\tleaveFrom=\"opacity-100\"\n\t\t\tleaveTo=\"opacity-0\">\n\t\t\t<div\n\t\t\t\tclassName=\"fixed inset-x-0 bottom-0 z-[9999] flex flex-col items-center justify-center gap-4 bg-black/85 px-6 py-4 text-center text-sm text-white backdrop-blur md:flex-row\"\n\t\t\t\trole=\"alert\"\n\t\t\t\taria-live=\"polite\">\n\t\t\t\t<p className=\"m-0\">\n\t\t\t\t\tWe use cookies to improve your experience and collect anonymous usage\n\t\t\t\t\tdata.\n\t\t\t\t</p>\n\t\t\t\t<div className=\"flex shrink-0 flex-wrap items-center justify-center gap-2\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"whitespace-nowrap rounded-md px-4 py-2 text-sm font-medium text-zinc-500 hover:border-zinc-600 hover:bg-zinc-900 hover:text-zinc-400\"\n\t\t\t\t\t\tonClick={() => setConsent(false)}>\n\t\t\t\t\t\tReject\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"whitespace-nowrap rounded-md bg-white px-5 py-2 text-sm font-semibold text-black transition-colors hover:bg-gray-400\"\n\t\t\t\t\t\tonClick={() => setConsent(true)}>\n\t\t\t\t\t\tAccept\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Transition>\n\t);\n}\n","var i=Object.defineProperty;var d=(t,e,n)=>e in t?i(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var r=(t,e,n)=>(d(t,typeof e!=\"symbol\"?e+\"\":e,n),n);class o{constructor(){r(this,\"current\",this.detect());r(this,\"handoffState\",\"pending\");r(this,\"currentId\",0)}set(e){this.current!==e&&(this.handoffState=\"pending\",this.currentId=0,this.current=e)}reset(){this.set(this.detect())}nextId(){return++this.currentId}get isServer(){return this.current===\"server\"}get isClient(){return this.current===\"client\"}detect(){return typeof window==\"undefined\"||typeof document==\"undefined\"?\"server\":\"client\"}handoff(){this.handoffState===\"pending\"&&(this.handoffState=\"complete\")}get isHandoffComplete(){return this.handoffState===\"complete\"}}let s=new o;export{s as env};\n","import{useEffect as s,useState as o}from\"react\";import{disposables as t}from'../utils/disposables.js';function p(){let[e]=o(t);return s(()=>()=>e.dispose(),[e]),e}export{p as useDisposables};\n","function t(e){typeof queueMicrotask==\"function\"?queueMicrotask(e):Promise.resolve().then(e).catch(o=>setTimeout(()=>{throw o}))}export{t as microTask};\n","import{microTask as a}from'./micro-task.js';function o(){let s=[],r={addEventListener(e,t,n,i){return e.addEventListener(t,n,i),r.add(()=>e.removeEventListener(t,n,i))},requestAnimationFrame(...e){let t=requestAnimationFrame(...e);return r.add(()=>cancelAnimationFrame(t))},nextFrame(...e){return r.requestAnimationFrame(()=>r.requestAnimationFrame(...e))},setTimeout(...e){let t=setTimeout(...e);return r.add(()=>clearTimeout(t))},microTask(...e){let t={current:!0};return a(()=>{t.current&&e[0]()}),r.add(()=>{t.current=!1})},style(e,t,n){let i=e.style.getPropertyValue(t);return Object.assign(e.style,{[t]:n}),this.add(()=>{Object.assign(e.style,{[t]:i})})},group(e){let t=o();return e(t),this.add(()=>t.dispose())},add(e){return s.includes(e)||s.push(e),()=>{let t=s.indexOf(e);if(t>=0)for(let n of s.splice(t,1))n()}},dispose(){for(let e of s.splice(0))e()}};return r}export{o as disposables};\n","import a from\"react\";import{useLatestValue as n}from'./use-latest-value.js';let o=function(t){let e=n(t);return a.useCallback((...r)=>e.current(...r),[e])};export{o as useEvent};\n","import{useRef as t}from\"react\";import{useIsoMorphicEffect as o}from'./use-iso-morphic-effect.js';function s(e){let r=t(e);return o(()=>{r.current=e},[e]),r}export{s as useLatestValue};\n","import{useEffect as f,useLayoutEffect as c}from\"react\";import{env as i}from'../utils/env.js';let n=(e,t)=>{i.isServer?f(e,t):c(e,t)};export{n as useIsoMorphicEffect};\n","import E,{Fragment as j,cloneElement as v,createElement as S,forwardRef as w,isValidElement as k,useCallback as x,useRef as M}from\"react\";import{classNames as N}from'./class-names.js';import{match as O}from'./match.js';var A=(a=>(a[a.None=0]=\"None\",a[a.RenderStrategy=1]=\"RenderStrategy\",a[a.Static=2]=\"Static\",a))(A||{}),C=(e=>(e[e.Unmount=0]=\"Unmount\",e[e.Hidden=1]=\"Hidden\",e))(C||{});function K(){let n=$();return x(r=>U({mergeRefs:n,...r}),[n])}function U({ourProps:n,theirProps:r,slot:e,defaultTag:a,features:s,visible:t=!0,name:l,mergeRefs:i}){i=i!=null?i:I;let o=P(r,n);if(t)return F(o,e,a,l,i);let y=s!=null?s:0;if(y&2){let{static:f=!1,...u}=o;if(f)return F(u,e,a,l,i)}if(y&1){let{unmount:f=!0,...u}=o;return O(f?0:1,{[0](){return null},[1](){return F({...u,hidden:!0,style:{display:\"none\"}},e,a,l,i)}})}return F(o,e,a,l,i)}function F(n,r={},e,a,s){let{as:t=e,children:l,refName:i=\"ref\",...o}=h(n,[\"unmount\",\"static\"]),y=n.ref!==void 0?{[i]:n.ref}:{},f=typeof l==\"function\"?l(r):l;\"className\"in o&&o.className&&typeof o.className==\"function\"&&(o.className=o.className(r)),o[\"aria-labelledby\"]&&o[\"aria-labelledby\"]===o.id&&(o[\"aria-labelledby\"]=void 0);let u={};if(r){let d=!1,p=[];for(let[c,T]of Object.entries(r))typeof T==\"boolean\"&&(d=!0),T===!0&&p.push(c.replace(/([A-Z])/g,g=>`-${g.toLowerCase()}`));if(d){u[\"data-headlessui-state\"]=p.join(\" \");for(let c of p)u[`data-${c}`]=\"\"}}if(b(t)&&(Object.keys(m(o)).length>0||Object.keys(m(u)).length>0))if(!k(f)||Array.isArray(f)&&f.length>1||D(f)){if(Object.keys(m(o)).length>0)throw new Error(['Passing props on \"Fragment\"!',\"\",`The current component <${a} /> is rendering a \"Fragment\".`,\"However we need to passthrough the following props:\",Object.keys(m(o)).concat(Object.keys(m(u))).map(d=>` - ${d}`).join(`\n`),\"\",\"You can apply a few solutions:\",['Add an `as=\"...\"` prop, to ensure that we render an actual element instead of a \"Fragment\".',\"Render a single element as the child so that we can forward the props onto that element.\"].map(d=>` - ${d}`).join(`\n`)].join(`\n`))}else{let d=f.props,p=d==null?void 0:d.className,c=typeof p==\"function\"?(...R)=>N(p(...R),o.className):N(p,o.className),T=c?{className:c}:{},g=P(f.props,m(h(o,[\"ref\"])));for(let R in u)R in g&&delete u[R];return v(f,Object.assign({},g,u,y,{ref:s(H(f),y.ref)},T))}return S(t,Object.assign({},h(o,[\"ref\"]),!b(t)&&y,!b(t)&&u),f)}function $(){let n=M([]),r=x(e=>{for(let a of n.current)a!=null&&(typeof a==\"function\"?a(e):a.current=e)},[]);return(...e)=>{if(!e.every(a=>a==null))return n.current=e,r}}function I(...n){return n.every(r=>r==null)?void 0:r=>{for(let e of n)e!=null&&(typeof e==\"function\"?e(r):e.current=r)}}function P(...n){var a;if(n.length===0)return{};if(n.length===1)return n[0];let r={},e={};for(let s of n)for(let t in s)t.startsWith(\"on\")&&typeof s[t]==\"function\"?((a=e[t])!=null||(e[t]=[]),e[t].push(s[t])):r[t]=s[t];if(r.disabled||r[\"aria-disabled\"])for(let s in e)/^(on(?:Click|Pointer|Mouse|Key)(?:Down|Up|Press)?)$/.test(s)&&(e[s]=[t=>{var l;return(l=t==null?void 0:t.preventDefault)==null?void 0:l.call(t)}]);for(let s in e)Object.assign(r,{[s](t,...l){let i=e[s];for(let o of i){if((t instanceof Event||(t==null?void 0:t.nativeEvent)instanceof Event)&&t.defaultPrevented)return;o(t,...l)}}});return r}function V(...n){var a;if(n.length===0)return{};if(n.length===1)return n[0];let r={},e={};for(let s of n)for(let t in s)t.startsWith(\"on\")&&typeof s[t]==\"function\"?((a=e[t])!=null||(e[t]=[]),e[t].push(s[t])):r[t]=s[t];for(let s in e)Object.assign(r,{[s](...t){let l=e[s];for(let i of l)i==null||i(...t)}});return r}function Y(n){var r;return Object.assign(w(n),{displayName:(r=n.displayName)!=null?r:n.name})}function m(n){let r=Object.assign({},n);for(let e in r)r[e]===void 0&&delete r[e];return r}function h(n,r=[]){let e=Object.assign({},n);for(let a of r)a in e&&delete e[a];return e}function H(n){return E.version.split(\".\")[0]>=\"19\"?n.props.ref:n.ref}function b(n){return n===j||n===Symbol.for(\"react.fragment\")}function D(n){return b(n.type)}export{A as RenderFeatures,C as RenderStrategy,m as compact,Y as forwardRefWithAs,b as isFragment,D as isFragmentInstance,V as mergeProps,K as useRender};\n","function t(...r){return Array.from(new Set(r.flatMap(n=>typeof n==\"string\"?n.split(\" \"):[]))).filter(Boolean).join(\" \")}export{t as classNames};\n","function u(r,n,...a){if(r in n){let e=n[r];return typeof e==\"function\"?e(...a):e}let t=new Error(`Tried to handle \"${r}\" but there is no handler defined. Only defined handlers are: ${Object.keys(n).map(e=>`\"${e}\"`).join(\", \")}.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,u),t}export{u as match};\n","import{useEffect as l,useRef as i}from\"react\";import{useEvent as r}from'./use-event.js';let u=Symbol();function T(t,n=!0){return Object.assign(t,{[u]:n})}function y(...t){let n=i(t);l(()=>{n.current=t},[t]);let c=r(e=>{for(let o of n.current)o!=null&&(typeof o==\"function\"?o(e):o.current=e)});return t.every(e=>e==null||(e==null?void 0:e[u]))?void 0:c}export{T as optionalRef,y as useSyncRefs};\n","var T,S;import{useRef as c,useState as b}from\"react\";import{disposables as m}from'../utils/disposables.js';import{useDisposables as g}from'./use-disposables.js';import{useFlags as y}from'./use-flags.js';import{useIsoMorphicEffect as L}from'./use-iso-morphic-effect.js';typeof process!=\"undefined\"&&typeof globalThis!=\"undefined\"&&typeof Element!=\"undefined\"&&((T=process==null?void 0:process.env)==null?void 0:T[\"NODE_ENV\"])===\"test\"&&typeof((S=Element==null?void 0:Element.prototype)==null?void 0:S.getAnimations)==\"undefined\"&&(Element.prototype.getAnimations=function(){return console.warn([\"Headless UI has polyfilled `Element.prototype.getAnimations` for your tests.\",\"Please install a proper polyfill e.g. `jsdom-testing-mocks`, to silence these warnings.\",\"\",\"Example usage:\",\"```js\",\"import { mockAnimationsApi } from 'jsdom-testing-mocks'\",\"mockAnimationsApi()\",\"```\"].join(`\n`)),[]});var A=(i=>(i[i.None=0]=\"None\",i[i.Closed=1]=\"Closed\",i[i.Enter=2]=\"Enter\",i[i.Leave=4]=\"Leave\",i))(A||{});function x(e){let r={};for(let t in e)e[t]===!0&&(r[`data-${t}`]=\"\");return r}function N(e,r,t,n){let[i,a]=b(t),{hasFlag:s,addFlag:o,removeFlag:l}=y(e&&i?3:0),u=c(!1),f=c(!1),E=g();return L(()=>{var d;if(e){if(t&&a(!0),!r){t&&o(3);return}return(d=n==null?void 0:n.start)==null||d.call(n,t),C(r,{inFlight:u,prepare(){f.current?f.current=!1:f.current=u.current,u.current=!0,!f.current&&(t?(o(3),l(4)):(o(4),l(2)))},run(){f.current?t?(l(3),o(4)):(l(4),o(3)):t?l(1):o(1)},done(){var p;f.current&&D(r)||(u.current=!1,l(7),t||a(!1),(p=n==null?void 0:n.end)==null||p.call(n,t))}})}},[e,t,r,E]),e?[i,{closed:s(1),enter:s(2),leave:s(4),transition:s(2)||s(4)}]:[t,{closed:void 0,enter:void 0,leave:void 0,transition:void 0}]}function C(e,{prepare:r,run:t,done:n,inFlight:i}){let a=m();return j(e,{prepare:r,inFlight:i}),a.nextFrame(()=>{t(),a.requestAnimationFrame(()=>{a.add(M(e,n))})}),a.dispose}function M(e,r){var a,s;let t=m();if(!e)return t.dispose;let n=!1;t.add(()=>{n=!0});let i=(s=(a=e.getAnimations)==null?void 0:a.call(e).filter(o=>o instanceof CSSTransition))!=null?s:[];return i.length===0?(r(),t.dispose):(Promise.allSettled(i.map(o=>o.finished)).then(()=>{n||r()}),t.dispose)}function j(e,{inFlight:r,prepare:t}){if(r!=null&&r.current){t();return}let n=e.style.transition;e.style.transition=\"none\",t(),e.offsetHeight,e.style.transition=n}function D(e){var t,n;return((n=(t=e.getAnimations)==null?void 0:t.call(e))!=null?n:[]).some(i=>i instanceof CSSTransition&&i.playState!==\"finished\")}export{x as transitionDataAttributes,N as useTransition};\n","import{useCallback as t,useState as b}from\"react\";function c(u=0){let[r,a]=b(u),g=t(e=>a(e),[]),s=t(e=>a(l=>l|e),[]),m=t(e=>(r&e)===e,[r]),n=t(e=>a(l=>l&~e),[]),F=t(e=>a(l=>l^e),[]);return{flags:r,setFlag:g,addFlag:s,hasFlag:m,removeFlag:n,toggleFlag:F}}export{c as useFlags};\n","import r,{createContext as l,useContext as d}from\"react\";let n=l(null);n.displayName=\"OpenClosedContext\";var i=(e=>(e[e.Open=1]=\"Open\",e[e.Closed=2]=\"Closed\",e[e.Closing=4]=\"Closing\",e[e.Opening=8]=\"Opening\",e))(i||{});function u(){return d(n)}function c({value:o,children:t}){return r.createElement(n.Provider,{value:o},t)}function s({children:o}){return r.createElement(n.Provider,{value:null},o)}export{c as OpenClosedProvider,s as ResetOpenClosedProvider,i as State,u as useOpenClosed};\n","import*as t from\"react\";import{env as f}from'../utils/env.js';function s(){let r=typeof document==\"undefined\";return\"useSyncExternalStore\"in t?(o=>o.useSyncExternalStore)(t)(()=>()=>{},()=>!1,()=>!r):!1}function l(){let r=s(),[e,n]=t.useState(f.isHandoffComplete);return e&&f.isHandoffComplete===!1&&n(!1),t.useEffect(()=>{e!==!0&&n(!0)},[e]),t.useEffect(()=>f.handoff(),[]),r?!1:e}export{l as useServerHandoffComplete};\n","import{useRef as r}from\"react\";import{useIsoMorphicEffect as t}from'./use-iso-morphic-effect.js';function f(){let e=r(!1);return t(()=>(e.current=!0,()=>{e.current=!1}),[]),e}export{f as useIsMounted};\n","\"use client\";import c,{Fragment as k,createContext as ne,useContext as q,useEffect as ge,useMemo as ie,useRef as b,useState as O}from\"react\";import{useDisposables as ve}from'../../hooks/use-disposables.js';import{useEvent as E}from'../../hooks/use-event.js';import{useIsMounted as be}from'../../hooks/use-is-mounted.js';import{useIsoMorphicEffect as D}from'../../hooks/use-iso-morphic-effect.js';import{useLatestValue as Ee}from'../../hooks/use-latest-value.js';import{useServerHandoffComplete as re}from'../../hooks/use-server-handoff-complete.js';import{useSyncRefs as oe}from'../../hooks/use-sync-refs.js';import{transitionDataAttributes as Se,useTransition as Re}from'../../hooks/use-transition.js';import{OpenClosedProvider as ye,State as x,useOpenClosed as se}from'../../internal/open-closed.js';import{classNames as Pe}from'../../utils/class-names.js';import{match as le}from'../../utils/match.js';import{RenderFeatures as xe,RenderStrategy as P,compact as Ne,forwardRefWithAs as J,isFragment as _e,useRender as ae}from'../../utils/render.js';function ue(e){var t;return!!(e.enter||e.enterFrom||e.enterTo||e.leave||e.leaveFrom||e.leaveTo)||!_e((t=e.as)!=null?t:de)||c.Children.count(e.children)===1}let V=ne(null);V.displayName=\"TransitionContext\";var De=(n=>(n.Visible=\"visible\",n.Hidden=\"hidden\",n))(De||{});function He(){let e=q(V);if(e===null)throw new Error(\"A <Transition.Child /> is used but it is missing a parent <Transition /> or <Transition.Root />.\");return e}function Ae(){let e=q(w);if(e===null)throw new Error(\"A <Transition.Child /> is used but it is missing a parent <Transition /> or <Transition.Root />.\");return e}let w=ne(null);w.displayName=\"NestingContext\";function M(e){return\"children\"in e?M(e.children):e.current.filter(({el:t})=>t.current!==null).filter(({state:t})=>t===\"visible\").length>0}function Te(e,t){let n=Ee(e),l=b([]),S=be(),R=ve(),d=E((o,i=P.Hidden)=>{let a=l.current.findIndex(({el:s})=>s===o);a!==-1&&(le(i,{[P.Unmount](){l.current.splice(a,1)},[P.Hidden](){l.current[a].state=\"hidden\"}}),R.microTask(()=>{var s;!M(l)&&S.current&&((s=n.current)==null||s.call(n))}))}),y=E(o=>{let i=l.current.find(({el:a})=>a===o);return i?i.state!==\"visible\"&&(i.state=\"visible\"):l.current.push({el:o,state:\"visible\"}),()=>d(o,P.Unmount)}),C=b([]),p=b(Promise.resolve()),h=b({enter:[],leave:[]}),g=E((o,i,a)=>{C.current.splice(0),t&&(t.chains.current[i]=t.chains.current[i].filter(([s])=>s!==o)),t==null||t.chains.current[i].push([o,new Promise(s=>{C.current.push(s)})]),t==null||t.chains.current[i].push([o,new Promise(s=>{Promise.all(h.current[i].map(([r,f])=>f)).then(()=>s())})]),i===\"enter\"?p.current=p.current.then(()=>t==null?void 0:t.wait.current).then(()=>a(i)):a(i)}),v=E((o,i,a)=>{Promise.all(h.current[i].splice(0).map(([s,r])=>r)).then(()=>{var s;(s=C.current.shift())==null||s()}).then(()=>a(i))});return ie(()=>({children:l,register:y,unregister:d,onStart:g,onStop:v,wait:p,chains:h}),[y,d,l,g,v,h,p])}let de=k,fe=xe.RenderStrategy;function Fe(e,t){var ee,te;let{transition:n=!0,beforeEnter:l,afterEnter:S,beforeLeave:R,afterLeave:d,enter:y,enterFrom:C,enterTo:p,entered:h,leave:g,leaveFrom:v,leaveTo:o,...i}=e,[a,s]=O(null),r=b(null),f=ue(e),U=oe(...f?[r,t,s]:t===null?[]:[t]),H=(ee=i.unmount)==null||ee?P.Unmount:P.Hidden,{show:u,appear:z,initial:K}=He(),[m,j]=O(u?\"visible\":\"hidden\"),Q=Ae(),{register:A,unregister:F}=Q;D(()=>A(r),[A,r]),D(()=>{if(H===P.Hidden&&r.current){if(u&&m!==\"visible\"){j(\"visible\");return}return le(m,{[\"hidden\"]:()=>F(r),[\"visible\"]:()=>A(r)})}},[m,r,A,F,u,H]);let G=re();D(()=>{if(f&&G&&m===\"visible\"&&r.current===null)throw new Error(\"Did you forget to passthrough the `ref` to the actual DOM node?\")},[r,m,G,f]);let ce=K&&!z,Y=z&&u&&K,B=b(!1),I=Te(()=>{B.current||(j(\"hidden\"),F(r))},Q),Z=E(W=>{B.current=!0;let L=W?\"enter\":\"leave\";I.onStart(r,L,_=>{_===\"enter\"?l==null||l():_===\"leave\"&&(R==null||R())})}),$=E(W=>{let L=W?\"enter\":\"leave\";B.current=!1,I.onStop(r,L,_=>{_===\"enter\"?S==null||S():_===\"leave\"&&(d==null||d())}),L===\"leave\"&&!M(I)&&(j(\"hidden\"),F(r))});ge(()=>{f&&n||(Z(u),$(u))},[u,f,n]);let pe=(()=>!(!n||!f||!G||ce))(),[,T]=Re(pe,a,u,{start:Z,end:$}),Ce=Ne({ref:U,className:((te=Pe(i.className,Y&&y,Y&&C,T.enter&&y,T.enter&&T.closed&&C,T.enter&&!T.closed&&p,T.leave&&g,T.leave&&!T.closed&&v,T.leave&&T.closed&&o,!T.transition&&u&&h))==null?void 0:te.trim())||void 0,...Se(T)}),N=0;m===\"visible\"&&(N|=x.Open),m===\"hidden\"&&(N|=x.Closed),u&&m===\"hidden\"&&(N|=x.Opening),!u&&m===\"visible\"&&(N|=x.Closing);let he=ae();return c.createElement(w.Provider,{value:I},c.createElement(ye,{value:N},he({ourProps:Ce,theirProps:i,defaultTag:de,features:fe,visible:m===\"visible\",name:\"Transition.Child\"})))}function Ie(e,t){let{show:n,appear:l=!1,unmount:S=!0,...R}=e,d=b(null),y=ue(e),C=oe(...y?[d,t]:t===null?[]:[t]);re();let p=se();if(n===void 0&&p!==null&&(n=(p&x.Open)===x.Open),n===void 0)throw new Error(\"A <Transition /> is used but it is missing a `show={true | false}` prop.\");let[h,g]=O(n?\"visible\":\"hidden\"),v=Te(()=>{n||g(\"hidden\")}),[o,i]=O(!0),a=b([n]);D(()=>{o!==!1&&a.current[a.current.length-1]!==n&&(a.current.push(n),i(!1))},[a,n]);let s=ie(()=>({show:n,appear:l,initial:o}),[n,l,o]);D(()=>{n?g(\"visible\"):!M(v)&&d.current!==null&&g(\"hidden\")},[n,v]);let r={unmount:S},f=E(()=>{var u;o&&i(!1),(u=e.beforeEnter)==null||u.call(e)}),U=E(()=>{var u;o&&i(!1),(u=e.beforeLeave)==null||u.call(e)}),H=ae();return c.createElement(w.Provider,{value:v},c.createElement(V.Provider,{value:s},H({ourProps:{...r,as:k,children:c.createElement(me,{ref:C,...r,...R,beforeEnter:f,beforeLeave:U})},theirProps:{},defaultTag:k,features:fe,visible:h===\"visible\",name:\"Transition\"})))}function Le(e,t){let n=q(V)!==null,l=se()!==null;return c.createElement(c.Fragment,null,!n&&l?c.createElement(X,{ref:t,...e}):c.createElement(me,{ref:t,...e}))}let X=J(Ie),me=J(Fe),Oe=J(Le),Ke=Object.assign(X,{Child:Oe,Root:X});export{Ke as Transition,Oe as TransitionChild};\n","\"use client\";\n\nimport Image from \"next/image\";\nimport Link from \"next/link\";\nimport type { MenuItem } from \"@zorgo/universal/interfaces\";\nimport type { Menu } from \"@zorgo/universal/utils/menuUtils\";\nimport { menuItemSlug } from \"@zorgo/universal/utils/menuSlugs\";\nimport { menuImageUrl } from \"@zorgo/universal/utils/menuUtils\";\nimport { ITEM_IMAGE_PREFIX } from \"../../images\";\nimport { buildMenuItemJsonLd } from \"../../seo\";\nimport { cn, money } from \"./ItemForm/classes\";\n\n/** Per-slot Tailwind classes for a single item card. */\nexport type ItemCardItemClasses = Partial<{\n\tcard: string;\n\timageBox: string;\n\timage: string;\n\tplaceholder: string;\n\ttextContainer: string;\n\tname: string;\n\tprice: string;\n\toldPrice: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeItemCardItemClasses}.\n */\nexport const ITEM_CARD_DEFAULT_ITEM_CLASSES: Required<ItemCardItemClasses> = {\n\tcard: \"flex flex-col gap-4 no-underline hover:translate-y-[-2px] hover:opacity-75 transition-all duration-300\",\n\t// Tailwind ships only aspect-square/aspect-video; 4:5 needs the arbitrary\n\t// form. The ratio is fixed on the box, not the image, so a card with no\n\t// photo occupies exactly the same space as one with.\n\timageBox:\n\t\t\"w-full aspect-[4/5] bg-background-recessed rounded-2xl overflow-hidden\",\n\timage: \"w-full h-full object-cover\",\n\tplaceholder:\n\t\t\"w-full h-full flex items-center justify-center p-6 text-center text-2xl font-bold uppercase leading-tight opacity-40\",\n\ttextContainer: \"flex flex-col opacity-75 px-4 w-full\",\n\tname: \"text-xl font-semibold\",\n\tprice: \"text-lg\",\n\toldPrice: \"text-lg line-through opacity-60\",\n};\n\nexport function mergeItemCardItemClasses(overrides?: ItemCardItemClasses) {\n\tconst d = ITEM_CARD_DEFAULT_ITEM_CLASSES;\n\treturn {\n\t\tcard: cn(d.card, overrides?.card),\n\t\timageBox: cn(d.imageBox, overrides?.imageBox),\n\t\timage: cn(d.image, overrides?.image),\n\t\tplaceholder: cn(d.placeholder, overrides?.placeholder),\n\t\ttextContainer: cn(d.textContainer, overrides?.textContainer),\n\t\tname: cn(d.name, overrides?.name),\n\t\tprice: cn(d.price, overrides?.price),\n\t\toldPrice: cn(d.oldPrice, overrides?.oldPrice),\n\t};\n}\n\nexport type ItemCardProps = {\n\titemClasses?: ItemCardItemClasses;\n\t/** Widest slot the card occupies, per breakpoint. */\n\tsizes?: string;\n\tpriority?: boolean;\n\t/** Overrides the `/menu/[slug]` target — see {@link CategoryTiles}. */\n\thref?: string;\n\t/** Overrides the displayed name and the no-image tile's text. */\n\tlabel?: string;\n\t/** Emit this dish's MenuItem JSON-LD beside the card. Off by default: the\n\t * site-wide Restaurant node already carries every item under `hasMenu`. */\n\tjsonLd?: boolean;\n} & ({ item: MenuItem } | { menu: Menu; bid: number });\n\n/**\n * One clickable dish: photo (or a typographic tile when there is none), name,\n * price — linking to that item's page. Pass `item` directly, or `menu` + `bid`\n * to pick a base item out of the prebuilt menu.\n *\n * Renders nothing for a bid the menu does not contain.\n */\nexport function ItemCard({\n\titemClasses,\n\tsizes = \"(min-width: 1024px) 320px, (min-width: 640px) 50vw, 100vw\",\n\tpriority,\n\thref,\n\tlabel,\n\tjsonLd,\n\t...source\n}: ItemCardProps) {\n\tconst item =\n\t\t\"item\" in source\n\t\t\t? source.item\n\t\t\t: source.menu.items.find((i) => i.base_item_id === source.bid);\n\tif (!item) return null;\n\n\tconst slots = mergeItemCardItemClasses(itemClasses);\n\tconst imageUrl = menuImageUrl(item.images?.[0]);\n\t// display_price is baked onto the variant by the SDK when a promo is live\n\tconst variant = item.variants[0];\n\tconst onSale =\n\t\tvariant?.display_price != null && variant.display_price < variant.price;\n\n\treturn (\n\t\t<Link\n\t\t\thref={href ?? `/menu/${menuItemSlug(item.name, item.base_item_id)}`}\n\t\t\tclassName={slots.card}\n\t\t>\n\t\t\t{jsonLd && (\n\t\t\t\t<script\n\t\t\t\t\ttype=\"application/ld+json\"\n\t\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t\t__html: JSON.stringify(buildMenuItemJsonLd(item)),\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<div className={slots.imageBox}>\n\t\t\t\t{imageUrl ? (\n\t\t\t\t\t<Image\n\t\t\t\t\t\tsrc={imageUrl}\n\t\t\t\t\t\talt={item.name}\n\t\t\t\t\t\twidth={640}\n\t\t\t\t\t\theight={800}\n\t\t\t\t\t\tpriority={priority}\n\t\t\t\t\t\t// Bucket fallbacks have no width variants to snap to.\n\t\t\t\t\t\tunoptimized={!imageUrl.startsWith(ITEM_IMAGE_PREFIX)}\n\t\t\t\t\t\tsizes={sizes}\n\t\t\t\t\t\tclassName={slots.image}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<span className={slots.placeholder}>{label ?? item.name}</span>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t<div className={slots.textContainer}>\n\t\t\t\t<p className={slots.name}>{label ?? item.name}</p>\n\t\t\t\t{variant &&\n\t\t\t\t\t(onSale ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<p className={slots.price}>\n\t\t\t\t\t\t\t\t{money(variant.display_price!)}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p className={slots.oldPrice}>{money(variant.price)}</p>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p className={slots.price}>{money(variant.price)}</p>\n\t\t\t\t\t))}\n\t\t\t</div>\n\t\t</Link>\n\t);\n}\n","export { menuImageUrl } from \"@zorgo/universal/utils/menuUtils\";\nexport type { BaseItemImage } from \"@zorgo/universal/interfaces\";\n\n/**\n * The variant widths prebuild emits, for menu item images and site-authored\n * photos alike. The loader below and the encoder in internal/images.ts read the\n * same list, so a requested width can never snap to a rung that was never\n * written. 1920 is the top rung because a full-bleed hero on a retina laptop\n * asks for it; `withoutEnlargement` means a smaller source just stops early.\n */\nexport const IMAGE_WIDTHS = [384, 640, 1080, 1920] as const;\n\n/** @deprecated The ladder is no longer item-only — use {@link IMAGE_WIDTHS}. */\nexport const ITEM_IMAGE_WIDTHS = IMAGE_WIDTHS;\n\n/** Public prefix for everything prebuild encodes. */\nexport const IMAGE_PREFIX = \"/images/\";\n\n/** Public prefix menuImageUrl returns for a localized item image. */\nexport const ITEM_IMAGE_PREFIX = \"/images/items/\";\n\n/**\n * next/image custom loader (`images.loaderFile` in a scaffolded site's\n * next.config.ts).\n *\n * An extension-less path under `/images/` is prebuild's contract for \"this has\n * a variant ladder\" — it gets the nearest rung that covers the requested width.\n * That covers both menu item images (`/images/items/<key>`) and the site's own\n * photos (`/images/food`, encoded from `assets/images/food.JPG`).\n *\n * Everything else passes through untouched and is served as-is: a bucket URL\n * for an item prebuild could not localize, the prebuilt logo, a video poster —\n * anything that still carries a file extension.\n *\n * Sync and pure by contract: next/image calls it during render for every srcset\n * candidate.\n */\nexport default function imageLoader({\n\tsrc,\n\twidth,\n}: {\n\tsrc: string;\n\twidth: number;\n}): string {\n\tif (!src.startsWith(IMAGE_PREFIX) || /\\.[a-z0-9]+$/i.test(src)) return src;\n\tconst rung =\n\t\tIMAGE_WIDTHS.find((candidate) => candidate >= width) ??\n\t\tIMAGE_WIDTHS[IMAGE_WIDTHS.length - 1];\n\treturn `${src}-${rung}.avif`;\n}\n\nexport { imageLoader, imageLoader as itemImageLoader };\n","export function cn(...parts: Array<string | undefined | false>) {\n return parts.filter(Boolean).join(\" \");\n}\n\nexport function money(cents: number) {\n return `$${(cents / 100).toFixed(2)}`;\n}\n\n/** Per-slot Tailwind classes for the item customization form. */\nexport type ClientItemFormItemClasses = Partial<{\n baseContainer: string;\n title: string;\n description: string;\n section: string;\n sectionTitle: string;\n optionsRow: string;\n optionButton: string;\n optionButtonSelected: string;\n optionButtonUnselected: string;\n optionButtonLabel: string;\n optionButtonUpcharge: string;\n servingsRow: string;\n servingsLabel: string;\n servingsControls: string;\n incrementButton: string;\n servingsValue: string;\n ruleError: string;\n portionHint: string;\n commentsTextarea: string;\n quantityRow: string;\n submitButton: string;\n notFound: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeClientItemFormItemClasses}.\n */\nexport const CLIENT_ITEM_FORM_DEFAULT_ITEM_CLASSES: Required<ClientItemFormItemClasses> =\n {\n baseContainer: \"flex flex-col gap-8\",\n title: \"text-4xl font-extrabold text-primary\",\n description: \"opacity-70 text-xl\",\n section:\n \"flex flex-col gap-2 shadow-sm rounded-xl p-4 bg-background-elevated border-3 border-foreground/[15%]\",\n sectionTitle: \"font-bold text-2xl py-4\",\n optionsRow: \"flex flex-row flex-wrap gap-2\",\n optionButton:\n \"flex flex-col items-start gap-0.5 p-3 px-4 rounded-xl border-3 text-lg hover:translate-y-[-2px] transition-all duration-300\",\n optionButtonSelected: \"bg-background-recessed border-transparent\",\n optionButtonUnselected:\n \"bg-background-elevated border-foreground/[15%]\",\n optionButtonLabel: \"font-semibold leading-tight\",\n optionButtonUpcharge: \"opacity-60\",\n servingsRow: \"flex flex-row items-center justify-between gap-4 text-xl\",\n servingsLabel: \"opacity-75\",\n servingsControls: \"flex flex-row items-center gap-2\",\n incrementButton:\n \"bg-background text-foreground w-10 h-10 rounded-xl flex items-center justify-center hover:bg-foreground hover:text-background transition-all duration-300\",\n servingsValue: \"w-8 md:w-12 font-semibold opacity-75 text-center\",\n ruleError: \"text-sm text-red-500\",\n portionHint: \"text-base font-normal opacity-60\",\n commentsTextarea:\n \"p-4 rounded-xl border-3 border-foreground/[15%] outline-none resize-none\",\n quantityRow: \"flex flex-row items-center gap-4 text-xl\",\n submitButton:\n \"bg-primary text-primary-foreground p-4 rounded-xl text-lg font-semibold hover:bg-primary/80 disabled:opacity-50 disabled:cursor-not-allowed transition-all duration-300\",\n notFound: \"\",\n };\n\nexport function mergeClientItemFormItemClasses(\n overrides?: ClientItemFormItemClasses,\n) {\n const d = CLIENT_ITEM_FORM_DEFAULT_ITEM_CLASSES;\n return {\n baseContainer: cn(d.baseContainer, overrides?.baseContainer),\n title: cn(d.title, overrides?.title),\n description: cn(d.description, overrides?.description),\n section: cn(d.section, overrides?.section),\n sectionTitle: cn(d.sectionTitle, overrides?.sectionTitle),\n optionsRow: cn(d.optionsRow, overrides?.optionsRow),\n optionButton: cn(d.optionButton, overrides?.optionButton),\n optionButtonSelected: cn(\n d.optionButtonSelected,\n overrides?.optionButtonSelected,\n ),\n optionButtonUnselected: cn(\n d.optionButtonUnselected,\n overrides?.optionButtonUnselected,\n ),\n optionButtonLabel: cn(\n d.optionButtonLabel,\n overrides?.optionButtonLabel,\n ),\n optionButtonUpcharge: cn(\n d.optionButtonUpcharge,\n overrides?.optionButtonUpcharge,\n ),\n servingsRow: cn(d.servingsRow, overrides?.servingsRow),\n servingsLabel: cn(d.servingsLabel, overrides?.servingsLabel),\n servingsControls: cn(d.servingsControls, overrides?.servingsControls),\n incrementButton: cn(d.incrementButton, overrides?.incrementButton),\n servingsValue: cn(d.servingsValue, overrides?.servingsValue),\n ruleError: cn(d.ruleError, overrides?.ruleError),\n portionHint: cn(d.portionHint, overrides?.portionHint),\n commentsTextarea: cn(d.commentsTextarea, overrides?.commentsTextarea),\n quantityRow: cn(d.quantityRow, overrides?.quantityRow),\n submitButton: cn(d.submitButton, overrides?.submitButton),\n notFound: cn(d.notFound, overrides?.notFound),\n };\n}\n\n/**\n * Fully-resolved classes. Every section takes this (not the partial overrides)\n * so a subcomponent used on its own and one composed into ClientItemForm merge\n * the defaults exactly once.\n */\nexport type ClientItemFormSlots = ReturnType<\n typeof mergeClientItemFormItemClasses\n>;\n\nexport const CLIENT_ITEM_FORM_SLOTS: ClientItemFormSlots =\n mergeClientItemFormItemClasses();\n","\"use client\";\n\nimport type { Category, MenuItem } from \"@zorgo/universal/interfaces\";\nimport { menuItemNameToSlug } from \"@zorgo/universal/utils/menuSlugs\";\nimport { cn } from \"./ItemForm/classes\";\nimport { ItemCard, type ItemCardItemClasses } from \"./ItemCard\";\n\n/** Per-slot Tailwind classes for the grid menu layout. */\nexport type GridMenuItemClasses = Partial<{\n baseContainer: string;\n categoryContainer: string;\n categoryTitle: string;\n itemCardContainer: string;\n itemCard: string;\n itemCardImage: string;\n itemCardTextContainer: string;\n itemCardName: string;\n itemCardPrice: string;\n itemCardOldPrice: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeGridMenuItemClasses}.\n */\nexport const GRID_MENU_DEFAULT_ITEM_CLASSES: Required<GridMenuItemClasses> = {\n baseContainer: \"flex flex-col gap-16\",\n categoryContainer: \"flex flex-col gap-8 scroll-mt-24\",\n categoryTitle: \"text-4xl text-center font-extrabold text-primary\",\n itemCardContainer:\n \"flex flex-row flex-wrap gap-8 content-center justify-center py-4 max-w-7xl mx-auto\",\n itemCard: \"w-60\",\n // The grid menu has always shown square tiles; ItemCard defaults to 4:5.\n itemCardImage: \"aspect-square\",\n itemCardTextContainer: \"\",\n itemCardName: \"\",\n itemCardPrice: \"\",\n itemCardOldPrice: \"\",\n};\n\nexport function mergeGridMenuItemClasses(overrides?: GridMenuItemClasses) {\n const d = GRID_MENU_DEFAULT_ITEM_CLASSES;\n return {\n baseContainer: cn(d.baseContainer, overrides?.baseContainer),\n categoryContainer: cn(\n d.categoryContainer,\n overrides?.categoryContainer,\n ),\n categoryTitle: cn(d.categoryTitle, overrides?.categoryTitle),\n itemCardContainer: cn(\n d.itemCardContainer,\n overrides?.itemCardContainer,\n ),\n itemCard: cn(d.itemCard, overrides?.itemCard),\n itemCardImage: cn(d.itemCardImage, overrides?.itemCardImage),\n itemCardTextContainer: cn(\n d.itemCardTextContainer,\n overrides?.itemCardTextContainer,\n ),\n itemCardName: cn(d.itemCardName, overrides?.itemCardName),\n itemCardPrice: cn(d.itemCardPrice, overrides?.itemCardPrice),\n itemCardOldPrice: cn(d.itemCardOldPrice, overrides?.itemCardOldPrice),\n };\n}\n\n/** Grid-menu slots that map onto an ItemCard's own slots. */\nfunction cardClasses(\n slots: ReturnType<typeof mergeGridMenuItemClasses>,\n): ItemCardItemClasses {\n return {\n card: slots.itemCard,\n imageBox: slots.itemCardImage,\n textContainer: slots.itemCardTextContainer,\n name: slots.itemCardName,\n price: slots.itemCardPrice,\n oldPrice: slots.itemCardOldPrice,\n };\n}\n\nexport function GridMenu({\n items,\n categories,\n itemClasses,\n}: {\n items: MenuItem[];\n categories: Category[];\n itemClasses?: GridMenuItemClasses;\n}) {\n const slots = mergeGridMenuItemClasses(itemClasses);\n const card = cardClasses(slots);\n\n return (\n <div className={slots.baseContainer}>\n {categories.map((category) => {\n const itemsInCategory = items.filter(\n (item) => item.category_id === category.category_id,\n );\n if (itemsInCategory.length === 0) {\n return null;\n }\n return (\n <div\n key={category.category_id}\n id={menuItemNameToSlug(category.name)}\n className={slots.categoryContainer}\n >\n <h1 className={slots.categoryTitle}>{category.name}</h1>\n\n <div className={slots.itemCardContainer}>\n {itemsInCategory.map((item) => (\n <ItemCard\n key={item.base_item_id}\n item={item}\n itemClasses={card}\n />\n ))}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nimport Image from \"next/image\";\nimport Link from \"next/link\";\nimport type { Category, MenuItem } from \"@zorgo/universal/interfaces\";\nimport { menuItemNameToSlug, menuItemSlug } from \"@zorgo/universal/utils/menuSlugs\";\nimport { menuImageUrl } from \"@zorgo/universal/utils/menuUtils\";\nimport { ITEM_IMAGE_PREFIX } from \"../../images\";\nimport { AccordionSection } from \"./Accordion\";\nimport { cn, money } from \"./ItemForm/classes\";\n\n/** Per-slot Tailwind classes for the accordion menu layout. */\nexport type AccordionMenuItemClasses = Partial<{\n baseContainer: string;\n categoryContainer: string;\n categoryTrigger: string;\n categoryTitle: string;\n categoryIndicator: string;\n itemsContainer: string;\n itemCard: string;\n itemCardFeatured: string;\n itemCardImageBox: string;\n itemCardImage: string;\n itemCardTextContainer: string;\n itemCardName: string;\n itemCardDescription: string;\n itemCardPriceContainer: string;\n itemCardPrice: string;\n itemCardOldPrice: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeAccordionMenuItemClasses}.\n */\nexport const ACCORDION_MENU_DEFAULT_ITEM_CLASSES: Required<AccordionMenuItemClasses> =\n {\n baseContainer: \"flex flex-col gap-4\",\n categoryContainer:\n \"flex flex-col gap-4 p-4 scroll-mt-24 bg-background-elevated border-3 border-foreground/[15%] rounded-xl shadow-sm\",\n categoryTrigger: \"flex flex-row items-center justify-between p-4\",\n categoryTitle: \"text-2xl font-bold\",\n categoryIndicator: \"h-8 w-8\",\n itemsContainer: \"flex-col gap-4\",\n // MN-03: the flat gray card is the default; the old full-red panel is a\n // reserved variant (itemCardFeatured), not the every-item norm.\n itemCard:\n \"flex items-center gap-4 p-4 bg-background rounded-xl hover:translate-x-1 transition-all duration-300\",\n itemCardFeatured: \"bg-primary text-primary-foreground\",\n // MN-07: a small square thumb on mobile too, not a full-width photo —\n // the aspect ratio is fixed on the box so an item with no photo still\n // reserves the same row height.\n itemCardImageBox:\n \"w-16 h-16 shrink-0 aspect-square bg-background-recessed rounded-lg overflow-hidden\",\n itemCardImage: \"w-full h-full object-cover\",\n // flex-1 (not justify-between on itemCard) so the price stays pinned\n // right whether or not the thumb is showing.\n itemCardTextContainer: \"flex flex-1 flex-col gap-2 opacity-75\",\n itemCardName: \"text-lg font-semibold\",\n itemCardDescription: \"text-lg opacity-75\",\n itemCardPriceContainer: \"flex flex-col gap-2 opacity-75\",\n itemCardPrice: \"text-lg font-semibold\",\n itemCardOldPrice: \"text-lg opacity-75 line-through\",\n };\n\nexport function mergeAccordionMenuItemClasses(\n overrides?: AccordionMenuItemClasses,\n) {\n const d = ACCORDION_MENU_DEFAULT_ITEM_CLASSES;\n return {\n baseContainer: cn(d.baseContainer, overrides?.baseContainer),\n categoryContainer: cn(\n d.categoryContainer,\n overrides?.categoryContainer,\n ),\n categoryTrigger: cn(d.categoryTrigger, overrides?.categoryTrigger),\n categoryTitle: cn(d.categoryTitle, overrides?.categoryTitle),\n categoryIndicator: cn(\n d.categoryIndicator,\n overrides?.categoryIndicator,\n ),\n itemsContainer: cn(d.itemsContainer, overrides?.itemsContainer),\n itemCard: cn(d.itemCard, overrides?.itemCard),\n itemCardFeatured: cn(d.itemCardFeatured, overrides?.itemCardFeatured),\n itemCardImageBox: cn(d.itemCardImageBox, overrides?.itemCardImageBox),\n itemCardImage: cn(d.itemCardImage, overrides?.itemCardImage),\n itemCardTextContainer: cn(\n d.itemCardTextContainer,\n overrides?.itemCardTextContainer,\n ),\n itemCardName: cn(d.itemCardName, overrides?.itemCardName),\n itemCardDescription: cn(\n d.itemCardDescription,\n overrides?.itemCardDescription,\n ),\n itemCardPriceContainer: cn(\n d.itemCardPriceContainer,\n overrides?.itemCardPriceContainer,\n ),\n itemCardPrice: cn(d.itemCardPrice, overrides?.itemCardPrice),\n itemCardOldPrice: cn(d.itemCardOldPrice, overrides?.itemCardOldPrice),\n };\n}\n\nexport function AccordionMenu({\n items,\n categories,\n itemClasses,\n /** MN-07: small square thumb left of the name/description. Off by default so a menu with no item images (nothing in base_item_images yet) doesn't render a grid of empty placeholders. */\n showImages = false,\n /** MN-03: base_item_ids to render with the reserved featured (red panel) variant instead of the default card. */\n featuredBaseItemIds,\n}: {\n items: MenuItem[];\n categories: Category[];\n itemClasses?: AccordionMenuItemClasses;\n showImages?: boolean;\n featuredBaseItemIds?: number[];\n}) {\n const slots = mergeAccordionMenuItemClasses(itemClasses);\n const featured = new Set(featuredBaseItemIds);\n\n return (\n <div className={slots.baseContainer}>\n {categories.map((category) => {\n const itemsInCategory = items.filter(\n (item) => item.category_id === category.category_id,\n );\n if (itemsInCategory.length === 0) {\n return null;\n }\n return (\n <MenuCategory\n key={category.category_id}\n category={category}\n itemsInCategory={itemsInCategory}\n slots={slots}\n showImages={showImages}\n featured={featured}\n />\n );\n })}\n </div>\n );\n}\n\nfunction MenuCategory({\n category,\n itemsInCategory,\n slots,\n showImages,\n featured,\n}: {\n category: Category;\n itemsInCategory: MenuItem[];\n slots: ReturnType<typeof mergeAccordionMenuItemClasses>;\n showImages: boolean;\n featured: Set<number>;\n}) {\n return (\n <AccordionSection\n id={menuItemNameToSlug(category.name)}\n title={<h2 className={slots.categoryTitle}>{category.name}</h2>}\n slots={{\n container: slots.categoryContainer,\n trigger: slots.categoryTrigger,\n indicator: slots.categoryIndicator,\n body: slots.itemsContainer,\n }}\n >\n {itemsInCategory.map((item) => (\n <ItemCard\n key={item.base_item_id}\n item={item}\n slots={slots}\n showImage={showImages}\n featured={featured.has(item.base_item_id)}\n />\n ))}\n </AccordionSection>\n );\n}\n\nfunction ItemCard({\n item,\n slots,\n showImage,\n featured,\n}: {\n item: MenuItem;\n slots: ReturnType<typeof mergeAccordionMenuItemClasses>;\n showImage: boolean;\n featured: boolean;\n}) {\n const variant = item.variants[0];\n const onSale =\n variant?.display_price != null && variant.display_price < variant.price;\n const imageUrl = showImage ? menuImageUrl(item.images?.[0]) : undefined;\n\n return (\n <Link\n href={`/menu/${menuItemSlug(item.name, item.base_item_id)}`}\n className={cn(slots.itemCard, featured && slots.itemCardFeatured)}\n >\n {showImage && (\n <div className={slots.itemCardImageBox}>\n {imageUrl && (\n <Image\n src={imageUrl}\n alt={item.name}\n width={128}\n height={128}\n unoptimized={!imageUrl.startsWith(ITEM_IMAGE_PREFIX)}\n className={slots.itemCardImage}\n />\n )}\n </div>\n )}\n <div className={slots.itemCardTextContainer}>\n <p className={slots.itemCardName}>{item.name}</p>\n {item.description && (\n <p className={slots.itemCardDescription}>\n {item.description}\n </p>\n )}\n </div>\n {variant && (\n <div className={slots.itemCardPriceContainer}>\n {onSale ? (\n <>\n <p className={slots.itemCardPrice}>\n {money(variant.display_price!)}\n </p>\n <p className={slots.itemCardOldPrice}>\n {money(variant.price)}\n </p>\n </>\n ) : (\n <p className={slots.itemCardPrice}>\n {money(variant.price)}\n </p>\n )}\n </div>\n )}\n </Link>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState, type ReactNode } from \"react\";\nimport { ChevronDown, ChevronUp } from \"lucide-react\";\nimport { cn } from \"./ItemForm/classes\";\n\n/**\n * Class slots an accordion section needs. Each consumer maps its own slot\n * names onto these — see {@link AccordionMenu} and {@link FaqAccordion}.\n */\nexport type AccordionSectionSlots = Partial<{\n\tcontainer: string;\n\ttrigger: string;\n\tindicator: string;\n\tbody: string;\n}>;\n\n/**\n * One expandable section: a trigger with a chevron over a body. The body stays\n * in the markup while collapsed — `hidden`, not unmounted — so its content is\n * still there for crawlers.\n *\n * `title` is a node rather than a string so the caller supplies its own\n * heading level.\n */\nexport function AccordionSection({\n\ttitle,\n\tslots,\n\tdefaultOpen = false,\n\tid,\n\tchildren,\n}: {\n\ttitle: ReactNode;\n\tslots: AccordionSectionSlots;\n\tdefaultOpen?: boolean;\n\t/** Anchor target, so a link can address this section. */\n\tid?: string;\n\tchildren: ReactNode;\n}) {\n\tconst [isExpanded, setIsExpanded] = useState(defaultOpen);\n\n\t// A link to #<id> should land on an open section, not a closed header.\n\tuseEffect(() => {\n\t\tif (!id) return;\n\t\tconst open = () => {\n\t\t\tif (window.location.hash.slice(1) === id) setIsExpanded(true);\n\t\t};\n\t\topen();\n\t\twindow.addEventListener(\"hashchange\", open);\n\t\treturn () => window.removeEventListener(\"hashchange\", open);\n\t}, [id]);\n\n\tconst Indicator = isExpanded ? ChevronUp : ChevronDown;\n\n\treturn (\n\t\t<div id={id} className={slots.container}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-expanded={isExpanded}\n\t\t\t\tonClick={() => setIsExpanded(!isExpanded)}\n\t\t\t\tclassName={slots.trigger}\n\t\t\t>\n\t\t\t\t{title}\n\t\t\t\t<Indicator className={slots.indicator} aria-hidden />\n\t\t\t</button>\n\t\t\t<div className={cn(isExpanded ? \"flex\" : \"hidden\", slots.body)}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { useItemCustomization, useMenu } from \"@zorgo/universal/hooks/hooks\";\nimport type { OrderItem } from \"@zorgo/universal/interfaces\";\nimport { Breadcrumbs } from \"./Breadcrumbs\";\nimport { CommentsSection } from \"./CommentsSection\";\nimport { ComponentsSection } from \"./ComponentsSection\";\nimport { PortionSection } from \"./PortionSection\";\nimport { QuantitySection } from \"./QuantitySection\";\nimport { RuleSection } from \"./RuleSection\";\nimport { SubmitButton } from \"./SubmitButton\";\nimport { VariantSection } from \"./VariantSection\";\nimport {\n mergeClientItemFormItemClasses,\n type ClientItemFormItemClasses,\n} from \"./classes\";\n\n/**\n * The stock item form. Every section here is exported on its own — a site that\n * wants its own layout composes these instead of forking the file.\n */\nexport function ClientItemForm({\n baseItemId,\n seed,\n editIndex,\n itemClasses,\n onSubmitSuccess,\n}: {\n baseItemId: number;\n seed?: OrderItem;\n editIndex?: number;\n itemClasses?: ClientItemFormItemClasses;\n /** Defaults to navigating back to /menu. */\n onSubmitSuccess?: () => void;\n}) {\n const router = useRouter();\n const slots = mergeClientItemFormItemClasses(itemClasses);\n\n const {\n item,\n variant,\n variants,\n setVariant,\n ruleGroups,\n unmetRule,\n canSubmit,\n submit,\n quantity,\n setQuantity,\n comments,\n setComments,\n setComponentServings,\n price,\n salePrice,\n isEditMode,\n draft,\n portionScheme,\n placeOption,\n recutSelections,\n } = useItemCustomization(baseItemId, seed, editIndex);\n\n const { categories } = useMenu();\n\n // how the item is cut and which section is being edited are this form's\n // cursor, not order data — a portion only exists as a string on a row\n const [cut, setCut] = useState(1);\n const [activeSection, setActiveSection] = useState<number | null>(null);\n const divisions = portionScheme\n ? Math.min(Math.max(cut, portionScheme.min_divisions), portionScheme.max_divisions)\n : 1;\n\n if (!item) {\n return <div className={slots.notFound}>Item not found.</div>;\n }\n\n const category = categories.find((c) => c.category_id === item.category_id);\n\n return (\n <div className={slots.baseContainer}>\n <Breadcrumbs\n items={[\n { label: \"Menu\", href: \"/menu\" },\n ...(category ? [{ label: category.name }] : []),\n { label: item.name },\n ]}\n />\n <h1 className={slots.title}>{item.name}</h1>\n {item.description && (\n <p className={slots.description}>{item.description}</p>\n )}\n\n <VariantSection\n variants={variants}\n variant={variant}\n setVariant={setVariant}\n slots={slots}\n />\n\n <ComponentsSection\n variant={variant}\n draft={draft}\n setComponentServings={setComponentServings}\n activeSection={activeSection}\n divisions={divisions}\n scheme={portionScheme}\n slots={slots}\n />\n\n {portionScheme && (\n <PortionSection\n scheme={portionScheme}\n divisions={divisions}\n activeSection={activeSection}\n setActiveSection={setActiveSection}\n setDivisions={(next) => {\n recutSelections(next);\n setCut(next);\n // an uncut item has no section to edit\n setActiveSection((s) =>\n s != null && (next === 1 || s > next) ? null : s,\n );\n }}\n slots={slots}\n />\n )}\n\n {ruleGroups.map((rule) => (\n <RuleSection\n key={rule.rule_id}\n rule={rule}\n activeSection={activeSection}\n divisions={divisions}\n scheme={portionScheme}\n placeOption={placeOption}\n slots={slots}\n />\n ))}\n\n <CommentsSection\n comments={comments}\n setComments={setComments}\n slots={slots}\n />\n\n <QuantitySection\n quantity={quantity}\n setQuantity={setQuantity}\n slots={slots}\n />\n\n <SubmitButton\n canSubmit={canSubmit}\n unmetRule={unmetRule}\n price={price}\n salePrice={salePrice}\n isEditMode={isEditMode}\n onSubmit={() => {\n submit();\n if (onSubmitSuccess) onSubmitSuccess();\n else router.push(\"/menu\");\n }}\n slots={slots}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { ChevronRight } from \"lucide-react\";\nimport { cn } from \"./classes\";\n\nexport interface BreadcrumbItem {\n label: string;\n /** Omit (or leave undefined) to render the crumb as plain, non-clickable text. */\n href?: string;\n}\n\n/** Per-slot Tailwind classes for the breadcrumb trail. */\nexport type BreadcrumbsItemClasses = Partial<{\n baseContainer: string;\n crumbLink: string;\n crumbText: string;\n separator: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeBreadcrumbsItemClasses}.\n */\nexport const BREADCRUMBS_DEFAULT_ITEM_CLASSES: Required<BreadcrumbsItemClasses> =\n {\n baseContainer: \"flex flex-row items-center gap-2 text-sm opacity-75\",\n crumbLink: \"hover:opacity-75 transition-all duration-300 underline-offset-2 hover:underline\",\n crumbText: \"font-semibold\",\n separator: \"h-4 w-4 opacity-50\",\n };\n\nexport function mergeBreadcrumbsItemClasses(\n overrides?: BreadcrumbsItemClasses,\n) {\n const d = BREADCRUMBS_DEFAULT_ITEM_CLASSES;\n return {\n baseContainer: cn(d.baseContainer, overrides?.baseContainer),\n crumbLink: cn(d.crumbLink, overrides?.crumbLink),\n crumbText: cn(d.crumbText, overrides?.crumbText),\n separator: cn(d.separator, overrides?.separator),\n };\n}\n\n/** Minimal, presentational breadcrumb trail (e.g. Menu -> Category -> Item). */\nexport function Breadcrumbs({\n items,\n itemClasses,\n}: {\n items: BreadcrumbItem[];\n itemClasses?: BreadcrumbsItemClasses;\n}) {\n const slots = mergeBreadcrumbsItemClasses(itemClasses);\n\n return (\n <nav aria-label=\"Breadcrumb\" className={slots.baseContainer}>\n {items.map((item, index) => (\n <span key={`${item.label}-${index}`} className=\"flex flex-row items-center gap-2\">\n {index > 0 && <ChevronRight className={slots.separator} />}\n {item.href ? (\n <Link href={item.href} className={slots.crumbLink}>\n {item.label}\n </Link>\n ) : (\n <span className={slots.crumbText}>{item.label}</span>\n )}\n </span>\n ))}\n </nav>\n );\n}\n","\"use client\";\n\nimport { CLIENT_ITEM_FORM_SLOTS, type ClientItemFormSlots } from \"./classes\";\n\n/** Free-text special instructions. */\nexport function CommentsSection({\n comments,\n setComments,\n title = \"Comments\",\n placeholder = \"Special instructions...\",\n rows = 2,\n slots = CLIENT_ITEM_FORM_SLOTS,\n}: {\n comments: string;\n setComments: (comments: string) => void;\n title?: string;\n placeholder?: string;\n rows?: number;\n slots?: ClientItemFormSlots;\n}) {\n return (\n <div className={slots.section}>\n <h2 className={slots.sectionTitle}>{title}</h2>\n <textarea\n value={comments}\n onChange={(e) => setComments(e.target.value)}\n placeholder={placeholder}\n className={slots.commentsTextarea}\n rows={rows}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport type { ItemVariant, OrderItem } from \"@zorgo/universal/interfaces\";\nimport type { PortionScheme } from \"@zorgo/universal/schemas\";\nimport { portionLabel } from \"@zorgo/universal/utils/portionUtils\";\nimport { OptionButton } from \"./OptionButton\";\nimport { CLIENT_ITEM_FORM_SLOTS, type ClientItemFormSlots } from \"./classes\";\n\n/**\n * What the variant already includes, each togglable on or off — for the whole\n * item, or for whichever section is being edited (\"no cheese on the left\").\n */\nexport function ComponentsSection({\n variant,\n draft,\n setComponentServings,\n activeSection = null,\n divisions = 1,\n scheme,\n title = \"Includes\",\n slots = CLIENT_ITEM_FORM_SLOTS,\n}: {\n variant: ItemVariant;\n draft?: OrderItem | null;\n setComponentServings: (\n componentId: number,\n servings: number,\n portion?: string | null,\n ) => void;\n /** Section being edited; null = the whole item. */\n activeSection?: number | null;\n divisions?: number;\n /** Names the section a removal applies to. */\n scheme?: PortionScheme | null;\n title?: string;\n slots?: ClientItemFormSlots;\n}) {\n const components = variant.components ?? [];\n if (components.length === 0) return null;\n\n const portion = activeSection != null ? `${activeSection}/${divisions}` : null;\n\n return (\n <div className={slots.section}>\n <h2 className={slots.sectionTitle}>{title}</h2>\n <div className={slots.optionsRow}>\n {components.map((component) => {\n const defaultServings = component.servings_per_item ?? 1;\n // the row for the section being edited, falling back to the\n // whole-item row when this component isn't split\n const rows = (draft?.components ?? []).filter(\n (c) => c.id === component.id,\n );\n const row =\n rows.find((c) => c.portion === portion) ??\n rows.find((c) => !c.portion);\n const servings = row?.quantity_servings ?? defaultServings;\n const selected = servings > 0;\n // removed from somewhere else, while the whole item is shown\n const removedElsewhere =\n !portion && rows.some((c) => c.quantity_servings === 0);\n\n return (\n <OptionButton\n key={component.id}\n label={component.name}\n subtext={\n removedElsewhere && scheme\n ? `No ${component.name.toLowerCase()} on ${rows\n .filter((c) => c.quantity_servings === 0)\n .map((c) =>\n portionLabel(c.portion, scheme).toLowerCase(),\n )\n .join(\", \")}`\n : undefined\n }\n selected={selected}\n onClick={() =>\n setComponentServings(\n component.id,\n selected ? 0 : defaultServings,\n portion,\n )\n }\n slots={slots}\n />\n );\n })}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { CLIENT_ITEM_FORM_SLOTS, cn, type ClientItemFormSlots } from \"./classes\";\n\nexport function OptionButton({\n label,\n subtext,\n selected,\n onClick,\n slots = CLIENT_ITEM_FORM_SLOTS,\n}: {\n label: string;\n subtext?: string;\n selected: boolean;\n onClick: () => void;\n slots?: ClientItemFormSlots;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n slots.optionButton,\n selected\n ? slots.optionButtonSelected\n : slots.optionButtonUnselected,\n )}\n >\n <span className={slots.optionButtonLabel}>{label}</span>\n {subtext && (\n <span className={slots.optionButtonUpcharge}>{subtext}</span>\n )}\n </button>\n );\n}\n","\"use client\";\n\nimport type { PortionScheme } from \"@zorgo/universal/schemas\";\nimport {\n divisionsFor,\n portionLabel,\n radialSectionPath,\n} from \"@zorgo/universal/utils/portionUtils\";\nimport { cn } from \"./classes\";\n\n/**\n * Section pickers. One per geometry, all with the same props and all dumb: they\n * draw `divisions` sections, highlight `active`, shade `covered`, and call\n * `onSelect`. Every indexing rule lives in the scheme and in portionUtils —\n * a renderer never decides what section 2 means. See docs/portions.md §4.\n */\nexport interface PortionShapeProps {\n divisions: number;\n active: number | null;\n /** Sections already carrying the selection being edited, shaded not selected. */\n covered?: number[];\n onSelect: (index: number | null) => void;\n}\n\nconst SECTION_FILL = \"var(--color-background-elevated, #fff)\";\n\nfunction sectionClass(isActive: boolean, isCovered: boolean) {\n return cn(\n \"transition-all duration-200 cursor-pointer\",\n isActive\n ? \"fill-primary stroke-primary\"\n : isCovered\n ? \"fill-primary/30 stroke-foreground/20\"\n : \"stroke-foreground/20 hover:fill-primary/10\",\n );\n}\n\n/** Contiguous arcs from 12 o'clock, counter-clockwise. */\nfunction RadialPicker({ divisions, active, covered = [], onSelect }: PortionShapeProps) {\n return (\n <svg viewBox=\"0 0 100 100\" className=\"w-32 h-32\" role=\"group\">\n {Array.from({ length: divisions }, (_, i) => {\n const index = i + 1;\n return (\n <path\n key={index}\n d={radialSectionPath(index, divisions)}\n strokeWidth={2}\n style={{ fill: SECTION_FILL }}\n className={sectionClass(active === index, covered.includes(index))}\n onClick={() => onSelect(active === index ? null : index)}\n />\n );\n })}\n </svg>\n );\n}\n\n/** CSS grid, column-major fill: down the left column, then the next. */\nfunction GridPicker({ divisions, active, covered = [], onSelect }: PortionShapeProps) {\n const cols = Math.ceil(Math.sqrt(divisions));\n const rows = Math.ceil(divisions / cols);\n\n return (\n <div\n className=\"grid gap-1 w-32 h-32\"\n style={{\n gridTemplateColumns: `repeat(${cols}, 1fr)`,\n gridTemplateRows: `repeat(${rows}, 1fr)`,\n gridAutoFlow: \"column\",\n }}\n >\n {Array.from({ length: divisions }, (_, i) => {\n const index = i + 1;\n return (\n <button\n key={index}\n type=\"button\"\n aria-pressed={active === index}\n onClick={() => onSelect(active === index ? null : index)}\n className={cn(\n \"rounded-lg border-3 transition-all duration-200\",\n active === index\n ? \"bg-primary border-primary\"\n : covered.includes(index)\n ? \"bg-primary/30 border-foreground/15\"\n : \"bg-background-elevated border-foreground/15 hover:bg-primary/10\",\n )}\n />\n );\n })}\n </div>\n );\n}\n\n/** Horizontal bar segments, one end to the other. */\nfunction LinearPicker({ divisions, active, covered = [], onSelect }: PortionShapeProps) {\n return (\n <div className=\"flex flex-row w-full max-w-xs h-12 gap-1\">\n {Array.from({ length: divisions }, (_, i) => {\n const index = i + 1;\n return (\n <button\n key={index}\n type=\"button\"\n aria-pressed={active === index}\n onClick={() => onSelect(active === index ? null : index)}\n className={cn(\n \"flex-1 rounded-lg border-3 transition-all duration-200\",\n active === index\n ? \"bg-primary border-primary\"\n : covered.includes(index)\n ? \"bg-primary/30 border-foreground/15\"\n : \"bg-background-elevated border-foreground/15 hover:bg-primary/10\",\n )}\n />\n );\n })}\n </div>\n );\n}\n\n/** Equal shares of a countable quantity — no geometry, just labelled buttons. */\nfunction CountPicker({\n divisions,\n active,\n covered = [],\n onSelect,\n scheme,\n}: PortionShapeProps & { scheme: Pick<PortionScheme, \"geometry\"> }) {\n return (\n <div className=\"flex flex-row flex-wrap gap-2\">\n {Array.from({ length: divisions }, (_, i) => {\n const index = i + 1;\n return (\n <button\n key={index}\n type=\"button\"\n aria-pressed={active === index}\n onClick={() => onSelect(active === index ? null : index)}\n className={cn(\n \"px-4 py-2 rounded-xl border-3 font-semibold transition-all duration-200\",\n active === index\n ? \"bg-primary text-primary-foreground border-primary\"\n : covered.includes(index)\n ? \"bg-primary/30 border-foreground/15\"\n : \"bg-background-elevated border-foreground/15 hover:bg-primary/10\",\n )}\n >\n {portionLabel(`${index}/${divisions}`, scheme)}\n </button>\n );\n })}\n </div>\n );\n}\n\nexport interface PortionPickerProps extends PortionShapeProps {\n scheme: PortionScheme;\n onDivisionsChange: (divisions: number) => void;\n className?: string;\n}\n\n/**\n * The one portion control: a cut selector plus the geometry's shape. Adding a\n * geometry means adding a `portion_geometry` enum value and a case here, in the\n * same change — which is exactly why geometry is a closed enum.\n */\nexport function PortionPicker({\n scheme,\n divisions,\n active,\n covered,\n onSelect,\n onDivisionsChange,\n className,\n}: PortionPickerProps) {\n const cuts = divisionsFor(scheme);\n const shapeProps = { divisions, active, covered, onSelect };\n\n return (\n <div className={cn(\"flex flex-col gap-4 items-center\", className)}>\n {cuts.length > 1 && (\n <div className=\"flex flex-row gap-2\">\n {cuts.map((count) => (\n <button\n key={count}\n type=\"button\"\n aria-pressed={divisions === count}\n onClick={() => onDivisionsChange(count)}\n className={cn(\n \"px-4 py-2 rounded-xl border-3 font-semibold transition-all duration-200\",\n divisions === count\n ? \"bg-primary text-primary-foreground border-primary\"\n : \"bg-background-elevated border-foreground/15 hover:bg-primary/10\",\n )}\n >\n {count === 1 ? \"Whole\" : `${count} parts`}\n </button>\n ))}\n </div>\n )}\n\n {/* an uncut item has exactly one section, which is the whole item —\n there is nothing to select until the customer cuts it */}\n {divisions > 1 && (\n <>\n {scheme.geometry === \"radial\" && (\n <RadialPicker {...shapeProps} />\n )}\n {scheme.geometry === \"grid\" && <GridPicker {...shapeProps} />}\n {scheme.geometry === \"linear\" && (\n <LinearPicker {...shapeProps} />\n )}\n {scheme.geometry === \"count\" && (\n <CountPicker {...shapeProps} scheme={scheme} />\n )}\n </>\n )}\n\n <p className=\"opacity-70\">\n {active == null\n ? divisions > 1\n ? \"Editing the whole item — tap a section to edit just that part\"\n : \"Editing the whole item\"\n : `Editing ${portionLabel(`${active}/${divisions}`, scheme).toLowerCase()}`}\n </p>\n </div>\n );\n}\n","\"use client\";\n\nimport type { PortionScheme } from \"@zorgo/universal/schemas\";\nimport { PortionPicker } from \"./PortionPicker\";\nimport { CLIENT_ITEM_FORM_SLOTS, type ClientItemFormSlots } from \"./classes\";\n\n/** The item's cut selector, wrapped in a titled form section. */\nexport function PortionSection({\n scheme,\n divisions,\n activeSection,\n setActiveSection,\n setDivisions,\n slots = CLIENT_ITEM_FORM_SLOTS,\n}: {\n scheme: PortionScheme;\n divisions: number;\n activeSection: number | null;\n setActiveSection: (section: number | null) => void;\n setDivisions: (divisions: number) => void;\n slots?: ClientItemFormSlots;\n}) {\n return (\n <div className={slots.section}>\n <h2 className={slots.sectionTitle}>{scheme.name}</h2>\n <PortionPicker\n scheme={scheme}\n divisions={divisions}\n active={activeSection}\n onSelect={setActiveSection}\n onDivisionsChange={setDivisions}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { Minus, Plus } from \"lucide-react\";\nimport { CLIENT_ITEM_FORM_SLOTS, type ClientItemFormSlots } from \"./classes\";\n\n/** Line quantity stepper. The hook already floors quantity at 1. */\nexport function QuantitySection({\n quantity,\n setQuantity,\n title = \"How many?\",\n slots = CLIENT_ITEM_FORM_SLOTS,\n}: {\n quantity: number;\n setQuantity: (next: number | ((current: number) => number)) => void;\n title?: string;\n slots?: ClientItemFormSlots;\n}) {\n return (\n <div className={slots.section}>\n <h2 className={slots.sectionTitle}>{title}</h2>\n <div className={slots.quantityRow}>\n <button\n type=\"button\"\n className={slots.incrementButton}\n onClick={() => setQuantity((q) => q - 1)}\n >\n <Minus className=\"h-4 w-4\" />\n </button>\n <p className={slots.servingsValue}>{quantity}</p>\n <button\n type=\"button\"\n className={slots.incrementButton}\n onClick={() => setQuantity((q) => q + 1)}\n >\n <Plus className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport type { CustomizationRule } from \"@zorgo/universal/interfaces\";\nimport type { PortionScheme } from \"@zorgo/universal/schemas\";\nimport { parsePortionKey, portionLabel } from \"@zorgo/universal/utils/portionUtils\";\nimport { OptionButton } from \"./OptionButton\";\nimport { CLIENT_ITEM_FORM_SLOTS, money, type ClientItemFormSlots } from \"./classes\";\n\n/** One rule group (toppings, sides, …) and its unmet-requirement message. */\nexport function RuleSection({\n rule,\n activeSection = null,\n divisions = 1,\n scheme,\n placeOption,\n slots = CLIENT_ITEM_FORM_SLOTS,\n}: {\n rule: CustomizationRule;\n /** Section currently being edited, so a whole-item-only rule can say so. */\n activeSection?: number | null;\n /** How the item is currently cut, for the portion this section writes. */\n divisions?: number;\n /** Names the section an option sits on; omit when the item can't be cut. */\n scheme?: PortionScheme | null;\n /** Defaults to the option's own whole-item toggle. */\n placeOption?: (\n ruleId: number,\n baseKey: string,\n portion: string | null,\n max?: number,\n ) => void;\n slots?: ClientItemFormSlots;\n}) {\n // a rule that can't be split ignores the active section entirely — you\n // can't have thin crust on one half\n const portion =\n rule.portionable && activeSection != null\n ? `${activeSection}/${divisions}`\n : null;\n\n return (\n <div className={slots.section}>\n <h2 className={slots.sectionTitle}>\n {rule.group_name}\n {/* a section is active but this rule can't be split —\n say so rather than silently applying it to everything */}\n {activeSection != null && !rule.portionable && (\n <span className={slots.portionHint}> — whole item only</span>\n )}\n </h2>\n\n <div className={slots.optionsRow}>\n {rule.options.map((option) => (\n <OptionButton\n key={parsePortionKey(option.key).baseKey}\n label={option.name}\n subtext={\n // where it sits beats what it costs — the price is\n // already in the running total\n option.portion && scheme\n ? portionLabel(option.portion, scheme)\n : option.upcharge > 0\n ? `+${money(option.upcharge)}`\n : undefined\n }\n selected={option.selected}\n onClick={() =>\n placeOption\n ? placeOption(\n rule.rule_id,\n parsePortionKey(option.key).baseKey,\n portion,\n rule.max,\n )\n : option.toggle()\n }\n slots={slots}\n />\n ))}\n </div>\n\n {rule.message() && (\n <p className={slots.ruleError}>{rule.message()}</p>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport type { CustomizationRule } from \"@zorgo/universal/interfaces\";\nimport { CLIENT_ITEM_FORM_SLOTS, money, type ClientItemFormSlots } from \"./classes\";\n\n/** Add-to-cart button: names the first unmet rule, otherwise the price. */\nexport function SubmitButton({\n canSubmit,\n unmetRule,\n price,\n salePrice,\n isEditMode,\n onSubmit,\n slots = CLIENT_ITEM_FORM_SLOTS,\n}: {\n canSubmit: boolean;\n unmetRule?: CustomizationRule | null;\n price: number;\n salePrice?: number | null;\n isEditMode?: boolean;\n onSubmit: () => void;\n slots?: ClientItemFormSlots;\n}) {\n return (\n <button\n type=\"button\"\n disabled={!canSubmit}\n onClick={onSubmit}\n className={slots.submitButton}\n >\n {unmetRule\n ? `Choose ${unmetRule.group_name}`\n : `${isEditMode ? \"Save changes\" : \"Add to cart\"} — ${money(salePrice ?? price)}`}\n </button>\n );\n}\n","\"use client\";\n\nimport type { ItemVariant } from \"@zorgo/universal/interfaces\";\nimport { OptionButton } from \"./OptionButton\";\nimport { CLIENT_ITEM_FORM_SLOTS, money, type ClientItemFormSlots } from \"./classes\";\n\n/** Size / variant picker. Renders nothing when there is only one variant. */\nexport function VariantSection({\n variants,\n variant,\n setVariant,\n title = \"Variants\",\n slots = CLIENT_ITEM_FORM_SLOTS,\n}: {\n variants: ItemVariant[];\n variant: ItemVariant;\n setVariant: (variant: ItemVariant) => void;\n title?: string;\n slots?: ClientItemFormSlots;\n}) {\n if (variants.length <= 1) return null;\n\n return (\n <div className={slots.section}>\n <h2 className={slots.sectionTitle}>{title}</h2>\n <div className={slots.optionsRow}>\n {variants.map((v) => (\n <OptionButton\n key={v.item_id}\n label={v.name}\n subtext={money(v.price)}\n selected={v.item_id === variant.item_id}\n onClick={() => setVariant(v)}\n slots={slots}\n />\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport type { Location } from \"@zorgo/universal/interfaces\";\nimport {\n\tLOCATION_ORDERING_TIMEZONE,\n\tlocationWindowOn,\n} from \"@zorgo/universal/utils/locationOrderingAvailability\";\nimport { formatInTimeZone } from \"date-fns-tz\";\nimport { cn } from \"./ItemForm/classes\";\n\n/** Per-slot Tailwind classes for the status pill. */\nexport type OpenStatusItemClasses = Partial<{\n\troot: string;\n\tdot: string;\n\tdotOpen: string;\n\tdotClosed: string;\n\tlabel: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeOpenStatusItemClasses}.\n */\nexport const OPEN_STATUS_DEFAULT_ITEM_CLASSES: Required<OpenStatusItemClasses> = {\n\troot: \"inline-flex items-center gap-2 text-sm\",\n\tdot: \"size-2 rounded-full\",\n\tdotOpen: \"bg-green-500\",\n\tdotClosed: \"bg-foreground/30\",\n\tlabel: \"\",\n};\n\nexport function mergeOpenStatusItemClasses(overrides?: OpenStatusItemClasses) {\n\tconst d = OPEN_STATUS_DEFAULT_ITEM_CLASSES;\n\treturn {\n\t\troot: cn(d.root, overrides?.root),\n\t\tdot: cn(d.dot, overrides?.dot),\n\t\tdotOpen: cn(d.dotOpen, overrides?.dotOpen),\n\t\tdotClosed: cn(d.dotClosed, overrides?.dotClosed),\n\t\tlabel: cn(d.label, overrides?.label),\n\t};\n}\n\n/** \"11pm\", \"11:30am\" — the on-the-hour case drops its minutes. */\nfunction timeLabel(at: Date): string {\n\treturn formatInTimeZone(at, LOCATION_ORDERING_TIMEZONE, \"h:mm a\")\n\t\t.toLowerCase()\n\t\t.replace(\":00\", \"\")\n\t\t.replace(\" \", \"\");\n}\n\n/** How far ahead the next opening is worth naming: today, tomorrow, or a weekday. */\nfunction dayLabel(at: Date, dayOffset: number): string {\n\tif (dayOffset === 0) return \"\";\n\tif (dayOffset === 1) return \" tomorrow\";\n\treturn ` ${formatInTimeZone(at, LOCATION_ORDERING_TIMEZONE, \"EEEE\")}`;\n}\n\n/**\n * Whether `location` is serving at `now`, and the sentence that says so —\n * \"Open until 11pm\" / \"Closed · opens 11am Tuesday\". Pure: every branch is\n * decided by the location's fourteen day-fields and the instant passed in.\n */\nexport function openStatus(\n\tlocation: Location,\n\tnow: Date,\n): { open: boolean; label: string } {\n\tif (location.force_close) return { open: false, label: \"Closed\" };\n\n\t// yesterday's window too, so 1am inside an 11pm–2am night still reads open\n\tfor (const offset of [-1, 0]) {\n\t\tconst window = locationWindowOn(now, location, offset);\n\t\tif (window && now >= window.open && now < window.close) {\n\t\t\treturn { open: true, label: `Open until ${timeLabel(window.close)}` };\n\t\t}\n\t}\n\n\tfor (let offset = 0; offset < 7; offset++) {\n\t\tconst window = locationWindowOn(now, location, offset);\n\t\tif (window && now < window.open) {\n\t\t\treturn {\n\t\t\t\topen: false,\n\t\t\t\tlabel: `Closed · opens ${timeLabel(window.open)}${dayLabel(window.open, offset)}`,\n\t\t\t};\n\t\t}\n\t}\n\n\treturn { open: false, label: \"Closed\" };\n}\n\nexport type OpenStatusProps = {\n\tlocation: Location | null | undefined;\n\t/**\n\t * Pin the instant to judge against. Left unset the component reads the\n\t * visitor's clock after mount and re-checks every minute, so a page built\n\t * hours ago never claims to be open once the kitchen has closed.\n\t */\n\tnow?: Date;\n\titemClasses?: OpenStatusItemClasses;\n};\n\n/** How often the live clock re-checks the window. */\nconst TICK_MS = 60_000;\n\n/**\n * Open/closed pill for one location.\n *\n * Renders nothing until the visitor's clock is known — the server and the first\n * client render must agree, and a statically built page has no instant that is\n * still true when it is served. The hours themselves reach crawlers through the\n * page's JSON-LD, not through this pill.\n */\nexport function OpenStatus({ location, now, itemClasses }: OpenStatusProps) {\n\tconst [clientNow, setClientNow] = useState<Date>();\n\n\tuseEffect(() => {\n\t\tif (now) return;\n\t\tsetClientNow(new Date());\n\t\tconst tick = setInterval(() => setClientNow(new Date()), TICK_MS);\n\t\treturn () => clearInterval(tick);\n\t}, [now]);\n\n\t// Both sides are absolute instants, so the comparison holds wherever the\n\t// visitor is; only the labels are rendered in the location's timezone.\n\tconst at = now ?? clientNow;\n\tif (!location || !at) return null;\n\n\tconst { open, label } = openStatus(location, at);\n\tconst slots = mergeOpenStatusItemClasses(itemClasses);\n\n\treturn (\n\t\t<span className={slots.root}>\n\t\t\t<span className={cn(slots.dot, open ? slots.dotOpen : slots.dotClosed)} aria-hidden />\n\t\t\t<span className={slots.label}>{label}</span>\n\t\t</span>\n\t);\n}\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"less than a second\",\n other: \"less than {{count}} seconds\",\n },\n\n xSeconds: {\n one: \"1 second\",\n other: \"{{count}} seconds\",\n },\n\n halfAMinute: \"half a minute\",\n\n lessThanXMinutes: {\n one: \"less than a minute\",\n other: \"less than {{count}} minutes\",\n },\n\n xMinutes: {\n one: \"1 minute\",\n other: \"{{count}} minutes\",\n },\n\n aboutXHours: {\n one: \"about 1 hour\",\n other: \"about {{count}} hours\",\n },\n\n xHours: {\n one: \"1 hour\",\n other: \"{{count}} hours\",\n },\n\n xDays: {\n one: \"1 day\",\n other: \"{{count}} days\",\n },\n\n aboutXWeeks: {\n one: \"about 1 week\",\n other: \"about {{count}} weeks\",\n },\n\n xWeeks: {\n one: \"1 week\",\n other: \"{{count}} weeks\",\n },\n\n aboutXMonths: {\n one: \"about 1 month\",\n other: \"about {{count}} months\",\n },\n\n xMonths: {\n one: \"1 month\",\n other: \"{{count}} months\",\n },\n\n aboutXYears: {\n one: \"about 1 year\",\n other: \"about {{count}} years\",\n },\n\n xYears: {\n one: \"1 year\",\n other: \"{{count}} years\",\n },\n\n overXYears: {\n one: \"over 1 year\",\n other: \"over {{count}} years\",\n },\n\n almostXYears: {\n one: \"almost 1 year\",\n other: \"almost {{count}} years\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", count.toString());\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"in \" + result;\n } else {\n return result + \" ago\";\n }\n }\n\n return result;\n};\n","export function buildFormatLongFn(args) {\n return (options = {}) => {\n // TODO: Remove String()\n const width = options.width ? String(options.width) : args.defaultWidth;\n const format = args.formats[width] || args.formats[args.defaultWidth];\n return format;\n };\n}\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.js\";\n\nconst dateFormats = {\n full: \"EEEE, MMMM do, y\",\n long: \"MMMM do, y\",\n medium: \"MMM d, y\",\n short: \"MM/dd/yyyy\",\n};\n\nconst timeFormats = {\n full: \"h:mm:ss a zzzz\",\n long: \"h:mm:ss a z\",\n medium: \"h:mm:ss a\",\n short: \"h:mm a\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'at' {{time}}\",\n long: \"{{date}} 'at' {{time}}\",\n medium: \"{{date}}, {{time}}\",\n short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"'last' eeee 'at' p\",\n yesterday: \"'yesterday at' p\",\n today: \"'today at' p\",\n tomorrow: \"'tomorrow at' p\",\n nextWeek: \"eeee 'at' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","/**\n * The localize function argument callback which allows to convert raw value to\n * the actual type.\n *\n * @param value - The value to convert\n *\n * @returns The converted value\n */\n\n/**\n * The map of localized values for each width.\n */\n\n/**\n * The index type of the locale unit value. It types conversion of units of\n * values that don't start at 0 (i.e. quarters).\n */\n\n/**\n * Converts the unit value to the tuple of values.\n */\n\n/**\n * The tuple of localized era values. The first element represents BC,\n * the second element represents AD.\n */\n\n/**\n * The tuple of localized quarter values. The first element represents Q1.\n */\n\n/**\n * The tuple of localized day values. The first element represents Sunday.\n */\n\n/**\n * The tuple of localized month values. The first element represents January.\n */\n\nexport function buildLocalizeFn(args) {\n return (value, options) => {\n const context = options?.context ? String(options.context) : \"standalone\";\n\n let valuesArray;\n if (context === \"formatting\" && args.formattingValues) {\n const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n const width = options?.width ? String(options.width) : defaultWidth;\n\n valuesArray =\n args.formattingValues[width] || args.formattingValues[defaultWidth];\n } else {\n const defaultWidth = args.defaultWidth;\n const width = options?.width ? String(options.width) : args.defaultWidth;\n\n valuesArray = args.values[width] || args.values[defaultWidth];\n }\n const index = args.argumentCallback ? args.argumentCallback(value) : value;\n\n // @ts-expect-error - For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!\n return valuesArray[index];\n };\n}\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.js\";\n\nconst eraValues = {\n narrow: [\"B\", \"A\"],\n abbreviated: [\"BC\", \"AD\"],\n wide: [\"Before Christ\", \"Anno Domini\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"1st quarter\", \"2nd quarter\", \"3rd quarter\", \"4th quarter\"],\n};\n\n// Note: in English, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nconst monthValues = {\n narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n\n wide: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n short: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"],\n abbreviated: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n wide: [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, _options) => {\n const number = Number(dirtyNumber);\n\n // If ordinal numbers depend on context, for example,\n // if they are different for different grammatical genders,\n // use `options.unit`.\n //\n // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n // 'day', 'hour', 'minute', 'second'.\n\n const rem100 = number % 100;\n if (rem100 > 20 || rem100 < 10) {\n switch (rem100 % 10) {\n case 1:\n return number + \"st\";\n case 2:\n return number + \"nd\";\n case 3:\n return number + \"rd\";\n }\n }\n return number + \"th\";\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","export function buildMatchFn(args) {\n return (string, options = {}) => {\n const width = options.width;\n\n const matchPattern =\n (width && args.matchPatterns[width]) ||\n args.matchPatterns[args.defaultMatchWidth];\n const matchResult = string.match(matchPattern);\n\n if (!matchResult) {\n return null;\n }\n const matchedString = matchResult[0];\n\n const parsePatterns =\n (width && args.parsePatterns[width]) ||\n args.parsePatterns[args.defaultParseWidth];\n\n const key = Array.isArray(parsePatterns)\n ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString))\n : // [TODO] -- I challenge you to fix the type\n findKey(parsePatterns, (pattern) => pattern.test(matchedString));\n\n let value;\n\n value = args.valueCallback ? args.valueCallback(key) : key;\n value = options.valueCallback\n ? // [TODO] -- I challenge you to fix the type\n options.valueCallback(value)\n : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n\nfunction findKey(object, predicate) {\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) &&\n predicate(object[key])\n ) {\n return key;\n }\n }\n return undefined;\n}\n\nfunction findIndex(array, predicate) {\n for (let key = 0; key < array.length; key++) {\n if (predicate(array[key])) {\n return key;\n }\n }\n return undefined;\n}\n","export function buildMatchPatternFn(args) {\n return (string, options = {}) => {\n const matchResult = string.match(args.matchPattern);\n if (!matchResult) return null;\n const matchedString = matchResult[0];\n\n const parseResult = string.match(args.parsePattern);\n if (!parseResult) return null;\n let value = args.valueCallback\n ? args.valueCallback(parseResult[0])\n : parseResult[0];\n\n // [TODO] I challenge you to fix the type\n value = options.valueCallback ? options.valueCallback(value) : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.js\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.js\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(b|a)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(before christ|before common era|anno domini|common era)/i,\n};\nconst parseEraPatterns = {\n any: [/^b/i, /^(a|c)/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](th|st|nd|rd)? quarter/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ja/i,\n /^f/i,\n /^mar/i,\n /^ap/i,\n /^may/i,\n /^jun/i,\n /^jul/i,\n /^au/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[smtwf]/i,\n short: /^(su|mo|tu|we|th|fr|sa)/i,\n abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i,\n};\nconst parseDayPatterns = {\n narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mi/i,\n noon: /^no/i,\n morning: /morning/i,\n afternoon: /afternoon/i,\n evening: /evening/i,\n night: /night/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./en-US/_lib/formatDistance.js\";\nimport { formatLong } from \"./en-US/_lib/formatLong.js\";\nimport { formatRelative } from \"./en-US/_lib/formatRelative.js\";\nimport { localize } from \"./en-US/_lib/localize.js\";\nimport { match } from \"./en-US/_lib/match.js\";\n\n/**\n * @category Locales\n * @summary English locale (United States).\n * @language English\n * @iso-639-2 eng\n * @author Sasha Koss [@kossnocorp](https://github.com/kossnocorp)\n * @author Lesha Koss [@leshakoss](https://github.com/leshakoss)\n */\nexport const enUS = {\n code: \"en-US\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1,\n },\n};\n\n// Fallback for modularized imports:\nexport default enUS;\n","let defaultOptions = {};\n\nexport function getDefaultOptions() {\n return defaultOptions;\n}\n\nexport function setDefaultOptions(newOptions) {\n defaultOptions = newOptions;\n}\n","/**\n * @module constants\n * @summary Useful constants\n * @description\n * Collection of useful date constants.\n *\n * The constants could be imported from `date-fns/constants`:\n *\n * ```ts\n * import { maxTime, minTime } from \"./constants/date-fns/constants\";\n *\n * function isAllowedTime(time) {\n * return time <= maxTime && time >= minTime;\n * }\n * ```\n */\n\n/**\n * @constant\n * @name daysInWeek\n * @summary Days in 1 week.\n */\nexport const daysInWeek = 7;\n\n/**\n * @constant\n * @name daysInYear\n * @summary Days in 1 year.\n *\n * @description\n * How many days in a year.\n *\n * One years equals 365.2425 days according to the formula:\n *\n * > Leap year occurs every 4 years, except for years that are divisible by 100 and not divisible by 400.\n * > 1 mean year = (365+1/4-1/100+1/400) days = 365.2425 days\n */\nexport const daysInYear = 365.2425;\n\n/**\n * @constant\n * @name maxTime\n * @summary Maximum allowed time.\n *\n * @example\n * import { maxTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = 8640000000000001 <= maxTime;\n * //=> false\n *\n * new Date(8640000000000001);\n * //=> Invalid Date\n */\nexport const maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000;\n\n/**\n * @constant\n * @name minTime\n * @summary Minimum allowed time.\n *\n * @example\n * import { minTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = -8640000000000001 >= minTime;\n * //=> false\n *\n * new Date(-8640000000000001)\n * //=> Invalid Date\n */\nexport const minTime = -maxTime;\n\n/**\n * @constant\n * @name millisecondsInWeek\n * @summary Milliseconds in 1 week.\n */\nexport const millisecondsInWeek = 604800000;\n\n/**\n * @constant\n * @name millisecondsInDay\n * @summary Milliseconds in 1 day.\n */\nexport const millisecondsInDay = 86400000;\n\n/**\n * @constant\n * @name millisecondsInMinute\n * @summary Milliseconds in 1 minute\n */\nexport const millisecondsInMinute = 60000;\n\n/**\n * @constant\n * @name millisecondsInHour\n * @summary Milliseconds in 1 hour\n */\nexport const millisecondsInHour = 3600000;\n\n/**\n * @constant\n * @name millisecondsInSecond\n * @summary Milliseconds in 1 second\n */\nexport const millisecondsInSecond = 1000;\n\n/**\n * @constant\n * @name minutesInYear\n * @summary Minutes in 1 year.\n */\nexport const minutesInYear = 525600;\n\n/**\n * @constant\n * @name minutesInMonth\n * @summary Minutes in 1 month.\n */\nexport const minutesInMonth = 43200;\n\n/**\n * @constant\n * @name minutesInDay\n * @summary Minutes in 1 day.\n */\nexport const minutesInDay = 1440;\n\n/**\n * @constant\n * @name minutesInHour\n * @summary Minutes in 1 hour.\n */\nexport const minutesInHour = 60;\n\n/**\n * @constant\n * @name monthsInQuarter\n * @summary Months in 1 quarter.\n */\nexport const monthsInQuarter = 3;\n\n/**\n * @constant\n * @name monthsInYear\n * @summary Months in 1 year.\n */\nexport const monthsInYear = 12;\n\n/**\n * @constant\n * @name quartersInYear\n * @summary Quarters in 1 year\n */\nexport const quartersInYear = 4;\n\n/**\n * @constant\n * @name secondsInHour\n * @summary Seconds in 1 hour.\n */\nexport const secondsInHour = 3600;\n\n/**\n * @constant\n * @name secondsInMinute\n * @summary Seconds in 1 minute.\n */\nexport const secondsInMinute = 60;\n\n/**\n * @constant\n * @name secondsInDay\n * @summary Seconds in 1 day.\n */\nexport const secondsInDay = secondsInHour * 24;\n\n/**\n * @constant\n * @name secondsInWeek\n * @summary Seconds in 1 week.\n */\nexport const secondsInWeek = secondsInDay * 7;\n\n/**\n * @constant\n * @name secondsInYear\n * @summary Seconds in 1 year.\n */\nexport const secondsInYear = secondsInDay * daysInYear;\n\n/**\n * @constant\n * @name secondsInMonth\n * @summary Seconds in 1 month\n */\nexport const secondsInMonth = secondsInYear / 12;\n\n/**\n * @constant\n * @name secondsInQuarter\n * @summary Seconds in 1 quarter.\n */\nexport const secondsInQuarter = secondsInMonth * 3;\n\n/**\n * @constant\n * @name constructFromSymbol\n * @summary Symbol enabling Date extensions to inherit properties from the reference date.\n *\n * The symbol is used to enable the `constructFrom` function to construct a date\n * using a reference date and a value. It allows to transfer extra properties\n * from the reference date to the new date. It's useful for extensions like\n * [`TZDate`](https://github.com/date-fns/tz) that accept a time zone as\n * a constructor argument.\n */\nexport const constructFromSymbol = Symbol.for(\"constructDateFrom\");\n","import { constructFromSymbol } from \"./constants.js\";\n\n/**\n * @name constructFrom\n * @category Generic Helpers\n * @summary Constructs a date using the reference date and the value\n *\n * @description\n * The function constructs a new date using the constructor from the reference\n * date and the given value. It helps to build generic functions that accept\n * date extensions.\n *\n * It defaults to `Date` if the passed reference date is a number or a string.\n *\n * Starting from v3.7.0, it allows to construct a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The reference date to take constructor from\n * @param value - The value to create the date\n *\n * @returns Date initialized using the given date and value\n *\n * @example\n * import { constructFrom } from \"./constructFrom/date-fns\";\n *\n * // A function that clones a date preserving the original type\n * function cloneDate<DateType extends Date>(date: DateType): DateType {\n * return constructFrom(\n * date, // Use constructor from the given date\n * date.getTime() // Use the date value to create a new date\n * );\n * }\n */\nexport function constructFrom(date, value) {\n if (typeof date === \"function\") return date(value);\n\n if (date && typeof date === \"object\" && constructFromSymbol in date)\n return date[constructFromSymbol](value);\n\n if (date instanceof Date) return new date.constructor(value);\n\n return new Date(value);\n}\n\n// Fallback for modularized imports:\nexport default constructFrom;\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * Starting from v3.7.0, it clones a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param argument - The value to convert\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Clone the date:\n * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert the timestamp to date:\n * const result = toDate(1392098430000)\n * //=> Tue Feb 11 2014 11:30:30\n */\nexport function toDate(argument, context) {\n // [TODO] Get rid of `toDate` or `constructFrom`?\n return constructFrom(context || argument, argument);\n}\n\n// Fallback for modularized imports:\nexport default toDate;\n","import { toDate } from \"../toDate.js\";\n\n/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport function getTimezoneOffsetInMilliseconds(date) {\n const _date = toDate(date);\n const utcDate = new Date(\n Date.UTC(\n _date.getFullYear(),\n _date.getMonth(),\n _date.getDate(),\n _date.getHours(),\n _date.getMinutes(),\n _date.getSeconds(),\n _date.getMilliseconds(),\n ),\n );\n utcDate.setUTCFullYear(_date.getFullYear());\n return +date - +utcDate;\n}\n","import { constructFrom } from \"../constructFrom.js\";\n\nexport function normalizeDates(context, ...dates) {\n const normalize = constructFrom.bind(\n null,\n context || dates.find((date) => typeof date === \"object\"),\n );\n return dates.map(normalize);\n}\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfDay} function options.\n */\n\n/**\n * @name startOfDay\n * @category Day Helpers\n * @summary Return the start of a day for the given date.\n *\n * @description\n * Return the start of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a day\n *\n * @example\n * // The start of a day for 2 September 2014 11:55:00:\n * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 00:00:00\n */\nexport function startOfDay(date, options) {\n const _date = toDate(date, options?.in);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfDay;\n","import { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { millisecondsInDay } from \"./constants.js\";\nimport { startOfDay } from \"./startOfDay.js\";\n\n/**\n * The {@link differenceInCalendarDays} function options.\n */\n\n/**\n * @name differenceInCalendarDays\n * @category Day Helpers\n * @summary Get the number of calendar days between the given dates.\n *\n * @description\n * Get the number of calendar days between the given dates. This means that the times are removed\n * from the dates and then the difference in days is calculated.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - The options object\n *\n * @returns The number of calendar days\n *\n * @example\n * // How many calendar days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * const result = differenceInCalendarDays(\n * new Date(2012, 6, 2, 0, 0),\n * new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 366\n * // How many calendar days are between\n * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?\n * const result = differenceInCalendarDays(\n * new Date(2011, 6, 3, 0, 1),\n * new Date(2011, 6, 2, 23, 59)\n * )\n * //=> 1\n */\nexport function differenceInCalendarDays(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n\n const laterStartOfDay = startOfDay(laterDate_);\n const earlierStartOfDay = startOfDay(earlierDate_);\n\n const laterTimestamp =\n +laterStartOfDay - getTimezoneOffsetInMilliseconds(laterStartOfDay);\n const earlierTimestamp =\n +earlierStartOfDay - getTimezoneOffsetInMilliseconds(earlierStartOfDay);\n\n // Round the number of days to the nearest integer because the number of\n // milliseconds in a day is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round((laterTimestamp - earlierTimestamp) / millisecondsInDay);\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarDays;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfYear} function options.\n */\n\n/**\n * @name startOfYear\n * @category Year Helpers\n * @summary Return the start of a year for the given date.\n *\n * @description\n * Return the start of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a year\n *\n * @example\n * // The start of a year for 2 September 2014 11:55:00:\n * const result = startOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Jan 01 2014 00:00:00\n */\nexport function startOfYear(date, options) {\n const date_ = toDate(date, options?.in);\n date_.setFullYear(date_.getFullYear(), 0, 1);\n date_.setHours(0, 0, 0, 0);\n return date_;\n}\n\n// Fallback for modularized imports:\nexport default startOfYear;\n","import { differenceInCalendarDays } from \"./differenceInCalendarDays.js\";\nimport { startOfYear } from \"./startOfYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getDayOfYear} function options.\n */\n\n/**\n * @name getDayOfYear\n * @category Day Helpers\n * @summary Get the day of the year of the given date.\n *\n * @description\n * Get the day of the year of the given date.\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The day of year\n *\n * @example\n * // Which day of the year is 2 July 2014?\n * const result = getDayOfYear(new Date(2014, 6, 2))\n * //=> 183\n */\nexport function getDayOfYear(date, options) {\n const _date = toDate(date, options?.in);\n const diff = differenceInCalendarDays(_date, startOfYear(_date));\n const dayOfYear = diff + 1;\n return dayOfYear;\n}\n\n// Fallback for modularized imports:\nexport default getDayOfYear;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfWeek} function options.\n */\n\n/**\n * @name startOfWeek\n * @category Week Helpers\n * @summary Return the start of a week for the given date.\n *\n * @description\n * Return the start of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week\n *\n * @example\n * // The start of a week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfWeek(date, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const _date = toDate(date, options?.in);\n const day = _date.getDay();\n const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\n _date.setDate(_date.getDate() - diff);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeek;\n","import { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfISOWeek} function options.\n */\n\n/**\n * @name startOfISOWeek\n * @category ISO Week Helpers\n * @summary Return the start of an ISO week for the given date.\n *\n * @description\n * Return the start of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week\n *\n * @example\n * // The start of an ISO week for 2 September 2014 11:55:00:\n * const result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfISOWeek(date, options) {\n return startOfWeek(date, { ...options, weekStartsOn: 1 });\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeek;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeekYear} function options.\n */\n\n/**\n * @name getISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the ISO week-numbering year of the given date.\n *\n * @description\n * Get the ISO week-numbering year of the given date,\n * which always starts 3 days before the year's first Thursday.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n *\n * @returns The ISO week-numbering year\n *\n * @example\n * // Which ISO-week numbering year is 2 January 2005?\n * const result = getISOWeekYear(new Date(2005, 0, 2))\n * //=> 2004\n */\nexport function getISOWeekYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n\n const fourthOfJanuaryOfNextYear = constructFrom(_date, 0);\n fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);\n fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);\n\n const fourthOfJanuaryOfThisYear = constructFrom(_date, 0);\n fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);\n fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);\n\n if (_date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (_date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getISOWeekYear;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { getISOWeekYear } from \"./getISOWeekYear.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\n\n/**\n * The {@link startOfISOWeekYear} function options.\n */\n\n/**\n * @name startOfISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Return the start of an ISO week-numbering year for the given date.\n *\n * @description\n * Return the start of an ISO week-numbering year,\n * which always starts 3 days before the year's first Thursday.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week-numbering year\n *\n * @example\n * // The start of an ISO week-numbering year for 2 July 2005:\n * const result = startOfISOWeekYear(new Date(2005, 6, 2))\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfISOWeekYear(date, options) {\n const year = getISOWeekYear(date, options);\n const fourthOfJanuary = constructFrom(options?.in || date, 0);\n fourthOfJanuary.setFullYear(year, 0, 4);\n fourthOfJanuary.setHours(0, 0, 0, 0);\n return startOfISOWeek(fourthOfJanuary);\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeekYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { startOfISOWeekYear } from \"./startOfISOWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeek} function options.\n */\n\n/**\n * @name getISOWeek\n * @category ISO Week Helpers\n * @summary Get the ISO week of the given date.\n *\n * @description\n * Get the ISO week of the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The ISO week\n *\n * @example\n * // Which week of the ISO-week numbering year is 2 January 2005?\n * const result = getISOWeek(new Date(2005, 0, 2))\n * //=> 53\n */\nexport function getISOWeek(date, options) {\n const _date = toDate(date, options?.in);\n const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getISOWeek;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeekYear} function options.\n */\n\n/**\n * @name getWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Get the local week-numbering year of the given date.\n *\n * @description\n * Get the local week-numbering year of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options.\n *\n * @returns The local week-numbering year\n *\n * @example\n * // Which week numbering year is 26 December 2004 with the default settings?\n * const result = getWeekYear(new Date(2004, 11, 26))\n * //=> 2005\n *\n * @example\n * // Which week numbering year is 26 December 2004 if week starts on Saturday?\n * const result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })\n * //=> 2004\n *\n * @example\n * // Which week numbering year is 26 December 2004 if the first week contains 4 January?\n * const result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })\n * //=> 2004\n */\nexport function getWeekYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const firstWeekOfNextYear = constructFrom(options?.in || date, 0);\n firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);\n firstWeekOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);\n\n const firstWeekOfThisYear = constructFrom(options?.in || date, 0);\n firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);\n firstWeekOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);\n\n if (+_date >= +startOfNextYear) {\n return year + 1;\n } else if (+_date >= +startOfThisYear) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getWeekYear;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { getWeekYear } from \"./getWeekYear.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfWeekYear} function options.\n */\n\n/**\n * @name startOfWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Return the start of a local week-numbering year for the given date.\n *\n * @description\n * Return the start of a local week-numbering year.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week-numbering year\n *\n * @example\n * // The start of an a week-numbering year for 2 July 2005 with default settings:\n * const result = startOfWeekYear(new Date(2005, 6, 2))\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // The start of a week-numbering year for 2 July 2005\n * // if Monday is the first day of week\n * // and 4 January is always in the first week of the year:\n * const result = startOfWeekYear(new Date(2005, 6, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfWeekYear(date, options) {\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const year = getWeekYear(date, options);\n const firstWeek = constructFrom(options?.in || date, 0);\n firstWeek.setFullYear(year, 0, firstWeekContainsDate);\n firstWeek.setHours(0, 0, 0, 0);\n const _date = startOfWeek(firstWeek, options);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeekYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { startOfWeekYear } from \"./startOfWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeek} function options.\n */\n\n/**\n * @name getWeek\n * @category Week Helpers\n * @summary Get the local week index of the given date.\n *\n * @description\n * Get the local week index of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The week\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005 with default options?\n * const result = getWeek(new Date(2005, 0, 2))\n * //=> 2\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January?\n * const result = getWeek(new Date(2005, 0, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> 53\n */\nexport function getWeek(date, options) {\n const _date = toDate(date, options?.in);\n const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getWeek;\n","export function addLeadingZeros(number, targetLength) {\n const sign = number < 0 ? \"-\" : \"\";\n const output = Math.abs(number).toString().padStart(targetLength, \"0\");\n return sign + output;\n}\n","import { addLeadingZeros } from \"../addLeadingZeros.js\";\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | |\n * | d | Day of month | D | |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | m | Minute | M | Month |\n * | s | Second | S | Fraction of second |\n * | y | Year (abs) | Y | |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n */\n\nexport const lightFormatters = {\n // Year\n y(date, token) {\n // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens\n // | Year | y | yy | yyy | yyyy | yyyyy |\n // |----------|-------|----|-------|-------|-------|\n // | AD 1 | 1 | 01 | 001 | 0001 | 00001 |\n // | AD 12 | 12 | 12 | 012 | 0012 | 00012 |\n // | AD 123 | 123 | 23 | 123 | 0123 | 00123 |\n // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 |\n // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\n\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return addLeadingZeros(token === \"yy\" ? year % 100 : year, token.length);\n },\n\n // Month\n M(date, token) {\n const month = date.getMonth();\n return token === \"M\" ? String(month + 1) : addLeadingZeros(month + 1, 2);\n },\n\n // Day of the month\n d(date, token) {\n return addLeadingZeros(date.getDate(), token.length);\n },\n\n // AM or PM\n a(date, token) {\n const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return dayPeriodEnumValue.toUpperCase();\n case \"aaa\":\n return dayPeriodEnumValue;\n case \"aaaaa\":\n return dayPeriodEnumValue[0];\n case \"aaaa\":\n default:\n return dayPeriodEnumValue === \"am\" ? \"a.m.\" : \"p.m.\";\n }\n },\n\n // Hour [1-12]\n h(date, token) {\n return addLeadingZeros(date.getHours() % 12 || 12, token.length);\n },\n\n // Hour [0-23]\n H(date, token) {\n return addLeadingZeros(date.getHours(), token.length);\n },\n\n // Minute\n m(date, token) {\n return addLeadingZeros(date.getMinutes(), token.length);\n },\n\n // Second\n s(date, token) {\n return addLeadingZeros(date.getSeconds(), token.length);\n },\n\n // Fraction of second\n S(date, token) {\n const numberOfDigits = token.length;\n const milliseconds = date.getMilliseconds();\n const fractionalSeconds = Math.trunc(\n milliseconds * Math.pow(10, numberOfDigits - 3),\n );\n return addLeadingZeros(fractionalSeconds, token.length);\n },\n};\n","import { getDayOfYear } from \"../../getDayOfYear.js\";\nimport { getISOWeek } from \"../../getISOWeek.js\";\nimport { getISOWeekYear } from \"../../getISOWeekYear.js\";\nimport { getWeek } from \"../../getWeek.js\";\nimport { getWeekYear } from \"../../getWeekYear.js\";\n\nimport { addLeadingZeros } from \"../addLeadingZeros.js\";\nimport { lightFormatters } from \"./lightFormatters.js\";\n\nconst dayPeriodEnum = {\n am: \"am\",\n pm: \"pm\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n};\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | Milliseconds in day |\n * | b | AM, PM, noon, midnight | B | Flexible day period |\n * | c | Stand-alone local day of week | C* | Localized hour w/ day period |\n * | d | Day of month | D | Day of year |\n * | e | Local day of week | E | Day of week |\n * | f | | F* | Day of week in month |\n * | g* | Modified Julian day | G | Era |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | i! | ISO day of week | I! | ISO week of year |\n * | j* | Localized hour w/ day period | J* | Localized hour w/o day period |\n * | k | Hour [1-24] | K | Hour [0-11] |\n * | l* | (deprecated) | L | Stand-alone month |\n * | m | Minute | M | Month |\n * | n | | N | |\n * | o! | Ordinal number modifier | O | Timezone (GMT) |\n * | p! | Long localized time | P! | Long localized date |\n * | q | Stand-alone quarter | Q | Quarter |\n * | r* | Related Gregorian year | R! | ISO week-numbering year |\n * | s | Second | S | Fraction of second |\n * | t! | Seconds timestamp | T! | Milliseconds timestamp |\n * | u | Extended year | U* | Cyclic year |\n * | v* | Timezone (generic non-locat.) | V* | Timezone (location) |\n * | w | Local week of year | W* | Week of month |\n * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) |\n * | y | Year (abs) | Y | Local week-numbering year |\n * | z | Timezone (specific non-locat.) | Z* | Timezone (aliases) |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `format` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n * i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n * `R` is supposed to be used in conjunction with `I` and `i`\n * for universal ISO week-numbering date, whereas\n * `Y` is supposed to be used in conjunction with `w` and `e`\n * for week-numbering date specific to the locale.\n * - `P` is long localized date format\n * - `p` is long localized time format\n */\n\nexport const formatters = {\n // Era\n G: function (date, token, localize) {\n const era = date.getFullYear() > 0 ? 1 : 0;\n switch (token) {\n // AD, BC\n case \"G\":\n case \"GG\":\n case \"GGG\":\n return localize.era(era, { width: \"abbreviated\" });\n // A, B\n case \"GGGGG\":\n return localize.era(era, { width: \"narrow\" });\n // Anno Domini, Before Christ\n case \"GGGG\":\n default:\n return localize.era(era, { width: \"wide\" });\n }\n },\n\n // Year\n y: function (date, token, localize) {\n // Ordinal number\n if (token === \"yo\") {\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return localize.ordinalNumber(year, { unit: \"year\" });\n }\n\n return lightFormatters.y(date, token);\n },\n\n // Local week-numbering year\n Y: function (date, token, localize, options) {\n const signedWeekYear = getWeekYear(date, options);\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;\n\n // Two digit year\n if (token === \"YY\") {\n const twoDigitYear = weekYear % 100;\n return addLeadingZeros(twoDigitYear, 2);\n }\n\n // Ordinal number\n if (token === \"Yo\") {\n return localize.ordinalNumber(weekYear, { unit: \"year\" });\n }\n\n // Padding\n return addLeadingZeros(weekYear, token.length);\n },\n\n // ISO week-numbering year\n R: function (date, token) {\n const isoWeekYear = getISOWeekYear(date);\n\n // Padding\n return addLeadingZeros(isoWeekYear, token.length);\n },\n\n // Extended year. This is a single number designating the year of this calendar system.\n // The main difference between `y` and `u` localizers are B.C. years:\n // | Year | `y` | `u` |\n // |------|-----|-----|\n // | AC 1 | 1 | 1 |\n // | BC 1 | 1 | 0 |\n // | BC 2 | 2 | -1 |\n // Also `yy` always returns the last two digits of a year,\n // while `uu` pads single digit years to 2 characters and returns other years unchanged.\n u: function (date, token) {\n const year = date.getFullYear();\n return addLeadingZeros(year, token.length);\n },\n\n // Quarter\n Q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"Q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"QQ\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"Qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"QQQ\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"QQQQQ\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"QQQQ\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone quarter\n q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"qq\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"qqq\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"qqqqq\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"qqqq\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // Month\n M: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n case \"M\":\n case \"MM\":\n return lightFormatters.M(date, token);\n // 1st, 2nd, ..., 12th\n case \"Mo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"MMM\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // J, F, ..., D\n case \"MMMMM\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // January, February, ..., December\n case \"MMMM\":\n default:\n return localize.month(month, { width: \"wide\", context: \"formatting\" });\n }\n },\n\n // Stand-alone month\n L: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n // 1, 2, ..., 12\n case \"L\":\n return String(month + 1);\n // 01, 02, ..., 12\n case \"LL\":\n return addLeadingZeros(month + 1, 2);\n // 1st, 2nd, ..., 12th\n case \"Lo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"LLL\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // J, F, ..., D\n case \"LLLLL\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // January, February, ..., December\n case \"LLLL\":\n default:\n return localize.month(month, { width: \"wide\", context: \"standalone\" });\n }\n },\n\n // Local week of year\n w: function (date, token, localize, options) {\n const week = getWeek(date, options);\n\n if (token === \"wo\") {\n return localize.ordinalNumber(week, { unit: \"week\" });\n }\n\n return addLeadingZeros(week, token.length);\n },\n\n // ISO week of year\n I: function (date, token, localize) {\n const isoWeek = getISOWeek(date);\n\n if (token === \"Io\") {\n return localize.ordinalNumber(isoWeek, { unit: \"week\" });\n }\n\n return addLeadingZeros(isoWeek, token.length);\n },\n\n // Day of the month\n d: function (date, token, localize) {\n if (token === \"do\") {\n return localize.ordinalNumber(date.getDate(), { unit: \"date\" });\n }\n\n return lightFormatters.d(date, token);\n },\n\n // Day of year\n D: function (date, token, localize) {\n const dayOfYear = getDayOfYear(date);\n\n if (token === \"Do\") {\n return localize.ordinalNumber(dayOfYear, { unit: \"dayOfYear\" });\n }\n\n return addLeadingZeros(dayOfYear, token.length);\n },\n\n // Day of week\n E: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n switch (token) {\n // Tue\n case \"E\":\n case \"EE\":\n case \"EEE\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"EEEEE\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"EEEEEE\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"EEEE\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Local day of week\n e: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (Nth day of week with current locale or weekStartsOn)\n case \"e\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"ee\":\n return addLeadingZeros(localDayOfWeek, 2);\n // 1st, 2nd, ..., 7th\n case \"eo\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"eee\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"eeeee\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"eeeeee\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"eeee\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone local day of week\n c: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (same as in `e`)\n case \"c\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"cc\":\n return addLeadingZeros(localDayOfWeek, token.length);\n // 1st, 2nd, ..., 7th\n case \"co\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"ccc\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // T\n case \"ccccc\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // Tu\n case \"cccccc\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"standalone\",\n });\n // Tuesday\n case \"cccc\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // ISO day of week\n i: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;\n switch (token) {\n // 2\n case \"i\":\n return String(isoDayOfWeek);\n // 02\n case \"ii\":\n return addLeadingZeros(isoDayOfWeek, token.length);\n // 2nd\n case \"io\":\n return localize.ordinalNumber(isoDayOfWeek, { unit: \"day\" });\n // Tue\n case \"iii\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"iiiii\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"iiiiii\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"iiii\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM or PM\n a: function (date, token, localize) {\n const hours = date.getHours();\n const dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"aaa\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"aaaaa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"aaaa\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM, PM, midnight, noon\n b: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours === 12) {\n dayPeriodEnumValue = dayPeriodEnum.noon;\n } else if (hours === 0) {\n dayPeriodEnumValue = dayPeriodEnum.midnight;\n } else {\n dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n }\n\n switch (token) {\n case \"b\":\n case \"bb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"bbb\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"bbbbb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"bbbb\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // in the morning, in the afternoon, in the evening, at night\n B: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours >= 17) {\n dayPeriodEnumValue = dayPeriodEnum.evening;\n } else if (hours >= 12) {\n dayPeriodEnumValue = dayPeriodEnum.afternoon;\n } else if (hours >= 4) {\n dayPeriodEnumValue = dayPeriodEnum.morning;\n } else {\n dayPeriodEnumValue = dayPeriodEnum.night;\n }\n\n switch (token) {\n case \"B\":\n case \"BB\":\n case \"BBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"BBBBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"BBBB\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Hour [1-12]\n h: function (date, token, localize) {\n if (token === \"ho\") {\n let hours = date.getHours() % 12;\n if (hours === 0) hours = 12;\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return lightFormatters.h(date, token);\n },\n\n // Hour [0-23]\n H: function (date, token, localize) {\n if (token === \"Ho\") {\n return localize.ordinalNumber(date.getHours(), { unit: \"hour\" });\n }\n\n return lightFormatters.H(date, token);\n },\n\n // Hour [0-11]\n K: function (date, token, localize) {\n const hours = date.getHours() % 12;\n\n if (token === \"Ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Hour [1-24]\n k: function (date, token, localize) {\n let hours = date.getHours();\n if (hours === 0) hours = 24;\n\n if (token === \"ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Minute\n m: function (date, token, localize) {\n if (token === \"mo\") {\n return localize.ordinalNumber(date.getMinutes(), { unit: \"minute\" });\n }\n\n return lightFormatters.m(date, token);\n },\n\n // Second\n s: function (date, token, localize) {\n if (token === \"so\") {\n return localize.ordinalNumber(date.getSeconds(), { unit: \"second\" });\n }\n\n return lightFormatters.s(date, token);\n },\n\n // Fraction of second\n S: function (date, token) {\n return lightFormatters.S(date, token);\n },\n\n // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)\n X: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n if (timezoneOffset === 0) {\n return \"Z\";\n }\n\n switch (token) {\n // Hours and optional minutes\n case \"X\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XX`\n case \"XXXX\":\n case \"XX\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XXX`\n case \"XXXXX\":\n case \"XXX\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)\n x: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Hours and optional minutes\n case \"x\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xx`\n case \"xxxx\":\n case \"xx\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xxx`\n case \"xxxxx\":\n case \"xxx\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (GMT)\n O: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"O\":\n case \"OO\":\n case \"OOO\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"OOOO\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (specific non-location)\n z: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"z\":\n case \"zz\":\n case \"zzz\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"zzzz\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Seconds timestamp\n t: function (date, token, _localize) {\n const timestamp = Math.trunc(+date / 1000);\n return addLeadingZeros(timestamp, token.length);\n },\n\n // Milliseconds timestamp\n T: function (date, token, _localize) {\n return addLeadingZeros(+date, token.length);\n },\n};\n\nfunction formatTimezoneShort(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = Math.trunc(absOffset / 60);\n const minutes = absOffset % 60;\n if (minutes === 0) {\n return sign + String(hours);\n }\n return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);\n}\n\nfunction formatTimezoneWithOptionalMinutes(offset, delimiter) {\n if (offset % 60 === 0) {\n const sign = offset > 0 ? \"-\" : \"+\";\n return sign + addLeadingZeros(Math.abs(offset) / 60, 2);\n }\n return formatTimezone(offset, delimiter);\n}\n\nfunction formatTimezone(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);\n const minutes = addLeadingZeros(absOffset % 60, 2);\n return sign + hours + delimiter + minutes;\n}\n","const dateLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"P\":\n return formatLong.date({ width: \"short\" });\n case \"PP\":\n return formatLong.date({ width: \"medium\" });\n case \"PPP\":\n return formatLong.date({ width: \"long\" });\n case \"PPPP\":\n default:\n return formatLong.date({ width: \"full\" });\n }\n};\n\nconst timeLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"p\":\n return formatLong.time({ width: \"short\" });\n case \"pp\":\n return formatLong.time({ width: \"medium\" });\n case \"ppp\":\n return formatLong.time({ width: \"long\" });\n case \"pppp\":\n default:\n return formatLong.time({ width: \"full\" });\n }\n};\n\nconst dateTimeLongFormatter = (pattern, formatLong) => {\n const matchResult = pattern.match(/(P+)(p+)?/) || [];\n const datePattern = matchResult[1];\n const timePattern = matchResult[2];\n\n if (!timePattern) {\n return dateLongFormatter(pattern, formatLong);\n }\n\n let dateTimeFormat;\n\n switch (datePattern) {\n case \"P\":\n dateTimeFormat = formatLong.dateTime({ width: \"short\" });\n break;\n case \"PP\":\n dateTimeFormat = formatLong.dateTime({ width: \"medium\" });\n break;\n case \"PPP\":\n dateTimeFormat = formatLong.dateTime({ width: \"long\" });\n break;\n case \"PPPP\":\n default:\n dateTimeFormat = formatLong.dateTime({ width: \"full\" });\n break;\n }\n\n return dateTimeFormat\n .replace(\"{{date}}\", dateLongFormatter(datePattern, formatLong))\n .replace(\"{{time}}\", timeLongFormatter(timePattern, formatLong));\n};\n\nexport const longFormatters = {\n p: timeLongFormatter,\n P: dateTimeLongFormatter,\n};\n","const dayOfYearTokenRE = /^D+$/;\nconst weekYearTokenRE = /^Y+$/;\n\nconst throwTokens = [\"D\", \"DD\", \"YY\", \"YYYY\"];\n\nexport function isProtectedDayOfYearToken(token) {\n return dayOfYearTokenRE.test(token);\n}\n\nexport function isProtectedWeekYearToken(token) {\n return weekYearTokenRE.test(token);\n}\n\nexport function warnOrThrowProtectedError(token, format, input) {\n const _message = message(token, format, input);\n console.warn(_message);\n if (throwTokens.includes(token)) throw new RangeError(_message);\n}\n\nfunction message(token, format, input) {\n const subject = token[0] === \"Y\" ? \"years\" : \"days of the month\";\n return `Use \\`${token.toLowerCase()}\\` instead of \\`${token}\\` (in \\`${format}\\`) for formatting ${subject} to the input \\`${input}\\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;\n}\n","/**\n * @name isDate\n * @category Common Helpers\n * @summary Is the given value a date?\n *\n * @description\n * Returns true if the given value is an instance of Date. The function works for dates transferred across iframes.\n *\n * @param value - The value to check\n *\n * @returns True if the given value is a date\n *\n * @example\n * // For a valid date:\n * const result = isDate(new Date())\n * //=> true\n *\n * @example\n * // For an invalid date:\n * const result = isDate(new Date(NaN))\n * //=> true\n *\n * @example\n * // For some value:\n * const result = isDate('2014-02-31')\n * //=> false\n *\n * @example\n * // For an object:\n * const result = isDate({})\n * //=> false\n */\nexport function isDate(value) {\n return (\n value instanceof Date ||\n (typeof value === \"object\" &&\n Object.prototype.toString.call(value) === \"[object Date]\")\n );\n}\n\n// Fallback for modularized imports:\nexport default isDate;\n","import { isDate } from \"./isDate.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * @name isValid\n * @category Common Helpers\n * @summary Is the given date valid?\n *\n * @description\n * Returns false if argument is Invalid Date and true otherwise.\n * Argument is converted to Date using `toDate`. See [toDate](https://date-fns.org/docs/toDate)\n * Invalid Date is a Date, whose time value is NaN.\n *\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @param date - The date to check\n *\n * @returns The date is valid\n *\n * @example\n * // For the valid date:\n * const result = isValid(new Date(2014, 1, 31))\n * //=> true\n *\n * @example\n * // For the value, convertible into a date:\n * const result = isValid(1393804800000)\n * //=> true\n *\n * @example\n * // For the invalid date:\n * const result = isValid(new Date(''))\n * //=> false\n */\nexport function isValid(date) {\n return !((!isDate(date) && typeof date !== \"number\") || isNaN(+toDate(date)));\n}\n\n// Fallback for modularized imports:\nexport default isValid;\n","import { defaultLocale } from \"./_lib/defaultLocale.js\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { formatters } from \"./_lib/format/formatters.js\";\nimport { longFormatters } from \"./_lib/format/longFormatters.js\";\nimport {\n isProtectedDayOfYearToken,\n isProtectedWeekYearToken,\n warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.js\";\nimport { isValid } from \"./isValid.js\";\nimport { toDate } from \"./toDate.js\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { formatters, longFormatters };\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n// (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n// except a single quote symbol, which ends the sequence.\n// Two quote characters do not end the sequence.\n// If there is no matching single quote\n// then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\nexport { format as formatDate };\n\n/**\n * The {@link format} function options.\n */\n\n/**\n * @name format\n * @alias formatDate\n * @category Common Helpers\n * @summary Format the date.\n *\n * @description\n * Return the formatted date string in the given format. The result may vary by locale.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n * (see the last example)\n *\n * Format of the string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 7 below the table).\n *\n * Accepted patterns:\n * | Unit | Pattern | Result examples | Notes |\n * |---------------------------------|---------|-----------------------------------|-------|\n * | Era | G..GGG | AD, BC | |\n * | | GGGG | Anno Domini, Before Christ | 2 |\n * | | GGGGG | A, B | |\n * | Calendar year | y | 44, 1, 1900, 2017 | 5 |\n * | | yo | 44th, 1st, 0th, 17th | 5,7 |\n * | | yy | 44, 01, 00, 17 | 5 |\n * | | yyy | 044, 001, 1900, 2017 | 5 |\n * | | yyyy | 0044, 0001, 1900, 2017 | 5 |\n * | | yyyyy | ... | 3,5 |\n * | Local week-numbering year | Y | 44, 1, 1900, 2017 | 5 |\n * | | Yo | 44th, 1st, 1900th, 2017th | 5,7 |\n * | | YY | 44, 01, 00, 17 | 5,8 |\n * | | YYY | 044, 001, 1900, 2017 | 5 |\n * | | YYYY | 0044, 0001, 1900, 2017 | 5,8 |\n * | | YYYYY | ... | 3,5 |\n * | ISO week-numbering year | R | -43, 0, 1, 1900, 2017 | 5,7 |\n * | | RR | -43, 00, 01, 1900, 2017 | 5,7 |\n * | | RRR | -043, 000, 001, 1900, 2017 | 5,7 |\n * | | RRRR | -0043, 0000, 0001, 1900, 2017 | 5,7 |\n * | | RRRRR | ... | 3,5,7 |\n * | Extended year | u | -43, 0, 1, 1900, 2017 | 5 |\n * | | uu | -43, 01, 1900, 2017 | 5 |\n * | | uuu | -043, 001, 1900, 2017 | 5 |\n * | | uuuu | -0043, 0001, 1900, 2017 | 5 |\n * | | uuuuu | ... | 3,5 |\n * | Quarter (formatting) | Q | 1, 2, 3, 4 | |\n * | | Qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | QQ | 01, 02, 03, 04 | |\n * | | QQQ | Q1, Q2, Q3, Q4 | |\n * | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |\n * | | QQQQQ | 1, 2, 3, 4 | 4 |\n * | Quarter (stand-alone) | q | 1, 2, 3, 4 | |\n * | | qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | qq | 01, 02, 03, 04 | |\n * | | qqq | Q1, Q2, Q3, Q4 | |\n * | | qqqq | 1st quarter, 2nd quarter, ... | 2 |\n * | | qqqqq | 1, 2, 3, 4 | 4 |\n * | Month (formatting) | M | 1, 2, ..., 12 | |\n * | | Mo | 1st, 2nd, ..., 12th | 7 |\n * | | MM | 01, 02, ..., 12 | |\n * | | MMM | Jan, Feb, ..., Dec | |\n * | | MMMM | January, February, ..., December | 2 |\n * | | MMMMM | J, F, ..., D | |\n * | Month (stand-alone) | L | 1, 2, ..., 12 | |\n * | | Lo | 1st, 2nd, ..., 12th | 7 |\n * | | LL | 01, 02, ..., 12 | |\n * | | LLL | Jan, Feb, ..., Dec | |\n * | | LLLL | January, February, ..., December | 2 |\n * | | LLLLL | J, F, ..., D | |\n * | Local week of year | w | 1, 2, ..., 53 | |\n * | | wo | 1st, 2nd, ..., 53th | 7 |\n * | | ww | 01, 02, ..., 53 | |\n * | ISO week of year | I | 1, 2, ..., 53 | 7 |\n * | | Io | 1st, 2nd, ..., 53th | 7 |\n * | | II | 01, 02, ..., 53 | 7 |\n * | Day of month | d | 1, 2, ..., 31 | |\n * | | do | 1st, 2nd, ..., 31st | 7 |\n * | | dd | 01, 02, ..., 31 | |\n * | Day of year | D | 1, 2, ..., 365, 366 | 9 |\n * | | Do | 1st, 2nd, ..., 365th, 366th | 7 |\n * | | DD | 01, 02, ..., 365, 366 | 9 |\n * | | DDD | 001, 002, ..., 365, 366 | |\n * | | DDDD | ... | 3 |\n * | Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Sun | |\n * | | EEEE | Monday, Tuesday, ..., Sunday | 2 |\n * | | EEEEE | M, T, W, T, F, S, S | |\n * | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 |\n * | | io | 1st, 2nd, ..., 7th | 7 |\n * | | ii | 01, 02, ..., 07 | 7 |\n * | | iii | Mon, Tue, Wed, ..., Sun | 7 |\n * | | iiii | Monday, Tuesday, ..., Sunday | 2,7 |\n * | | iiiii | M, T, W, T, F, S, S | 7 |\n * | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 7 |\n * | Local day of week (formatting) | e | 2, 3, 4, ..., 1 | |\n * | | eo | 2nd, 3rd, ..., 1st | 7 |\n * | | ee | 02, 03, ..., 01 | |\n * | | eee | Mon, Tue, Wed, ..., Sun | |\n * | | eeee | Monday, Tuesday, ..., Sunday | 2 |\n * | | eeeee | M, T, W, T, F, S, S | |\n * | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | |\n * | | co | 2nd, 3rd, ..., 1st | 7 |\n * | | cc | 02, 03, ..., 01 | |\n * | | ccc | Mon, Tue, Wed, ..., Sun | |\n * | | cccc | Monday, Tuesday, ..., Sunday | 2 |\n * | | ccccc | M, T, W, T, F, S, S | |\n * | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | AM, PM | a..aa | AM, PM | |\n * | | aaa | am, pm | |\n * | | aaaa | a.m., p.m. | 2 |\n * | | aaaaa | a, p | |\n * | AM, PM, noon, midnight | b..bb | AM, PM, noon, midnight | |\n * | | bbb | am, pm, noon, midnight | |\n * | | bbbb | a.m., p.m., noon, midnight | 2 |\n * | | bbbbb | a, p, n, mi | |\n * | Flexible day period | B..BBB | at night, in the morning, ... | |\n * | | BBBB | at night, in the morning, ... | 2 |\n * | | BBBBB | at night, in the morning, ... | |\n * | Hour [1-12] | h | 1, 2, ..., 11, 12 | |\n * | | ho | 1st, 2nd, ..., 11th, 12th | 7 |\n * | | hh | 01, 02, ..., 11, 12 | |\n * | Hour [0-23] | H | 0, 1, 2, ..., 23 | |\n * | | Ho | 0th, 1st, 2nd, ..., 23rd | 7 |\n * | | HH | 00, 01, 02, ..., 23 | |\n * | Hour [0-11] | K | 1, 2, ..., 11, 0 | |\n * | | Ko | 1st, 2nd, ..., 11th, 0th | 7 |\n * | | KK | 01, 02, ..., 11, 00 | |\n * | Hour [1-24] | k | 24, 1, 2, ..., 23 | |\n * | | ko | 24th, 1st, 2nd, ..., 23rd | 7 |\n * | | kk | 24, 01, 02, ..., 23 | |\n * | Minute | m | 0, 1, ..., 59 | |\n * | | mo | 0th, 1st, ..., 59th | 7 |\n * | | mm | 00, 01, ..., 59 | |\n * | Second | s | 0, 1, ..., 59 | |\n * | | so | 0th, 1st, ..., 59th | 7 |\n * | | ss | 00, 01, ..., 59 | |\n * | Fraction of second | S | 0, 1, ..., 9 | |\n * | | SS | 00, 01, ..., 99 | |\n * | | SSS | 000, 001, ..., 999 | |\n * | | SSSS | ... | 3 |\n * | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |\n * | | XX | -0800, +0530, Z | |\n * | | XXX | -08:00, +05:30, Z | |\n * | | XXXX | -0800, +0530, Z, +123456 | 2 |\n * | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |\n * | Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |\n * | | xx | -0800, +0530, +0000 | |\n * | | xxx | -08:00, +05:30, +00:00 | 2 |\n * | | xxxx | -0800, +0530, +0000, +123456 | |\n * | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |\n * | Timezone (GMT) | O...OOO | GMT-8, GMT+5:30, GMT+0 | |\n * | | OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | 2 |\n * | Timezone (specific non-locat.) | z...zzz | GMT-8, GMT+5:30, GMT+0 | 6 |\n * | | zzzz | GMT-08:00, GMT+05:30, GMT+00:00 | 2,6 |\n * | Seconds timestamp | t | 512969520 | 7 |\n * | | tt | ... | 3,7 |\n * | Milliseconds timestamp | T | 512969520900 | 7 |\n * | | TT | ... | 3,7 |\n * | Long localized date | P | 04/29/1453 | 7 |\n * | | PP | Apr 29, 1453 | 7 |\n * | | PPP | April 29th, 1453 | 7 |\n * | | PPPP | Friday, April 29th, 1453 | 2,7 |\n * | Long localized time | p | 12:00 AM | 7 |\n * | | pp | 12:00:00 AM | 7 |\n * | | ppp | 12:00:00 AM GMT+2 | 7 |\n * | | pppp | 12:00:00 AM GMT+02:00 | 2,7 |\n * | Combination of date and time | Pp | 04/29/1453, 12:00 AM | 7 |\n * | | PPpp | Apr 29, 1453, 12:00:00 AM | 7 |\n * | | PPPppp | April 29th, 1453 at ... | 7 |\n * | | PPPPpppp| Friday, April 29th, 1453 at ... | 2,7 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n * are the same as \"stand-alone\" units, but are different in some languages.\n * \"Formatting\" units are declined according to the rules of the language\n * in the context of a date. \"Stand-alone\" units are always nominative singular:\n *\n * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n * the single quote characters (see below).\n * If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)\n * the output will be the same as default pattern for this unit, usually\n * the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units\n * are marked with \"2\" in the last column of the table.\n *\n * `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`\n *\n * `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`\n *\n * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).\n * The output will be padded with zeros to match the length of the pattern.\n *\n * `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`\n *\n * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n * These tokens represent the shortest form of the quarter.\n *\n * 5. The main difference between `y` and `u` patterns are B.C. years:\n *\n * | Year | `y` | `u` |\n * |------|-----|-----|\n * | AC 1 | 1 | 1 |\n * | BC 1 | 1 | 0 |\n * | BC 2 | 2 | -1 |\n *\n * Also `yy` always returns the last two digits of a year,\n * while `uu` pads single digit years to 2 characters and returns other years unchanged:\n *\n * | Year | `yy` | `uu` |\n * |------|------|------|\n * | 1 | 01 | 01 |\n * | 14 | 14 | 14 |\n * | 376 | 76 | 376 |\n * | 1453 | 53 | 1453 |\n *\n * The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n * except local week-numbering years are dependent on `options.weekStartsOn`\n * and `options.firstWeekContainsDate` (compare [getISOWeekYear](https://date-fns.org/docs/getISOWeekYear)\n * and [getWeekYear](https://date-fns.org/docs/getWeekYear)).\n *\n * 6. Specific non-location timezones are currently unavailable in `date-fns`,\n * so right now these tokens fall back to GMT timezones.\n *\n * 7. These patterns are not in the Unicode Technical Standard #35:\n * - `i`: ISO day of week\n * - `I`: ISO week of year\n * - `R`: ISO week-numbering year\n * - `t`: seconds timestamp\n * - `T`: milliseconds timestamp\n * - `o`: ordinal number modifier\n * - `P`: long localized date\n * - `p`: long localized time\n *\n * 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @param date - The original date\n * @param format - The string of tokens\n * @param options - An object with options\n *\n * @returns The formatted date string\n *\n * @throws `date` must not be Invalid Date\n * @throws `options.locale` must contain `localize` property\n * @throws `options.locale` must contain `formatLong` property\n * @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Represent 11 February 2014 in middle-endian format:\n * const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')\n * //=> '02/11/2014'\n *\n * @example\n * // Represent 2 July 2014 in Esperanto:\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = format(new Date(2014, 6, 2), \"do 'de' MMMM yyyy\", {\n * locale: eoLocale\n * })\n * //=> '2-a de julio 2014'\n *\n * @example\n * // Escape string by single quote characters:\n * const result = format(new Date(2014, 6, 2, 15), \"h 'o''clock'\")\n * //=> \"3 o'clock\"\n */\nexport function format(date, formatStr, options) {\n const defaultOptions = getDefaultOptions();\n const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const originalDate = toDate(date, options?.in);\n\n if (!isValid(originalDate)) {\n throw new RangeError(\"Invalid time value\");\n }\n\n let parts = formatStr\n .match(longFormattingTokensRegExp)\n .map((substring) => {\n const firstCharacter = substring[0];\n if (firstCharacter === \"p\" || firstCharacter === \"P\") {\n const longFormatter = longFormatters[firstCharacter];\n return longFormatter(substring, locale.formatLong);\n }\n return substring;\n })\n .join(\"\")\n .match(formattingTokensRegExp)\n .map((substring) => {\n // Replace two single quote characters with one single quote character\n if (substring === \"''\") {\n return { isToken: false, value: \"'\" };\n }\n\n const firstCharacter = substring[0];\n if (firstCharacter === \"'\") {\n return { isToken: false, value: cleanEscapedString(substring) };\n }\n\n if (formatters[firstCharacter]) {\n return { isToken: true, value: substring };\n }\n\n if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n throw new RangeError(\n \"Format string contains an unescaped latin alphabet character `\" +\n firstCharacter +\n \"`\",\n );\n }\n\n return { isToken: false, value: substring };\n });\n\n // invoke localize preprocessor (only for french locales at the moment)\n if (locale.localize.preprocessor) {\n parts = locale.localize.preprocessor(originalDate, parts);\n }\n\n const formatterOptions = {\n firstWeekContainsDate,\n weekStartsOn,\n locale,\n };\n\n return parts\n .map((part) => {\n if (!part.isToken) return part.value;\n\n const token = part.value;\n\n if (\n (!options?.useAdditionalWeekYearTokens &&\n isProtectedWeekYearToken(token)) ||\n (!options?.useAdditionalDayOfYearTokens &&\n isProtectedDayOfYearToken(token))\n ) {\n warnOrThrowProtectedError(token, formatStr, String(date));\n }\n\n const formatter = formatters[token[0]];\n return formatter(originalDate, token, locale.localize, formatterOptions);\n })\n .join(\"\");\n}\n\nfunction cleanEscapedString(input) {\n const matched = input.match(escapedStringRegExp);\n\n if (!matched) {\n return input;\n }\n\n return matched[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default format;\n","import { getDefaultOptions as getInternalDefaultOptions } from \"./_lib/defaultOptions.js\";\n\n/**\n * @name getDefaultOptions\n * @category Common Helpers\n * @summary Get default options.\n * @pure false\n *\n * @description\n * Returns an object that contains defaults for\n * `options.locale`, `options.weekStartsOn` and `options.firstWeekContainsDate`\n * arguments for all functions.\n *\n * You can change these with [setDefaultOptions](https://date-fns.org/docs/setDefaultOptions).\n *\n * @returns The default options\n *\n * @example\n * const result = getDefaultOptions()\n * //=> {}\n *\n * @example\n * setDefaultOptions({ weekStarsOn: 1, firstWeekContainsDate: 4 })\n * const result = getDefaultOptions()\n * //=> { weekStarsOn: 1, firstWeekContainsDate: 4 }\n */\nexport function getDefaultOptions() {\n return Object.assign({}, getInternalDefaultOptions());\n}\n\n// Fallback for modularized imports:\nexport default getDefaultOptions;\n","import { getDefaultOptions } from 'date-fns';\n/**\n * Returns the formatted time zone name of the provided `timeZone` or the current\n * system time zone if omitted, accounting for DST according to the UTC value of\n * the date.\n */\nexport function tzIntlTimeZoneName(length, date, options) {\n const defaultOptions = getDefaultOptions();\n const dtf = getDTF(length, options.timeZone, options.locale ?? defaultOptions.locale);\n return 'formatToParts' in dtf ? partsTimeZone(dtf, date) : hackyTimeZone(dtf, date);\n}\nfunction partsTimeZone(dtf, date) {\n const formatted = dtf.formatToParts(date);\n for (let i = formatted.length - 1; i >= 0; --i) {\n if (formatted[i].type === 'timeZoneName') {\n return formatted[i].value;\n }\n }\n return undefined;\n}\nfunction hackyTimeZone(dtf, date) {\n const formatted = dtf.format(date).replace(/\\u200E/g, '');\n const tzNameMatch = / [\\w-+ ]+$/.exec(formatted);\n return tzNameMatch ? tzNameMatch[0].substr(1) : '';\n}\n// If a locale has been provided `en-US` is used as a fallback in case it is an\n// invalid locale, otherwise the locale is left undefined to use the system locale.\nfunction getDTF(length, timeZone, locale) {\n return new Intl.DateTimeFormat(locale ? [locale.code, 'en-US'] : undefined, {\n timeZone: timeZone,\n timeZoneName: length,\n });\n}\n","/**\n * Returns the [year, month, day, hour, minute, seconds] tokens of the provided\n * `date` as it will be rendered in the `timeZone`.\n */\nexport function tzTokenizeDate(date, timeZone) {\n const dtf = getDateTimeFormat(timeZone);\n return 'formatToParts' in dtf ? partsOffset(dtf, date) : hackyOffset(dtf, date);\n}\nconst typeToPos = {\n year: 0,\n month: 1,\n day: 2,\n hour: 3,\n minute: 4,\n second: 5,\n};\nfunction partsOffset(dtf, date) {\n try {\n const formatted = dtf.formatToParts(date);\n const filled = [];\n for (let i = 0; i < formatted.length; i++) {\n const pos = typeToPos[formatted[i].type];\n if (pos !== undefined) {\n filled[pos] = parseInt(formatted[i].value, 10);\n }\n }\n return filled;\n }\n catch (error) {\n if (error instanceof RangeError) {\n return [NaN];\n }\n throw error;\n }\n}\nfunction hackyOffset(dtf, date) {\n const formatted = dtf.format(date);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const parsed = /(\\d+)\\/(\\d+)\\/(\\d+),? (\\d+):(\\d+):(\\d+)/.exec(formatted);\n // const [, fMonth, fDay, fYear, fHour, fMinute, fSecond] = parsed\n // return [fYear, fMonth, fDay, fHour, fMinute, fSecond]\n return [\n parseInt(parsed[3], 10),\n parseInt(parsed[1], 10),\n parseInt(parsed[2], 10),\n parseInt(parsed[4], 10),\n parseInt(parsed[5], 10),\n parseInt(parsed[6], 10),\n ];\n}\n// Get a cached Intl.DateTimeFormat instance for the IANA `timeZone`. This can be used\n// to get deterministic local date/time output according to the `en-US` locale which\n// can be used to extract local time parts as necessary.\nconst dtfCache = {};\n// New browsers use `hourCycle`, IE and Chrome <73 does not support it and uses `hour12`\nconst testDateFormatted = new Intl.DateTimeFormat('en-US', {\n hourCycle: 'h23',\n timeZone: 'America/New_York',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n}).format(new Date('2014-06-25T04:00:00.123Z'));\nconst hourCycleSupported = testDateFormatted === '06/25/2014, 00:00:00' ||\n testDateFormatted === '06/25/2014 00:00:00';\nfunction getDateTimeFormat(timeZone) {\n if (!dtfCache[timeZone]) {\n dtfCache[timeZone] = hourCycleSupported\n ? new Intl.DateTimeFormat('en-US', {\n hourCycle: 'h23',\n timeZone: timeZone,\n year: 'numeric',\n month: 'numeric',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n : new Intl.DateTimeFormat('en-US', {\n hour12: false,\n timeZone: timeZone,\n year: 'numeric',\n month: 'numeric',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n }\n return dtfCache[timeZone];\n}\n","/**\n * Use instead of `new Date(Date.UTC(...))` to support years below 100 which doesn't work\n * otherwise due to the nature of the\n * [`Date` constructor](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#interpretation_of_two-digit_years.\n *\n * For `Date.UTC(...)`, use `newDateUTC(...).getTime()`.\n */\nexport function newDateUTC(fullYear, month, day, hour, minute, second, millisecond) {\n const utcDate = new Date(0);\n utcDate.setUTCFullYear(fullYear, month, day);\n utcDate.setUTCHours(hour, minute, second, millisecond);\n return utcDate;\n}\n","import { tzTokenizeDate } from '../tzTokenizeDate/index.js';\nimport { newDateUTC } from '../newDateUTC/index.js';\nconst MILLISECONDS_IN_HOUR = 3600000;\nconst MILLISECONDS_IN_MINUTE = 60000;\nconst patterns = {\n timezone: /([Z+-].*)$/,\n timezoneZ: /^(Z)$/,\n timezoneHH: /^([+-]\\d{2})$/,\n timezoneHHMM: /^([+-])(\\d{2}):?(\\d{2})$/,\n};\n// Parse constious time zone offset formats to an offset in milliseconds\nexport function tzParseTimezone(timezoneString, date, isUtcDate) {\n // Empty string\n if (!timezoneString) {\n return 0;\n }\n // Z\n let token = patterns.timezoneZ.exec(timezoneString);\n if (token) {\n return 0;\n }\n let hours;\n let absoluteOffset;\n // ±hh\n token = patterns.timezoneHH.exec(timezoneString);\n if (token) {\n hours = parseInt(token[1], 10);\n if (!validateTimezone(hours)) {\n return NaN;\n }\n return -(hours * MILLISECONDS_IN_HOUR);\n }\n // ±hh:mm or ±hhmm\n token = patterns.timezoneHHMM.exec(timezoneString);\n if (token) {\n hours = parseInt(token[2], 10);\n const minutes = parseInt(token[3], 10);\n if (!validateTimezone(hours, minutes)) {\n return NaN;\n }\n absoluteOffset = Math.abs(hours) * MILLISECONDS_IN_HOUR + minutes * MILLISECONDS_IN_MINUTE;\n return token[1] === '+' ? -absoluteOffset : absoluteOffset;\n }\n // IANA time zone\n if (isValidTimezoneIANAString(timezoneString)) {\n date = new Date(date || Date.now());\n const utcDate = isUtcDate ? date : toUtcDate(date);\n const offset = calcOffset(utcDate, timezoneString);\n const fixedOffset = isUtcDate ? offset : fixOffset(date, offset, timezoneString);\n return -fixedOffset;\n }\n return NaN;\n}\nfunction toUtcDate(date) {\n return newDateUTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n}\nfunction calcOffset(date, timezoneString) {\n const tokens = tzTokenizeDate(date, timezoneString);\n // ms dropped because it's not provided by tzTokenizeDate\n const asUTC = newDateUTC(tokens[0], tokens[1] - 1, tokens[2], tokens[3] % 24, tokens[4], tokens[5], 0).getTime();\n let asTS = date.getTime();\n const over = asTS % 1000;\n asTS -= over >= 0 ? over : 1000 + over;\n return asUTC - asTS;\n}\nfunction fixOffset(date, offset, timezoneString) {\n const localTS = date.getTime();\n // Our UTC time is just a guess because our offset is just a guess\n let utcGuess = localTS - offset;\n // Test whether the zone matches the offset for this ts\n const o2 = calcOffset(new Date(utcGuess), timezoneString);\n // If so, offset didn't change, and we're done\n if (offset === o2) {\n return offset;\n }\n // If not, change the ts by the difference in the offset\n utcGuess -= o2 - offset;\n // If that gives us the local time we want, we're done\n const o3 = calcOffset(new Date(utcGuess), timezoneString);\n if (o2 === o3) {\n return o2;\n }\n // If it's different, we're in a hole time. The offset has changed, but we don't adjust the time\n return Math.max(o2, o3);\n}\nfunction validateTimezone(hours, minutes) {\n return -23 <= hours && hours <= 23 && (minutes == null || (0 <= minutes && minutes <= 59));\n}\nconst validIANATimezoneCache = {};\nfunction isValidTimezoneIANAString(timeZoneString) {\n if (validIANATimezoneCache[timeZoneString])\n return true;\n try {\n new Intl.DateTimeFormat(undefined, { timeZone: timeZoneString });\n validIANATimezoneCache[timeZoneString] = true;\n return true;\n }\n catch (error) {\n return false;\n }\n}\n","import { tzIntlTimeZoneName } from '../../_lib/tzIntlTimeZoneName/index.js';\nimport { tzParseTimezone } from '../../_lib/tzParseTimezone/index.js';\nconst MILLISECONDS_IN_MINUTE = 60 * 1000;\nexport const formatters = {\n // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)\n X: function (date, token, options) {\n const timezoneOffset = getTimeZoneOffset(options.timeZone, date);\n if (timezoneOffset === 0) {\n return 'Z';\n }\n switch (token) {\n // Hours and optional minutes\n case 'X':\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n // Hours, minutes and optional seconds without `:` delimeter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XX`\n case 'XXXX':\n case 'XX': // Hours and minutes without `:` delimeter\n return formatTimezone(timezoneOffset);\n // Hours, minutes and optional seconds with `:` delimeter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XXX`\n case 'XXXXX':\n case 'XXX': // Hours and minutes with `:` delimeter\n default:\n return formatTimezone(timezoneOffset, ':');\n }\n },\n // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)\n x: function (date, token, options) {\n const timezoneOffset = getTimeZoneOffset(options.timeZone, date);\n switch (token) {\n // Hours and optional minutes\n case 'x':\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n // Hours, minutes and optional seconds without `:` delimeter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xx`\n case 'xxxx':\n case 'xx': // Hours and minutes without `:` delimeter\n return formatTimezone(timezoneOffset);\n // Hours, minutes and optional seconds with `:` delimeter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xxx`\n case 'xxxxx':\n case 'xxx': // Hours and minutes with `:` delimeter\n default:\n return formatTimezone(timezoneOffset, ':');\n }\n },\n // Timezone (GMT)\n O: function (date, token, options) {\n const timezoneOffset = getTimeZoneOffset(options.timeZone, date);\n switch (token) {\n // Short\n case 'O':\n case 'OO':\n case 'OOO':\n return 'GMT' + formatTimezoneShort(timezoneOffset, ':');\n // Long\n case 'OOOO':\n default:\n return 'GMT' + formatTimezone(timezoneOffset, ':');\n }\n },\n // Timezone (specific non-location)\n z: function (date, token, options) {\n switch (token) {\n // Short\n case 'z':\n case 'zz':\n case 'zzz':\n return tzIntlTimeZoneName('short', date, options);\n // Long\n case 'zzzz':\n default:\n return tzIntlTimeZoneName('long', date, options);\n }\n },\n};\nfunction getTimeZoneOffset(timeZone, originalDate) {\n const timeZoneOffset = timeZone\n ? tzParseTimezone(timeZone, originalDate, true) / MILLISECONDS_IN_MINUTE\n : originalDate?.getTimezoneOffset() ?? 0;\n if (Number.isNaN(timeZoneOffset)) {\n throw new RangeError('Invalid time zone specified: ' + timeZone);\n }\n return timeZoneOffset;\n}\nfunction addLeadingZeros(number, targetLength) {\n const sign = number < 0 ? '-' : '';\n let output = Math.abs(number).toString();\n while (output.length < targetLength) {\n output = '0' + output;\n }\n return sign + output;\n}\nfunction formatTimezone(offset, delimiter = '') {\n const sign = offset > 0 ? '-' : '+';\n const absOffset = Math.abs(offset);\n const hours = addLeadingZeros(Math.floor(absOffset / 60), 2);\n const minutes = addLeadingZeros(Math.floor(absOffset % 60), 2);\n return sign + hours + delimiter + minutes;\n}\nfunction formatTimezoneWithOptionalMinutes(offset, delimiter) {\n if (offset % 60 === 0) {\n const sign = offset > 0 ? '-' : '+';\n return sign + addLeadingZeros(Math.abs(offset) / 60, 2);\n }\n return formatTimezone(offset, delimiter);\n}\nfunction formatTimezoneShort(offset, delimiter = '') {\n const sign = offset > 0 ? '-' : '+';\n const absOffset = Math.abs(offset);\n const hours = Math.floor(absOffset / 60);\n const minutes = absOffset % 60;\n if (minutes === 0) {\n return sign + String(hours);\n }\n return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);\n}\n","/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport function getTimezoneOffsetInMilliseconds(date) {\n const utcDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()));\n utcDate.setUTCFullYear(date.getFullYear());\n return +date - +utcDate;\n}\n","/** Regex to identify the presence of a time zone specifier in a date string */\nexport const tzPattern = /(Z|[+-]\\d{2}(?::?\\d{2})?| UTC| [a-zA-Z]+\\/[a-zA-Z_]+(?:\\/[a-zA-Z_]+)?)$/;\n","import { getTimezoneOffsetInMilliseconds } from '../_lib/getTimezoneOffsetInMilliseconds/index.js';\nimport { tzParseTimezone } from '../_lib/tzParseTimezone/index.js';\nimport { tzPattern } from '../_lib/tzPattern/index.js';\nconst MILLISECONDS_IN_HOUR = 3600000;\nconst MILLISECONDS_IN_MINUTE = 60000;\nconst DEFAULT_ADDITIONAL_DIGITS = 2;\nconst patterns = {\n dateTimePattern: /^([0-9W+-]+)(T| )(.*)/,\n datePattern: /^([0-9W+-]+)(.*)/,\n plainTime: /:/,\n // year tokens\n YY: /^(\\d{2})$/,\n YYY: [\n /^([+-]\\d{2})$/, // 0 additional digits\n /^([+-]\\d{3})$/, // 1 additional digit\n /^([+-]\\d{4})$/, // 2 additional digits\n ],\n YYYY: /^(\\d{4})/,\n YYYYY: [\n /^([+-]\\d{4})/, // 0 additional digits\n /^([+-]\\d{5})/, // 1 additional digit\n /^([+-]\\d{6})/, // 2 additional digits\n ],\n // date tokens\n MM: /^-(\\d{2})$/,\n DDD: /^-?(\\d{3})$/,\n MMDD: /^-?(\\d{2})-?(\\d{2})$/,\n Www: /^-?W(\\d{2})$/,\n WwwD: /^-?W(\\d{2})-?(\\d{1})$/,\n HH: /^(\\d{2}([.,]\\d*)?)$/,\n HHMM: /^(\\d{2}):?(\\d{2}([.,]\\d*)?)$/,\n HHMMSS: /^(\\d{2}):?(\\d{2}):?(\\d{2}([.,]\\d*)?)$/,\n // time zone tokens (to identify the presence of a tz)\n timeZone: tzPattern,\n};\n/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If an argument is a string, the function tries to parse it.\n * Function accepts complete ISO 8601 formats as well as partial implementations.\n * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601\n * If the function cannot parse the string or the values are invalid, it returns Invalid Date.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n * All *date-fns* functions will throw `RangeError` if `options.additionalDigits` is not 0, 1, 2 or undefined.\n *\n * @param argument the value to convert\n * @param options the object with options. See [Options]{@link https://date-fns.org/docs/Options}\n * @param {0|1|2} [options.additionalDigits=2] - the additional number of digits in the extended year format\n * @param {string} [options.timeZone=''] - used to specify the IANA time zone offset of a date String.\n *\n * @returns the parsed date in the local time zone\n * @throws {TypeError} 1 argument required\n * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2\n *\n * @example\n * // Convert string '2014-02-11T11:30:30' to date:\n * const result = toDate('2014-02-11T11:30:30')\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert string '+02014101' to date,\n * // if the additional number of digits in the extended year format is 1:\n * const result = toDate('+02014101', {additionalDigits: 1})\n * //=> Fri Apr 11 2014 00:00:00\n */\nexport function toDate(argument, options = {}) {\n if (arguments.length < 1) {\n throw new TypeError('1 argument required, but only ' + arguments.length + ' present');\n }\n if (argument === null) {\n return new Date(NaN);\n }\n const additionalDigits = options.additionalDigits == null ? DEFAULT_ADDITIONAL_DIGITS : Number(options.additionalDigits);\n if (additionalDigits !== 2 && additionalDigits !== 1 && additionalDigits !== 0) {\n throw new RangeError('additionalDigits must be 0, 1 or 2');\n }\n // Clone the date\n if (argument instanceof Date ||\n (typeof argument === 'object' && Object.prototype.toString.call(argument) === '[object Date]')) {\n // Prevent the date to lose the milliseconds when passed to new Date() in IE10\n return new Date(argument.getTime());\n }\n else if (typeof argument === 'number' ||\n Object.prototype.toString.call(argument) === '[object Number]') {\n return new Date(argument);\n }\n else if (!(Object.prototype.toString.call(argument) === '[object String]')) {\n return new Date(NaN);\n }\n const dateStrings = splitDateString(argument);\n const { year, restDateString } = parseYear(dateStrings.date, additionalDigits);\n const date = parseDate(restDateString, year);\n if (date === null || isNaN(date.getTime())) {\n return new Date(NaN);\n }\n if (date) {\n const timestamp = date.getTime();\n let time = 0;\n let offset;\n if (dateStrings.time) {\n time = parseTime(dateStrings.time);\n if (time === null || isNaN(time)) {\n return new Date(NaN);\n }\n }\n if (dateStrings.timeZone || options.timeZone) {\n offset = tzParseTimezone(dateStrings.timeZone || options.timeZone, new Date(timestamp + time));\n if (isNaN(offset)) {\n return new Date(NaN);\n }\n }\n else {\n // get offset accurate to hour in time zones that change offset\n offset = getTimezoneOffsetInMilliseconds(new Date(timestamp + time));\n offset = getTimezoneOffsetInMilliseconds(new Date(timestamp + time + offset));\n }\n return new Date(timestamp + time + offset);\n }\n else {\n return new Date(NaN);\n }\n}\nfunction splitDateString(dateString) {\n const dateStrings = {};\n let parts = patterns.dateTimePattern.exec(dateString);\n let timeString;\n if (!parts) {\n parts = patterns.datePattern.exec(dateString);\n if (parts) {\n dateStrings.date = parts[1];\n timeString = parts[2];\n }\n else {\n dateStrings.date = null;\n timeString = dateString;\n }\n }\n else {\n dateStrings.date = parts[1];\n timeString = parts[3];\n }\n if (timeString) {\n const token = patterns.timeZone.exec(timeString);\n if (token) {\n dateStrings.time = timeString.replace(token[1], '');\n dateStrings.timeZone = token[1].trim();\n }\n else {\n dateStrings.time = timeString;\n }\n }\n return dateStrings;\n}\nfunction parseYear(dateString, additionalDigits) {\n if (dateString) {\n const patternYYY = patterns.YYY[additionalDigits];\n const patternYYYYY = patterns.YYYYY[additionalDigits];\n // YYYY or ±YYYYY\n let token = patterns.YYYY.exec(dateString) || patternYYYYY.exec(dateString);\n if (token) {\n const yearString = token[1];\n return {\n year: parseInt(yearString, 10),\n restDateString: dateString.slice(yearString.length),\n };\n }\n // YY or ±YYY\n token = patterns.YY.exec(dateString) || patternYYY.exec(dateString);\n if (token) {\n const centuryString = token[1];\n return {\n year: parseInt(centuryString, 10) * 100,\n restDateString: dateString.slice(centuryString.length),\n };\n }\n }\n // Invalid ISO-formatted year\n return {\n year: null,\n };\n}\nfunction parseDate(dateString, year) {\n // Invalid ISO-formatted year\n if (year === null) {\n return null;\n }\n let date;\n let month;\n let week;\n // YYYY\n if (!dateString || !dateString.length) {\n date = new Date(0);\n date.setUTCFullYear(year);\n return date;\n }\n // YYYY-MM\n let token = patterns.MM.exec(dateString);\n if (token) {\n date = new Date(0);\n month = parseInt(token[1], 10) - 1;\n if (!validateDate(year, month)) {\n return new Date(NaN);\n }\n date.setUTCFullYear(year, month);\n return date;\n }\n // YYYY-DDD or YYYYDDD\n token = patterns.DDD.exec(dateString);\n if (token) {\n date = new Date(0);\n const dayOfYear = parseInt(token[1], 10);\n if (!validateDayOfYearDate(year, dayOfYear)) {\n return new Date(NaN);\n }\n date.setUTCFullYear(year, 0, dayOfYear);\n return date;\n }\n // yyyy-MM-dd or YYYYMMDD\n token = patterns.MMDD.exec(dateString);\n if (token) {\n date = new Date(0);\n month = parseInt(token[1], 10) - 1;\n const day = parseInt(token[2], 10);\n if (!validateDate(year, month, day)) {\n return new Date(NaN);\n }\n date.setUTCFullYear(year, month, day);\n return date;\n }\n // YYYY-Www or YYYYWww\n token = patterns.Www.exec(dateString);\n if (token) {\n week = parseInt(token[1], 10) - 1;\n if (!validateWeekDate(week)) {\n return new Date(NaN);\n }\n return dayOfISOWeekYear(year, week);\n }\n // YYYY-Www-D or YYYYWwwD\n token = patterns.WwwD.exec(dateString);\n if (token) {\n week = parseInt(token[1], 10) - 1;\n const dayOfWeek = parseInt(token[2], 10) - 1;\n if (!validateWeekDate(week, dayOfWeek)) {\n return new Date(NaN);\n }\n return dayOfISOWeekYear(year, week, dayOfWeek);\n }\n // Invalid ISO-formatted date\n return null;\n}\nfunction parseTime(timeString) {\n let hours;\n let minutes;\n // hh\n let token = patterns.HH.exec(timeString);\n if (token) {\n hours = parseFloat(token[1].replace(',', '.'));\n if (!validateTime(hours)) {\n return NaN;\n }\n return (hours % 24) * MILLISECONDS_IN_HOUR;\n }\n // hh:mm or hhmm\n token = patterns.HHMM.exec(timeString);\n if (token) {\n hours = parseInt(token[1], 10);\n minutes = parseFloat(token[2].replace(',', '.'));\n if (!validateTime(hours, minutes)) {\n return NaN;\n }\n return (hours % 24) * MILLISECONDS_IN_HOUR + minutes * MILLISECONDS_IN_MINUTE;\n }\n // hh:mm:ss or hhmmss\n token = patterns.HHMMSS.exec(timeString);\n if (token) {\n hours = parseInt(token[1], 10);\n minutes = parseInt(token[2], 10);\n const seconds = parseFloat(token[3].replace(',', '.'));\n if (!validateTime(hours, minutes, seconds)) {\n return NaN;\n }\n return (hours % 24) * MILLISECONDS_IN_HOUR + minutes * MILLISECONDS_IN_MINUTE + seconds * 1000;\n }\n // Invalid ISO-formatted time\n return null;\n}\nfunction dayOfISOWeekYear(isoWeekYear, week, day) {\n week = week || 0;\n day = day || 0;\n const date = new Date(0);\n date.setUTCFullYear(isoWeekYear, 0, 4);\n const fourthOfJanuaryDay = date.getUTCDay() || 7;\n const diff = week * 7 + day + 1 - fourthOfJanuaryDay;\n date.setUTCDate(date.getUTCDate() + diff);\n return date;\n}\n// Validation functions\nconst DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nconst DAYS_IN_MONTH_LEAP_YEAR = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nfunction isLeapYearIndex(year) {\n return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);\n}\nfunction validateDate(year, month, date) {\n if (month < 0 || month > 11) {\n return false;\n }\n if (date != null) {\n if (date < 1) {\n return false;\n }\n const isLeapYear = isLeapYearIndex(year);\n if (isLeapYear && date > DAYS_IN_MONTH_LEAP_YEAR[month]) {\n return false;\n }\n if (!isLeapYear && date > DAYS_IN_MONTH[month]) {\n return false;\n }\n }\n return true;\n}\nfunction validateDayOfYearDate(year, dayOfYear) {\n if (dayOfYear < 1) {\n return false;\n }\n const isLeapYear = isLeapYearIndex(year);\n if (isLeapYear && dayOfYear > 366) {\n return false;\n }\n if (!isLeapYear && dayOfYear > 365) {\n return false;\n }\n return true;\n}\nfunction validateWeekDate(week, day) {\n if (week < 0 || week > 52) {\n return false;\n }\n if (day != null && (day < 0 || day > 6)) {\n return false;\n }\n return true;\n}\nfunction validateTime(hours, minutes, seconds) {\n if (hours < 0 || hours >= 25) {\n return false;\n }\n if (minutes != null && (minutes < 0 || minutes >= 60)) {\n return false;\n }\n if (seconds != null && (seconds < 0 || seconds >= 60)) {\n return false;\n }\n return true;\n}\n","import { format as dateFnsFormat } from 'date-fns/format';\nimport { formatters } from './formatters/index.js';\nimport { toDate } from '../toDate/index.js';\nconst tzFormattingTokensRegExp = /([xXOz]+)|''|'(''|[^'])+('|$)/g;\n/**\n * @name format\n * @category Common Helpers\n * @summary Format the date.\n *\n * @description\n * Return the formatted date string in the given format. The result may consty by locale.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://git.io/fxCyr\n *\n * The characters wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n * (see the last example)\n *\n * Format of the string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 7 below the table).\n *\n * Accepted patterns:\n * | Unit | Pattern | Result examples | Notes |\n * |---------------------------------|---------|-----------------------------------|-------|\n * | Era | G..GGG | AD, BC | |\n * | | GGGG | Anno Domini, Before Christ | 2 |\n * | | GGGGG | A, B | |\n * | Calendar year | y | 44, 1, 1900, 2017 | 5 |\n * | | yo | 44th, 1st, 0th, 17th | 5,7 |\n * | | yy | 44, 01, 00, 17 | 5 |\n * | | yyy | 044, 001, 1900, 2017 | 5 |\n * | | yyyy | 0044, 0001, 1900, 2017 | 5 |\n * | | yyyyy | ... | 3,5 |\n * | Local week-numbering year | Y | 44, 1, 1900, 2017 | 5 |\n * | | Yo | 44th, 1st, 1900th, 2017th | 5,7 |\n * | | YY | 44, 01, 00, 17 | 5,8 |\n * | | YYY | 044, 001, 1900, 2017 | 5 |\n * | | YYYY | 0044, 0001, 1900, 2017 | 5,8 |\n * | | YYYYY | ... | 3,5 |\n * | ISO week-numbering year | R | -43, 0, 1, 1900, 2017 | 5,7 |\n * | | RR | -43, 00, 01, 1900, 2017 | 5,7 |\n * | | RRR | -043, 000, 001, 1900, 2017 | 5,7 |\n * | | RRRR | -0043, 0000, 0001, 1900, 2017 | 5,7 |\n * | | RRRRR | ... | 3,5,7 |\n * | Extended year | u | -43, 0, 1, 1900, 2017 | 5 |\n * | | uu | -43, 01, 1900, 2017 | 5 |\n * | | uuu | -043, 001, 1900, 2017 | 5 |\n * | | uuuu | -0043, 0001, 1900, 2017 | 5 |\n * | | uuuuu | ... | 3,5 |\n * | Quarter (formatting) | Q | 1, 2, 3, 4 | |\n * | | Qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | QQ | 01, 02, 03, 04 | |\n * | | QQQ | Q1, Q2, Q3, Q4 | |\n * | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |\n * | | QQQQQ | 1, 2, 3, 4 | 4 |\n * | Quarter (stand-alone) | q | 1, 2, 3, 4 | |\n * | | qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | qq | 01, 02, 03, 04 | |\n * | | qqq | Q1, Q2, Q3, Q4 | |\n * | | qqqq | 1st quarter, 2nd quarter, ... | 2 |\n * | | qqqqq | 1, 2, 3, 4 | 4 |\n * | Month (formatting) | M | 1, 2, ..., 12 | |\n * | | Mo | 1st, 2nd, ..., 12th | 7 |\n * | | MM | 01, 02, ..., 12 | |\n * | | MMM | Jan, Feb, ..., Dec | |\n * | | MMMM | January, February, ..., December | 2 |\n * | | MMMMM | J, F, ..., D | |\n * | Month (stand-alone) | L | 1, 2, ..., 12 | |\n * | | Lo | 1st, 2nd, ..., 12th | 7 |\n * | | LL | 01, 02, ..., 12 | |\n * | | LLL | Jan, Feb, ..., Dec | |\n * | | LLLL | January, February, ..., December | 2 |\n * | | LLLLL | J, F, ..., D | |\n * | Local week of year | w | 1, 2, ..., 53 | |\n * | | wo | 1st, 2nd, ..., 53th | 7 |\n * | | ww | 01, 02, ..., 53 | |\n * | ISO week of year | I | 1, 2, ..., 53 | 7 |\n * | | Io | 1st, 2nd, ..., 53th | 7 |\n * | | II | 01, 02, ..., 53 | 7 |\n * | Day of month | d | 1, 2, ..., 31 | |\n * | | do | 1st, 2nd, ..., 31st | 7 |\n * | | dd | 01, 02, ..., 31 | |\n * | Day of year | D | 1, 2, ..., 365, 366 | 8 |\n * | | Do | 1st, 2nd, ..., 365th, 366th | 7 |\n * | | DD | 01, 02, ..., 365, 366 | 8 |\n * | | DDD | 001, 002, ..., 365, 366 | |\n * | | DDDD | ... | 3 |\n * | Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Su | |\n * | | EEEE | Monday, Tuesday, ..., Sunday | 2 |\n * | | EEEEE | M, T, W, T, F, S, S | |\n * | | EEEEEE | Mo, Tu, We, Th, Fr, Su, Sa | |\n * | ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 |\n * | | io | 1st, 2nd, ..., 7th | 7 |\n * | | ii | 01, 02, ..., 07 | 7 |\n * | | iii | Mon, Tue, Wed, ..., Su | 7 |\n * | | iiii | Monday, Tuesday, ..., Sunday | 2,7 |\n * | | iiiii | M, T, W, T, F, S, S | 7 |\n * | | iiiiii | Mo, Tu, We, Th, Fr, Su, Sa | 7 |\n * | Local day of week (formatting) | e | 2, 3, 4, ..., 1 | |\n * | | eo | 2nd, 3rd, ..., 1st | 7 |\n * | | ee | 02, 03, ..., 01 | |\n * | | eee | Mon, Tue, Wed, ..., Su | |\n * | | eeee | Monday, Tuesday, ..., Sunday | 2 |\n * | | eeeee | M, T, W, T, F, S, S | |\n * | | eeeeee | Mo, Tu, We, Th, Fr, Su, Sa | |\n * | Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | |\n * | | co | 2nd, 3rd, ..., 1st | 7 |\n * | | cc | 02, 03, ..., 01 | |\n * | | ccc | Mon, Tue, Wed, ..., Su | |\n * | | cccc | Monday, Tuesday, ..., Sunday | 2 |\n * | | ccccc | M, T, W, T, F, S, S | |\n * | | cccccc | Mo, Tu, We, Th, Fr, Su, Sa | |\n * | AM, PM | a..aaa | AM, PM | |\n * | | aaaa | a.m., p.m. | 2 |\n * | | aaaaa | a, p | |\n * | AM, PM, noon, midnight | b..bbb | AM, PM, noon, midnight | |\n * | | bbbb | a.m., p.m., noon, midnight | 2 |\n * | | bbbbb | a, p, n, mi | |\n * | Flexible day period | B..BBB | at night, in the morning, ... | |\n * | | BBBB | at night, in the morning, ... | 2 |\n * | | BBBBB | at night, in the morning, ... | |\n * | Hour [1-12] | h | 1, 2, ..., 11, 12 | |\n * | | ho | 1st, 2nd, ..., 11th, 12th | 7 |\n * | | hh | 01, 02, ..., 11, 12 | |\n * | Hour [0-23] | H | 0, 1, 2, ..., 23 | |\n * | | Ho | 0th, 1st, 2nd, ..., 23rd | 7 |\n * | | HH | 00, 01, 02, ..., 23 | |\n * | Hour [0-11] | K | 1, 2, ..., 11, 0 | |\n * | | Ko | 1st, 2nd, ..., 11th, 0th | 7 |\n * | | KK | 1, 2, ..., 11, 0 | |\n * | Hour [1-24] | k | 24, 1, 2, ..., 23 | |\n * | | ko | 24th, 1st, 2nd, ..., 23rd | 7 |\n * | | kk | 24, 01, 02, ..., 23 | |\n * | Minute | m | 0, 1, ..., 59 | |\n * | | mo | 0th, 1st, ..., 59th | 7 |\n * | | mm | 00, 01, ..., 59 | |\n * | Second | s | 0, 1, ..., 59 | |\n * | | so | 0th, 1st, ..., 59th | 7 |\n * | | ss | 00, 01, ..., 59 | |\n * | Fraction of second | S | 0, 1, ..., 9 | |\n * | | SS | 00, 01, ..., 99 | |\n * | | SSS | 000, 0001, ..., 999 | |\n * | | SSSS | ... | 3 |\n * | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |\n * | | XX | -0800, +0530, Z | |\n * | | XXX | -08:00, +05:30, Z | |\n * | | XXXX | -0800, +0530, Z, +123456 | 2 |\n * | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |\n * | Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |\n * | | xx | -0800, +0530, +0000 | |\n * | | xxx | -08:00, +05:30, +00:00 | 2 |\n * | | xxxx | -0800, +0530, +0000, +123456 | |\n * | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |\n * | Timezone (GMT) | O...OOO | GMT-8, GMT+5:30, GMT+0 | |\n * | | OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | 2 |\n * | Timezone (specific non-locat.) | z...zzz | PDT, EST, CEST | 6 |\n * | | zzzz | Pacific Daylight Time | 2,6 |\n * | Seconds timestamp | t | 512969520 | 7 |\n * | | tt | ... | 3,7 |\n * | Milliseconds timestamp | T | 512969520900 | 7 |\n * | | TT | ... | 3,7 |\n * | Long localized date | P | 05/29/1453 | 7 |\n * | | PP | May 29, 1453 | 7 |\n * | | PPP | May 29th, 1453 | 7 |\n * | | PPPP | Sunday, May 29th, 1453 | 2,7 |\n * | Long localized time | p | 12:00 AM | 7 |\n * | | pp | 12:00:00 AM | 7 |\n * | | ppp | 12:00:00 AM GMT+2 | 7 |\n * | | pppp | 12:00:00 AM GMT+02:00 | 2,7 |\n * | Combination of date and time | Pp | 05/29/1453, 12:00 AM | 7 |\n * | | PPpp | May 29, 1453, 12:00:00 AM | 7 |\n * | | PPPppp | May 29th, 1453 at ... | 7 |\n * | | PPPPpppp| Sunday, May 29th, 1453 at ... | 2,7 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n * are the same as \"stand-alone\" units, but are different in some languages.\n * \"Formatting\" units are declined according to the rules of the language\n * in the context of a date. \"Stand-alone\" units are always nominative singular:\n *\n * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n * the single quote characters (see below).\n * If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)\n * the output will be the same as default pattern for this unit, usually\n * the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units\n * are marked with \"2\" in the last column of the table.\n *\n * `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`\n *\n * `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`\n *\n * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).\n * The output will be padded with zeros to match the length of the pattern.\n *\n * `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`\n *\n * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n * These tokens represent the shortest form of the quarter.\n *\n * 5. The main difference between `y` and `u` patterns are B.C. years:\n *\n * | Year | `y` | `u` |\n * |------|-----|-----|\n * | AC 1 | 1 | 1 |\n * | BC 1 | 1 | 0 |\n * | BC 2 | 2 | -1 |\n *\n * Also `yy` always returns the last two digits of a year,\n * while `uu` pads single digit years to 2 characters and returns other years unchanged:\n *\n * | Year | `yy` | `uu` |\n * |------|------|------|\n * | 1 | 01 | 01 |\n * | 14 | 14 | 14 |\n * | 376 | 76 | 376 |\n * | 1453 | 53 | 1453 |\n *\n * The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n * except local week-numbering years are dependent on `options.weekStartsOn`\n * and `options.firstWeekContainsDate` (compare [getISOWeekYear]{@link https://date-fns.org/docs/getISOWeekYear}\n * and [getWeekYear]{@link https://date-fns.org/docs/getWeekYear}).\n *\n * 6. Specific non-location timezones are created using the Intl browser API. The output is determined by the\n * preferred standard of the current locale (en-US by default) which may not always give the expected result.\n * For this reason it is recommended to supply a `locale` in the format options when formatting a time zone name.\n *\n * 7. These patterns are not in the Unicode Technical Standard #35:\n * - `i`: ISO day of week\n * - `I`: ISO week of year\n * - `R`: ISO week-numbering year\n * - `t`: seconds timestamp\n * - `T`: milliseconds timestamp\n * - `o`: ordinal number modifier\n * - `P`: long localized date\n * - `p`: long localized time\n *\n * 8. These tokens are often confused with others. See: https://git.io/fxCyr\n *\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole\n * library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * - The second argument is now required for the sake of explicitness.\n *\n * ```javascript\n * // Before v2.0.0\n * format(new Date(2016, 0, 1))\n *\n * // v2.0.0 onward\n * format(new Date(2016, 0, 1), \"yyyy-MM-dd'T'HH:mm:ss.SSSxxx\")\n * ```\n *\n * - New format string API for `format` function\n * which is based on [Unicode Technical Standard\n * #35](https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table). See [this\n * post](https://blog.date-fns.org/post/unicode-tokens-in-date-fns-v2-sreatyki91jg) for more details.\n *\n * - Characters are now escaped using single quote symbols (`'`) instead of square brackets.\n *\n * @param date the original date\n * @param formatStr the string of tokens\n * @param options the object with options. See [Options]{@link https://date-fns.org/docs/Options}\n * @param {0|1|2} [options.additionalDigits=2] - passed to `toDate`. See [toDate]{@link\n * https://date-fns.org/docs/toDate}\n * @param {0|1|2|3|4|5|6} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday)\n * @param {Number} [options.firstWeekContainsDate=1] - the day of January, which is\n * @param {Locale} [options.locale=defaultLocale] - the locale object. See\n * [Locale]{@link https://date-fns.org/docs/Locale}\n * @param {Boolean} [options.awareOfUnicodeTokens=false] - if true, allows usage of Unicode tokens causes confusion:\n * - Some of the day of year tokens (`D`, `DD`) that are confused with the day of month tokens (`d`, `dd`).\n * - Some of the local week-numbering year tokens (`YY`, `YYYY`) that are confused with the calendar year tokens\n * (`yy`, `yyyy`). See: https://git.io/fxCyr\n * @param {String} [options.timeZone=''] - used to specify the IANA time zone offset of a date String.\n * @param {Date|Number} [options.originalDate] - can be used to pass the original unmodified date to `format` to\n * improve correctness of the replaced timezone token close to the DST threshold.\n * @throws {TypeError} 2 arguments required\n * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2\n * @throws {RangeError} `options.locale` must contain `localize` property\n * @throws {RangeError} `options.locale` must contain `formatLong` property\n * @throws {RangeError} `options.weekStartsOn` must be between 0 and 6\n * @throws {RangeError} `options.firstWeekContainsDate` must be between 1 and 7\n * @throws {RangeError} `options.awareOfUnicodeTokens` must be set to `true` to use `XX` token; see:\n * https://git.io/fxCyr\n *\n * @example\n * // Represent 11 February 2014 in middle-endian format:\n * const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')\n * //=> '02/11/2014'\n *\n * @example\n * // Represent 2 July 2014 in Esperanto:\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = format(new Date(2014, 6, 2), \"do 'de' MMMM yyyy\", {\n * locale: eoLocale\n * })\n * //=> '2-a de julio 2014'\n *\n * @example\n * // Escape string by single quote characters:\n * const result = format(new Date(2014, 6, 2, 15), \"h 'o''clock'\")\n * //=> \"3 o'clock\"\n */\nexport function format(date, formatStr, options = {}) {\n formatStr = String(formatStr);\n const matches = formatStr.match(tzFormattingTokensRegExp);\n if (matches) {\n const d = toDate(options.originalDate || date, options);\n // Work through each match and replace the tz token in the format string with the quoted\n // formatted time zone so the remaining tokens can be filled in by date-fns#format.\n formatStr = matches.reduce(function (result, token) {\n if (token[0] === \"'\") {\n return result; // This is a quoted portion, matched only to ensure we don't match inside it\n }\n const pos = result.indexOf(token);\n const precededByQuotedSection = result[pos - 1] === \"'\";\n const replaced = result.replace(token, \"'\" + formatters[token[0]](d, token, options) + \"'\");\n // If the replacement results in two adjoining quoted strings, the back to back quotes\n // are removed, so it doesn't look like an escaped quote.\n return precededByQuotedSection\n ? replaced.substring(0, pos - 1) + replaced.substring(pos + 1)\n : replaced;\n }, formatStr);\n }\n return dateFnsFormat(date, formatStr, options);\n}\n","import { tzParseTimezone } from '../_lib/tzParseTimezone/index.js';\nimport { toDate } from '../toDate/index.js';\n/**\n * @name toZonedTime\n * @category Time Zone Helpers\n * @summary Get a date/time representing local time in a given time zone from the UTC date\n *\n * @description\n * Returns a date instance with values representing the local time in the time zone\n * specified of the UTC time from the date provided. In other words, when the new date\n * is formatted it will show the equivalent hours in the target time zone regardless\n * of the current system time zone.\n *\n * @param date the date with the relevant UTC time\n * @param timeZone the time zone to get local time for, can be an offset or IANA time zone\n * @param options the object with options. See [Options]{@link https://date-fns.org/docs/Options}\n * @param {0|1|2} [options.additionalDigits=2] - passed to `toDate`. See [toDate]{@link https://date-fns.org/docs/toDate}\n *\n * @throws {TypeError} 2 arguments required\n * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2\n *\n * @example\n * // In June 10am UTC is 6am in New York (-04:00)\n * const result = toZonedTime('2014-06-25T10:00:00.000Z', 'America/New_York')\n * //=> Jun 25 2014 06:00:00\n */\nexport function toZonedTime(date, timeZone, options) {\n date = toDate(date, options);\n const offsetMilliseconds = tzParseTimezone(timeZone, date, true);\n const d = new Date(date.getTime() - offsetMilliseconds);\n const resultDate = new Date(0);\n resultDate.setFullYear(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate());\n resultDate.setHours(d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), d.getUTCMilliseconds());\n return resultDate;\n}\n","import { format } from '../format/index.js';\nimport { toZonedTime } from '../toZonedTime/index.js';\n/**\n * @name formatInTimeZone\n * @category Time Zone Helpers\n * @summary Gets the offset in milliseconds between the time zone and Universal Coordinated Time (UTC)\n *\n * @param date the date representing the local time / real UTC time\n * @param timeZone the time zone this date should be formatted for; can be an offset or IANA time zone\n * @param formatStr the string of tokens\n * @param options the object with options. See [Options]{@link https://date-fns.org/docs/Options}\n * @param {0|1|2} [options.additionalDigits=2] - passed to `toDate`. See [toDate]{@link\n * https://date-fns.org/docs/toDate}\n * @param {0|1|2|3|4|5|6} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday)\n * @param {Number} [options.firstWeekContainsDate=1] - the day of January, which is\n * @param {Locale} [options.locale=defaultLocale] - the locale object. See\n * [Locale]{@link https://date-fns.org/docs/Locale}\n * @param {Boolean} [options.awareOfUnicodeTokens=false] - if true, allows usage of Unicode tokens causes confusion:\n * - Some of the day of year tokens (`D`, `DD`) that are confused with the day of month tokens (`d`, `dd`).\n * - Some of the local week-numbering year tokens (`YY`, `YYYY`) that are confused with the calendar year tokens\n * (`yy`, `yyyy`). See: https://git.io/fxCyr\n * @param {String} [options.timeZone=''] - used to specify the IANA time zone offset of a date String.\n */\nexport function formatInTimeZone(date, timeZone, formatStr, options) {\n options = {\n ...options,\n timeZone,\n originalDate: date,\n };\n return format(toZonedTime(date, timeZone, { timeZone: options.timeZone }), formatStr, options);\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { MapPin, Phone, Store } from \"lucide-react\";\nimport type { Location } from \"@zorgo/universal/interfaces\";\nimport { buildLocationJsonLd, type RestaurantInfo } from \"../../seo\";\nimport { OpenStatus } from \"./OpenStatus\";\nimport { cn } from \"./ItemForm/classes\";\n\n/** Per-slot Tailwind classes for a location card and the section that lists them. */\nexport type LocationCardItemClasses = Partial<{\n\tsection: string;\n\ttitle: string;\n\tgrid: string;\n\tcard: string;\n\tcardWide: string;\n\tbody: string;\n\theader: string;\n\tname: string;\n\tstatus: string;\n\trows: string;\n\trow: string;\n\trowIcon: string;\n\trowText: string;\n\tmap: string;\n\tmapFrame: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeLocationCardItemClasses}.\n */\nexport const LOCATION_CARD_DEFAULT_ITEM_CLASSES: Required<LocationCardItemClasses> =\n\t{\n\t\tsection: \"flex flex-col gap-8\",\n\t\ttitle: \"text-4xl font-bold uppercase tracking-tight\",\n\t\t// The track shape comes from `locationGridClass` — a card carrying a map is\n\t\t// too wide to share a row, so the two cases cannot both live in one default.\n\t\tgrid: \"grid gap-6\",\n\t\tcard: \"flex flex-col overflow-hidden rounded-lg border border-foreground/15 bg-background-elevated\",\n\t\tcardWide: \"md:flex-row\",\n\t\tbody: \"flex flex-1 flex-col\",\n\t\theader: \"flex flex-col gap-2 p-6\",\n\t\tname: \"text-2xl font-bold leading-tight\",\n\t\tstatus: \"text-sm\",\n\t\trows: \"flex flex-col divide-y divide-foreground/10 border-t border-foreground/10\",\n\t\trow: \"flex items-center gap-3 px-6 py-4 text-left no-underline hover:bg-foreground/5 transition-colors duration-300\",\n\t\trowIcon: \"size-5 shrink-0 opacity-60\",\n\t\trowText: \"whitespace-pre-line\",\n\t\tmap: \"relative min-h-72 w-full border-t border-foreground/10 md:min-h-80 md:w-1/2 md:shrink-0 md:border-t-0 md:border-l\",\n\t\tmapFrame: \"absolute inset-0 size-full\",\n\t};\n\nexport function mergeLocationCardItemClasses(\n\toverrides?: LocationCardItemClasses,\n) {\n\tconst d = LOCATION_CARD_DEFAULT_ITEM_CLASSES;\n\treturn {\n\t\tsection: cn(d.section, overrides?.section),\n\t\ttitle: cn(d.title, overrides?.title),\n\t\tgrid: cn(d.grid, overrides?.grid),\n\t\tcard: cn(d.card, overrides?.card),\n\t\tcardWide: cn(d.cardWide, overrides?.cardWide),\n\t\tbody: cn(d.body, overrides?.body),\n\t\theader: cn(d.header, overrides?.header),\n\t\tname: cn(d.name, overrides?.name),\n\t\tstatus: cn(d.status, overrides?.status),\n\t\trows: cn(d.rows, overrides?.rows),\n\t\trow: cn(d.row, overrides?.row),\n\t\trowIcon: cn(d.rowIcon, overrides?.rowIcon),\n\t\trowText: cn(d.rowText, overrides?.rowText),\n\t\tmap: cn(d.map, overrides?.map),\n\t\tmapFrame: cn(d.mapFrame, overrides?.mapFrame),\n\t};\n}\n\n/** Coordinates win over the staff-typed address string when both are set. */\nfunction mapQuery(location: Location): string | undefined {\n\treturn location.lat != null && location.lng != null\n\t\t? `${location.lat},${location.lng}`\n\t\t: location.address;\n}\n\n/**\n * The map pane's `src` and the address row's `href`, which are not the same URL\n * and cannot be derived from each other:\n *\n * - A site-supplied `mapUrl` is normally a share link to the real Place listing\n * — reviews, photos, the pin on the right unit of a shared plaza. Google turns\n * any such link into an iframe with `output=embed`, and a `/maps/embed?pb=`\n * URL already is one. That form has no place page behind it, so it is a `src`\n * only and the row falls back to the coordinate search.\n * - With no `mapUrl` the pane is derived from the address (or coordinates), which\n * is enough for \"where is it\" and needs no API key. `null` is the one way to\n * say \"no map here\" — `undefined` cannot be, since that is also what a caller\n * passing nothing sends.\n */\nexport function locationMap(\n\tlocation: Location,\n\tmapUrl?: string | null,\n): { src?: string; href?: string } {\n\tconst query = mapQuery(location);\n\tconst search = query\n\t\t? `https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(query)}`\n\t\t: undefined;\n\n\tif (mapUrl === null) return { href: search };\n\tif (!mapUrl) {\n\t\treturn {\n\t\t\tsrc: query\n\t\t\t\t? `https://www.google.com/maps?q=${encodeURIComponent(query)}&output=embed`\n\t\t\t\t: undefined,\n\t\t\thref: search,\n\t\t};\n\t}\n\tif (mapUrl.includes(\"/maps/embed\")) return { src: mapUrl, href: search };\n\treturn {\n\t\tsrc: `${mapUrl}${mapUrl.includes(\"?\") ? \"&\" : \"?\"}output=embed`,\n\t\thref: mapUrl,\n\t};\n}\n\n/** A card carrying a map takes the full container width; a plain one shares an auto-fit row. */\nexport function locationGridClass(wide: boolean): string {\n\treturn wide\n\t\t? \"grid-cols-1\"\n\t\t: \"justify-center [grid-template-columns:repeat(auto-fit,minmax(min(100%,18rem),22rem))]\";\n}\n\nexport type LocationCardProps = {\n\tlocation: Location | null | undefined;\n\t/** That location's own page, when the site has one. */\n\thref?: string;\n\t/**\n\t * This location on Google Maps — a share link to its Place listing, or an\n\t * embed URL. Omitted, the card derives one from the address; `null` drops\n\t * the map pane and keeps the narrow card.\n\t */\n\tmapUrl?: string | null;\n\t/** Pins the open/closed clock — see {@link OpenStatus}. */\n\tnow?: Date;\n\t/**\n\t * Franchise facts. Supplied, the card also emits this location's branch\n\t * JSON-LD — only worth doing on the page that *is* this location's, since\n\t * the parent node already carries a lone location's facts.\n\t */\n\tinfo?: RestaurantInfo;\n\titemClasses?: LocationCardItemClasses;\n};\n\n/**\n * One location: name and live open/closed up top, then a stack of tappable\n * rows — address opens the map, phone dials, and the last row leads to that\n * location's page — beside a map of where it actually is. Every field is\n * optional in the data, so each row drops out on its own rather than leaving an\n * empty line behind.\n */\nexport function LocationCard({\n\tlocation,\n\thref,\n\tmapUrl,\n\tnow,\n\tinfo,\n\titemClasses,\n}: LocationCardProps) {\n\tif (!location) return null;\n\n\tconst slots = mergeLocationCardItemClasses(itemClasses);\n\tconst map = locationMap(location, mapUrl);\n\n\treturn (\n\t\t<article className={cn(slots.card, map.src && slots.cardWide)}>\n\t\t\t{info && (\n\t\t\t\t<script\n\t\t\t\t\ttype=\"application/ld+json\"\n\t\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t\t__html: JSON.stringify(buildLocationJsonLd(location, info)),\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<div className={slots.body}>\n\t\t\t\t<div className={slots.header}>\n\t\t\t\t\t<h3 className={slots.name}>{location.name}</h3>\n\t\t\t\t\t<OpenStatus\n\t\t\t\t\t\tlocation={location}\n\t\t\t\t\t\tnow={now}\n\t\t\t\t\t\titemClasses={{ root: slots.status }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t{(location.address || location.phone || href) && (\n\t\t\t\t\t<div className={slots.rows}>\n\t\t\t\t\t\t{location.address && (\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\tclassName={slots.row}\n\t\t\t\t\t\t\t\thref={map.href}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<MapPin className={slots.rowIcon} aria-hidden />\n\t\t\t\t\t\t\t\t<span className={slots.rowText}>{location.address}</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{location.phone && (\n\t\t\t\t\t\t\t<a className={slots.row} href={`tel:${location.phone}`}>\n\t\t\t\t\t\t\t\t<Phone className={slots.rowIcon} aria-hidden />\n\t\t\t\t\t\t\t\t<span className={slots.rowText}>{location.phone}</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{href && (\n\t\t\t\t\t\t\t<Link className={slots.row} href={href}>\n\t\t\t\t\t\t\t\t<Store className={slots.rowIcon} aria-hidden />\n\t\t\t\t\t\t\t\t<span className={slots.rowText}>Store details</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{map.src && (\n\t\t\t\t<div className={slots.map}>\n\t\t\t\t\t{/* lazy: three of these on a locations page is three map loads —\n\t\t\t\t\t deferring them keeps the page's own paint off Google's critical\n\t\t\t\t\t path. */}\n\t\t\t\t\t<iframe\n\t\t\t\t\t\tsrc={map.src}\n\t\t\t\t\t\ttitle={`Map of ${location.name}`}\n\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\treferrerPolicy=\"no-referrer-when-downgrade\"\n\t\t\t\t\t\tclassName={slots.mapFrame}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</article>\n\t);\n}\n\nexport type LocationsSectionProps = Omit<\n\tLocationCardProps,\n\t\"location\" | \"href\" | \"mapUrl\"\n> & {\n\tlocations: Location[];\n\ttitle?: string;\n\t/** Builds each card's page link; omit when the site has no location pages. */\n\thref?: (location: Location) => string;\n\t/**\n\t * Pins each card's Google Maps URL, either as a `location_id` → URL lookup —\n\t * the usual shape, since the locations themselves come from the database and\n\t * the Place links are hand-collected — or as a builder. A location the lookup\n\t * has no entry for derives its map from its address, as it would with no\n\t * `mapUrl` at all; `null` is how a site says \"no map on this one\".\n\t */\n\tmapUrl?:\n\t\t| Record<number, string | null>\n\t\t| ((location: Location) => string | null | undefined);\n};\n\n/** The homepage/locations grid of {@link LocationCard}s. Nothing when empty. */\nexport function LocationsSection({\n\tlocations,\n\ttitle = \"Locations\",\n\thref,\n\tmapUrl,\n\titemClasses,\n\t...card\n}: LocationsSectionProps) {\n\tif (!locations.length) return null;\n\tconst slots = mergeLocationCardItemClasses(itemClasses);\n\tconst resolveMapUrl = (location: Location) =>\n\t\ttypeof mapUrl === \"function\"\n\t\t\t? mapUrl(location)\n\t\t\t: mapUrl?.[location.location_id];\n\tconst wide = locations.some(\n\t\t(location) => locationMap(location, resolveMapUrl(location)).src,\n\t);\n\n\treturn (\n\t\t<section className={slots.section}>\n\t\t\t{title && <h2 className={slots.title}>{title}</h2>}\n\t\t\t<div className={cn(locationGridClass(wide), slots.grid)}>\n\t\t\t\t{locations.map((location) => (\n\t\t\t\t\t<LocationCard\n\t\t\t\t\t\tkey={location.location_id}\n\t\t\t\t\t\tlocation={location}\n\t\t\t\t\t\thref={href?.(location)}\n\t\t\t\t\t\tmapUrl={resolveMapUrl(location)}\n\t\t\t\t\t\titemClasses={itemClasses}\n\t\t\t\t\t\t{...card}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</section>\n\t);\n}\n","\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { Search } from \"lucide-react\";\nimport type { Location } from \"@zorgo/universal/interfaces\";\nimport { cn } from \"./ItemForm/classes\";\n\nfunction searchableText(location: Location) {\n return `${location.name} ${location.address ?? \"\"}`.toLowerCase();\n}\n\n/** Rank: 0 = starts-with, 1 = includes, 2 = no match. Lower is better. */\nfunction matchRank(location: Location, query: string): number {\n const text = searchableText(location);\n const q = query.trim().toLowerCase();\n if (!q) return 0;\n if (text.startsWith(q) || location.name.toLowerCase().startsWith(q)) {\n return 0;\n }\n if (text.includes(q)) return 1;\n return 2;\n}\n\nfunction rankLocations(\n locations: Location[],\n query: string,\n pinnedLocationId?: number | null,\n): Location[] {\n const q = query.trim();\n const ranked = q\n ? [...locations].sort((a, b) => {\n const rankDiff = matchRank(a, q) - matchRank(b, q);\n if (rankDiff !== 0) return rankDiff;\n return a.name.localeCompare(b.name);\n })\n : [...locations];\n\n if (pinnedLocationId == null) return ranked;\n\n const pinnedIndex = ranked.findIndex(\n (location) => location.location_id === pinnedLocationId,\n );\n if (pinnedIndex <= 0) return ranked;\n\n const [pinned] = ranked.splice(pinnedIndex, 1);\n if (!pinned) return ranked;\n return [pinned, ...ranked];\n}\n\n/** Per-slot Tailwind classes for the find-location layout. */\nexport type FindLocationItemClasses = Partial<{\n baseContainer: string;\n searchContainer: string;\n searchIcon: string;\n searchInput: string;\n noMatchesMessage: string;\n emptyMessage: string;\n list: string;\n locationRow: string;\n locationRowSelected: string;\n locationRowUnselected: string;\n locationButton: string;\n locationName: string;\n locationAddress: string;\n selectButton: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeFindLocationItemClasses}.\n */\nexport const FIND_LOCATION_DEFAULT_ITEM_CLASSES: Required<FindLocationItemClasses> =\n {\n baseContainer: \"flex flex-col gap-6\",\n searchContainer: \"relative flex items-center\",\n searchIcon:\n \"absolute left-4 h-5 w-5 text-foreground opacity-50 pointer-events-none\",\n searchInput:\n \"w-full rounded-xl bg-background-recessed opacity-75 py-3 pl-12 pr-4 text-lg text-foreground placeholder:opacity-50 outline-none focus:opacity-100 transition-all duration-300\",\n noMatchesMessage: \"text-center opacity-75 text-sm\",\n emptyMessage: \"text-center opacity-75 py-8\",\n list: \"flex flex-col gap-3\",\n locationRow:\n \"flex items-center justify-between gap-4 p-4 rounded-xl border-3 border-foreground/[15%] shadow-sm hover:translate-x-1 transition-all duration-300 w-full\",\n locationRowSelected: \"bg-background-elevated\",\n locationRowUnselected: \"bg-background-recessed\",\n locationButton:\n \"flex flex-col gap-1 text-left flex-1 min-w-0\",\n locationName: \"text-lg font-semibold text-foreground\",\n locationAddress: \"text-base opacity-75 whitespace-pre-line\",\n selectButton:\n \"text-lg font-semibold px-4 py-3 rounded-xl bg-primary text-primary-foreground hover:opacity-75 transition-all duration-300 shrink-0\",\n };\n\nexport function mergeFindLocationItemClasses(\n overrides?: FindLocationItemClasses,\n) {\n const d = FIND_LOCATION_DEFAULT_ITEM_CLASSES;\n return {\n baseContainer: cn(d.baseContainer, overrides?.baseContainer),\n searchContainer: cn(d.searchContainer, overrides?.searchContainer),\n searchIcon: cn(d.searchIcon, overrides?.searchIcon),\n searchInput: cn(d.searchInput, overrides?.searchInput),\n noMatchesMessage: cn(d.noMatchesMessage, overrides?.noMatchesMessage),\n emptyMessage: cn(d.emptyMessage, overrides?.emptyMessage),\n list: cn(d.list, overrides?.list),\n locationRow: cn(d.locationRow, overrides?.locationRow),\n locationRowSelected: cn(\n d.locationRowSelected,\n overrides?.locationRowSelected,\n ),\n locationRowUnselected: cn(\n d.locationRowUnselected,\n overrides?.locationRowUnselected,\n ),\n locationButton: cn(d.locationButton, overrides?.locationButton),\n locationName: cn(d.locationName, overrides?.locationName),\n locationAddress: cn(d.locationAddress, overrides?.locationAddress),\n selectButton: cn(d.selectButton, overrides?.selectButton),\n };\n}\n\nexport function FindLocation({\n locations,\n initialSelected,\n onSelect,\n itemClasses,\n}: {\n locations: Location[];\n /** Seeds the internal highlight and stays pinned at the top of the list. */\n initialSelected?: Location | null;\n onSelect: (location: Location) => void;\n itemClasses?: FindLocationItemClasses;\n}) {\n const [query, setQuery] = useState(\"\");\n const [selected, setSelected] = useState<Location | null>(\n () => initialSelected ?? null,\n );\n const slots = mergeFindLocationItemClasses(itemClasses);\n const pinnedLocationId = initialSelected?.location_id;\n\n const ranked = useMemo(\n () => rankLocations(locations, query, pinnedLocationId),\n [locations, query, pinnedLocationId],\n );\n\n const trimmedQuery = query.trim();\n const noMatches =\n trimmedQuery.length > 0 &&\n locations.every((location) => matchRank(location, trimmedQuery) === 2);\n\n return (\n <div className={slots.baseContainer}>\n <div className={slots.searchContainer}>\n <Search className={slots.searchIcon} strokeWidth={2} />\n <input\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search by name or address\"\n className={slots.searchInput}\n aria-label=\"Search locations\"\n />\n </div>\n\n {noMatches && (\n <p className={slots.noMatchesMessage}>\n No locations match “{trimmedQuery}”. Showing all\n locations anyway.\n </p>\n )}\n\n {ranked.length === 0 ? (\n <p className={slots.emptyMessage}>No locations available.</p>\n ) : (\n <ul className={slots.list}>\n {ranked.map((location) => {\n const isSelected =\n selected?.location_id === location.location_id;\n return (\n <li\n key={location.location_id}\n className={cn(\n slots.locationRow,\n isSelected\n ? slots.locationRowSelected\n : slots.locationRowUnselected,\n )}\n >\n <button\n type=\"button\"\n onClick={() => setSelected(location)}\n aria-pressed={isSelected}\n className={slots.locationButton}\n >\n <p className={slots.locationName}>\n {location.name}\n </p>\n {location.address && (\n <p className={slots.locationAddress}>\n {location.address}\n </p>\n )}\n </button>\n {isSelected && (\n <button\n type=\"button\"\n onClick={() => onSelect(location)}\n className={slots.selectButton}\n >\n Select\n </button>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n}\n","import { cn } from \"../ItemForm/classes\";\n\n/** Per-slot Tailwind classes for the checkout form. */\nexport type CheckoutFormItemClasses = Partial<{\n\tshell: string;\n\tshellInner: string;\n\tpageTitle: string;\n\tprimaryButton: string;\n\tsecondaryButton: string;\n\tincrementButton: string;\n\tsurface: string;\n\tfieldInput: string;\n\tfieldContainer: string;\n\tfieldLabel: string;\n\tfieldError: string;\n\tstatusPanel: string;\n\tstatusTitle: string;\n\tstatusMessage: string;\n\tstatusMessageError: string;\n\tstatusActions: string;\n\tstepSection: string;\n\tsectionTitle: string;\n\tcartList: string;\n\ttotals: string;\n\ttotalsRow: string;\n\ttotalsDivider: string;\n\ttotalsTotalRow: string;\n\tform: string;\n\tformActions: string;\n\tsubmitError: string;\n\tpaymentSurface: string;\n\tsteps: string;\n\tstepBadge: string;\n\tstepBadgeActive: string;\n\tstepBadgeInactive: string;\n\tstepLabel: string;\n\tstepLabelActive: string;\n\tstepLabelInactive: string;\n\tstepDivider: string;\n\tstepDividerActive: string;\n\tstepDividerInactive: string;\n\tcartLine: string;\n\tcartLineName: string;\n\tcartLineSelection: string;\n\tcartLinePrice: string;\n\tcartLineControls: string;\n\tcartLineQuantity: string;\n\tpromoApplied: string;\n\tpromoAppliedLabel: string;\n\tpromoRow: string;\n\tpromoInput: string;\n\tpromoError: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeCheckoutFormItemClasses}.\n */\nexport const CHECKOUT_FORM_DEFAULT_ITEM_CLASSES: Required<CheckoutFormItemClasses> =\n\t{\n\t\tshell: \"\",\n\t\tshellInner: \"max-w-2xl mx-auto w-full flex flex-col gap-6\",\n\t\tpageTitle: \"text-4xl font-extrabold text-primary text-center mb-8\",\n\t\tprimaryButton:\n\t\t\t\"text-lg font-semibold px-4 py-3 rounded-xl bg-primary text-primary-foreground hover:opacity-75 transition-all duration-300 disabled:opacity-50 disabled:cursor-not-allowed\",\n\t\tsecondaryButton:\n\t\t\t\"text-lg font-semibold px-4 py-3 rounded-xl bg-background-recessed text-foreground border-3 border-foreground/[15%] hover:opacity-75 transition-all duration-300\",\n\t\tincrementButton:\n\t\t\t\"bg-background-recessed text-foreground w-10 h-10 rounded-xl flex items-center justify-center hover:bg-foreground hover:text-background transition-all duration-300\",\n\t\tsurface:\n\t\t\t\"rounded-xl bg-background-elevated border-3 border-foreground/[15%] shadow-sm\",\n\t\tfieldInput:\n\t\t\t\"w-full bg-transparent outline-none text-lg font-semibold text-foreground placeholder:opacity-50\",\n\t\tfieldContainer:\n\t\t\t\"flex flex-col gap-1 w-full p-4 rounded-xl bg-background-elevated border-3 border-foreground/[15%]\",\n\t\tfieldLabel: \"text-xl opacity-50 text-foreground\",\n\t\tfieldError: \"text-xl text-red-500\",\n\t\tstatusPanel: \"flex flex-col gap-6 items-center text-center p-8 w-full\",\n\t\tstatusTitle: \"text-3xl font-semibold\",\n\t\tstatusMessage: \"text-xl max-w-md opacity-60\",\n\t\tstatusMessageError: \"text-xl max-w-md text-red-500\",\n\t\tstatusActions: \"w-full max-w-sm flex flex-col gap-3\",\n\t\tstepSection: \"flex flex-col gap-6\",\n\t\tsectionTitle: \"text-3xl font-semibold mt-8\",\n\t\tcartList: \"flex flex-col gap-3\",\n\t\ttotals: \"flex flex-col gap-2 p-4\",\n\t\ttotalsRow: \"flex flex-row justify-between text-xl opacity-75\",\n\t\ttotalsDivider: \"h-[2px] bg-foreground/20 rounded-xl w-full\",\n\t\ttotalsTotalRow:\n\t\t\t\"flex flex-row justify-between text-2xl font-semibold pt-2\",\n\t\tform: \"flex flex-col gap-4 w-full\",\n\t\tformActions: \"flex flex-row items-center justify-between gap-3\",\n\t\tsubmitError: \"text-sm text-red-500\",\n\t\tpaymentSurface: \"p-4\",\n\t\tsteps: \"flex flex-row items-center gap-2 w-full\",\n\t\tstepBadge:\n\t\t\t\"w-10 h-10 rounded-full flex items-center justify-center text-xl font-semibold transition-all duration-300\",\n\t\tstepBadgeActive: \"bg-foreground text-background\",\n\t\tstepBadgeInactive: \"bg-background-recessed text-foreground opacity-60\",\n\t\tstepLabel: \"text-xl transition-all duration-300\",\n\t\tstepLabelActive: \"font-semibold\",\n\t\tstepLabelInactive: \"opacity-60\",\n\t\tstepDivider: \"flex-1 h-[2px] transition-all duration-300\",\n\t\tstepDividerActive: \"bg-foreground\",\n\t\tstepDividerInactive: \"bg-foreground/15\",\n\t\tcartLine: \"flex flex-row items-start justify-between gap-4 p-4 w-full\",\n\t\tcartLineName: \"text-xl font-semibold text-foreground\",\n\t\tcartLineSelection: \"text-lg opacity-50\",\n\t\tcartLinePrice: \"text-lg font-semibold opacity-75\",\n\t\tcartLineControls:\n\t\t\t\"flex flex-col flex-col-reverse md:flex-row items-center gap-3 shrink-0\",\n\t\tcartLineQuantity: \"w-8 text-xl font-semibold text-center\",\n\t\tpromoApplied:\n\t\t\t\"flex flex-row items-center justify-between gap-4 p-4 w-full\",\n\t\tpromoAppliedLabel: \"flex-1 text-lg font-semibold\",\n\t\tpromoRow: \"flex flex-row gap-3\",\n\t\tpromoInput:\n\t\t\t\"flex-1 rounded-xl bg-background-recessed border-3 border-transparent py-3 px-4 text-lg font-semibold text-foreground placeholder:opacity-50 outline-none focus:border-foreground/15 transition-all duration-300\",\n\t\tpromoError: \"text-xl text-red-500\",\n\t};\n\nexport function mergeCheckoutFormItemClasses(\n\toverrides?: CheckoutFormItemClasses,\n) {\n\tconst d = CHECKOUT_FORM_DEFAULT_ITEM_CLASSES;\n\treturn Object.fromEntries(\n\t\t(Object.keys(d) as Array<keyof CheckoutFormItemClasses>).map((key) => [\n\t\t\tkey,\n\t\t\tcn(d[key], overrides?.[key]),\n\t\t]),\n\t) as Required<CheckoutFormItemClasses>;\n}\n\n/**\n * Fully-resolved classes. Every subcomponent takes this (not the partial\n * overrides) so a piece used on its own and one composed into CheckoutForm\n * merge the defaults exactly once.\n */\nexport type CheckoutFormSlots = Required<CheckoutFormItemClasses>;\n\nexport const CHECKOUT_FORM_SLOTS: CheckoutFormSlots =\n\tmergeCheckoutFormItemClasses();\n\n/**\n * Copy for a card *hold* — a Stripe SetupIntent rather than a PaymentIntent.\n * The server issues one when the order is catering (create-payment-intent.ts\n * branches on order.is_catering): the card is saved and nothing is charged\n * until a manager confirms. Without this, checkout told the customer they had\n * paid when no money had moved.\n *\n * Defaulted and overridable: the wording is catering-shaped today, but holding\n * a card is not a catering-only idea.\n */\nexport interface CheckoutHoldCopy {\n\tsubmitLabel: string;\n\tsubmitLoadingLabel: string;\n\tsuccessTitle: string;\n\t/**\n\t * Called with the formatted amount, or `null` when it isn't known — the\n\t * Stripe return URL only carries one if we put it there, and a hold panel\n\t * that promises to charge \"$0.00\" is worse than one that names no figure.\n\t */\n\tsuccessMessage: (amount: string | null) => string;\n}\n\nexport const CHECKOUT_HOLD_COPY: CheckoutHoldCopy = {\n\tsubmitLabel: \"Save card & send request\",\n\tsubmitLoadingLabel: \"Sending\\u2026\",\n\tsuccessTitle: \"Request received\",\n\tsuccessMessage: (amount) =>\n\t\tamount\n\t\t\t? `Nothing has been charged yet. We'll confirm your request by email and charge ${amount} then.`\n\t\t\t: \"Nothing has been charged yet. We'll confirm your request by email before charging your card.\",\n};\n","\"use client\";\n\nimport { useEffect, useState, type ReactNode } from \"react\";\nimport Link from \"next/link\";\nimport { Elements } from \"@stripe/react-stripe-js\";\nimport {\n\tuseCart,\n\tuseLocation,\n\tuseModal,\n\tusePayment,\n} from \"@zorgo/universal/hooks/hooks\";\nimport { cn, money } from \"../ItemForm/classes\";\nimport { CheckoutShell } from \"./CheckoutShell\";\nimport { DetailsStep } from \"./DetailsStep\";\nimport { PaymentStep } from \"./PaymentStep\";\nimport { StatusPanel } from \"./StatusPanel\";\nimport {\n\tCHECKOUT_HOLD_COPY,\n\tmergeCheckoutFormItemClasses,\n\ttype CheckoutFormItemClasses,\n\ttype CheckoutHoldCopy,\n} from \"./classes\";\n\n/**\n * The stock checkout flow: cart + customer details, then Stripe payment.\n * Every piece here is exported on its own — a site that wants its own layout\n * composes these instead of forking the file.\n *\n * The order + payment intent are created on details submit (not on mount),\n * so the collected customer and any applied promo are baked into the charge.\n */\nexport function CheckoutForm({\n\titemClasses,\n\thomeHref = \"/\",\n\tmenuHref = \"/menu\",\n\tcheckoutHref = \"/checkout\",\n\tholdCopy,\n\tsuccessAction,\n}: {\n\titemClasses?: CheckoutFormItemClasses;\n\thomeHref?: string;\n\tmenuHref?: string;\n\tcheckoutHref?: string;\n\tholdCopy?: Partial<CheckoutHoldCopy>;\n\t/**\n\t * Replaces the \"Back home\" button on the success panel.\n\t *\n\t * Takes the order id and its read token when the return URL carried them —\n\t * enough to link the customer straight to their own order. Both are absent\n\t * whenever the mint before the redirect failed, so an implementation has to\n\t * render something sensible without them.\n\t */\n\tsuccessAction?: (context: { orderId?: number; orderToken?: string }) => ReactNode;\n}) {\n\tconst slots = mergeCheckoutFormItemClasses(itemClasses);\n\tconst {\n\t\tclientSecret,\n\t\tstripe,\n\t\telementOptions,\n\t\tisReady,\n\t\tisLoading,\n\t\terror,\n\t\tgetReturnStatus,\n\t} = usePayment();\n\tconst { isEmpty, resetCart } = useCart();\n\tconst { currentLocation, needsLocationSelection } = useLocation({\n\t\tpromptLocationSelection: true,\n\t});\n\tconst { open } = useModal();\n\tconst hold = { ...CHECKOUT_HOLD_COPY, ...holdCopy };\n\n\tconst [returnStatus, setReturnStatus] = useState<ReturnType<\n\t\ttypeof getReturnStatus\n\t> | null>(null);\n\tuseEffect(() => {\n\t\tif (window.location.search.includes(\"redirect_status\")) {\n\t\t\tconst status = getReturnStatus(window.location.href);\n\t\t\tsetReturnStatus(status);\n\t\t\tif (status.succeeded) resetCart();\n\t\t}\n\t}, []);\n\n\tconst linkAction = (href: string, label: string) => (\n\t\t<Link\n\t\t\thref={href}\n\t\t\tclassName={cn(slots.primaryButton, \"block w-full text-center\")}\n\t\t>\n\t\t\t{label}\n\t\t</Link>\n\t);\n\n\tif (returnStatus) {\n\t\treturn (\n\t\t\t<CheckoutShell slots={slots}>\n\t\t\t\t{returnStatus.succeeded ? (\n\t\t\t\t\t// A setup_intent return means the card was saved, not charged —\n\t\t\t\t\t// telling a catering customer \"payment successful\" is a lie.\n\t\t\t\t\t<StatusPanel\n\t\t\t\t\t\tslots={slots}\n\t\t\t\t\t\ttitle={returnStatus.isHold ? hold.successTitle : \"You're all set\"}\n\t\t\t\t\t\tmessage={\n\t\t\t\t\t\t\treturnStatus.isHold\n\t\t\t\t\t\t\t\t? hold.successMessage(\n\t\t\t\t\t\t\t\t\t\treturnStatus.amount ? money(returnStatus.amount) : null,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: \"Payment successful. Thank you!\"\n\t\t\t\t\t\t}\n\t\t\t\t\t\taction={\n\t\t\t\t\t\t\tsuccessAction?.({\n\t\t\t\t\t\t\t\torderId: returnStatus.orderId,\n\t\t\t\t\t\t\t\torderToken: returnStatus.orderToken,\n\t\t\t\t\t\t\t}) ?? linkAction(homeHref, \"Back home\")\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<StatusPanel\n\t\t\t\t\t\tslots={slots}\n\t\t\t\t\t\ttitle=\"Payment didn't go through\"\n\t\t\t\t\t\tmessage={returnStatus.error}\n\t\t\t\t\t\ttone=\"error\"\n\t\t\t\t\t\taction={linkAction(checkoutHref, \"Try again\")}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</CheckoutShell>\n\t\t);\n\t}\n\n\tif (isEmpty && !isLoading && !clientSecret) {\n\t\treturn (\n\t\t\t<CheckoutShell slots={slots}>\n\t\t\t\t<StatusPanel\n\t\t\t\t\tslots={slots}\n\t\t\t\t\ttitle=\"Your cart is empty\"\n\t\t\t\t\tmessage=\"Add something from the menu to get started.\"\n\t\t\t\t\taction={linkAction(menuHref, \"Browse the menu\")}\n\t\t\t\t/>\n\t\t\t</CheckoutShell>\n\t\t);\n\t}\n\n\tif (error) {\n\t\treturn (\n\t\t\t<CheckoutShell slots={slots}>\n\t\t\t\t<StatusPanel\n\t\t\t\t\tslots={slots}\n\t\t\t\t\ttitle=\"Something went wrong\"\n\t\t\t\t\tmessage={error}\n\t\t\t\t\ttone=\"error\"\n\t\t\t\t\taction={linkAction(menuHref, \"Back to menu\")}\n\t\t\t\t/>\n\t\t\t</CheckoutShell>\n\t\t);\n\t}\n\n\tif (needsLocationSelection) {\n\t\treturn (\n\t\t\t<CheckoutShell slots={slots}>\n\t\t\t\t<StatusPanel\n\t\t\t\t\tslots={slots}\n\t\t\t\t\ttitle=\"Choose a location\"\n\t\t\t\t\tmessage=\"Please choose a location to continue checkout.\"\n\t\t\t\t\taction={\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => open(\"FIND_LOCATION_MODAL\")}\n\t\t\t\t\t\t\tclassName={cn(slots.primaryButton, \"w-full\")}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSelect a location\n\t\t\t\t\t\t</button>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</CheckoutShell>\n\t\t);\n\t}\n\n\tif (isReady && elementOptions) {\n\t\treturn (\n\t\t\t<CheckoutShell slots={slots}>\n\t\t\t\t<Elements\n\t\t\t\t\tkey={currentLocation?.stripe_account_id}\n\t\t\t\t\tstripe={stripe!}\n\t\t\t\t\toptions={elementOptions}\n\t\t\t\t>\n\t\t\t\t\t<PaymentStep slots={slots} checkoutHref={checkoutHref} />\n\t\t\t\t</Elements>\n\t\t\t</CheckoutShell>\n\t\t);\n\t}\n\n\treturn (\n\t\t<CheckoutShell slots={slots}>\n\t\t\t<DetailsStep slots={slots} />\n\t\t</CheckoutShell>\n\t);\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { CHECKOUT_FORM_SLOTS, type CheckoutFormSlots } from \"./classes\";\n\n/** Page wrapper + title every checkout state renders inside. */\nexport function CheckoutShell({\n\tchildren,\n\ttitle = \"Checkout\",\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\tchildren: ReactNode;\n\ttitle?: ReactNode;\n\tslots?: CheckoutFormSlots;\n}) {\n\treturn (\n\t\t<div className={slots.shell}>\n\t\t\t<div className={slots.shellInner}>\n\t\t\t\t<h1 className={slots.pageTitle}>{title}</h1>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { DynamicFormShell, SubmitButton } from \"@zorgo/universal/components/Form\";\nimport { useCart, useCustomer, usePayment } from \"@zorgo/universal/hooks/hooks\";\nimport type { Customer } from \"@zorgo/universal/interfaces\";\nimport { cn } from \"../ItemForm/classes\";\nimport { CheckoutSteps } from \"./CheckoutSteps\";\nimport { ConsentFields } from \"./ConsentFields\";\nimport { ContactFields } from \"./ContactFields\";\nimport { OrderLines } from \"./OrderLine\";\nimport { OrderTotals } from \"./OrderTotals\";\nimport { PromoCode } from \"./PromoCode\";\nimport { CHECKOUT_FORM_SLOTS, type CheckoutFormSlots } from \"./classes\";\n\n/** Step 1: review the cart, apply a promo, hand over contact details. */\nexport function DetailsStep({\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\tslots?: CheckoutFormSlots;\n}) {\n\tconst { resetCart } = useCart();\n\tconst { setCustomer } = useCustomer();\n\tconst { startCheckout } = usePayment();\n\tconst [submitError, setSubmitError] = useState<string | undefined>();\n\n\tconst handleSubmit = async (values: Record<string, unknown>) => {\n\t\tconst filledCustomer: Customer = {\n\t\t\tfirst_name: values.firstName as string,\n\t\t\tlast_name: values.lastName as string,\n\t\t\tphone: values.phone as string,\n\t\t\temail: values.email as string,\n\t\t\tallow_marketing: values.marketingConsent as boolean,\n\t\t};\n\t\tsetCustomer(filledCustomer);\n\n\t\ttry {\n\t\t\tawait startCheckout();\n\t\t} catch (err) {\n\t\t\tsetSubmitError(\n\t\t\t\terr instanceof Error ? err.message : \"Could not start payment.\",\n\t\t\t);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className={slots.stepSection}>\n\t\t\t<CheckoutSteps current={1} slots={slots} />\n\n\t\t\t<h2 className={slots.sectionTitle}>Your order</h2>\n\t\t\t<OrderLines slots={slots} />\n\n\t\t\t<OrderTotals slots={slots} />\n\n\t\t\t<PromoCode slots={slots} />\n\n\t\t\t<h2 className={slots.sectionTitle}>Contact information</h2>\n\n\t\t\t<DynamicFormShell onSubmit={handleSubmit} className={slots.form}>\n\t\t\t\t<ContactFields slots={slots} />\n\t\t\t\t<ConsentFields slots={slots} />\n\n\t\t\t\t{submitError && (\n\t\t\t\t\t<p className={slots.submitError}>{submitError}</p>\n\t\t\t\t)}\n\n\t\t\t\t<div className={slots.formActions}>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={resetCart}\n\t\t\t\t\t\tclassName={slots.secondaryButton}\n\t\t\t\t\t>\n\t\t\t\t\t\tClear cart\n\t\t\t\t\t</button>\n\t\t\t\t\t<SubmitButton\n\t\t\t\t\t\tlabel=\"Continue to payment\"\n\t\t\t\t\t\tloadingLabel=\"Setting up...\"\n\t\t\t\t\t\tclassName={cn(\"flex-1\", slots.primaryButton)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</DynamicFormShell>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { cn } from \"../ItemForm/classes\";\nimport { CHECKOUT_FORM_SLOTS, type CheckoutFormSlots } from \"./classes\";\n\n/** Numbered progress header shown above each step. */\nexport function CheckoutSteps({\n\tcurrent,\n\tlabels = [\"Your details\", \"Payment\"],\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\tcurrent: number;\n\tlabels?: string[];\n\tslots?: CheckoutFormSlots;\n}) {\n\treturn (\n\t\t<div className={slots.steps}>\n\t\t\t{labels.map((label, i) => {\n\t\t\t\tconst n = i + 1;\n\t\t\t\tconst active = n <= current;\n\t\t\t\treturn (\n\t\t\t\t\t<div key={label} className=\"contents\">\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\tslots.stepBadge,\n\t\t\t\t\t\t\t\t\tactive\n\t\t\t\t\t\t\t\t\t\t? slots.stepBadgeActive\n\t\t\t\t\t\t\t\t\t\t: slots.stepBadgeInactive,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{n}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\tslots.stepLabel,\n\t\t\t\t\t\t\t\t\tactive\n\t\t\t\t\t\t\t\t\t\t? slots.stepLabelActive\n\t\t\t\t\t\t\t\t\t\t: slots.stepLabelInactive,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{i < labels.length - 1 && (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\tslots.stepDivider,\n\t\t\t\t\t\t\t\t\tcurrent > n\n\t\t\t\t\t\t\t\t\t\t? slots.stepDividerActive\n\t\t\t\t\t\t\t\t\t\t: slots.stepDividerInactive,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { CheckboxField } from \"@zorgo/universal/components/Form\";\nimport { CHECKOUT_FORM_SLOTS, type CheckoutFormSlots } from \"./classes\";\n\n/**\n * Terms + marketing checkboxes. Must be rendered inside a `DynamicFormShell`;\n * the submit handler reads `termsAccepted` / `marketingConsent`.\n */\nexport function ConsentFields({\n\ttermsLabel = \"I have read and agree to the terms of service.\",\n\tmarketingLabel = \"I consent to receive promotions via text and email.\",\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\ttermsLabel?: React.ReactNode;\n\tmarketingLabel?: React.ReactNode;\n\tslots?: CheckoutFormSlots;\n}) {\n\treturn (\n\t\t<>\n\t\t\t<CheckboxField\n\t\t\t\tfieldId=\"termsAccepted\"\n\t\t\t\trequired\n\t\t\t\trequiredText=\"You must agree to the terms of service to continue.\"\n\t\t\t\tfieldErrorClassName={slots.fieldError}\n\t\t\t>\n\t\t\t\t{termsLabel}\n\t\t\t</CheckboxField>\n\t\t\t<CheckboxField fieldId=\"marketingConsent\" required={false}>\n\t\t\t\t{marketingLabel}\n\t\t\t</CheckboxField>\n\t\t</>\n\t);\n}\n","\"use client\";\n\nimport {\n\tNameFields,\n\tPhoneField,\n\tEmailField,\n\tFieldError,\n} from \"@zorgo/universal/components/Form\";\nimport { useCustomer } from \"@zorgo/universal/hooks/hooks\";\nimport { cn } from \"../ItemForm/classes\";\nimport { CHECKOUT_FORM_SLOTS, type CheckoutFormSlots } from \"./classes\";\n\n/**\n * Name / phone / email inputs, seeded from the stored customer. Must be\n * rendered inside a `DynamicFormShell`.\n */\nexport function ContactFields({\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\tslots?: CheckoutFormSlots;\n}) {\n\tconst { customer } = useCustomer();\n\n\tconst fieldStyleProps = {\n\t\tfieldClassName: slots.fieldInput,\n\t\tcontainerClassName: slots.fieldContainer,\n\t\tfieldLabelClassName: slots.fieldLabel,\n\t\tfieldErrorClassName: slots.fieldError,\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<NameFields\n\t\t\t\tfirstNameInitialValue={customer.first_name ?? \"\"}\n\t\t\t\tlastNameInitialValue={customer.last_name ?? \"\"}\n\t\t\t\tfieldClassName={slots.fieldInput}\n\t\t\t\tfieldLabelClassName={slots.fieldLabel}\n\t\t\t\tfieldErrorClassName={slots.fieldError}\n\t\t\t\tchildClassName={cn(\n\t\t\t\t\tslots.fieldContainer,\n\t\t\t\t\t\"md:flex-1 md:min-w-0\",\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<div className=\"flex flex-col w-full gap-1\">\n\t\t\t\t<PhoneField\n\t\t\t\t\tinitialValue={customer.phone ?? \"\"}\n\t\t\t\t\tshowError={false}\n\t\t\t\t\t{...fieldStyleProps}\n\t\t\t\t/>\n\t\t\t\t<FieldError name=\"phone\" className={slots.fieldError} />\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col w-full gap-1\">\n\t\t\t\t<EmailField\n\t\t\t\t\tinitialValue={customer.email ?? \"\"}\n\t\t\t\t\tshowError={false}\n\t\t\t\t\t{...fieldStyleProps}\n\t\t\t\t/>\n\t\t\t\t<FieldError name=\"email\" className={slots.fieldError} />\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","\"use client\";\n\nimport { Minus, Pencil, Plus } from \"lucide-react\";\nimport { useCart, useModal } from \"@zorgo/universal/hooks/hooks\";\nimport type { OrderItem } from \"@zorgo/universal/interfaces\";\nimport { cn, money } from \"../ItemForm/classes\";\nimport { CHECKOUT_FORM_SLOTS, type CheckoutFormSlots } from \"./classes\";\n\n/** One cart line: selections, price, edit + quantity controls. */\nexport function OrderLine({\n\titem,\n\tindex,\n\tonRemove,\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\titem: OrderItem;\n\tindex: number;\n\tonRemove: () => void;\n\tslots?: CheckoutFormSlots;\n}) {\n\tconst { open } = useModal();\n\tconst { updateItem, getItemTotal } = useCart();\n\n\t// Read straight from the store item so edits (from the pencil modal) and\n\t// quantity changes stay reactive — no local hook state to drift out of sync.\n\tconst setQuantity = (next: number) =>\n\t\tnext < 1 ? onRemove() : updateItem({ ...item, quantity: next }, index);\n\n\tconst added = (item.selections ?? []).flatMap((rs) =>\n\t\trs.selections.map((s) => s.name),\n\t);\n\tconst removed = (item.components ?? [])\n\t\t.filter((c) => c.quantity_servings === 0)\n\t\t.map((c) => c.name);\n\n\treturn (\n\t\t<div className={cn(slots.cartLine, slots.surface)}>\n\t\t\t<div className=\"flex flex-col gap-1 flex-1 min-w-0\">\n\t\t\t\t<p className={slots.cartLineName}>{item.name}</p>\n\t\t\t\t{added.length > 0 && (\n\t\t\t\t\t<p className={slots.cartLineSelection}>\n\t\t\t\t\t\tAdd {added.join(\", \")}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t\t{removed.length > 0 && (\n\t\t\t\t\t<p className={slots.cartLineSelection}>\n\t\t\t\t\t\tRemove {removed.join(\", \")}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t\t{item.comments && (\n\t\t\t\t\t<p className={slots.cartLineSelection}>\n\t\t\t\t\t\tComments: {item.comments}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t\t<p className={slots.cartLinePrice}>{money(getItemTotal(item))}</p>\n\t\t\t</div>\n\n\t\t\t<div className={slots.cartLineControls}>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-label=\"Edit item\"\n\t\t\t\t\tclassName={slots.incrementButton}\n\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\topen(\"EDIT_ITEM_MODAL\", {\n\t\t\t\t\t\t\tbaseItemId: item.base_item_id,\n\t\t\t\t\t\t\tseed: item,\n\t\t\t\t\t\t\teditIndex: index,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t<Pencil className=\"w-5 h-5\" />\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={slots.incrementButton}\n\t\t\t\t\tonClick={() => setQuantity(item.quantity - 1)}\n\t\t\t\t>\n\t\t\t\t\t<Minus className=\"w-5 h-5\" />\n\t\t\t\t</button>\n\t\t\t\t<p className={slots.cartLineQuantity}>{item.quantity}</p>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={slots.incrementButton}\n\t\t\t\t\tonClick={() => setQuantity(item.quantity + 1)}\n\t\t\t\t>\n\t\t\t\t\t<Plus className=\"w-5 h-5\" />\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\n/** Every line in the cart. */\nexport function OrderLines({\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\tslots?: CheckoutFormSlots;\n}) {\n\tconst { items, removeItem } = useCart();\n\n\treturn (\n\t\t<div className={slots.cartList}>\n\t\t\t{items.map((item, index) => (\n\t\t\t\t<OrderLine\n\t\t\t\t\tkey={`${item.item_id}-${index}`}\n\t\t\t\t\titem={item}\n\t\t\t\t\tindex={index}\n\t\t\t\t\tonRemove={() => removeItem(index)}\n\t\t\t\t\tslots={slots}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { useCart } from \"@zorgo/universal/hooks/hooks\";\nimport { cn, money } from \"../ItemForm/classes\";\nimport { CHECKOUT_FORM_SLOTS, type CheckoutFormSlots } from \"./classes\";\n\n/** Subtotal, discount, tax, service fee, total. */\nexport function OrderTotals({\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\tslots?: CheckoutFormSlots;\n}) {\n\tconst { subtotal, discount, tax, serviceFee, total } = useCart();\n\n\treturn (\n\t\t<div className={cn(slots.totals, slots.surface)}>\n\t\t\t<div className={slots.totalsRow}>\n\t\t\t\t<span>Subtotal</span>\n\t\t\t\t<span>{money(subtotal)}</span>\n\t\t\t</div>\n\t\t\t{discount > 0 && (\n\t\t\t\t<div className={slots.totalsRow}>\n\t\t\t\t\t<span>Discount</span>\n\t\t\t\t\t<span>{money(-discount)}</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div className={slots.totalsRow}>\n\t\t\t\t<span>Tax</span>\n\t\t\t\t<span>{money(tax)}</span>\n\t\t\t</div>\n\t\t\t{serviceFee > 0 && (\n\t\t\t\t<div className={slots.totalsRow}>\n\t\t\t\t\t<span>Service fee</span>\n\t\t\t\t\t<span>{money(serviceFee)}</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div className={slots.totalsDivider} />\n\t\t\t<div className={slots.totalsTotalRow}>\n\t\t\t\t<span>Total</span>\n\t\t\t\t<span>{money(total)}</span>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { usePromotions } from \"@zorgo/universal/hooks/hooks\";\nimport { cn } from \"../ItemForm/classes\";\nimport { CHECKOUT_FORM_SLOTS, type CheckoutFormSlots } from \"./classes\";\n\n/** Promo code entry; swaps to the applied-promo row once one sticks. */\nexport function PromoCode({\n\tplaceholder = \"Promo code\",\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\tplaceholder?: string;\n\tslots?: CheckoutFormSlots;\n}) {\n\tconst { promoCode, appliedPromo, applyPromo, removePromo, error, loading } =\n\t\tusePromotions();\n\tconst [draft, setDraft] = useState(\"\");\n\n\tif (appliedPromo) {\n\t\treturn (\n\t\t\t<div className={cn(slots.promoApplied, slots.surface)}>\n\t\t\t\t<span className={slots.promoAppliedLabel}>\n\t\t\t\t\t{appliedPromo.name} applied\n\t\t\t\t</span>\n\t\t\t\t{promoCode && (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={removePromo}\n\t\t\t\t\t\tclassName={slots.secondaryButton}\n\t\t\t\t\t>\n\t\t\t\t\t\tRemove\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2 w-full\">\n\t\t\t<div className={slots.promoRow}>\n\t\t\t\t<input\n\t\t\t\t\tvalue={draft}\n\t\t\t\t\tonChange={(e) => setDraft(e.target.value)}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\tclassName={slots.promoInput}\n\t\t\t\t/>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tdisabled={loading || !draft.trim()}\n\t\t\t\t\tonClick={() => applyPromo(draft)}\n\t\t\t\t\tclassName={cn(slots.primaryButton, \"shrink-0\")}\n\t\t\t\t>\n\t\t\t\t\t{loading ? \"Applying…\" : \"Apply\"}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{error && <p className={slots.promoError}>{error}</p>}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { PaymentElement, useElements, useStripe } from \"@stripe/react-stripe-js\";\nimport { DynamicFormShell, SubmitButton } from \"@zorgo/universal/components/Form\";\nimport { useCustomer, usePayment } from \"@zorgo/universal/hooks/hooks\";\nimport { cn, money } from \"../ItemForm/classes\";\nimport { CheckoutSteps } from \"./CheckoutSteps\";\nimport {\n\tCHECKOUT_FORM_SLOTS,\n\tCHECKOUT_HOLD_COPY,\n\ttype CheckoutFormSlots,\n\ttype CheckoutHoldCopy,\n} from \"./classes\";\n\n/**\n * Where Stripe sends the customer back to, and everything we need them to\n * arrive with.\n *\n * Stripe appends `payment_intent`/`setup_intent` + `redirect_status` itself and\n * nothing else, and the redirect is a fresh page load — no store survives it.\n * So anything the success panel needs has to be in this URL: the amount (so a\n * hold can name what will be charged instead of guessing) and the order id +\n * its read token (so we can offer a link to the order).\n */\nexport function buildReturnUrl({\n\tsiteUrl,\n\tcheckoutHref,\n\tamountCents,\n\torderId,\n\torderToken,\n}: {\n\tsiteUrl: string;\n\tcheckoutHref: string;\n\tamountCents: number;\n\torderId?: number | null;\n\torderToken?: string | null;\n}): string {\n\tconst path = checkoutHref.startsWith(\"/\") ? checkoutHref : `/${checkoutHref}`;\n\tconst url = new URL(`${siteUrl}${path}`);\n\turl.searchParams.set(\"amount\", String(amountCents));\n\t// Both or neither: an order id with no token points at a page that can only\n\t// tell the customer their link is incomplete.\n\tif (orderId && orderToken) {\n\t\turl.searchParams.set(\"order\", String(orderId));\n\t\turl.searchParams.set(\"order_token\", orderToken);\n\t}\n\treturn url.toString();\n}\n\n/** Step 2: the Stripe payment element. Must be rendered inside `<Elements>`. */\nexport function PaymentStep({\n\tslots = CHECKOUT_FORM_SLOTS,\n\tcheckoutHref = \"/checkout\",\n\tholdCopy,\n}: {\n\tslots?: CheckoutFormSlots;\n\tcheckoutHref?: string;\n\tholdCopy?: Partial<CheckoutHoldCopy>;\n}) {\n\tconst stripe = useStripe();\n\tconst elements = useElements();\n\tconst {\n\t\ttotal,\n\t\tintentType,\n\t\tclientSecret,\n\t\torderId,\n\t\tsubmitPayment,\n\t\tmintOrderLinkToken,\n\t\tpaymentElementOptions,\n\t\tgetReturnUrl,\n\t\tresetCheckout,\n\t} = usePayment();\n\tconst { customer } = useCustomer();\n\tconst [submitError, setSubmitError] = useState<string | undefined>();\n\n\t// Catering checks out through a SetupIntent — the state was already in the\n\t// store and nothing read it, so the button said \"Pay $2,400\" for a charge\n\t// that never happened.\n\tconst isHold = intentType === \"setup_intent\";\n\tconst hold = { ...CHECKOUT_HOLD_COPY, ...holdCopy };\n\n\tconst handleSubmit = async () => {\n\t\tif (!stripe || !elements || !clientSecret) return;\n\n\t\tconst { error } = await elements.submit();\n\t\tif (error) {\n\t\t\tsetSubmitError(error.message ?? \"Please check your card details.\");\n\t\t\tthrow error;\n\t\t}\n\n\t\t// Minted here rather than on the way back: after the redirect this order id\n\t\t// is gone and the customer's email with it. Best-effort — mintOrderLinkToken\n\t\t// swallows its own failures, so checkout proceeds without the link.\n\t\tconst orderToken =\n\t\t\torderId && customer.email\n\t\t\t\t? await mintOrderLinkToken(orderId, customer.email)\n\t\t\t\t: null;\n\n\t\tconst returnUrl = buildReturnUrl({\n\t\t\t// The store's site URL is configured; the origin we are already on is\n\t\t\t// not. Stripe rejects a relative return_url, so fall back rather than\n\t\t\t// interpolate \"undefined\" into one.\n\t\t\tsiteUrl: getReturnUrl() || window.location.origin,\n\t\t\tcheckoutHref,\n\t\t\tamountCents: total ?? 0,\n\t\t\torderId,\n\t\t\torderToken,\n\t\t});\n\t\tconst result = await submitPayment(\n\t\t\tstripe,\n\t\t\telements,\n\t\t\tclientSecret,\n\t\t\treturnUrl,\n\t\t\tcustomer,\n\t\t);\n\t\tif (!result.success) setSubmitError(result.error);\n\t};\n\n\treturn (\n\t\t<div className={slots.stepSection}>\n\t\t\t<CheckoutSteps current={2} slots={slots} />\n\n\t\t\t<DynamicFormShell onSubmit={handleSubmit} className={slots.form}>\n\t\t\t\t<div className={cn(slots.paymentSurface, slots.surface)}>\n\t\t\t\t\t<PaymentElement options={paymentElementOptions} />\n\t\t\t\t</div>\n\n\t\t\t\t{submitError && (\n\t\t\t\t\t<p className={slots.submitError}>{submitError}</p>\n\t\t\t\t)}\n\n\t\t\t\t{isHold && (\n\t\t\t\t\t<p className={slots.statusMessage}>\n\t\t\t\t\t\t{hold.successMessage(total ? money(total) : null)}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\n\t\t\t\t<div className={slots.formActions}>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={resetCheckout}\n\t\t\t\t\t\tclassName={slots.secondaryButton}\n\t\t\t\t\t>\n\t\t\t\t\t\tBack to order\n\t\t\t\t\t</button>\n\t\t\t\t\t<SubmitButton\n\t\t\t\t\t\tlabel={isHold ? hold.submitLabel : `Pay ${money(total ?? 0)}`}\n\t\t\t\t\t\tloadingLabel={isHold ? hold.submitLoadingLabel : \"Processing...\"}\n\t\t\t\t\t\tclassName={cn(\"flex-1\", slots.primaryButton)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</DynamicFormShell>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../ItemForm/classes\";\nimport { CHECKOUT_FORM_SLOTS, type CheckoutFormSlots } from \"./classes\";\n\n/** Terminal states: empty cart, payment result, errors, location prompt. */\nexport function StatusPanel({\n\ttitle,\n\tmessage,\n\taction,\n\ttone = \"default\",\n\tslots = CHECKOUT_FORM_SLOTS,\n}: {\n\ttitle: string;\n\tmessage?: string;\n\taction: ReactNode;\n\ttone?: \"default\" | \"error\";\n\tslots?: CheckoutFormSlots;\n}) {\n\treturn (\n\t\t<div className={cn(slots.statusPanel, slots.surface)}>\n\t\t\t<h2 className={slots.statusTitle}>{title}</h2>\n\t\t\t{message && (\n\t\t\t\t<p\n\t\t\t\t\tclassName={\n\t\t\t\t\t\ttone === \"error\"\n\t\t\t\t\t\t\t? slots.statusMessageError\n\t\t\t\t\t\t\t: slots.statusMessage\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{message}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t<div className={slots.statusActions}>{action}</div>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { usePathname } from \"next/navigation\";\nimport { Button, type ButtonItemClasses, type ButtonProps } from \"./Button\";\nimport { isNavLinkActive } from \"./NavLink\";\nimport { cn } from \"./ItemForm/classes\";\n\n/** A button's own slots plus the bar it pins to on mobile. */\nexport type StickyButtonItemClasses = ButtonItemClasses &\n\tPartial<{ bar: string }>;\n\n/**\n * The bar is only a bar below `sm`: `sm:contents` drops the wrapper out of the\n * layout entirely, so from that breakpoint up the button is an ordinary flex or\n * inline child of whatever holds it — which is the whole point of the\n * component, and why `Button`'s `full` width (`w-full sm:w-fit`) switches at the\n * same step.\n */\nexport const STICKY_BUTTON_DEFAULT_BAR_CLASS =\n\t\"fixed inset-x-0 bottom-0 z-40 flex justify-center border-t border-foreground/10 bg-background p-4 sm:contents\";\n\n/**\n * Omitted `stickyOn` pins on every route; an empty list pins on none. Route\n * matching is {@link isNavLinkActive}'s — \"/\" exact, everything else its own\n * subtree — so the routes read the same here as they do in a nav.\n */\nexport function isStickyRoute(\n\tpathname: string | null,\n\tstickyOn?: string[],\n): boolean {\n\tif (!stickyOn) return true;\n\tif (!pathname) return false;\n\treturn stickyOn.some((route) => isNavLinkActive(pathname, route));\n}\n\nexport type StickyButtonProps = ButtonProps & {\n\t/** Routes where this pins to the bottom of the viewport on mobile. */\n\tstickyOn?: string[];\n\t/**\n\t * Reserves the bar's height in the flow. Wanted where the component sits at\n\t * the end of a page (nothing should hide under the bar); not wanted in a\n\t * header, where the bar's height is nowhere near the button's own place.\n\t */\n\tspacer?: boolean;\n\titemClasses?: StickyButtonItemClasses;\n};\n\n/**\n * One CTA that is an ordinary {@link Button} on desktop and a pinned\n * bottom-of-screen bar on mobile, per route. Width is owned here rather than\n * taken as a prop: pinned is always full-width (FT-02's mobile-only exception),\n * inline is always capped at its label.\n */\nexport function StickyButton({\n\tstickyOn,\n\tspacer = true,\n\titemClasses,\n\twidth: _width,\n\t...rest\n}: StickyButtonProps) {\n\tconst pathname = usePathname();\n\tconst { bar, ...buttonClasses } = itemClasses ?? {};\n\tconst button = rest as ButtonProps;\n\n\tif (!isStickyRoute(pathname, stickyOn)) {\n\t\treturn <Button itemClasses={buttonClasses} {...button} />;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{spacer && <div className=\"h-20 sm:hidden\" aria-hidden />}\n\t\t\t<div className={cn(STICKY_BUTTON_DEFAULT_BAR_CLASS, bar)}>\n\t\t\t\t<Button width=\"full\" itemClasses={buttonClasses} {...button} />\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","import Link from \"next/link\";\nimport type { AnchorHTMLAttributes, ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"./ItemForm/classes\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\";\n/** \"auto\" caps the button at its label + padding (FT-02); \"full\" stretches, but only below the sm breakpoint — a button should never stretch to ~1200px for two words on desktop. */\nexport type ButtonWidth = \"auto\" | \"full\";\n\n/** Per-slot Tailwind classes for a button. */\nexport type ButtonItemClasses = Partial<{\n\tbase: string;\n\tprimary: string;\n\tsecondary: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeButtonItemClasses}.\n *\n * min-h-11 (44px) is Tailwind's stock h-11 step and also the standard\n * touch-target floor (MB-02) — no separate constant needed for it.\n *\n * Brand-specific button geometry (Zestia's pill radius, uppercase Gotham Black,\n * wider tracking) is a per-site decision, so it goes through `itemClasses` at\n * the call site rather than into this default — every value the Zestia guide\n * names has an exact stock Tailwind step (`rounded-full`, `font-black`,\n * `tracking-wider`, `px-6`, `py-3`), so no arbitrary value is needed for it.\n */\nexport const BUTTON_DEFAULT_ITEM_CLASSES: Required<ButtonItemClasses> = {\n\tbase: \"inline-flex min-h-11 items-center justify-center rounded-xl px-6 py-3 text-base font-semibold transition-all duration-300 disabled:cursor-not-allowed disabled:opacity-50\",\n\tprimary: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n\tsecondary: \"bg-background-elevated text-foreground hover:bg-background-recessed\",\n};\n\nexport function mergeButtonItemClasses(overrides?: ButtonItemClasses) {\n\tconst d = BUTTON_DEFAULT_ITEM_CLASSES;\n\treturn {\n\t\tbase: cn(d.base, overrides?.base),\n\t\tprimary: cn(d.primary, overrides?.primary),\n\t\tsecondary: cn(d.secondary, overrides?.secondary),\n\t};\n}\n\n/** FT-02's width rule as a pure decision: only \"full\" may stretch, and only on mobile. */\nexport function buttonWidthClass(width: ButtonWidth): string {\n\treturn width === \"full\" ? \"w-full sm:w-fit\" : \"w-fit\";\n}\n\ntype SharedProps = {\n\tvariant?: ButtonVariant;\n\twidth?: ButtonWidth;\n\titemClasses?: ButtonItemClasses;\n\tchildren: ReactNode;\n};\n\nexport type ButtonProps = SharedProps &\n\t(\n\t\t| ({ href: string } & Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"href\" | \"className\">)\n\t\t| ({ href?: undefined } & Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"className\">)\n\t);\n\n/** One clickable action: a link when `href` is passed, a `<button>` otherwise. Same width/variant rules either way. */\nexport function Button({\n\tvariant = \"primary\",\n\twidth = \"auto\",\n\titemClasses,\n\tchildren,\n\thref,\n\t...rest\n}: ButtonProps) {\n\tconst slots = mergeButtonItemClasses(itemClasses);\n\tconst className = cn(slots.base, slots[variant], buttonWidthClass(width));\n\n\tif (href !== undefined) {\n\t\treturn (\n\t\t\t<Link\n\t\t\t\thref={href}\n\t\t\t\tclassName={className}\n\t\t\t\t{...(rest as Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"href\" | \"className\">)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</Link>\n\t\t);\n\t}\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName={className}\n\t\t\t{...(rest as Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"className\">)}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t);\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport type { AnchorHTMLAttributes, ReactNode } from \"react\";\nimport { usePathname } from \"next/navigation\";\nimport { cn } from \"./ItemForm/classes\";\n\n/** Per-slot Tailwind classes for a nav link. */\nexport type NavLinkItemClasses = Partial<{\n\tbase: string;\n\tactive: string;\n\tinactive: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeNavLinkItemClasses}.\n *\n * NV-01: links default to `text-foreground` (the derived near-black/near-white\n * token every franchise already gets), not a second hardcoded gray — the\n * checklist's \"near-black\" is what that token already resolves to on a light\n * background. Red is reserved for hover/active so the one red \"Order Online\"\n * pill stays the visually distinct primary action.\n */\nexport const NAV_LINK_DEFAULT_ITEM_CLASSES: Required<NavLinkItemClasses> = {\n\tbase: \"relative inline-flex min-h-11 items-center px-1 text-base font-medium transition-colors duration-200\",\n\tinactive: \"text-foreground hover:text-primary\",\n\tactive:\n\t\t\"text-primary after:absolute after:-bottom-1 after:left-0 after:right-0 after:h-0.5 after:rounded-full after:bg-primary\",\n};\n\nexport function mergeNavLinkItemClasses(overrides?: NavLinkItemClasses) {\n\tconst d = NAV_LINK_DEFAULT_ITEM_CLASSES;\n\treturn {\n\t\tbase: cn(d.base, overrides?.base),\n\t\tinactive: cn(d.inactive, overrides?.inactive),\n\t\tactive: cn(d.active, overrides?.active),\n\t};\n}\n\n/**\n * NV-02: the current page gets the active indicator, nothing else does.\n * \"/\" gets an exact match — every pathname starts with \"/\", so a prefix match\n * would leave the home link permanently active. Everything else is a prefix\n * match so a link to /menu also lights up on /menu/gyro.\n */\nexport function isNavLinkActive(pathname: string, href: string): boolean {\n\tif (href === \"/\") return pathname === \"/\";\n\treturn pathname === href || pathname.startsWith(`${href}/`);\n}\n\nexport type NavLinkProps = {\n\thref: string;\n\titemClasses?: NavLinkItemClasses;\n\tchildren: ReactNode;\n} & Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"href\" | \"className\">;\n\n/** A header nav link: near-black by default, red on hover or on the active page, with an active-page indicator. */\nexport function NavLink({ href, itemClasses, children, ...rest }: NavLinkProps) {\n\tconst pathname = usePathname();\n\tconst slots = mergeNavLinkItemClasses(itemClasses);\n\tconst active = isNavLinkActive(pathname, href);\n\treturn (\n\t\t<Link href={href} className={cn(slots.base, active ? slots.active : slots.inactive)} {...rest}>\n\t\t\t{children}\n\t\t</Link>\n\t);\n}\n","\"use client\";\n\nimport { AccordionSection } from \"./Accordion\";\nimport { cn } from \"./ItemForm/classes\";\n\n/** One site-authored question and its answer. */\nexport type Faq = { question: string; answer: string };\n\n/** Per-slot Tailwind classes for the FAQ accordion. */\nexport type FaqAccordionItemClasses = Partial<{\n\tsection: string;\n\ttitle: string;\n\tlist: string;\n\titem: string;\n\ttrigger: string;\n\tquestion: string;\n\tindicator: string;\n\tanswer: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeFaqAccordionItemClasses}.\n */\nexport const FAQ_ACCORDION_DEFAULT_ITEM_CLASSES: Required<FaqAccordionItemClasses> =\n\t{\n\t\tsection: \"flex flex-col gap-8\",\n\t\ttitle: \"text-4xl font-bold uppercase tracking-tight\",\n\t\tlist: \"flex flex-col divide-y divide-foreground/10 border-y border-foreground/10\",\n\t\titem: \"flex flex-col\",\n\t\ttrigger: \"flex w-full items-center justify-between gap-4 py-6 text-left\",\n\t\tquestion: \"text-xl font-semibold\",\n\t\tindicator: \"size-5 shrink-0 opacity-60\",\n\t\tanswer: \"pb-6 pr-9 leading-relaxed opacity-75 whitespace-pre-line\",\n\t};\n\nexport function mergeFaqAccordionItemClasses(\n\toverrides?: FaqAccordionItemClasses,\n) {\n\tconst d = FAQ_ACCORDION_DEFAULT_ITEM_CLASSES;\n\treturn {\n\t\tsection: cn(d.section, overrides?.section),\n\t\ttitle: cn(d.title, overrides?.title),\n\t\tlist: cn(d.list, overrides?.list),\n\t\titem: cn(d.item, overrides?.item),\n\t\ttrigger: cn(d.trigger, overrides?.trigger),\n\t\tquestion: cn(d.question, overrides?.question),\n\t\tindicator: cn(d.indicator, overrides?.indicator),\n\t\tanswer: cn(d.answer, overrides?.answer),\n\t};\n}\n\nexport type FaqAccordionProps = {\n\tfaqs: Faq[];\n\ttitle?: string;\n\t/** Index of the one question open on arrival — none by default. */\n\tdefaultOpen?: number;\n\titemClasses?: FaqAccordionItemClasses;\n};\n\n/**\n * Site-authored Q&A. Answers stay in the markup while collapsed, which is the\n * whole point of the block — AI answer engines quote them. Deliberately emits\n * no `FAQPage` JSON-LD: Google removed FAQ rich results from Search in May\n * 2026, so the markup would buy nothing.\n */\nexport function FaqAccordion({\n\tfaqs,\n\ttitle,\n\tdefaultOpen,\n\titemClasses,\n}: FaqAccordionProps) {\n\tif (faqs.length === 0) return null;\n\n\tconst slots = mergeFaqAccordionItemClasses(itemClasses);\n\n\treturn (\n\t\t<section className={slots.section}>\n\t\t\t{title && <h2 className={slots.title}>{title}</h2>}\n\t\t\t<div className={slots.list}>\n\t\t\t\t{faqs.map((faq, index) => (\n\t\t\t\t\t<AccordionSection\n\t\t\t\t\t\tkey={faq.question}\n\t\t\t\t\t\tdefaultOpen={index === defaultOpen}\n\t\t\t\t\t\ttitle={<h3 className={slots.question}>{faq.question}</h3>}\n\t\t\t\t\t\tslots={{\n\t\t\t\t\t\t\tcontainer: slots.item,\n\t\t\t\t\t\t\ttrigger: slots.trigger,\n\t\t\t\t\t\t\tindicator: slots.indicator,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<p className={slots.answer}>{faq.answer}</p>\n\t\t\t\t\t</AccordionSection>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</section>\n\t);\n}\n","import Image from \"next/image\";\nimport { cn } from \"./ItemForm/classes\";\n\n/**\n * One site-authored photo, served from the site's own `public/`. These are not\n * in the data pipeline — unlike item photos there is no prebuild step that\n * localizes them.\n */\nexport type GalleryImage = { src: string; alt: string };\n\n/** Per-slot Tailwind classes for the photo gallery. */\nexport type GalleryItemClasses = Partial<{\n\tsection: string;\n\ttitle: string;\n\tlist: string;\n\tfigure: string;\n\timage: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeGalleryItemClasses}.\n */\nexport const GALLERY_DEFAULT_ITEM_CLASSES: Required<GalleryItemClasses> = {\n\tsection: \"flex flex-col gap-8\",\n\t// Wrapping + growing rather than a fixed column count: three photos fill\n\t// the row instead of leaving a gap where the fourth would go.\n\tlist: \"flex flex-wrap gap-4\",\n\tfigure:\n\t\t\"relative grow basis-64 aspect-[4/5] overflow-hidden rounded-2xl bg-background-recessed\",\n\ttitle: \"text-4xl font-bold uppercase tracking-tight\",\n\timage: \"object-cover\",\n};\n\nexport function mergeGalleryItemClasses(overrides?: GalleryItemClasses) {\n\tconst d = GALLERY_DEFAULT_ITEM_CLASSES;\n\treturn {\n\t\tsection: cn(d.section, overrides?.section),\n\t\ttitle: cn(d.title, overrides?.title),\n\t\tlist: cn(d.list, overrides?.list),\n\t\tfigure: cn(d.figure, overrides?.figure),\n\t\timage: cn(d.image, overrides?.image),\n\t};\n}\n\nexport type GalleryProps = {\n\timages: GalleryImage[];\n\ttitle?: string;\n\t/** Widest slot one photo occupies, per breakpoint. */\n\tsizes?: string;\n\titemClasses?: GalleryItemClasses;\n};\n\n/**\n * Interior and food photos, authored by the site under `public/`. The row\n * grows to fill whatever it is given, so two photos read as deliberate rather\n * than as ten that failed to load.\n */\nexport function Gallery({\n\timages,\n\ttitle,\n\tsizes = \"(min-width: 1024px) 33vw, (min-width: 640px) 50vw, 100vw\",\n\titemClasses,\n}: GalleryProps) {\n\tif (images.length === 0) return null;\n\n\tconst slots = mergeGalleryItemClasses(itemClasses);\n\n\treturn (\n\t\t<section className={slots.section}>\n\t\t\t{title && <h2 className={slots.title}>{title}</h2>}\n\t\t\t<div className={slots.list}>\n\t\t\t\t{images.map((image) => (\n\t\t\t\t\t<figure key={image.src} className={slots.figure}>\n\t\t\t\t\t\t<Image\n\t\t\t\t\t\t\tsrc={image.src}\n\t\t\t\t\t\t\talt={image.alt}\n\t\t\t\t\t\t\tfill\n\t\t\t\t\t\t\tsizes={sizes}\n\t\t\t\t\t\t\tclassName={slots.image}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</figure>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</section>\n\t);\n}\n","import { Star } from \"lucide-react\";\nimport { cn } from \"./ItemForm/classes\";\n\n/**\n * One first-party testimonial: something a customer said to the restaurant,\n * published with their permission.\n *\n * First-party is the whole design. Reprinting reviews off Google or Yelp is two\n * problems the component cannot solve for a site — the review text is the\n * reviewer's own copyrighted writing, and the platforms' terms restrict\n * republishing it — so there is no `source: \"google\"` field here to invite it.\n * A site that wants platform reviews on the page embeds that platform's own\n * widget, which carries its licence with it.\n *\n * `name` is required rather than optional on purpose. An unattributed quote is\n * the exact shape of a testimonial nobody can check, and the FTC's Rule on the\n * Use of Consumer Reviews and Testimonials (16 CFR 465, in force since October\n * 21 2024) puts civil penalties behind fabricated ones. A first name and a city\n * is plenty; what matters is that a real person said it and the restaurant can\n * show they did.\n */\nexport type Testimonial = {\n\t/** Verbatim. Trim it and you are editing what someone said into something they did not. */\n\tquote: string;\n\t/** Attribution, as the customer agreed to it being published — \"Marisa T.\" is fine. */\n\tname: string;\n\t/** Optional colour under the name: a city, \"catering customer\", \"regular since 2019\". */\n\tdetail?: string;\n\t/** `YYYY-MM-DD`. Rendered as month + year, and machine-readable in `datetime`. */\n\tdate?: string;\n\t/** 1–5. Omit it rather than inventing one. */\n\trating?: number;\n\t/**\n\t * Required by the FTC whenever the reviewer got anything of value for the\n\t * review — a discount, a free meal, a gift card, entry into a drawing — and\n\t * whenever they are staff, family or an owner. Rendered with the quote, not\n\t * in a page footer: the disclosure has to be where the claim is.\n\t * e.g. \"Received a free meal in exchange for this review.\"\n\t */\n\tdisclosure?: string;\n};\n\n/** Per-slot Tailwind classes for the testimonials block. */\nexport type TestimonialsItemClasses = Partial<{\n\tsection: string;\n\ttitle: string;\n\tlist: string;\n\tcard: string;\n\tstars: string;\n\tstar: string;\n\tstarEmpty: string;\n\tquote: string;\n\tattribution: string;\n\tname: string;\n\tdetail: string;\n\tdisclosure: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeTestimonialsItemClasses}.\n *\n * No line clamp on `quote`, deliberately: a card that cuts a testimonial off\n * mid-sentence is publishing an edit of it. Long quotes make a taller card,\n * which is the correct outcome.\n */\nexport const TESTIMONIALS_DEFAULT_ITEM_CLASSES: Required<TestimonialsItemClasses> = {\n\tsection: \"flex flex-col gap-8\",\n\ttitle: \"text-4xl font-bold uppercase tracking-tight\",\n\t// basis-72 + grow: two quotes fill the row rather than leaving a hole where\n\t// a third would have gone. Same reasoning as Gallery.\n\tlist: \"flex flex-wrap gap-4\",\n\tcard: \"flex grow basis-72 flex-col gap-4 rounded-2xl bg-background-recessed p-6\",\n\tstars: \"flex gap-0.5 text-primary\",\n\tstar: \"size-4 fill-current\",\n\tstarEmpty: \"size-4 opacity-25\",\n\tquote: \"text-lg leading-relaxed\",\n\tattribution: \"mt-auto flex flex-col gap-0.5 text-sm\",\n\tname: \"font-semibold\",\n\tdetail: \"opacity-60\",\n\tdisclosure: \"text-xs opacity-60\",\n};\n\nexport function mergeTestimonialsItemClasses(overrides?: TestimonialsItemClasses) {\n\tconst d = TESTIMONIALS_DEFAULT_ITEM_CLASSES;\n\treturn {\n\t\tsection: cn(d.section, overrides?.section),\n\t\ttitle: cn(d.title, overrides?.title),\n\t\tlist: cn(d.list, overrides?.list),\n\t\tcard: cn(d.card, overrides?.card),\n\t\tstars: cn(d.stars, overrides?.stars),\n\t\tstar: cn(d.star, overrides?.star),\n\t\tstarEmpty: cn(d.starEmpty, overrides?.starEmpty),\n\t\tquote: cn(d.quote, overrides?.quote),\n\t\tattribution: cn(d.attribution, overrides?.attribution),\n\t\tname: cn(d.name, overrides?.name),\n\t\tdetail: cn(d.detail, overrides?.detail),\n\t\tdisclosure: cn(d.disclosure, overrides?.disclosure),\n\t};\n}\n\nexport type TestimonialsProps = {\n\ttestimonials: Testimonial[];\n\ttitle?: string;\n\titemClasses?: TestimonialsItemClasses;\n};\n\n// Fixed locale and UTC so the server and the browser format the same string —\n// the machine's locale would be a hydration mismatch. Month and year only:\n// day-level precision on a testimonial is noise, and it keeps the block from\n// reading as a feed that has to be topped up.\nconst MONTH_YEAR = new Intl.DateTimeFormat(\"en-US\", {\n\tmonth: \"long\",\n\tyear: \"numeric\",\n\ttimeZone: \"UTC\",\n});\n\nfunction monthYear(date: string): string {\n\tconst parsed = new Date(`${date}T00:00:00Z`);\n\treturn Number.isNaN(parsed.getTime()) ? date : MONTH_YEAR.format(parsed);\n}\n\nfunction Stars({ rating, slots }: { rating: number; slots: { stars: string; star: string; starEmpty: string } }) {\n\tconst filled = Math.max(0, Math.min(5, Math.round(rating)));\n\treturn (\n\t\t<span className={slots.stars} role=\"img\" aria-label={`${filled} out of 5 stars`}>\n\t\t\t{[0, 1, 2, 3, 4].map((index) => (\n\t\t\t\t<Star key={index} aria-hidden className={index < filled ? slots.star : slots.starEmpty} />\n\t\t\t))}\n\t\t</span>\n\t);\n}\n\n/**\n * What customers said, in their own words, attributed.\n *\n * Deliberately emits no `Review` or `AggregateRating` JSON-LD. Since 2019\n * Google ignores reviews a business collects about itself on its own site —\n * they are ineligible for review rich results either way — so the markup buys\n * no stars in search and only adds a structured-data policy surface to get\n * wrong. The stars here are for the reader.\n */\nexport function Testimonials({ testimonials, title, itemClasses }: TestimonialsProps) {\n\tif (testimonials.length === 0) return null;\n\n\tconst slots = mergeTestimonialsItemClasses(itemClasses);\n\n\treturn (\n\t\t<section className={slots.section}>\n\t\t\t{title && <h2 className={slots.title}>{title}</h2>}\n\t\t\t<div className={slots.list}>\n\t\t\t\t{testimonials.map((testimonial) => (\n\t\t\t\t\t<figure key={testimonial.quote} className={slots.card}>\n\t\t\t\t\t\t{testimonial.rating !== undefined && (\n\t\t\t\t\t\t\t<Stars rating={testimonial.rating} slots={slots} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<blockquote className={slots.quote}>“{testimonial.quote}”</blockquote>\n\t\t\t\t\t\t<figcaption className={slots.attribution}>\n\t\t\t\t\t\t\t<span className={slots.name}>{testimonial.name}</span>\n\t\t\t\t\t\t\t{testimonial.detail && <span className={slots.detail}>{testimonial.detail}</span>}\n\t\t\t\t\t\t\t{testimonial.date && (\n\t\t\t\t\t\t\t\t<time dateTime={testimonial.date} className={slots.detail}>\n\t\t\t\t\t\t\t\t\t{monthYear(testimonial.date)}\n\t\t\t\t\t\t\t\t</time>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{/* Inside the figcaption, so it travels with the quote it\n\t\t\t\t\t\t\t qualifies however the cards reflow. */}\n\t\t\t\t\t\t\t{testimonial.disclosure && (\n\t\t\t\t\t\t\t\t<span className={slots.disclosure}>{testimonial.disclosure}</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</figcaption>\n\t\t\t\t\t</figure>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</section>\n\t);\n}\n","\"use client\";\n\nimport type { Menu } from \"@zorgo/universal/utils/menuUtils\";\nimport { menuItemNameToSlug } from \"@zorgo/universal/utils/menuSlugs\";\nimport { menuImageUrl } from \"@zorgo/universal/utils/menuUtils\";\nimport { cn } from \"./ItemForm/classes\";\nimport { ItemCard, type ItemCardItemClasses } from \"./ItemCard\";\n\n/** Per-slot Tailwind classes for the category tile grid. */\nexport type CategoryTilesItemClasses = Partial<{\n\tbaseContainer: string;\n\ttitle: string;\n\ttiles: string;\n\ttile: string;\n\ttileImage: string;\n\ttileName: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeCategoryTilesItemClasses}.\n */\nexport const CATEGORY_TILES_DEFAULT_ITEM_CLASSES: Required<CategoryTilesItemClasses> =\n\t{\n\t\tbaseContainer: \"flex flex-col gap-8\",\n\t\ttitle: \"text-4xl font-bold\",\n\t\ttiles: \"grid grid-cols-2 gap-6 md:grid-cols-4 md:gap-8\",\n\t\ttile: \"\",\n\t\ttileImage: \"aspect-square\",\n\t\ttileName: \"\",\n\t};\n\nexport function mergeCategoryTilesItemClasses(\n\toverrides?: CategoryTilesItemClasses,\n) {\n\tconst d = CATEGORY_TILES_DEFAULT_ITEM_CLASSES;\n\treturn {\n\t\tbaseContainer: cn(d.baseContainer, overrides?.baseContainer),\n\t\ttitle: cn(d.title, overrides?.title),\n\t\ttiles: cn(d.tiles, overrides?.tiles),\n\t\ttile: cn(d.tile, overrides?.tile),\n\t\ttileImage: cn(d.tileImage, overrides?.tileImage),\n\t\ttileName: cn(d.tileName, overrides?.tileName),\n\t};\n}\n\n/** The `/menu#pizzas` anchor for a category — the same id the menu page's\n * category sections carry. */\nexport function categoryAnchor(name: string) {\n\treturn `#${menuItemNameToSlug(name)}`;\n}\n\n/** Category slots mapped onto an ItemCard's own slots. The price is hidden\n * rather than switched off with a prop: a tile borrows a dish's photo, and\n * that dish's price does not describe the category. */\nfunction tileClasses(\n\tslots: ReturnType<typeof mergeCategoryTilesItemClasses>,\n): ItemCardItemClasses {\n\treturn {\n\t\tcard: slots.tile,\n\t\timageBox: slots.tileImage,\n\t\tname: slots.tileName,\n\t\tprice: \"hidden\",\n\t\toldPrice: \"hidden\",\n\t};\n}\n\nexport type CategoryTilesProps = {\n\tmenu: Menu;\n\ttitle?: string;\n\t/** Menu page the anchors point at. */\n\tmenuHref?: string;\n\titemClasses?: CategoryTilesItemClasses;\n\tsizes?: string;\n};\n\n/**\n * One tile per menu category, linking to that category on the menu page. Each\n * tile borrows the photo of the first item in the category that has one, so a\n * category of photo-less items still renders as a typographic tile.\n *\n * Empty categories are skipped; nothing renders when none are left.\n */\nexport function CategoryTiles({\n\tmenu,\n\ttitle,\n\tmenuHref = \"/menu\",\n\titemClasses,\n\tsizes = \"(min-width: 768px) 25vw, 50vw\",\n}: CategoryTilesProps) {\n\tconst slots = mergeCategoryTilesItemClasses(itemClasses);\n\tconst card = tileClasses(slots);\n\n\tconst tiles = menu.categories.flatMap((category) => {\n\t\tconst items = menu.items.filter(\n\t\t\t(item) => item.category_id === category.category_id,\n\t\t);\n\t\tconst item = items.find((i) => menuImageUrl(i.images?.[0])) ?? items[0];\n\t\treturn item ? [{ category, item }] : [];\n\t});\n\tif (!tiles.length) return null;\n\n\treturn (\n\t\t<section className={slots.baseContainer}>\n\t\t\t{title && <h2 className={slots.title}>{title}</h2>}\n\t\t\t<div className={slots.tiles}>\n\t\t\t\t{tiles.map(({ category, item }) => (\n\t\t\t\t\t<ItemCard\n\t\t\t\t\t\tkey={category.category_id}\n\t\t\t\t\t\titem={item}\n\t\t\t\t\t\thref={`${menuHref}${categoryAnchor(category.name)}`}\n\t\t\t\t\t\tlabel={category.name}\n\t\t\t\t\t\titemClasses={card}\n\t\t\t\t\t\tsizes={sizes}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</section>\n\t);\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"./ItemForm/classes\";\n\n/** Per-slot Tailwind classes for a page section. */\nexport type SectionItemClasses = Partial<{\n\tcontainer: string;\n\teyebrow: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergeSectionItemClasses}.\n *\n * SP-01/02: one spacing scale and one container width for every section, so\n * left edges line up while scrolling instead of each section picking its own.\n * SP-03: the eyebrow gets full padding above (it's the top of a new section)\n * and a tight gap below (it labels what follows, not what came before).\n */\nexport const SECTION_DEFAULT_ITEM_CLASSES: Required<SectionItemClasses> = {\n\tcontainer: \"mx-auto max-w-6xl px-4 py-16 sm:px-6 sm:py-24 lg:px-8\",\n\teyebrow: \"mb-2 text-sm font-semibold uppercase tracking-wide text-primary\",\n};\n\nexport function mergeSectionItemClasses(overrides?: SectionItemClasses) {\n\tconst d = SECTION_DEFAULT_ITEM_CLASSES;\n\treturn {\n\t\tcontainer: cn(d.container, overrides?.container),\n\t\teyebrow: cn(d.eyebrow, overrides?.eyebrow),\n\t};\n}\n\nexport type SectionProps = {\n\titemClasses?: SectionItemClasses;\n\t/** e.g. \"BY DEFAULT, OUR TRUCK INCLUDES\" — rendered above `children`, inside the same padded container so it never floats free of what it labels. */\n\teyebrow?: ReactNode;\n\tchildren: ReactNode;\n\tid?: string;\n};\n\n/** One page section: consistent container width and vertical rhythm, with an optional eyebrow label. */\nexport function Section({ itemClasses, eyebrow, children, id }: SectionProps) {\n\tconst slots = mergeSectionItemClasses(itemClasses);\n\treturn (\n\t\t<section id={id} className={slots.container}>\n\t\t\t{eyebrow && <p className={slots.eyebrow}>{eyebrow}</p>}\n\t\t\t{children}\n\t\t</section>\n\t);\n}\n","import Image from \"next/image\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"./ItemForm/classes\";\n\nexport type PageHeroSize = \"sm\" | \"md\" | \"lg\";\n\n/** Per-slot Tailwind classes for a page hero. */\nexport type PageHeroItemClasses = Partial<{\n\tcontainer: string;\n\timageBox: string;\n\timage: string;\n\ttitleContainer: string;\n\ttitle: string;\n}>;\n\n/**\n * Structural / theme defaults. Merged with `itemClasses` via\n * {@link mergePageHeroItemClasses}.\n */\nexport const PAGE_HERO_DEFAULT_ITEM_CLASSES: Required<PageHeroItemClasses> = {\n\tcontainer: \"relative w-full overflow-hidden rounded-b-3xl bg-background-recessed\",\n\timageBox: \"absolute inset-0\",\n\timage: \"object-cover\",\n\ttitleContainer: \"relative flex h-full items-end p-6 sm:p-10\",\n\ttitle: \"text-background drop-shadow-lg\",\n};\n\nexport function mergePageHeroItemClasses(overrides?: PageHeroItemClasses) {\n\tconst d = PAGE_HERO_DEFAULT_ITEM_CLASSES;\n\treturn {\n\t\tcontainer: cn(d.container, overrides?.container),\n\t\timageBox: cn(d.imageBox, overrides?.imageBox),\n\t\timage: cn(d.image, overrides?.image),\n\t\ttitleContainer: cn(d.titleContainer, overrides?.titleContainer),\n\t\ttitle: cn(d.title, overrides?.title),\n\t};\n}\n\n/**\n * HD-01/02: a real height scale instead of the ~240px letterbox every hero on\n * the old site collapsed to (which read as a divider, not a hero). Tailwind's\n * default spacing scale only — no arbitrary pixel/vh values, which is the\n * exact smell this checklist exists to cure.\n */\nexport function heroHeightClass(size: PageHeroSize): string {\n\tswitch (size) {\n\t\tcase \"sm\":\n\t\t\treturn \"h-64 sm:h-72\";\n\t\tcase \"lg\":\n\t\t\treturn \"h-96 sm:h-128\";\n\t\tcase \"md\":\n\t\tdefault:\n\t\t\treturn \"h-80 sm:h-96\";\n\t}\n}\n\n/**\n * MB-03: a title over a small hero needs its own mobile step, not the desktop\n * size scaled down with `clamp()` — each size gets a dedicated mobile/desktop\n * pair from the type scale.\n */\nexport function heroTitleTypeClass(size: PageHeroSize): string {\n\tswitch (size) {\n\t\tcase \"sm\":\n\t\t\treturn \"text-3xl sm:text-4xl font-extrabold\";\n\t\tcase \"lg\":\n\t\t\treturn \"text-5xl sm:text-7xl font-extrabold\";\n\t\tcase \"md\":\n\t\tdefault:\n\t\t\treturn \"text-4xl sm:text-6xl font-extrabold\";\n\t}\n}\n\nexport type PageHeroProps = {\n\tsize?: PageHeroSize;\n\timage: { src: string; alt: string };\n\t/** HD-03: photography carries the top of the page by default. Pass a title only for the rare page that needs text over the hero. */\n\ttitle?: ReactNode;\n\tpriority?: boolean;\n\titemClasses?: PageHeroItemClasses;\n};\n\n/** A page-top hero: an art-directed photo with a defined bottom edge and, by default, no title competing with it. */\nexport function PageHero({ size = \"md\", image, title, priority, itemClasses }: PageHeroProps) {\n\tconst slots = mergePageHeroItemClasses(itemClasses);\n\treturn (\n\t\t<div className={cn(slots.container, heroHeightClass(size))}>\n\t\t\t<div className={slots.imageBox}>\n\t\t\t\t<Image\n\t\t\t\t\tsrc={image.src}\n\t\t\t\t\talt={image.alt}\n\t\t\t\t\tfill\n\t\t\t\t\tpriority={priority}\n\t\t\t\t\tsizes=\"100vw\"\n\t\t\t\t\tclassName={slots.image}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t{title && (\n\t\t\t\t<div className={slots.titleContainer}>\n\t\t\t\t\t<h1 className={cn(slots.title, heroTitleTypeClass(size))}>{title}</h1>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"],"mappings":"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","names":["import_react","t","n","o","o","s","r","t","n","i","o","s","import_react","import_react","import_react","t","f","c","s","r","t","o","t","s","a","r","import_react","t","r","n","r","n","a","t","a","n","x","r","s","t","l","i","o","y","f","u","d","p","c","T","k","v","S","M","n","r","w","a","E","j","import_react","u","t","n","i","l","c","o","u","import_react","import_react","c","u","r","a","b","t","s","l","m","n","F","S","A","i","x","r","t","n","a","b","s","o","l","c","u","f","E","d","C","p","D","j","M","import_react","n","l","i","u","d","c","o","t","r","t","s","r","t","o","l","n","import_react","f","r","import_react","t","c","ne","n","q","w","M","s","l","b","S","f","d","o","i","a","y","C","p","h","r","v","ie","k","O","U","H","u","K","m","j","A","F","Y","I","$","ge","T","x","N","import_menuUtils","d","import_jsx_runtime","d","i","Link","Image","import_menuSlugs","import_jsx_runtime","d","import_image","import_link","import_menuSlugs","import_menuUtils","import_react","import_jsx_runtime","import_jsx_runtime","d","ItemCard","Link","Image","import_react","import_hooks","import_link","import_lucide_react","import_jsx_runtime","d","Link","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","c","import_portionUtils","import_jsx_runtime","i","import_jsx_runtime","import_lucide_react","import_jsx_runtime","q","import_portionUtils","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","v","import_jsx_runtime","c","s","import_react","format","defaultOptions","defaultOptions","defaultOptions","localize","formatLong","format","defaultOptions","getDefaultOptions","defaultOptions","getDefaultOptions","i","i","o2","o3","MILLISECONDS_IN_MINUTE","formatters","formatTimezoneWithOptionalMinutes","formatTimezone","formatTimezoneShort","addLeadingZeros","getTimezoneOffsetInMilliseconds","MILLISECONDS_IN_HOUR","MILLISECONDS_IN_MINUTE","patterns","toDate","getTimezoneOffsetInMilliseconds","format","d","toDate","formatters","toDate","d","format","import_jsx_runtime","d","window","import_link","import_lucide_react","import_seo","import_jsx_runtime","d","Link","import_react","import_lucide_react","import_jsx_runtime","q","a","b","d","d","import_react","import_link","import_react_stripe_js","import_hooks","import_jsx_runtime","import_react","import_Form","import_hooks","import_jsx_runtime","i","n","import_jsx_runtime","import_Form","import_hooks","import_jsx_runtime","import_lucide_react","import_hooks","import_jsx_runtime","s","c","import_hooks","import_jsx_runtime","import_react","import_hooks","import_jsx_runtime","import_jsx_runtime","import_react","import_Form","import_hooks","import_jsx_runtime","import_jsx_runtime","message","import_jsx_runtime","Link","import_navigation","import_link","import_jsx_runtime","d","Link","import_link","import_navigation","import_jsx_runtime","d","Link","import_jsx_runtime","import_jsx_runtime","d","import_image","import_jsx_runtime","d","Image","import_lucide_react","import_jsx_runtime","d","import_menuSlugs","import_menuUtils","import_jsx_runtime","d","item","i","import_jsx_runtime","d","import_image","import_jsx_runtime","d","Image"]}
|