PageSourceSearch

https://ryansrezipes.com/assets/Quote-Bz60N-ux.js

js ryansrezipes.com collected 2026-10-08 20:27:18 UTC 21,132 bytes, 1 lines download raw bytes

1import{j as e}from"./index-CWVhlzLh.js";import{j as te,b as h,L as ae}from"./vendor-D4vAZRrx.js";import{f as ne}from"./phone-CbjCDnDL.js";import{B as l,s as B}from"./card-F3jmohpy.js";import{W as re}from"./WebsiteLayout-CDRbQWTn.js";import{C as v,c$ as M,c_ as N,cY as le,$ as C,A,au as ce}from"./App-dsBIqK-t.js";import{a as I,h as oe,c as L,f as Y,i as G,F as de,m as ue,b as z}from"./cateringChoices-YuH_c0n9.js";import{P as x}from"./plus-DGd61is6.js";import{M as F}from"./message-square-text-DKGbLiy2.js";import{M as O}from"./mail-CHC0N7Ut.js";const W=ue.filter(d=>d.id==="tacos"||d.id==="frybreads").flatMap(d=>d.items),pe=["Corporate / company event","Wedding","Private celebration","Community or tribal event","Reception","Other"],j=[{id:"food-truck",label:"Food truck on site"},{id:"taco-bar",label:"Taco & frybread bar"},{id:"appetizers",label:"Heavy appetizers / reception"},{id:"buffet",label:"Full-service buffet"},{id:"breakfast",label:"Breakfast catering"},{id:"drop-off",label:"Drop-off catering"},{id:"not-sure",label:"Not sure yet"}],he=["Platinum package","Gold package","Silver package","Bronze package","BBQ package","Smoked meats","Seafood","Tacos & frybread","Appetizers & charcuterie","Sides & fruit","Breakfast","Dessert"],me=["Small event / not sure yet — Ryan will suggest options","Under $3,500","$3,500–$6,000","$6,000–$10,000","$10,000–$20,000","$20,000+"],ve={event_type:"",event_date:"",event_time:"",guest_count:"",location:"",setting:"unsure",audience:"",service_styles:[],menu_interests:[],dietary:"",budget:"Small event / not sure yet — Ryan will suggest options",name:"",email:"",phone:"",preferred_contact:"email",notes:"",selected_service:"",service_pricing:"",selected_package:"",package_inclusions:[],selected_menu_items:[],optional_extras:[]},ge=["Step 1 of 3 · Your event","Step 2 of 3 · The food","Step 3 of 3 · How to reach you"],qe=()=>{const[d]=te(),[o,_]=h.useState(0),[i,u]=h.useState(ve),[f,S]=h.useState(!1),[D,U]=h.useState(!1),[y,E]=h.useState(null),g=d.get("type");h.useEffect(()=>{const s=g&&j.some(r=>r.id===g)?g:"",t=I.find(r=>r.id===d.get("package")),a=oe(d.get("menu"),G),n=(d.get("service")??"").slice(0,120),p=(d.get("pricing")??"").slice(0,240);u(r=>({...r,service_styles:r.service_styles.length||!s?r.service_styles:[s],selected_service:r.selected_service||n,service_pricing:r.service_pricing||p,selected_package:r.selected_package||t?.name||"",package_inclusions:r.package_inclusions.length?r.package_inclusions:[...t?.includes??[]],selected_menu_items:r.selected_menu_items.length||t?r.selected_menu_items:a,optional_extras:r.optional_extras.length||!t?r.optional_extras:a}))},[d,g]);const c=(s,t)=>u(a=>({...a,[s]:t})),H=(s,t)=>u(a=>({...a,[s]:a[s].includes(t)?a[s].filter(n=>n!==t):[...a[s],t]})),V=s=>{u(t=>{const a=t.service_styles.includes(s),n=a?t.service_styles.filter(r=>r!==s):[...t.service_styles,s],p=Y.some(([r,b])=>t.service_pricing===z(r,b));return{...t,service_styles:n,selected_service:n.map(r=>j.find(b=>b.id===r)?.label??r).join(", "),service_pricing:a&&s==="food-truck"&&p?"":t.service_pricing}})},k=s=>{const t=i.selected_package?"optional_extras":"selected_menu_items";u(a=>({...a,[t]:a[t].includes(s)?a[t].filter(n=>n!==s):[...a[t],s]}))},m=I.find(s=>s.name===i.selected_package),Q=m?.choiceGroups.flatMap(s=>s.items)??[],Z=(s,t,a)=>{u(n=>{if(n.selected_menu_items.includes(s))return{...n,selected_menu_items:n.selected_menu_items.filter(r=>r!==s)};const p=n.selected_menu_items.filter(r=>t.includes(r)).length;return a!==void 0&&p>=a?n:{...n,selected_menu_items:[...n.selected_menu_items,s],optional_extras:n.optional_extras.filter(r=>r!==s)}})},K=s=>u(t=>({...t,selected_menu_items:t.selected_menu_items.filter(a=>a!==s)})),X=s=>u(t=>({...t,optional_extras:t.optional_extras.filter(a=>a!==s)})),J=()=>u(s=>({...s,selected_package:"",package_inclusions:[]})),ee=i.service_styles.map(s=>j.find(t=>t.id===s)?.label??s),q=m?e.jsxs("fieldset",{className:"preview-package-choice-fieldset",children:[e.jsxs("legend",{children:["Choose what’s included in your ",m.name]}),e.jsx("p",{className:"preview-field-help",children:"Choose your included food below. Ryan will confirm the final menu with you."}),e.jsx("div",{className:"preview-package-choice-groups",children:m.choiceGroups.map(s=>{const t=i.selected_menu_items.filter(a=>s.items.includes(a)).length;return e.jsxs("div",{className:"preview-package-choice-group",children:[e.jsxs("div",{className:"preview-package-choice-heading",children:[e.jsx("h3",{children:s.label}),e.jsx("span",{children:s.limit?`${t} of ${s.limit}
1 selected`:`${t} selected`})]}),e.jsx("div",{className:"preview-chip-grid",children:s.items.map(a=>{const n=i.selected_menu_items.includes(a),p=!n&&s.limit!==void 0&&t>=s.limit;return e.jsxs(l,{type:"button",variant:"outline","aria-pressed":n,disabled:p,className:`preview-chip ${n?"is-on":""}`,onClick:()=>Z(a,s.items,s.limit),children:[n?e.jsx(v,{}):e.jsx(x,{}),a]},a)})})]},s.id)})})]}):null,$=i.service_styles.includes("taco-bar")&&!m?e.jsxs("fieldset",{className:"preview-package-choice-fieldset",children:[e.jsx("legend",{children:"Build your taco & frybread bar"}),e.jsx("p",{className:"preview-field-help",children:"Pick what you want on the line. Ryan will confirm the final setup and pricing with you."}),e.jsx("div",{className:"preview-package-choice-groups",children:e.jsxs("div",{className:"preview-package-choice-group",children:[e.jsxs("div",{className:"preview-package-choice-heading",children:[e.jsx("h3",{children:"Taco & frybread choices"}),e.jsxs("span",{children:[i.selected_menu_items.filter(s=>W.includes(s)).length," selected"]})]}),e.jsx("div",{className:"preview-chip-grid",children:W.map(s=>{const t=i.selected_menu_items.includes(s);return e.jsxs(l,{type:"button",variant:"outline","aria-pressed":t,className:`preview-chip ${t?"is-on":""}`,onClick:()=>k(s),children:[t?e.jsx(v,{}):e.jsx(x,{}),s]},s)})})]})})]}):null,P=i.service_styles.includes("breakfast")&&!m?e.jsxs("fieldset",{className:"preview-package-choice-fieldset",children:[e.jsx("legend",{children:"Build your breakfast catering"}),e.jsx("p",{className:"preview-field-help",children:"Pick the breakfast items you want. Ryan will confirm the final menu and pricing with you."}),e.jsx("div",{className:"preview-package-choice-groups",children:e.jsxs("div",{className:"preview-package-choice-group",children:[e.jsxs("div",{className:"preview-package-choice-heading",children:[e.jsx("h3",{children:"Breakfast choices"}),e.jsxs("span",{children:[i.selected_menu_items.filter(s=>L.includes(s)).length," selected"]})]}),e.jsx("div",{className:"preview-chip-grid",children:L.map(s=>{const t=i.selected_menu_items.includes(s);return e.jsxs(l,{type:"button",variant:"outline","aria-pressed":t,className:`preview-chip ${t?"is-on":""}`,onClick:()=>k(s),children:[t?e.jsx(v,{}):e.jsx(x,{}),s]},s)})})]})})]}):null,R=h.useMemo(()=>{const s=[];return o===0?(i.event_type||s.push("event type"),i.event_date||s.push("event date"),i.guest_count||s.push("guest count"),i.location.trim()||s.push("location")):o===1?i.service_styles.length===0?s.push("how you want it served"):i.service_styles.includes("food-truck")&&!i.service_pricing&&s.push("a food truck guest-count tier"):(i.name.trim()||s.push("your name"),/\S+@\S+\.\S+/.test(i.email)||s.push("a valid email")),s},[o,i]),w=R.length===0,[se]=h.useState(()=>crypto.randomUUID()),T=(s,t)=>{const a=s==="FunctionsFetchError"?"network":t===408||t===504?"timeout":t===400||t===422?"validation":s==="FunctionsHttpError"||s==="FunctionsRelayError"||s==="backend_rejected"?"backend":"unknown",n=window.innerWidth,p=n<640?"phone":n<1024?"tablet":"desktop";B.rpc("log_quote_failure",{_step:"submit",_error_category:a,_backend_status:t!==null&&t>=100&&t<=599?t:null,_page:"/quote",_viewport:`${Math.min(n,99999)}x${Math.min(window.innerHeight,99999)}`,_form_version:"quote-v2",_device:p}).then(()=>{},()=>{})},ie=async()=>{if(!f){S(!0),E(null);try{const{data:s,error:t}=await B.functions.invoke("website-catering-quote",{body:{...i,submission_key:se}});if(t){const a=t.context?.status??null;throw T(t.name||"function_error",a),t}if(s&&s.error)throw T("backend_rejected",200),new Error(s.error);U(!0),window.dispatchEvent(new CustomEvent("catering_quote_submitted"))}catch(s){console.error("Quote submit failed",s),E("Your request didn't go through.")}finally{S(!1)}}};return e.jsxs(re,{title:"Get a Catering Quote | Ryan's REZ-ipes",description:"Tell us your date, guest count, location and what sounds good. Ryan's REZ-ipes will put together a catering quote for your event.",path:"/quote",children:[e.jsxs("section",{className:"preview-page-head",children:[e.jsx("p",{className:"preview-kicker",children:"Get a catering quote"}),e.jsx("h1",{children:"Tell us about your event."}),e.jsx("p",{children:"Three quick steps. No account needed—Ryan gets it straight away."})]}),e.jsx("section",{className:"preview-section preview-quote",children:D?e.jsxs("div",{className:"preview-quote-card preview-quote-done",children:[e.jsx(v,{}),e.jsx("h2",{children:"Got it—thank you."}
1),e.jsx("p",{children:"Your request is with Ryan. We'll get back to you with what's possible for your date and what it costs. If your event is soon, text us and we'll move faster."}),e.jsxs("div",{className:"preview-contact-actions",children:[e.jsx(l,{asChild:!0,variant:"outline",className:"preview-button-secondary",children:e.jsxs("a",{href:`sms:${M}`,children:[e.jsx(F,{})," Text us"]})}),e.jsx(l,{asChild:!0,variant:"outline",className:"preview-button-secondary",children:e.jsxs("a",{href:`mailto:${N}`,children:[e.jsx(O,{})," Email us"]})}),e.jsx(l,{asChild:!0,className:"preview-button-primary",children:e.jsx(ae,{to:le("/"),children:"Back to the homepage"})})]})]}):e.jsxs("div",{className:"preview-quote-card",children:[e.jsx("p",{className:"preview-kicker",children:ge[o]}),e.jsx("div",{className:"preview-quote-progress","aria-hidden":"true",children:[0,1,2].map(s=>e.jsx("span",{className:s<=o?"is-done":""},s))}),o<2&&(i.selected_service||i.selected_package||i.selected_menu_items.length>0||i.optional_extras.length>0)&&e.jsxs("div",{className:"preview-prefill-summary",children:[e.jsx("p",{className:"preview-kicker",children:"Your selection"}),i.selected_service&&e.jsxs("p",{children:[e.jsx("strong",{children:"Service:"})," ",i.selected_service]}),i.service_pricing&&e.jsxs("p",{children:[e.jsx("strong",{children:i.service_styles.includes("food-truck")?"Selected food truck rate:":"Pricing basis:"})," ",i.service_pricing]}),i.selected_package&&e.jsxs("div",{className:"preview-summary-group",children:[e.jsxs("p",{children:[e.jsx("strong",{children:"Package:"})," ",i.selected_package]}),e.jsx("p",{children:i.package_inclusions.join(" · ")}),e.jsxs(l,{type:"button",variant:"outline",size:"sm",className:"preview-summary-remove",onClick:J,children:[e.jsx(C,{})," Remove package"]})]}),!i.selected_package&&i.selected_menu_items.length>0&&e.jsxs("div",{className:"preview-summary-group",children:[e.jsx("p",{children:e.jsx("strong",{children:"Build Your Own Menu:"})}),e.jsx("p",{children:i.selected_menu_items.join(" · ")})]}),i.optional_extras.length>0&&e.jsxs("div",{className:"preview-summary-group",children:[e.jsx("p",{children:e.jsx("strong",{children:"Optional extras:"})}),e.jsx("p",{children:i.optional_extras.join(" · ")})]})]}),o===0&&e.jsxs("div",{className:"preview-quote-fields",children:[e.jsxs("label",{children:["What kind of event is it?",e.jsxs("select",{value:i.event_type,onChange:s=>c("event_type",s.target.value),children:[e.jsx("option",{value:"",children:"Choose one"}),pe.map(s=>e.jsx("option",{children:s},s))]})]}),e.jsxs("label",{children:["Event date",e.jsx("input",{type:"date",name:"event_date",autoComplete:"off",value:i.event_date,onChange:s=>c("event_date",s.target.value)})]}),e.jsxs("label",{children:["What time should the food be served?",e.jsx("input",{type:"time",name:"event_time",autoComplete:"off",value:i.event_time,onChange:s=>c("event_time",s.target.value)})]}),e.jsxs("label",{children:["About how many guests?",e.jsx("input",{type:"number",name:"guest_count",min:1,inputMode:"numeric",placeholder:"e.g. 120",value:i.guest_count,onChange:s=>c("guest_count",s.target.value)})]}),e.jsxs("label",{children:["Where is it?",e.jsx("input",{type:"text",name:"location",autoComplete:"address-level2",placeholder:"City, venue or address",value:i.location,onChange:s=>c("location",s.target.value)})]}),e.jsxs("label",{children:["Indoor or outdoor?",e.jsxs("select",{value:i.setting,onChange:s=>c("setting",s.target.value),children:[e.jsx("option",{value:"indoor",children:"Indoor"}),e.jsx("option",{value:"outdoor",children:"Outdoor"}),e.jsx("option",{value:"unsure",children:"Not sure yet"})]})]}),e.jsxs("label",{children:["Corporate or private?",e.jsxs("select",{value:i.audience,onChange:s=>c("audience",s.target.value),children:[e.jsx("option",{value:"",children:"Choose one"}),e.jsx("option",{value:"corporate",children:"Corporate / organization"}),e.jsx("option",{value:"private",children:"Private event"}),e.jsx("option",{value:"community",children:"Community or tribal event"})]})]}),q,$,P]}),o===1&&e.jsxs("div",{className:"preview-quote-fields",children:[e.jsxs("fieldset",{children:[e.jsx("legend",{children:"How do you want it served?"}),e.jsx("div",{className:"preview-chip-grid",children:j.map(s=>e.jsx(l,{type:"button",variant:"outline",className:`preview-chip ${i.service_styles.includes(s.id
1)?"is-on":""}`,onClick:()=>V(s.id),children:s.label},s.id))})]}),i.service_styles.includes("food-truck")&&e.jsxs("fieldset",{children:[e.jsx("legend",{children:"Which food truck guest-count tier fits your event?"}),e.jsx("p",{className:"preview-field-help",children:"The per-person rate includes the truck, on-site kitchen and crew, plus three hours of service. Additional time is $150 per hour."}),e.jsxs("div",{className:"preview-chip-grid",children:[Y.map(([s,t])=>{const a=z(s,t),n=i.service_pricing===a;return e.jsxs(l,{type:"button",variant:"outline","aria-pressed":n,className:`preview-chip ${n?"is-on":""}`,onClick:()=>c("service_pricing",n?"":a),children:[s," · ",t]},s)}),e.jsx(l,{type:"button",variant:"outline","aria-pressed":i.service_pricing==="Not sure yet — help me pick the right tier",className:`preview-chip ${i.service_pricing==="Not sure yet — help me pick the right tier"?"is-on":""}`,onClick:()=>c("service_pricing","Not sure yet — help me pick the right tier"),children:"Not sure yet — help me pick"})]})]}),e.jsxs("fieldset",{children:[e.jsx("legend",{children:"Anything your people already love?"}),e.jsx("div",{className:"preview-chip-grid",children:he.map(s=>e.jsx(l,{type:"button",variant:"outline",className:`preview-chip ${i.menu_interests.includes(s)?"is-on":""}`,onClick:()=>H("menu_interests",s),children:s},s))})]}),q,$,P,e.jsxs("fieldset",{children:[e.jsx("legend",{children:i.selected_package?"Optional extras":"Specific menu choices"}),e.jsx("p",{className:"preview-field-help",children:i.selected_package?"Add anything beyond your package choices. Extras stay separate in your request.":"Add or remove the exact items you want Ryan to consider."}),e.jsx("div",{className:"preview-chip-grid",children:G.filter(s=>!i.selected_package||!Q.includes(s)).map(s=>{const t=i.selected_package?i.optional_extras.includes(s):i.selected_menu_items.includes(s);return e.jsxs(l,{type:"button",variant:"outline","aria-pressed":t,className:`preview-chip ${t?"is-on":""}`,onClick:()=>k(s),children:[t?e.jsx(v,{}):e.jsx(x,{}),s]},s)})})]}),e.jsxs("label",{children:["Allergies or dietary needs",e.jsx("textarea",{rows:3,placeholder:"Vegetarian plates, gluten-free, allergies…",value:i.dietary,onChange:s=>c("dietary",s.target.value)})]}),e.jsxs("label",{children:["Budget range",e.jsx("select",{value:i.budget,onChange:s=>c("budget",s.target.value),children:me.map(s=>e.jsx("option",{children:s},s))})]}),e.jsxs("p",{className:"preview-quote-note",children:[e.jsx("strong",{children:"Every event size has options."})," Packages start at $30 per person, food truck service starts at $31 per person, and drop-off or breakfast service works well for smaller groups. Breakfast catering has a $1,500 event minimum; lunch and dinner catering has a $3,500 event minimum. An event minimum is the minimum catering subtotal, not an extra charge. A 20% service fee and applicable tax are added. Planning something smaller or on a tighter budget? Pick “Small event / not sure yet” above — Ryan will suggest options that fit."]})]}),o===2&&e.jsxs("div",{className:"preview-quote-fields",children:[e.jsxs("div",{className:"preview-review-summary","aria-labelledby":"request-summary-title",children:[e.jsx("p",{className:"preview-kicker",children:"Review your request"}),e.jsx("h2",{id:"request-summary-title",children:"Everything you’ve chosen."}),e.jsxs("dl",{children:[e.jsxs("div",{children:[e.jsx("dt",{children:"Service type"}),e.jsx("dd",{children:i.selected_service||ee.join(", ")||"Not selected"})]}),i.service_pricing&&e.jsxs("div",{children:[e.jsx("dt",{children:i.service_styles.includes("food-truck")?"Selected food truck rate":"Pricing basis"}),e.jsx("dd",{children:i.service_pricing})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"Package"}),e.jsx("dd",{children:i.selected_package||"No package selected"})]}),i.package_inclusions.length>0&&e.jsxs("div",{children:[e.jsx("dt",{children:"Package includes"}),e.jsx("dd",{children:i.package_inclusions.join(" · ")})]}),e.jsxs("div",{children:[e.jsx("dt",{children:i.selected_package?"Included food choices":"Menu items"}),e.jsx("dd",{children:i.selected_menu_items.length?e.jsx("span",{className:"preview-review-items",children:i.selected_menu_items.map(s=>e.jsxs(l,{type:"button",variant:"outline",size:"sm",onClick:()=>K(s),"aria-label":`Remove ${s}`,children:[s,e.jsx(C,{})]},s))}):"None selected"})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"Optional extras"}),e.jsx("dd",{children:i.optional_extras.length?e.jsx("span",{className:"preview-review-items",children:i.optional_extras.map(s=>e.jsxs(l,{type:"button",variant:"outline",size:"sm",onClick:()=>X(s),"aria-label":`Remove ${s}`,children:[s,e.jsx(C,{})]},s))}):"None selected"})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"Guests"}),e.jsx("dd",{children:i.guest_count})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"Date"}),e.jsx("dd",{children:i.event_date})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"Location"}),e.jsx("dd",{children:i.location})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"Dietary needs"}),e.jsx("dd",{children:i.dietary||"None shared"})]})]}),e.jsx("p",{className:"preview-quote-note",children:de}),e.jsxs(l,{type:"button",variant:"outline",className:"preview-button-secondary",onClick:()=>_(1),children:[e.jsx(A,{})," Edit food & service"]})]}),e.jsxs("label",{children:["Your name",e.jsx("input",{type:"text",name:"name",autoComplete:"name",value:i.name,onChange:s=>c("name",s.target.value)})]}),e.jsxs("label",{children:["Email",e.jsx("input",{type:"email",name:"email",autoComplete:"email",value:i.email,onChange:s=>c("email",s.target.value)})]}),e.jsxs("label",{children:["Mobile number (for texting, optional)",e.
1jsx("input",{type:"tel",name:"phone",autoComplete:"tel",value:i.phone,onChange:s=>c("phone",ne(s.target.value))})]}),e.jsxs("label",{children:["Best way to reach you",e.jsxs("select",{value:i.preferred_contact,onChange:s=>c("preferred_contact",s.target.value),children:[e.jsx("option",{value:"email",children:"Email"}),e.jsx("option",{value:"text",children:"Text message"})]})]}),e.jsxs("label",{children:["Anything else we should know?",e.jsx("textarea",{rows:4,value:i.notes,onChange:s=>c("notes",s.target.value)})]}),e.jsx("p",{className:"preview-quote-note",children:"Sending this is an inquiry, not a booking. Please request at least 30 days ahead; availability is not guaranteed. A signed contract and non-refundable 50% deposit secure your date."})]}),y&&e.jsxs("div",{className:"preview-quote-error",role:"alert",children:[e.jsxs("p",{children:[e.jsx("strong",{children:y})," Your details are still here — tap “Send my request” to try again, or reach Ryan directly:"]}),e.jsxs("div",{className:"preview-contact-actions",children:[e.jsx(l,{asChild:!0,variant:"outline",className:"preview-button-secondary",children:e.jsxs("a",{href:`sms:${M}`,children:[e.jsx(F,{})," Text 425-299-8397"]})}),e.jsx(l,{asChild:!0,variant:"outline",className:"preview-button-secondary",children:e.jsxs("a",{href:`mailto:${N}?subject=${encodeURIComponent("Catering request")}`,children:[e.jsx(O,{})," Email ",N]})})]})]}),!w&&!y&&e.jsxs("p",{className:"preview-quote-note","aria-live":"polite",children:["To continue, add: ",R.join(", "),"."]}),e.jsxs("div",{className:"preview-quote-actions",children:[o>0&&e.jsxs(l,{variant:"outline",className:"preview-button-secondary",onClick:()=>_(o-1),children:[e.jsx(A,{})," Back"]}),o<2?e.jsxs(l,{className:"preview-button-primary",disabled:!w,onClick:()=>_(o+1),children:["Continue ",e.jsx(ce,{})]}):e.jsx(l,{className:"preview-button-primary",disabled:!w||f,onClick:ie,children:f?"Sending…":"Send my request"})]})]})})]})};export{qe as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.