{"version":3,"file":"StepByStepForm.BUI6oYFa.mjs","names":["useState","useRef","useMemo","useCallback"],"sources":["https:/framerusercontent.com/modules/BwRmNMb85DeyNNj6BTEJ/QJM7BGiYNHqJcaxzCJtb/StepByStepForm.js"],"sourcesContent":["// Step-by-step form for collecting Name, Phone, Email, Date, Start Time, Adults, Children, Address, Allergies, Special Occasion, Social Media Sharing, Instagram Handle\n// Features: Webhook submission with retry logic, abandoned form tracking, CRM integration\nimport{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{useState,useCallback,startTransition,useMemo,useEffect,useRef}from\"react\";import{addPropertyControls,ControlType}from\"framer\";// ===== BEGIN HIBACHI LEGAL SOURCE (generated, do not edit by hand) =====\n// Identical copy in Workshop/LegalPage.tsx and Workshop/StepByStepForm.tsx.\n// Framer code files cannot import each other, so both carry this block and are\n// regenerated together from Tyler's HTML by scripts/hibachi-legal-build.py.\n// DO NOT EDIT THE HTML STRINGS BY HAND. Not a word, not a typo.\nconst LEGAL_CSS='.hg-legal{--ink:#1a1a1a;--muted:#6b6b6b;--accent:#c00000;--rule:#e3e3e3;--bg:#ffffff;--keybg:#fbf7f7;--measure:44rem;\\n  background:var(--bg);color:var(--ink);font:400 17px/1.65 -apple-system,BlinkMacSystemFont,\"Segoe UI\",Helvetica,Arial,sans-serif;\\n  -webkit-text-size-adjust:100%;text-align:left;width:100%}\\n.hg-legal *{box-sizing:border-box}\\n.hg-legal .wrap{max-width:var(--measure);margin:0 auto;padding:56px 16px 96px}\\n.hg-legal header{border-bottom:2px solid var(--accent);padding-bottom:18px;margin-bottom:34px}\\n.hg-legal .brand{font-size:.78rem;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);font-weight:700;margin:0 0 10px}\\n.hg-legal h1{font-size:1.85rem;line-height:1.2;margin:0 0 12px;font-weight:700;letter-spacing:-.01em;color:var(--ink)}\\n.hg-legal .meta{margin:0;font-size:.86rem;color:var(--muted)}\\n.hg-legal nav{margin:0 0 42px;padding:20px 24px;background:#fafafa;border:1px solid var(--rule);border-radius:8px}\\n.hg-legal nav h2{font-size:.76rem;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin:0 0 12px;font-weight:700}\\n.hg-legal nav ol{margin:0;padding-left:1.4em;columns:2;column-gap:32px;font-size:.92rem}\\n.hg-legal nav li{margin:0 0 6px;break-inside:avoid}\\n.hg-legal nav a{color:var(--ink);text-decoration:none;border-bottom:1px solid transparent}\\n.hg-legal nav a:hover{border-bottom-color:var(--accent);color:var(--accent)}\\n.hg-legal h2{font-size:1.06rem;margin:2.3em 0 .55em;font-weight:700;line-height:1.35;scroll-margin-top:100px;color:var(--ink)}\\n.hg-legal h2 .num{color:var(--accent);margin-right:.35em}\\n.hg-legal h3{font-size:.95rem;margin:1.6em 0 .45em;font-weight:700;line-height:1.4;color:var(--ink)}\\n.hg-legal p{margin:0 0 1.05em}\\n.hg-legal p.intro{font-size:1.06rem;margin-bottom:.4em}\\n.hg-legal ul{margin:0 0 1.15em;padding-left:1.35em}\\n.hg-legal ul li{margin:0 0 .45em}\\n.hg-legal .key{font-weight:700}\\n.hg-legal ul.key li{font-weight:700}\\n.hg-legal p.caps{font-size:max(16px,.94rem);letter-spacing:.005em;font-weight:600;background:var(--keybg);border-left:3px solid var(--accent);padding:16px 18px;margin:0 0 .8em;border-radius:0 4px 4px 0}\\n.hg-legal p.note{font-size:max(16px,.88rem);color:var(--muted);font-style:italic}\\n.hg-legal a{color:var(--accent)}\\n.hg-legal .contact{font-style:normal;line-height:1.85;margin:0}\\n.hg-legal footer{margin-top:64px;padding-top:20px;border-top:1px solid var(--rule);font-size:.84rem;color:var(--muted)}\\n.hg-legal footer a{color:var(--muted)}\\n@media (max-width:640px){.hg-legal .wrap{padding:36px 16px 72px}.hg-legal h1{font-size:1.5rem}.hg-legal nav ol{columns:1}.hg-legal{font-size:16px}}\\n@media print{.hg-legal{font-size:10.5pt;color:#000}.hg-legal .wrap{max-width:none;padding:0}.hg-legal nav{display:none}.hg-legal a{color:#000;text-decoration:none}.hg-legal h2{page-break-after:avoid}.hg-legal p.caps{background:none;border-left:2px solid #000}}';const TERMS={\"version\":\"1.0\",\"effective\":\"2026-09-28\",\"url\":\"https://www.hibachiguru.com/terms\",\"sha256\":\"8e1f7b76439863a023b6dfd8316b21a78b1345c7889b952d06ce21d8e77c06f0\",\"sha256_supplied\":\"d455a91e293e6e29c5ef5604fea17a4dd7e37af7bc277fc01ca1f2a92272cfe5\",\"html\":'<header>\\n  <p class=\"brand\">Hibachi Guru</p>\\n  <h1>Customer Terms and Conditions</h1>\\n  <p class=\"meta\">Version 1.0 &middot; Effective 28 September 2026</p>\\n</header>\\n\\n<nav aria-label=\"Contents\">\\n  <h2>Contents</h2>\\n  <ol>\\n    <li><a href=\"#s1\">Role of Limitless Franchise Solutions LLC DBA Hibachi Guru</a></li>\\n    <li><a href=\"#s2\">Independent Third-Party Vendors</a></li>\\n    <li><a href=\"#s3\">Payments, Deposits, and Taxes</a></li>\\n    <li><a href=\"#s4\">Assumption of Risk</a></li>\\n    <li><a href=\"#s5\">Limitation of Liability</a></li>\\n    <li><a href=\"#s6\">No Claims Against Hibachi Guru; Data Accuracy</a></li>\\n    <li><a href=\"#s7\">My Guests and My Venue</a></li>\\n    <li><a href=\"#s8\">Data Privacy</a></li>\\n    <li><a href=\"#s9\">Text Messages</a></li>\\n    <li><a href=\"#s10\">Severability and Waiver</a></li>\\n    <li><a href=\"#s11\">Governing Law and Dispute Resolution</a></li>\\n    <li><a href=\"#s12\">Changes to These Terms</a></li>\\n    <li><a href=\"#s13\">Acceptance</a></li>\\n    <li><a href=\"#s14\">Contact</a></li>\\n  </ol>\\n</nav>\\n\\n<main>\\n<p class=\"intro\">These Terms and Conditions govern quote requests and bookings made through the Hibachi Guru platform at <a href=\"/\">hibachiguru.com</a>. By submitting a quote request or booking through this platform (“Hibachi Guru”), I acknowledge and agree that:</p>\\n<h2 id=\"s1\"><span class=\"num\">1.</span> Role of Limitless Franchise Solutions LLC DBA Hibachi Guru</h2>\\n<p>Limitless Franchise Solutions LLC, doing business as Hibachi Guru, is not a hibachi, restaurant, and/or catering service provider. Hibachi Guru is not the seller for any services booked through this platform. Hibachi Guru’s role is limited to marketing, connecting customers such as myself with independent third-party hibachi service providers, and placing and coordinating bookings with those providers. Hibachi Guru will coordinate events with myself and intake times, venue locations, addresses, group sizes and dates of such events from me. Hibachi Guru is compensated by the hibachi service providers and not by me.</p>\\n<h2 id=\"s2\"><span class=\"num\">2.</span> Independent Third-Party Vendors</h2>\\n<p>All hibachi services are provided by independent third-party vendors who contract directly with the customer (me). Hibachi Guru does not control, supervise, or guarantee the quality, safety, timing, pricing, and/or performance of any services provided. These third-party vendors may require the execution of liability waivers for hibachi services at my venue or home, which I am expected to complete.</p>\\n<p class=\"caps\">THE HIBACHI GURU PLATFORM AND ANY BOOKING COORDINATION SERVICES ARE PROVIDED “AS IS” AND “AS AVAILABLE,” WITHOUT WARRANTIES OF ANY KIND, WHETHER EXPRESS, IMPLIED, OR STATUTORY. TO THE FULLEST EXTENT PERMITTED BY LAW, HIBACHI GURU DISCLAIMS ALL IMPLIED WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND NON-INFRINGEMENT.</p>\\n<p class=\"note\">Some states do not allow the exclusion of certain implied warranties, so parts of the paragraph above may not apply to me.</p>\\n<h2 id=\"s3\"><span class=\"num\">3.</span> Payments, Deposits, and Taxes</h2>\\n<p>All service pricing, deposits, balances, refunds, gratuities, and any applicable sales, use, or local taxes are determined, collected, and handled solely by the customer-selected hibachi service provider. Hibachi Guru does not collect service payments on behalf of the hibachi service providers.</p>\\n<h2 id=\"s4\"><span class=\"num\">4.</span> Assumption of Risk</h2>\\n<p class=\"key\">I understand hibachi cooking and live-fire food preparation involve inherent risks, including open flames, hot surfaces, food poisoning, potential consumption of undercooked food, sharp utensils, and/or potential property damage. I voluntarily assume all risks associated with hosting and/or attending any event booked or identified through the Hibachi Guru platform.</p>\\n<h2 id=\"s5\"><span class=\"num\">5.</span> Limitation of Liability</h2>\\n<p class=\"key\">To the fullest extent permitted by law, I agree Hibachi Guru shall not be liable for any:</p>\\n<ul class=\"key\">\\n  <li>Personal injury including allergic reactions, cross-contamination, property damage, fire, or loss of any kind;</li>\\n  <li>Failure to perform, delayed performance, or unsatisfactory service;</li>\\n  <li>Acts or omissions of the hibachi service provider or its employees, contractors, or agents; and/or</li>\\n  <li>Claims, disputes, chargebacks, or damages arising from or related to the event.</li>\\n</ul>\\n<p class=\"key\">If any exclusion in this section is held unenforceable, Hibachi Guru’s total liability for all claims arising out of or relating to these Terms, the platform, or any event booked through it shall not exceed one hundred dollars ($100).</p>\\n<p>As the potential host of a hibachi event, I understand I am responsible for coordinating any additional insurance and/or legal compliance with hosting such an event, at my venue, residence or other hosting place. I am also responsible for reporting any allergies or culinary restrictions of myself and/or my guests directly to the hibachi provider.</p>\\n<h2 id=\"s6\"><span class=\"num\">6.</span> No Claims Against Hibachi Guru; Data Accuracy</h2>\\n<p class=\"key\">I agree any claims, disputes, or legal actions arising from the hibachi services must be brought solely against the hibachi service provider and not against Limitless Franchise Solutions LLC DBA Hibachi Guru.</p>\\n<p>Nothing in this section or in the Limitation of Liability section above operates to exclude or limit any liability that cannot lawfully be excluded or limited, including liability for Hibachi Guru’s own fraud, fraudulent misrepresentation, gross negligence, or willful misconduct, or any non-waivable rights I have under applicable consumer protection law. If any part of this section is held unenforceable as to a particular claim, it remains in force as to all other claims.</p>\\n<p>I hereby agree the information I disclose to Hibachi Guru must be accurate.</p>\\n<h2 id=\"s7\"><span class=\"num\">7.</span> My Guests and My Venue</h2>\\n<p>I am the host of the event. I will inform everyone attending of the risks described in the Assumption of Risk section above, and I accept these Terms on behalf of myself and the members of my party. If a guest, my venue, my landlord, or a homeowners or community association brings a claim against Hibachi Guru arising out of an event I booked, I will indemnify Hibachi Guru against that claim, except to the extent it arises from Hibachi Guru’s own fraud, gross negligence, or willful misconduct.</p>\\n<h2 id=\"s8\"><span class=\"num\">8.</span> Data Privacy</h2>\\n<p>To administer booking, Hibachi Guru may process my personal data. Such data includes, but is not limited to, the information provided on the Hibachi Guru platform including my email address, phone number, full name and address, any changes thereto, other appropriate personal and financial data about myself such as home address and business addresses and other contact information, and any other information that might be deemed appropriate by Hibachi Guru to facilitate hibachi events. By accepting these Terms and Conditions, I hereby give express consent to Hibachi Guru to process any such personal data and to use it to coordinate my event(s). I also give express consent to Hibachi Guru to transfer any such personal data to the hibachi chef / third-party vendor who will be providing the hibachi services.</p>\\n<p>Hibachi Guru will save my data on its online system(s) for four (4) years to comply with 42 Pa.C.S.A. \\xa75525 and the Pennsylvania Commercial Code at 13 Pa.C.S.A. \\xa72725.</p>\\n<p>Hibachi Guru’s Privacy Policy, published at <a href=\"/privacy-policy\">hibachiguru.com/privacy-policy</a>, describes in full what information is collected, how it is used, how long it is kept, and the choices available to me. It forms part of these Terms.</p>\\n<p>A copy of my data stored with Hibachi Guru, or any questions about Hibachi Guru’s data privacy policy, may be requested at any time via email to: <a href=\"mailto:sales@hibachiguru.com\">sales@hibachiguru.com</a></p>\\n<h2 id=\"s9\"><span class=\"num\">9.</span> Text Messages</h2>\\n<p class=\"key\">Hibachi Guru does not send marketing or promotional text messages. If I give Hibachi Guru my mobile number, it may text me only about my quote request and about the event I book — for example a quote, a confirmation, scheduling details, my chef’s arrival, or a question about my event.</p>\\n<p>Message frequency varies. Message and data rates may apply. Messages may be sent from any of several numbers operated by or on behalf of Hibachi Guru, and those numbers may change. The customer support number published on <a href=\"/\">hibachiguru.com</a> is a different number from the numbers these messages are sent from.</p>\\n<p>I may ask Hibachi Guru to stop texting me at any time by replying STOP, END, QUIT, CANCEL, REVOKE, OPT OUT, or UNSUBSCRIBE to any message, or by emailing <a href=\"mailto:sales@hibachiguru.com\">sales@hibachiguru.com</a> or calling <a href=\"tel:+13024687309\">302-468-7309</a> and asking to be removed. Hibachi Guru will honor my request within ten (10) business days of receipt and will stop sending texts from all of its numbers.</p>\\n<p>If I do not give a mobile number, or if I ask Hibachi Guru to stop texting me, it will communicate with me about my quote request and my event by email to the address I provide, and I will receive the same service.</p>\\n<h2 id=\"s10\"><span class=\"num\">10.</span> Severability and Waiver</h2>\\n<p>If any provision is held unenforceable, the remainder stays in full force and the unenforceable provision will be enforced to the maximum extent permitted. A failure to enforce any provision is not a waiver of it.</p>\\n<h2 id=\"s11\"><span class=\"num\">11.</span> Governing Law and Dispute Resolution</h2>\\n<p class=\"caps\">PLEASE READ THIS SECTION CAREFULLY. IT REQUIRES DISPUTES TO BE RESOLVED BY INDIVIDUAL ARBITRATION, AND IT INCLUDES A JURY TRIAL WAIVER AND A CLASS ACTION WAIVER. IT ALSO GIVES ME THIRTY DAYS TO OPT OUT OF ARBITRATION.</p>\\n<h3>11.1  Agreement to arbitrate</h3>\\n<p class=\"key\">There may be instances in which disputes arise between Hibachi Guru and me. Hibachi Guru and I each agree to resolve, by binding individual arbitration, all Disputes except any claim within the jurisdiction of a small claims court, consistent with the jurisdictional and dollar limits that may apply, as long as it is an individual dispute and not a class action.</p>\\n<h3>11.2  Governing law, and what counts as a Dispute</h3>\\n<p>This engagement is governed by the laws of the Commonwealth of Pennsylvania, without regard to its conflict-of-laws rules. Hibachi Guru and I will each attempt in good faith to resolve any Dispute through direct discussion for at least thirty (30) days, by email to the address listed on Hibachi Guru’s website or to the email address I provided. Should that negotiation be unsuccessful after thirty (30) days, the Dispute shall proceed to mediation with AAA Mediation Services. Should mediation be unsuccessful, the Dispute shall proceed to arbitration before the American Arbitration Association before a single arbitrator. The arbitrator’s decision shall be final and binding on both Hibachi Guru and me.</p>\\n<p class=\"key\">Hibachi Guru and I each waive any right to a trial by jury in connection with any Dispute.</p>\\n<p>“Dispute” means any claim, dispute, action, or other controversy, whether based on past, present, or future events, and whether based in contract, tort, statute, or common law, between Hibachi Guru and me concerning the use of the platform, or concerning the interpretation, applicability or enforceability of these Terms or the formation of this contract, including without limitation the arbitrability of any Dispute and any claim that all or any part of these Terms and Conditions is void or voidable.</p>\\n<h3>11.3  Class action waiver</h3>\\n<p class=\"caps\">HIBACHI GURU AND I AGREE TO WAIVE CLASS ACTION PROCEDURES.</p>\\n<p class=\"key\">Neither party will seek to have a Dispute heard as a class action or private attorney general action, or in any other proceeding in which either party acts or proposes to act in a representative capacity. Hibachi Guru and I each expressly waive any right to file a class action or to seek relief on a class basis. No arbitration or proceeding may be combined with another without the prior written consent of all parties to the applicable arbitrations or proceedings.</p>\\n<p>If this waiver of class or consolidated actions is deemed invalid or unenforceable, neither Hibachi Guru nor I are entitled to arbitration, and all Disputes will instead be resolved in a court.</p>\\n<h3>11.4  Small claims court</h3>\\n<p>Subject to applicable jurisdictional requirements, either Hibachi Guru or I may elect to pursue a Dispute in a local small claims court rather than through the informal dispute resolution process described below or arbitration, so long as the matter remains in small claims court and proceeds only on an individual basis. If a party has already submitted an arbitration demand, the other party may, in its sole discretion, inform the arbitral forum that it chooses to have the Dispute heard in small claims court. At that time the arbitral forum will close the arbitration and the Dispute will be heard in the appropriate small claims court, with no fees due from the arbitration respondent.</p>\\n<h3>11.5  Informal dispute resolution</h3>\\n<p>In the event of a Dispute, Hibachi Guru and I agree to attempt to avoid the costs of formal dispute resolution by giving each party a full and fair opportunity to address and resolve the Dispute informally. Except for Disputes eligible to be resolved in small claims court, the claiming party must send the other party a notice of Dispute: a written statement setting out the name, address and contact information of the party giving the notice, detailed factual information sufficient to evaluate the merits of the claiming party’s individualized claim, and the specific relief sought, including any amount of money demanded and the means by which the demanding party calculated the claimed damages.</p>\\n<p>Any notice of Dispute to Hibachi Guru must be sent to: Limitless Franchise Solutions LLC DBA Hibachi Guru, 1433 N Hope Street, Philadelphia, PA 19122.</p>\\n<h3>11.6  Arbitration process and rules</h3>\\n<p>If Hibachi Guru and I do not resolve a Dispute by informal negotiation, the Dispute shall be resolved by binding arbitration. The Federal Arbitration Act, 9 U.S.C. \\xa7\\xa7 1–16, including its procedural provisions, and not state law, governs the interpretation and enforcement of this arbitration agreement. Any demand for arbitration must be filed with the American Arbitration Association. The rules of the arbitral forum will govern all aspects of the arbitration, except to the extent those rules conflict with these Terms and Conditions. The arbitration will be conducted by a single, neutral, qualified arbitrator. Arbitration may be conducted in person, through the submission of documents, by phone, or online. Proceedings that cannot be conducted through the submission of documents, by phone, or online will take place in Philadelphia, Pennsylvania.</p>\\n<p>Hibachi Guru and I each agree to submit to the exclusive jurisdiction of the federal or state courts located in Philadelphia, Pennsylvania in order to compel arbitration, to stay proceedings pending arbitration, or to confirm, modify, vacate or enter judgment on the award entered by the arbitrator. The arbitrator may award damages to either party individually as a court could, including declaratory or injunctive relief, but only to the extent required to satisfy that party’s individual claim.</p>\\n<h3>11.7  Fees</h3>\\n<p>If Hibachi Guru initiates an arbitration against me, Hibachi Guru will pay all costs associated with the arbitration, including the entire filing fee. If I am the party initiating an arbitration, I will be responsible for the nonrefundable initial filing fee and other applicable fees as required by the American Arbitration Association. If the arbitrator finds that either the substance of a claim or the relief sought violates the representation requirements of Federal Rule of Civil Procedure 11, then to the extent permitted by law the arbitrator shall have the same power to award sanctions consistent with that rule.</p>\\n<h3>11.8  Settlement offers and offers of judgment</h3>\\n<p>At least ten (10) calendar days before the date set for an arbitration hearing, either party may serve a written offer of judgment on the other to allow judgment on specified terms. If the offer is accepted, the offer with proof of acceptance shall be submitted to the arbitrator, who shall enter judgment accordingly. If the offer is not accepted before the arbitration hearing or within thirty (30) calendar days after it is made, whichever is first, it shall be deemed withdrawn and cannot be given as evidence in the arbitration. If an offer made by one party is not accepted by the other and that other party fails to obtain a more favorable award, it shall not recover its post-offer costs and shall pay the offering party’s costs, including all fees paid to the arbitral forum, from the time of the offer.</p>\\n<h3>11.9  Survival</h3>\\n<p>This arbitration agreement will survive the termination of my relationship with Hibachi Guru, including any revocation of consent or other action by me to end my participation in the services or any communication with Hibachi Guru.</p>\\n<h3>11.10  My right to opt out of arbitration</h3>\\n<p class=\"key\">I may opt out of this arbitration agreement by mail. If I do, neither party can force the other to arbitrate. To opt out I must notify Hibachi Guru in writing no later than thirty (30) calendar days after first becoming subject to this arbitration agreement; otherwise I am bound to arbitrate Disputes on a non-class basis in accordance with these Terms and Conditions.</p>\\n<p>If I opt out of only the arbitration provisions and not also the class action waiver, the class action waiver still applies. I may not opt out of only the class action waiver and not also the arbitration provisions.</p>\\n<p>My opt-out notice must include my name and address, the email address I used, and an unequivocal statement that I want to opt out of this arbitration agreement and, if applicable, that I want to opt out of the class action waiver. I must mail my opt-out notice to: Limitless Franchise Solutions LLC DBA Hibachi Guru, 1433 N Hope Street, Philadelphia, PA 19122. Opt-out notices submitted by email will not be effective.</p>\\n<p>If I have questions or concerns about the meaning of any provision of this arbitration agreement, I am free to seek the counsel of an attorney.</p>\\n<h2 id=\"s12\"><span class=\"num\">12.</span> Changes to These Terms</h2>\\n<p>Hibachi Guru may update these Terms from time to time. The version in force at the time I submit a quote request or booking governs that quote request or booking, and later changes will not apply to it. If Hibachi Guru makes a material change, the updated Terms will be posted at <a href=\"/terms\">hibachiguru.com/terms</a> with a new version number and effective date before the change takes effect, and my next quote request or booking made after that date will be subject to the updated Terms.</p>\\n<h2 id=\"s13\"><span class=\"num\">13.</span> Acceptance</h2>\\n<p>When I submit a quote request or booking through this platform I am asked to confirm, by separate affirmative action:</p>\\n<ul>\\n  <li>that I am at least 18 years of age and have the authority to agree to these Terms on behalf of myself, my party, and the venue where the event will be held; and</li>\\n  <li>that I have read, understand, and agree to these Terms, including the Assumption of Risk, Limitation of Liability, and No Claims Against Hibachi Guru sections, and the jury waiver and class action waiver in the Governing Law and Dispute Resolution section.</li>\\n</ul>\\n<p>Hibachi Guru records the version of these Terms displayed to me, the date and time of my confirmation, and the confirmations I gave.</p>\\n<h2 id=\"s14\"><span class=\"num\">14.</span> Contact</h2>\\n<address class=\"contact\">\\n  <strong>Limitless Franchise Solutions LLC DBA Hibachi Guru</strong><br>\\n  Email: <a href=\"mailto:sales@hibachiguru.com\">sales@hibachiguru.com</a><br>\\n  Phone: <a href=\"tel:+13024687309\">302-468-7309</a><br>\\n  Web: <a href=\"/\">hibachiguru.com</a><br>\\n  Privacy Policy: <a href=\"/privacy-policy\">hibachiguru.com/privacy-policy</a><br>\\n</address>\\n</main>\\n\\n<footer>\\n  <p>Limitless Franchise Solutions LLC DBA Hibachi Guru &middot;\\n     <a href=\"/privacy-policy\">Privacy Policy</a> &middot;\\n     Terms and Conditions (this page, version 1.0)</p>\\n</footer>'};const PRIVACY_POLICY={\"version\":\"1.0\",\"effective\":\"2026-09-28\",\"url\":\"https://www.hibachiguru.com/privacy-policy\",\"sha256\":\"bd40e9d26bb968292bf36ce81804fc0e760c660aa789b891eb5f3b565037fcb8\",\"sha256_supplied\":\"409ce54399ff39dbed479f121f0d9238ff9e6a5d68e0070fa9c23b243500bb20\",\"html\":'<header>\\n  <p class=\"brand\">Hibachi Guru</p>\\n  <h1>Privacy Policy &amp; SMS Terms</h1>\\n  <p class=\"meta\">Version 1.0 &middot; Effective 28 September 2026</p>\\n</header>\\n\\n<nav aria-label=\"Contents\">\\n  <h2>Contents</h2>\\n  <ol>\\n    <li><a href=\"#s1\">Information We Collect</a></li>\\n    <li><a href=\"#s2\">How We Use Your Information</a></li>\\n    <li><a href=\"#s3\">Information Sharing</a></li>\\n    <li><a href=\"#s4\">SMS Messaging Policy</a></li>\\n    <li><a href=\"#s5\">Customer Support</a></li>\\n    <li><a href=\"#s6\">Data Security</a></li>\\n    <li><a href=\"#s7\">Your Choices</a></li>\\n    <li><a href=\"#s8\">Data Retention</a></li>\\n    <li><a href=\"#s9\">Cookies and Tracking</a></li>\\n    <li><a href=\"#s10\">External Links</a></li>\\n    <li><a href=\"#s11\">Updates to This Policy</a></li>\\n    <li><a href=\"#s12\">Contact Us</a></li>\\n    <li><a href=\"#s13\">SMS Terms &amp; Conditions Summary</a></li>\\n  </ol>\\n</nav>\\n\\n<main>\\n<p class=\"intro\">Limitless Franchise Solutions LLC DBA Hibachi Guru (“Hibachi Guru,” “we,” “our,” or “us”) values your privacy. This page explains how we collect, use, and protect personal information, and outlines the terms that apply to our SMS messaging program. By using our website and/or services, you hereby agree to and acknowledge the following:</p>\\n<h2 id=\"s1\"><span class=\"num\">1.</span> Information We Collect</h2>\\n<p>We may collect the following information when you visit our website, place an order, or communicate with us:</p>\\n<ul>\\n  <li>Contact information: Name, phone number, email address, mailing or event address</li>\\n  <li>Order details: Event/meal selections, event times, event venue addresses, Terms and Conditions (<a href=\"/terms\">hibachiguru.com/terms</a>) signature and date(s) and payment confirmations</li>\\n  <li>Communication records: SMS messages, emails, and correspondence with our support team, and/or</li>\\n  <li>Device and usage data: IP address, browser type, cookies, and related analytics</li>\\n</ul>\\n<p>Information entered but not submitted. If you begin a quote request and do not finish it, we may keep the contact details you have already entered so that we can follow up with you about completing it. This information is held, protected, retained and deleted on the same terms as everything else described in this policy.</p>\\n<h2 id=\"s2\"><span class=\"num\">2.</span> How We Use Your Information</h2>\\n<p>We use your information to:</p>\\n<ul>\\n  <li>Process and confirm your hibachi related event, including intaking event and meal selections, event times, event venue addresses, Terms and Conditions signature and date(s), and confirmation that a deposit or balance has been paid to your hibachi service provider. Hibachi Guru does not collect payments and does not receive or store card or bank details.</li>\\n  <li>Send order confirmations, updates, and customer support messages</li>\\n  <li>Provide SMS communications regarding orders, catering logistics, or customer assistance</li>\\n  <li>Contact you by email about a quote request you started but did not complete. We will not send you text messages about an incomplete quote request</li>\\n  <li>Improve our website, menu options, and service experience, and/or</li>\\n  <li>Comply with applicable laws and prevent fraud or abuse</li>\\n</ul>\\n<h2 id=\"s3\"><span class=\"num\">3.</span> Information Sharing</h2>\\n<p class=\"key\">We do not sell or rent your personal information.</p>\\n<p>We only share limited data with:</p>\\n<ul>\\n  <li>Hibachi service providers who assist with event management and cuisine delivery under strict confidentiality, and/or</li>\\n  <li>Government authorities if required by law or to protect our legal rights.</li>\\n</ul>\\n<h2 id=\"s4\"><span class=\"num\">4.</span> SMS Messaging Policy</h2>\\n<p class=\"key\">We do not send marketing or promotional text messages. If you give us your mobile number when you request a quote, we may text you only about that quote and about the event you book. These messages are part of the service you asked us for.</p>\\n<p>Those messages cover:</p>\\n<ul>\\n  <li>Order confirmations, delivery notifications, or updates,</li>\\n  <li>Event coordination or event communications, and/or</li>\\n  <li>Customer support and follow-up messages</li>\\n</ul>\\n<p class=\"key\">Message frequency may vary. Message and data rates may apply.</p>\\n<p>You can ask us to stop at any time by replying to any message by texting the words “STOP,” “QUIT,” “END,” “REVOKE,” “OPT-OUT,” “CANCEL,” or “UNSUBSCRIBE”</p>\\n<p>SMS messages may come from one of several numbers operated by or on behalf of Hibachi Guru and we will always identify ourselves as Hibachi Guru.</p>\\n<p>For help, contact us at <a href=\"mailto:sales@hibachiguru.com\">sales@hibachiguru.com</a></p>\\n<p>Your phone number is used only by Hibachi Guru and its Providers.</p>\\n<p>We abide by the FCC’s “Opt-Out Rule” and should you opt out of SMS messaging, Hibachi Guru will:</p>\\n<ul>\\n  <li>Allow consumers to revoke consent in any reasonable manner including the methods identified above;</li>\\n  <li>Honor revocation requests within 10 (ten) business days of receipt; and</li>\\n  <li>Only send a post-revocation text message one time after receipt of a revocation request to clarify the scope of the consumer’s revocation (a “clarification message”).</li>\\n</ul>\\n<p class=\"key\">Email-only communications. Providing a mobile number is optional. If you do not provide one, or if you ask us to stop texting you, we will communicate with you about your quote request and your event by email to the address you provide, and you will receive the same service.</p>\\n<h2 id=\"s5\"><span class=\"num\">5.</span> Customer Support</h2>\\n<p>For assistance with SMS or order-related questions:</p>\\n<ul>\\n  <li>Call or text our customer support line <a href=\"tel:+13024687309\">302-468-7309</a></li>\\n  <li>Email <a href=\"mailto:sales@hibachiguru.com\">sales@hibachiguru.com</a></li>\\n</ul>\\n<h2 id=\"s6\"><span class=\"num\">6.</span> Data Security</h2>\\n<p>We implement reasonable administrative, technical, and physical safeguards to protect your personal information from unauthorized access, alteration, or misuse. However, no electronic transmission is completely secure, and you acknowledge the inherent risks of sharing information online. We only keep your records until after your event has occurred, or four (4) years from data input, whichever is later.</p>\\n<p>We encrypt your records for your security.</p>\\n<p>Under Pennsylvania’s Breach of Personal Information Notification Act (the “Act”), personal information under the Act includes your name combined with an unencrypted, unredacted Social Security number, driver\\'s license or state ID number, financial-account or card number with its access code, certain medical or health-insurance information, or online-account credentials in case of data breach. Hibachi Guru will notify the Attorney General and all other applicable state and federal agencies concurrently once a breach of the data controlled by Hibachi Guru reaches more than five hundred (500) Pennsylvania residents. Additionally, if a data breach occurs for your data controlled and/or held by Hibachi Guru, you will receive a notification by email and, where applicable, by phone, without unreasonable delay.</p>\\n<h2 id=\"s7\"><span class=\"num\">7.</span> Your Choices</h2>\\n<p>You may:</p>\\n<ul>\\n  <li>Update or correct your personal details by contacting us</li>\\n  <li>Opt out of SMS messages at any time, and</li>\\n  <li>Request we delete your personal data in writing, subject to the legal retention requirements described below.</li>\\n</ul>\\n<p>Some records must be kept even after a deletion request. We retain records of your text message consent, and of any opt-out request, for as long as is necessary to demonstrate compliance with the Telephone Consumer Protection Act, under which we carry the burden of proving that consent was given. We retain records relating to your event and to your agreement to our Terms and Conditions for four (4) years, which is the limitation period under 42 Pa.C.S.A. \\xa75525 and the Pennsylvania Commercial Code at 13 Pa.C.S.A. \\xa72725.</p>\\n<h2 id=\"s8\"><span class=\"num\">8.</span> Data Retention</h2>\\n<p>We retain personal information only as long as necessary to fulfill the purposes described above or as required by law, such as tax or audit obligations. Such length of time is four (4) years from your data input.</p>\\n<h2 id=\"s9\"><span class=\"num\">9.</span> Cookies and Tracking</h2>\\n<p>Our website may use cookies and analytics tools to understand visitor behavior, improve performance, enhance user experience and confirm signature of our Terms and Conditions form (<a href=\"/terms\">hibachiguru.com/terms</a>). You can manage cookie preferences in your browser settings.</p>\\n<h2 id=\"s10\"><span class=\"num\">10.</span> External Links</h2>\\n<p>Our website may contain links to other websites or services not operated by Hibachi Guru. We are not responsible for their privacy or data practices.</p>\\n<h2 id=\"s11\"><span class=\"num\">11.</span> Updates to This Policy</h2>\\n<p>We may update this Privacy Policy and SMS Terms periodically. Updates will be reflected by a new version number and effective date above. Continued use of our services after changes are posted constitutes acceptance of the revised policy.</p>\\n<h2 id=\"s12\"><span class=\"num\">12.</span> Contact Us</h2>\\n<p>If you have questions about this Privacy Policy or SMS Terms, please contact:</p>\\n<address class=\"contact\">\\n  <strong>HIBACHI GURU</strong><br>\\n  Website: <a href=\"/\">hibachiguru.com</a><br>\\n  Email: <a href=\"mailto:sales@hibachiguru.com\">sales@hibachiguru.com</a><br>\\n  Phone: <a href=\"tel:+13024687309\">302-468-7309</a><br>\\n  Terms and Conditions: <a href=\"/terms\">hibachiguru.com/terms</a><br>\\n</address>\\n<h2 id=\"s13\"><span class=\"num\">13.</span> SMS Terms &amp; Conditions Summary</h2>\\n<p>For convenience and compliance with carrier requirements, the following terms apply to all text messaging interactions:</p>\\n<ul class=\"key\">\\n  <li>Message frequency may vary.</li>\\n  <li>Message and data rates may apply.</li>\\n</ul>\\n<p>To opt out, reply to any message by texting the words “STOP,” “QUIT,” “END,” “REVOKE,” “OPT-OUT,” “CANCEL,” or “UNSUBSCRIBE”.</p>\\n<p>For help, email <a href=\"mailto:sales@hibachiguru.com\">sales@hibachiguru.com</a></p>\\n</main>\\n\\n<footer>\\n  <p>Limitless Franchise Solutions LLC DBA Hibachi Guru &middot;\\n     <a href=\"/terms\">Terms and Conditions</a> &middot;\\n     Privacy Policy (this page, version 1.0)</p>\\n</footer>'};// Normalise visible text exactly as sha256 above was computed.\nfunction normaliseLegalText(text){return text.split(/\\s+/).filter(Boolean).join(\" \");}async function sha256Hex(text){const data=new TextEncoder().encode(text);const digest=await crypto.subtle.digest(\"SHA-256\",data);return Array.from(new Uint8Array(digest)).map(b=>b.toString(16).padStart(2,\"0\")).join(\"\");}const WEBHOOK_CONFIG={supabaseWebhook:\"https://mzmmunduwavxafewtetv.supabase.co/functions/v1/form-webhook\",secondaryWebhook:\"https://xdomdorylkslplcrluuh.supabase.co/functions/v1/submit-form/82s4a9mw77nn\",maxRetries:2,retryDelayMs:500,// A browser never times out a fetch on its own, so a stalled connection to a\n// cold Supabase edge function froze the submit button indefinitely. Every\n// attempt is now bounded by this via AbortController. Worst case for the\n// visitor-facing primary call is maxRetries * attemptTimeoutMs plus backoff.\nattemptTimeoutMs:6e3};// ==================== ATTRIBUTION CONFIGURATION ====================\n// Click and campaign identifiers read off the landing URL. Single source of truth:\n// the site-wide capture script (Site Settings -> head) captures the same list on the\n// true landing page, and this component re-reads it as a fallback. Adding a field\n// here means adding it there too.\n//\n// Meta does NOT put campaign/adset/ad IDs in the URL on its own. The ad's \"URL\n// parameters\" field has to append them using the {{campaign.id}}, {{adset.id}} and\n// {{ad.id}} macros. Until that is set on the ads, these keys stay empty and only\n// fbclid/_fbc arrive.\nconst ATTRIBUTION_URL_FIELDS=[\"utm_source\",\"utm_medium\",\"utm_campaign\",\"utm_content\",\"utm_term\",\"utm_id\",\"gclid\",\"wbraid\",\"gbraid\",\"fbclid\",\"msclkid\",\"ttclid\",\"meta_campaign_id\",\"meta_adset_id\",\"meta_ad_id\",\"meta_placement\",\"campaign_id\",\"adset_id\",\"ad_id\",// Google Ads ValueTrack. Google writes these with its own lowercase,\n// no-underscore names, so they are captured verbatim and aliased to\n// CRM-facing names in withClickIdentifiers below.\n//\n// IMPORTANT: none of these arrive on their own. Auto-tagging only ever adds\n// gclid. The Google Ads account must carry a tracking template such as\n//   {lpurl}?campaignid={campaignid}&adgroupid={adgroupid}&keyword={keyword}&matchtype={matchtype}\n// Google has NO ValueTrack parameter for campaign or ad group NAME, so\n// campaignname/adgroupname only arrive if the account also defines custom\n// parameters and appends them, e.g. &adgroupname={_adgroup}.\n\"campaignid\",\"campaignname\",\"adgroupid\",\"adgroupname\",\"keyword\",\"matchtype\"];// Read a cookie by name.\nconst readCookie=name=>{if(typeof document===\"undefined\")return\"\";const escaped=name.replace(/([.*+?^${}()|[\\]\\\\])/g,\"\\\\$1\");const match=document.cookie.match(new RegExp(\"(?:^|; )\"+escaped+\"=([^;]*)\"));return match?decodeURIComponent(match[1]):\"\";};// Normalize Meta/Google identifiers into the field names the CRM expects.\n// _fbc and _fbp are set by the Meta pixel and are what Meta's Conversions API\n// actually matches on, so they are worth more than a raw fbclid on its own.\nconst withClickIdentifiers=captured=>{const out={...captured};const fbc=readCookie(\"_fbc\");const fbp=readCookie(\"_fbp\");if(fbc)out[\"fbc\"]=fbc;if(fbp)out[\"fbp\"]=fbp;// meta_click_id is the CRM-facing name. Prefer the pixel cookie, which is the\n// full fb.1.<ts>.<fbclid> form, and fall back to the raw URL param.\nconst metaClickId=fbc||out[\"fbclid\"]||\"\";if(metaClickId)out[\"meta_click_id\"]=metaClickId;if(out[\"gclid\"]&&!out[\"google_click_id\"]){out[\"google_click_id\"]=out[\"gclid\"];}// Mirror Google's ValueTrack keys onto CRM-facing names, the same way gclid is\n// mirrored onto google_click_id. Both spellings go out on the payload so the\n// receiving CRM can read whichever it prefers.\nconst GOOGLE_ALIASES={campaignid:\"google_campaign_id\",campaignname:\"google_campaign_name\",adgroupid:\"google_adgroup_id\",adgroupname:\"google_adgroup_name\",keyword:\"google_keyword\",matchtype:\"google_match_type\"};Object.keys(GOOGLE_ALIASES).forEach(source=>{const target=GOOGLE_ALIASES[source];if(out[source]&&!out[target])out[target]=out[source];});return out;};// ==================== TERMS ASSENT (spec v1.0, 27 Sep 2026) ====================\n//\n// The two confirmations on the last step are the clickwrap that makes the Customer\n// Terms binding. Rules from Tyler's implementation spec, sections 4 to 6:\n//   - exactly two checkboxes, both required, never pre-checked, no marketing opt-in;\n//   - the full terms text is shown in a scrollable panel rendered from the same\n//     legal source block as /terms, never retyped and never an iframe;\n//   - Change Request 01 (counsel): the two boxes unlock only once the customer has\n//     reached the end of the terms panel. Defensive per CR01 section 3: detected with\n//     an IntersectionObserver on a sentinel (not scroll arithmetic), unlocks at once\n//     when the panel does not overflow, and the boxes render ENABLED until the\n//     browser runs the effect, so a failed script never leaves the form dead.\n//     terms_scrolled_to_end is still logged;\n//   - every completed submission carries an assent record with the label text\n//     exactly as displayed.\n// The checkbox state lives OUTSIDE `form` on purpose: incomplete and abandoned\n// sends serialise `form`, and a partial record must never carry a terms acceptance\n// (spec 5.5). Only handleSubmit adds assent data to a payload.\nconst TERMS_ACCEPTED_VALUE=\"accepted\";// Label text, verbatim from spec 4.2. The assent record stores what the browser\n// actually displayed (read from the DOM at submit); this is the fallback.\nconst AGE_AUTHORITY_LABEL=\"I am at least 18 years old and have the authority to agree to these Terms on behalf of myself, my party, and the venue where the event will be held.\";// 10-digit US number as entered -> E.164. Returns \"\" when not a usable number.\nconst toE164=phone=>{const digits=String(phone||\"\").replace(/\\D/g,\"\");if(digits.length===10)return`+1${digits}`;if(digits.length===11&&digits.startsWith(\"1\"))return`+${digits}`;return\"\";};const newAssentId=()=>{try{if(typeof crypto!==\"undefined\"&&\"randomUUID\"in crypto)return crypto.randomUUID();}catch{}return`assent-${generateSubmissionId()}`;};// Generate unique submission ID to prevent duplicates\nconst generateSubmissionId=()=>{return`${Date.now()}-${Math.random().toString(36).substr(2,9)}`;};// ==================== THANK-YOU PAGE HANDOFF ====================\n// The /thank-you/ page asks an optional follow-up question about add-on services\n// and has to attach the answers to the lead that was just created. It reads this\n// sessionStorage key, and ServiceInterests.tsx declares the same constant.\n// Changing it here means changing it there.\nconst SUBMISSION_HANDOFF_KEY=\"hg_last_submission\";// Hand the thank-you page the identity of the person who just submitted.\n//\n// sessionStorage rather than query parameters: name, phone and email are PII, and\n// query strings get copied into analytics page-view payloads, browser history and\n// outbound referrer headers. sessionStorage is same-tab, same-origin and never\n// leaves the browser. Only the opaque submission id goes in the URL, as a fallback\n// for browsers where storage is blocked.\n//\n// Never throws. A private-mode or quota-full sessionStorage must not be able to\n// stop the redirect after a lead has already been recorded.\nconst persistSubmissionHandoff=(submissionId,formData)=>{if(typeof window===\"undefined\")return;try{window.sessionStorage.setItem(SUBMISSION_HANDOFF_KEY,JSON.stringify({submission_id:submissionId,name:[formData.firstName,formData.lastName].filter(Boolean).join(\" \"),phone:formData.phone||\"\",email:formData.email||\"\",savedAt:new Date().toISOString()}));}catch(e){console.warn(\"[Handoff] Could not persist submission identity:\",e);}};// Transform form data to match webhook field names.\n//\n// submissionId is a parameter with a generating default so that a caller which\n// needs to know the id (the complete-submission path, which hands it to the\n// thank-you page) can generate it once and pass it in, while every other caller\n// keeps the previous behaviour of getting a fresh id per call.\nconst transformFormData=(formData,submissionId=generateSubmissionId())=>{const{firstName,lastName,startTime,specialOccasion,termsAccepted,hasAllergies,finalizingVenue,address,city,state,zipCode,adults,children,...rest}=formData;// Calculate total guests\nconst adultsNum=parseInt(adults)||0;const childrenNum=parseInt(children)||0;const totalGuests=adultsNum+childrenNum;// Combine address fields into one full address string\nconst fullAddress=[address,city,state,zipCode].filter(Boolean).join(\", \");return{...rest,// Combine first and last name into \"name\"\n...firstName||lastName?{name:[firstName,lastName].filter(Boolean).join(\" \")}:{},// Map startTime to start_time (accepted field name)\n...startTime?{start_time:startTime}:{},// Map specialOccasion to occasion (accepted field name)\n...specialOccasion?{occasion:specialOccasion}:{},// Combined address field\n...fullAddress?{address:fullAddress}:{},// Include adults and children with accepted names\n...adults?{adults:adults}:{},...children?{children:children}:{},// Add total guests count\n...totalGuests>0?{guests:totalGuests}:{},// Keep allergies as-is (accepted field name) - only include actual allergy text\n// hasAllergies is just Yes/No, the actual text is in \"allergies\" field which passes through via ...rest\n// Keep terms accepted status\n...termsAccepted?{terms_accepted:termsAccepted}:{},// Map venue status\n...finalizingVenue!==undefined?{venue_pending:finalizingVenue}:{},// Add submission ID\nsubmission_id:submissionId};};// Webhook submission with retry logic\nconst submitWithRetry=async(url,data,options={})=>{const{maxRetries=WEBHOOK_CONFIG.maxRetries,delayMs=WEBHOOK_CONFIG.retryDelayMs,timeoutMs=WEBHOOK_CONFIG.attemptTimeoutMs,keepalive=false}=options;let lastError=\"\";for(let attempt=1;attempt<=maxRetries;attempt++){const controller=new AbortController;const timer=setTimeout(()=>controller.abort(),timeoutMs);try{const response=await fetch(url,{method:\"POST\",headers:{\"Content-Type\":\"application/json\"},body:JSON.stringify(data),signal:controller.signal,keepalive});if(response.ok){console.log(`[Webhook] Success on attempt ${attempt} to ${url}`);return{success:true,attempts:attempt};}lastError=`HTTP ${response.status}: ${response.statusText}`;console.warn(`[Webhook] Attempt ${attempt} failed: ${lastError}`);}catch(e){lastError=e instanceof Error&&e.name===\"AbortError\"?`Timed out after ${timeoutMs}ms`:e instanceof Error?e.message:\"Network error\";console.warn(`[Webhook] Attempt ${attempt} failed: ${lastError}`);}finally{clearTimeout(timer);}if(attempt<maxRetries){await new Promise(resolve=>setTimeout(resolve,delayMs*attempt));}}console.error(`[Webhook] All ${maxRetries} attempts failed for ${url}`);return{success:false,error:lastError,attempts:maxRetries};};// Submit to Supabase (primary) and secondary webhook\nconst submitToSupabaseAndSync=async(formData,formStatus=\"complete\",additionalData={},// The caller may generate the id up front (handleSubmit does, so the assent\n// record can name its quote request); otherwise it is generated here, once.\nsubmissionId=generateSubmissionId())=>{const transformedData={...transformFormData(formData,submissionId),_formStatus:formStatus,...additionalData};// Secondary starts immediately in parallel with primary, and is keepalive:true\n// from the first attempt, not just as a post-hoc fallback, so the redirect in\n// handleSubmit can never cancel it mid-flight regardless of timing. This is the\n// exact failure mode that broke lead capture the last time this path was made\n// non-blocking without keepalive: window.location.href unloads the page and the\n// browser drops any in-flight fetch that is not keepalive. Secondary is\n// best-effort, so its outcome never gates the result.\nvoid submitWithRetry(WEBHOOK_CONFIG.secondaryWebhook,transformedData,{keepalive:true}).then(result=>{if(!result.success){console.warn(`[Secondary Webhook] Submission failed: ${result.error}`);}});// Primary is the source of truth and is fully awaited. The visitor is not shown\n// success or redirected until it is confirmed, which is what stops the earlier\n// failure mode from recurring: we never say \"you're done\" or send someone to the\n// thank-you page before knowing the lead actually landed.\nconst primaryResult=await submitWithRetry(WEBHOOK_CONFIG.supabaseWebhook,transformedData);if(!primaryResult.success){return{success:false,error:`Supabase submission failed: ${primaryResult.error}`,submissionId};}return{success:true,submissionId};};// Phone validation - must have at least 10 digits\nconst isValidPhone=phone=>{const digitsOnly=phone.replace(/\\D/g,\"\");return digitsOnly.length>=10;};// Email validation - pragmatic shape check (something@something.tld), not a\n// full RFC 5322 implementation. Same rule the Next-button step validation has\n// always used; it lives at module scope so the abandonment gate below and\n// handleNext share one definition rather than drifting apart.\nconst isValidEmail=email=>{const emailRegex=/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;return emailRegex.test(email);};// Check if the form carries enough contact info to be worth capturing as a lead.\n//\n// EITHER a valid phone OR a valid email is enough. Mauricio's call on\n// 2026-08-24, relaying Tyler: \"I just want both that it could be either they put\n// a phone number or they put an email. Just one of those is enough to trigger an\n// abandoned form.\" Previously this required a valid phone and did not look at\n// email at all, so a visitor who had given a good email but no usable phone was\n// dropped entirely.\n//\n// This one function gates BOTH abandonment systems, and keeping it that way is\n// deliberate: the CRM webhook sends (sendIncompleteForm and handleBeforeUnload)\n// and the OpenAI Ads pixel (fireAbandonmentPixelOnce) both read it, so the two\n// can never drift into \"captured as a lead but never reported as a conversion\".\n//\n// This does NOT touch the completed-submission path. handleSubmit still requires\n// the full set of valid fields; nothing here loosens what counts as a finished\n// booking.\nconst hasRequiredContactInfo=data=>{const hasValidPhone=!!data?.phone&&isValidPhone(String(data.phone));const hasValidEmail=!!data?.email&&isValidEmail(String(data.email));return hasValidPhone||hasValidEmail;};// Send incomplete form data to webhook (fire and forget)\n//\n// submissionId follows the same parameter-with-generating-default shape as\n// transformFormData. The abandonment callers pass the stable per-page-session id\n// so that every repeat send in one session carries ONE submission_id, which is\n// what lets the CRM treat them as updates to a single incomplete lead rather\n// than as a pile of unrelated ones. Callers that do not care keep the previous\n// behaviour of a fresh id per call.\nconst sendIncompleteForm=async(formData,currentStep,submissionId=generateSubmissionId())=>{// Only send once we have at least one usable contact method: a valid phone\n// OR a valid email. See hasRequiredContactInfo.\nif(!hasRequiredContactInfo(formData)){console.log(\"[Incomplete Form] Skipping - no valid phone number or email\");return;}const payload={...transformFormData(formData,submissionId),_formStatus:\"incomplete\",_lastCompletedStep:currentStep,_totalSteps:steps.length,_abandonedAt:new Date().toISOString()};console.log(\"[Incomplete Form] Sending to webhook:\",payload);// Deliver to BOTH webhooks via sendBeacon. A plain-string beacon goes out as\n// text/plain (a CORS-safelisted type, no preflight) and the browser guarantees\n// delivery even if the tab is closing or navigating. Sequential awaited fetches\n// dropped the second call (secondary Lovable) on unload, so incompletes reached\n// the primary but not the secondary. Beacon sends to both reliably.\ntry{const body=JSON.stringify(payload);let primaryQueued=false;let secondaryQueued=false;if(typeof navigator!==\"undefined\"&&typeof navigator.sendBeacon===\"function\"){primaryQueued=navigator.sendBeacon(WEBHOOK_CONFIG.supabaseWebhook,body);secondaryQueued=navigator.sendBeacon(WEBHOOK_CONFIG.secondaryWebhook,body);}// Fallback: for any endpoint the beacon could not queue, use a keepalive\n// text/plain fetch (still a simple request, still survives navigation).\nif(!primaryQueued&&typeof fetch!==\"undefined\"){void fetch(WEBHOOK_CONFIG.supabaseWebhook,{method:\"POST\",headers:{\"Content-Type\":\"text/plain;charset=UTF-8\"},body,keepalive:true}).catch(()=>{});}if(!secondaryQueued&&typeof fetch!==\"undefined\"){void fetch(WEBHOOK_CONFIG.secondaryWebhook,{method:\"POST\",headers:{\"Content-Type\":\"text/plain;charset=UTF-8\"},body,keepalive:true}).catch(()=>{});}console.log(\"[Incomplete Form] Beacon queued - primary:\",primaryQueued,\"secondary:\",secondaryQueued);}catch(e){// Silent fail for incomplete form tracking\nconsole.error(\"[Incomplete Form] Failed to send:\",e);}};// ==================== ABANDONED-FORM CONVERSION PIXEL ====================\n// Report an ABANDONED (incomplete) booking form to the OpenAI ChatGPT Ads pixel.\n//\n// This deliberately fires the SAME two events a completed booking fires in\n// handleSubmit: the \"lead_created\" standard event and the \"quoterequestform\"\n// custom conversion. That is Mauricio's explicit decision, taken after the\n// tradeoff was spelled out to him: these two events are exactly what the ad\n// campaigns optimize against, so firing them on non-conversions widens what\n// \"conversion\" means for this ad account. Do not quietly narrow this back to a\n// distinct non-conversion event; that is a different product decision.\n//\n// eventId MUST be the stable per-page-session abandonment id, never a freshly\n// generated one. OpenAI only collapses duplicates that share an event_id, and\n// the abandonment handlers can each fire many times in a single page session\n// (handleVisibilityChange runs on EVERY tab-hide), so an unstable id would\n// report one hesitant visitor as several separate conversions.\n//\n// The fire-once guard lives with the caller, not here. This function only sends.\nconst fireAbandonmentPixel=eventId=>{if(typeof window===\"undefined\"||typeof window.oaiq!==\"function\"){return;}// 1. Standard event, mirroring the completed-booking call in handleSubmit.\ntry{window.oaiq(\"measure\",\"lead_created\",{type:\"customer_action\",event_id:eventId});}catch{// A blocked or missing pixel (ad blockers commonly block tracking SDKs)\n// must never disturb the webhook sends running alongside this on the\n// same abandonment.\n}// 2. Custom conversion action, mirroring the completed-booking call. Its own\n// try/catch so a throw in the standard event above cannot suppress it.\ntry{window.oaiq(\"measure\",\"custom\",{type:\"custom\"},{custom_event_name:\"quoterequestform\",event_id:eventId});}catch{// Same reasoning as above.\n}};const steps=[{title:\"Your Information\",fields:[{label:\"First Name\",key:\"firstName\",type:\"string\",placeholder:\"First Name\",required:true},{label:\"Last Name\",key:\"lastName\",type:\"string\",placeholder:\"Last Name\",required:true}],layout:\"row\"},{title:\"Contact\",fields:[{label:\"Phone\",key:\"phone\",type:\"tel\",placeholder:\"Phone\",required:true}],layout:\"full\"},{title:\"Contact\",fields:[{label:\"Email\",key:\"email\",type:\"email\",placeholder:\"Email Address\",required:true}],layout:\"full\"},{title:\"Event Date\",fields:[{label:\"Date\",key:\"date\",type:\"date\",placeholder:\"Select Date\",required:true}],layout:\"full\"},{title:\"Event Time\",fields:[{label:\"Start Time\",key:\"startTime\",type:\"enum\",options:[\"1pm\",\"4pm\",\"7pm\",\"9:30pm\"],required:true,helperText:\"If your preferred time isn't listed, please choose the closest available option.\"}],layout:\"full\"},{title:\"Party Size\",fields:[{label:\"Not sure yet?\",key:\"partySizeEstimate\",type:\"enum\",options:[\"Unknown\"],required:false},{label:\"Estimated Number of Adults\",key:\"adults\",type:\"number\",placeholder:\"Number of Adults\",required:true},{label:\"Estimated Children under 13\",key:\"children\",type:\"number\",placeholder:\"Children under 13\",required:false}],layout:\"row\"},{title:\"Location\",fields:[{label:\"Address\",key:\"address\",type:\"address\",placeholder:\"Street Address\",required:true},{label:\"City\",key:\"city\",type:\"string\",placeholder:\"City\",required:true},{label:\"State\",key:\"state\",type:\"string\",placeholder:\"State\",required:true},{label:\"Zip Code\",key:\"zipCode\",type:\"string\",placeholder:\"Zip Code\",required:true}],layout:\"address\",hasVenueCheckbox:true},{title:\"Dietary Information\",fields:[{label:\"Do you or your guests have any allergies?\",key:\"hasAllergies\",type:\"yesno\",required:true},{label:\"Please list allergies\",key:\"allergies\",type:\"string\",placeholder:\"List any allergies...\",conditionalOn:\"hasAllergies\",conditionalValue:\"Yes\",required:false}],layout:\"allergies\"},{title:\"Special Occasion\",fields:[{label:\"Special Occasion?\",key:\"specialOccasion\",type:\"string\",placeholder:\"Birthday, Anniversary, etc. (optional)\",required:false}],layout:\"full\"},{title:\"Terms & Conditions\",fields:[{label:\"Customer Terms and Conditions\",key:\"termsAccepted\",type:\"terms\",// Enforced in handleSubmit with a message naming the missing box,\n// not by disabling SUBMIT (spec 4.3). Text comes from the legal source block.\nrequired:false}],layout:\"full\"}];/**\r\n * Step-by-Step Booking Form\r\n *\r\n * Collects: Name, Phone, Email, Date, Start Time, Adults, Children, Address, Allergies, Special Occasion, Social Sharing, Instagram.\r\n * Features: Webhook retry logic, abandoned form tracking, CRM integration\r\n * Color scheme: Black and Orange\r\n *\r\n * @framerIntrinsicWidth 400\r\n * @framerIntrinsicHeight 460\r\n * @framerSupportedLayoutWidth any-prefer-fixed\r\n * @framerSupportedLayoutHeight any-prefer-fixed\r\n */export default function StepByStepForm(props){const{background=\"#000000\",primary=\"#FFFFFF\",accent=\"#FF6B00\",buttonText=\"#FFFFFF\",buttonBackground=\"#FF6B00\",disabledButtonBackground=\"#B34700\",placeholderColor=\"#999999\",borderColor=\"#4D4D4D\",font={},buttonFont={},style={}}=props;const[step,setStep]=useState(0);const[form,setForm]=useState({});const[submitting,setSubmitting]=useState(false);const[submitted,setSubmitted]=useState(false);const[error,setError]=useState(\"\");const[validationError,setValidationError]=useState(\"\");const[finalizingVenue,setFinalizingVenue]=useState(false);const[isMobile,setIsMobile]=useState(false);// Terms assent. Never pre-checked, kept out of `form` (see TERMS ASSENT above).\nconst[ageAuthority,setAgeAuthority]=useState(false);const[termsAgree,setTermsAgree]=useState(false);const[termsScrolledToEnd,setTermsScrolledToEnd]=useState(false);const termsPanelRef=useRef(null);const termsEndRef=useRef(null);// true only after the browser has armed the scroll gate (see effect below)\nconst[termsGateArmed,setTermsGateArmed]=useState(false);const ageLabelRef=useRef(null);const termsLabelRef=useRef(null);// Detect mobile screen width\nuseEffect(()=>{const checkMobile=()=>{setIsMobile(window.innerWidth<480);};checkMobile();window.addEventListener(\"resize\",checkMobile);return()=>window.removeEventListener(\"resize\",checkMobile);},[]);// Capture UTM parameters and referrer source once on mount.\n// Priority: sessionStorage (set by site-wide header script on FIRST page of session)\n//         → URL params on current page (fallback if script not installed)\n// The header script captures the true landing page + referrer before same-site\n// navigation overwrites document.referrer, solving the \"referral\" misattribution.\nconst trafficSourceRef=useRef({});useEffect(()=>{const SESSION_KEY=\"hg_traffic_source\";try{let captured={};// 1. Prefer sessionStorage — populated by the site-wide attribution script\n//    on the original landing page, so it has the true source/referrer.\ntry{const stored=sessionStorage.getItem(SESSION_KEY);if(stored)captured=JSON.parse(stored);}catch(_){}// 2. If sessionStorage is empty (script not installed or first-page form),\n//    fall back to reading URL params on the current page.\nif(Object.keys(captured).length===0){const params=new URLSearchParams(window.location.search);ATTRIBUTION_URL_FIELDS.forEach(key=>{const val=params.get(key);if(val)captured[key]=val;});// Only capture referrer from external domains (ignore same-site navigation)\nconst isExternalReferrer=(()=>{if(!document.referrer)return false;try{return new URL(document.referrer).hostname!==window.location.hostname;}catch(_){return false;}})();if(isExternalReferrer)captured[\"referrer\"]=document.referrer;if(!captured[\"landing_page\"])captured[\"landing_page\"]=window.location.href.split(\"?\")[0];}// Always derive inferred_source if missing — whether data came\n// from sessionStorage or URL params. This guarantees every\n// submission includes a human-readable source label.\nif(!captured[\"utm_source\"]&&!captured[\"inferred_source\"]){const isPaidMedium=/^(cpc|ppc|paid|paid_search|paid_social)$/i.test(captured[\"utm_medium\"]??\"\");if(captured[\"gclid\"]){captured[\"inferred_source\"]=\"google_ads\";}else if(captured[\"fbclid\"]){captured[\"inferred_source\"]=\"facebook_ads\";}else if(isPaidMedium){captured[\"inferred_source\"]=captured[\"utm_medium\"].toLowerCase();}else if(captured[\"referrer\"]){try{const refHost=new URL(captured[\"referrer\"]).hostname;if(/google/.test(refHost))captured[\"inferred_source\"]=\"google_organic\";else if(/bing|msn/.test(refHost))captured[\"inferred_source\"]=\"bing_organic\";else if(/facebook|instagram|fb\\.com/.test(refHost))captured[\"inferred_source\"]=\"social\";else if(/yelp/.test(refHost))captured[\"inferred_source\"]=\"yelp\";else if(/tiktok/.test(refHost))captured[\"inferred_source\"]=\"tiktok\";else captured[\"inferred_source\"]=\"referral\";}catch(_){}}else{captured[\"inferred_source\"]=\"direct\";}}// Always record which page the form was filled on\ncaptured[\"form_page\"]=window.location.href.split(\"?\")[0];// Baseline only. The Meta pixel writes _fbc asynchronously after page\n// load, so it is often still missing at mount and meta_click_id would\n// fall back to the raw fbclid. Every send site re-runs\n// withClickIdentifiers, which is idempotent and picks up the real\n// cookie once the pixel has set it.\ntrafficSourceRef.current=withClickIdentifiers(captured);}catch(_){}},[]);// Track form interaction for abandoned form detection\nconst hasSubmittedRef=useRef(false);const isSubmittingRef=useRef(false)// Prevent duplicate submissions\n;const formRef=useRef(form);// ---- Abandonment identity and pixel dedup --------------------------------\n//\n// One stable id for THIS page session's abandonment, generated lazily on\n// first use and reused by every abandonment send afterwards. Both handlers\n// below can fire repeatedly in a single session, and handleVisibilityChange\n// fires on EVERY tab-hide, so a visitor who alt-tabs three times while\n// filling out a 10-step form trips it three times. Every one of those sends\n// has to carry the same id: it is the CRM submission_id, so repeat sends\n// read as one incomplete lead being updated, and it is the pixel event_id,\n// which is the only thing OpenAI deduplicates on.\n//\n// Deliberately NOT useRef(generateSubmissionId()), which would run the\n// generator on every single render and discard the result.\nconst abandonmentIdRef=useRef(null);const getAbandonmentId=()=>{if(abandonmentIdRef.current===null){abandonmentIdRef.current=generateSubmissionId();}return abandonmentIdRef.current;};// The pixel fires AT MOST ONCE per page session, on whichever abandonment\n// path trips first. This guard is intentionally separate from the CRM sends,\n// which stay free to re-send an updated incomplete snapshot on every\n// tab-hide: the CRM wants the latest state of the lead, whereas the ad\n// platform must not be told about the same person more than once.\nconst hasFiredAbandonmentPixelRef=useRef(false);const fireAbandonmentPixelOnce=eventId=>{if(hasFiredAbandonmentPixelRef.current)return;hasFiredAbandonmentPixelRef.current=true;fireAbandonmentPixel(eventId);};// Keep formRef in sync with form state\nuseEffect(()=>{formRef.current=form;},[form]);// Track abandoned forms when user leaves page\nuseEffect(()=>{const handleBeforeUnload=()=>{if(!hasSubmittedRef.current&&Object.keys(formRef.current).length>0&&hasRequiredContactInfo(formRef.current)){// Use sendBeacon for reliable delivery on page unload\nconst abandonmentId=getAbandonmentId();const payload={...transformFormData({...formRef.current,finalizingVenue},abandonmentId),_formStatus:\"abandoned\",_lastCompletedStep:step,_totalSteps:steps.length,_abandonedAt:new Date().toISOString(),...withClickIdentifiers(trafficSourceRef.current)};console.log(\"[Abandoned Form] Page unload - sending data:\",payload);// Send to primary webhook\nnavigator.sendBeacon(WEBHOOK_CONFIG.supabaseWebhook,JSON.stringify(payload));// Also send to secondary webhook\nnavigator.sendBeacon(WEBHOOK_CONFIG.secondaryWebhook,JSON.stringify(payload));// Report the abandonment to the OpenAI Ads pixel. Last, and\n// fully guarded internally, so it can never come between the\n// two beacons above and the closing page.\nfireAbandonmentPixelOnce(abandonmentId);}};// Also track visibility changes (user switches tabs/minimizes)\nconst handleVisibilityChange=()=>{if(document.visibilityState===\"hidden\"&&!hasSubmittedRef.current&&Object.keys(formRef.current).length>0&&hasRequiredContactInfo(formRef.current)){console.log(\"[Incomplete Form] Tab hidden - sending data:\",{...formRef.current,finalizingVenue,step});const abandonmentId=getAbandonmentId();sendIncompleteForm({...formRef.current,finalizingVenue,...withClickIdentifiers(trafficSourceRef.current)},step,abandonmentId);// Fires only the first time this runs, even though this handler\n// itself runs on every tab-hide. See fireAbandonmentPixelOnce.\nfireAbandonmentPixelOnce(abandonmentId);}};window.addEventListener(\"beforeunload\",handleBeforeUnload);document.addEventListener(\"visibilitychange\",handleVisibilityChange);return()=>{window.removeEventListener(\"beforeunload\",handleBeforeUnload);document.removeEventListener(\"visibilitychange\",handleVisibilityChange);};},[step,finalizingVenue]);// isValidEmail now lives at module scope, next to isValidPhone, so the\n// Next-button validation below and the abandonment gate share one rule.\nconst currentStep=steps[step];// Scroll gate for the terms confirmations (Change Request 01). Arms only in the\n// browser and only when IntersectionObserver exists, so without JS or without\n// IO support the boxes stay usable. Unlocks when the end sentinel is visible,\n// including immediately when the panel is short enough not to scroll.\nconst isTermsStep=currentStep?.fields?.some(f=>f.type===\"terms\");useEffect(()=>{if(!isTermsStep||termsScrolledToEnd)return;const root=termsPanelRef.current;const end=termsEndRef.current;if(!root||!end||typeof window===\"undefined\"||typeof window.IntersectionObserver!==\"function\")return;setTermsGateArmed(true);const io=new IntersectionObserver(entries=>{if(entries.some(e=>e.isIntersecting)){setTermsScrolledToEnd(true);setTermsGateArmed(false);io.disconnect();}},{root,threshold:.9});io.observe(end);return()=>io.disconnect();},[isTermsStep,termsScrolledToEnd]);const termsLocked=termsGateArmed&&!termsScrolledToEnd;const isLast=step===steps.length-1;const canBack=step>0;// Check if all required fields in current step have values\nconst canNext=useMemo(()=>{if(submitting||submitted)return false;return currentStep.fields.every(field=>{// Skip conditional fields that shouldn't be shown\nif(field.conditionalOn){const conditionMet=form[field.conditionalOn]===field.conditionalValue;if(!conditionMet)return true// Skip validation for hidden fields\n;}// Optional fields don't need values\nif(!field.required)return true;// Party size can be marked unknown instead of entering a number\nif(currentStep.title===\"Party Size\"&&field.key===\"adults\"&&form.partySizeEstimate===\"Unknown\"){return true;}// Address fields are optional if finalizing venue is checked\nif(currentStep.hasVenueCheckbox&&finalizingVenue){return true;}// For yesno type, check if a selection was made\nif(field.type===\"yesno\"){return form[field.key]===\"Yes\"||form[field.key]===\"No\"||form[field.key]===\"Unsure\";}return form[field.key]&&form[field.key]!==\"\";});},[currentStep,form,submitting,submitted,finalizingVenue]);const handleInput=useCallback((key,inputType)=>e=>{let val=e.target.value;// For phone fields, only allow digits and format\n    if(inputType===\"tel\"){val=val.replace(/\\D/g,\"\").slice(0,10);}// Date inputs need synchronous updates to work properly with native picker\n    if(inputType===\"date\"){setForm(f=>({...f,[key]:val}));}else{startTransition(()=>setForm(f=>({...f,[key]:val})));}},[]);const handleEnumSelect=useCallback((key,option)=>{startTransition(()=>setForm(f=>({...f,[key]:option})));},[]);const handleNext=useCallback(()=>{if(!canNext)return;// Validate email if current step has email field\nconst emailField=currentStep.fields.find(f=>f.type===\"email\");if(emailField&&form[emailField.key]){if(!isValidEmail(form[emailField.key])){setValidationError(\"Please enter a valid email address\");return;}}// Validate phone if current step has tel field\nconst phoneField=currentStep.fields.find(f=>f.type===\"tel\");if(phoneField&&form[phoneField.key]){if(!isValidPhone(form[phoneField.key])){setValidationError(\"Please enter a valid phone number (10 digits required)\");return;}}// Validate date is not in the past\nconst dateField=currentStep.fields.find(f=>f.type===\"date\");if(dateField&&form[dateField.key]){const selectedDate=new Date(form[dateField.key]);const today=new Date;today.setHours(0,0,0,0);if(selectedDate<today){setValidationError(\"Please select a date in the future\");return;}}// Validate number inputs only when user has entered a value\nconst numberFields=currentStep.fields.filter(f=>f.type===\"number\");for(const numberField of numberFields){const rawValue=form[numberField.key];if(rawValue===undefined||rawValue===null||rawValue===\"\"){continue;}const parsedValue=Number(rawValue);if(!Number.isFinite(parsedValue)||parsedValue<0){setValidationError(\"Please enter a valid non-negative number\");return;}}setValidationError(\"\");startTransition(()=>{setStep(s=>s+1);});},[canNext,currentStep,form]);const handleBack=useCallback(()=>{if(!canBack)return;setValidationError(\"\");startTransition(()=>{setStep(s=>s-1);});},[canBack,currentStep,form]);const handleSubmit=useCallback(async()=>{// Hard gate on the two terms confirmations. Disabling the SUBMIT button is\n// not sufficient on its own: a form with a submit button still performs\n// native implicit submission when Enter is pressed inside it, which fires\n// onSubmit while the button is disabled. This check is the real enforcement.\n// Placed before the duplicate-submit refs so a blocked attempt does not\n// latch the form into a permanently unsubmittable state.\nif(termsGateArmed&&!termsScrolledToEnd){setValidationError(\"Please scroll to the end of the terms to continue, then tick both boxes.\");return;}if(!ageAuthority||!termsAgree){const missing=[!ageAuthority&&\"confirm you are at least 18 and have the authority to agree (first box)\",!termsAgree&&\"confirm you have read and agree to the Customer Terms and Conditions (second box)\"].filter(Boolean);setValidationError(`Please ${missing.join(\", and \")}.`);return;}// SYNCHRONOUS duplicate check - must happen before ANY async code\nif(isSubmittingRef.current){console.log(\"[Form] Submission already in progress, blocking duplicate\");return;}if(hasSubmittedRef.current){console.log(\"[Form] Already submitted, blocking duplicate\");return;}// Set refs IMMEDIATELY and SYNCHRONOUSLY before any async operations\nisSubmittingRef.current=true;hasSubmittedRef.current=true;// Now safe to do async state updates\nstartTransition(()=>{setSubmitting(true);setError(\"\");setValidationError(\"\");});// Include venue finalization status and traffic source in form data\nconst submissionData={...form,termsAccepted:TERMS_ACCEPTED_VALUE,finalizingVenue:finalizingVenue,...withClickIdentifiers(trafficSourceRef.current)};// Assent record (spec 6.1/6.2). ip_address is null here on purpose: the\n// browser cannot know its public IP reliably, so the receiving server must\n// stamp it from the request. Label text is read from the DOM so the record\n// holds the sentence the customer actually saw.\nconst submittedAt=new Date().toISOString();const submissionId=generateSubmissionId();const shownText=el=>normaliseLegalText(el?.textContent||\"\");let termsDisplayedSha256=\"\";try{termsDisplayedSha256=await sha256Hex(shownText(termsPanelRef.current));}catch{}const mobile=toE164(form.phone);const customerName=[form.firstName,form.lastName].filter(Boolean).join(\" \");const assentRecord={assent_id:newAssentId(),quote_request_id:submissionId,submitted_at:submittedAt,ip_address:null,user_agent:typeof navigator!==\"undefined\"?navigator.userAgent:\"\",customer:{name:customerName,email:form.email||\"\",phone:mobile||String(form.phone||\"\")},terms:{version:TERMS.version,effective:TERMS.effective,url:TERMS.url,sha256:TERMS.sha256,sha256_displayed:termsDisplayedSha256,sha256_supplied:TERMS.sha256_supplied},privacy_policy:{version:PRIVACY_POLICY.version,effective:PRIVACY_POLICY.effective,url:PRIVACY_POLICY.url,sha256:PRIVACY_POLICY.sha256,sha256_supplied:PRIVACY_POLICY.sha256_supplied},terms_scrolled_to_end:termsScrolledToEnd,...mobile?{sms_service_consent:{mobile,basis:\"number provided on the quote form for this booking\",captured_at:submittedAt}}:{},confirmations:[{id:\"age_authority\",checked:ageAuthority,label_as_displayed:shownText(ageLabelRef.current)||AGE_AUTHORITY_LABEL},{id:\"terms_agree\",checked:termsAgree,label_as_displayed:shownText(termsLabelRef.current)}]};const result=await submitToSupabaseAndSync(submissionData,\"complete\",{_submittedAt:submittedAt,terms_version:TERMS.version,terms_effective:TERMS.effective,privacy_policy_version:PRIVACY_POLICY.version,privacy_policy_effective:PRIVACY_POLICY.effective,assent_record:assentRecord},submissionId);if(!result.success){startTransition(()=>{setError(result.error||\"Submission failed. Please try again.\");setSubmitting(false);});isSubmittingRef.current=false;hasSubmittedRef.current=false;return;}// OpenAI ChatGPT Ads measurement pixel: report the lead.\n// Pure fire-and-forget instrumentation. It runs only after the primary\n// webhook has confirmed the lead landed, is fully guarded, and swallows\n// every error, so it can never delay or block the redirect below.\n// The SDK is loaded by the sitewide head snippet (Site Settings > Custom Code);\n// if that script is missing or blocked, oaiq is simply undefined and this no-ops.\n// event_id reuses the CRM submission_id so a future server-side\n// Conversions API call can deduplicate against this browser event.\n// Two separate measure calls fire here, each in its own try/catch so a\n// failure in one can never suppress or block the other.\nif(typeof window!==\"undefined\"&&typeof window.oaiq===\"function\"){// 1. Standard event, from OpenAI's documented event list.\ntry{window.oaiq(\"measure\",\"lead_created\",{type:\"customer_action\",event_id:result.submissionId});}catch{// A blocked or missing pixel (ad blockers commonly block tracking SDKs)\n// must never break the booking redirect.\n}// 2. Custom conversion action \"quoterequestform\", configured separately\n// by the client in OpenAI Ads Manager and used there for campaign\n// optimization. This is IN ADDITION TO lead_created above, not a\n// replacement: the standard event and the custom conversion action are\n// counted as two different things on OpenAI's side, so both must fire.\n// event_id is carried in the options object as well, which goes beyond\n// the snippet the client supplied, so that this event dedupes against\n// the same CRM submission_id as the standard event.\ntry{window.oaiq(\"measure\",\"custom\",{type:\"custom\"},{custom_event_name:\"quoterequestform\",event_id:result.submissionId});}catch{// Same reasoning as above: instrumentation must never break the\n// booking redirect.\n}}// Hand the identity of this lead to the thank-you page so the optional\n// add-on service question there can be attached to this same person.\n// Both of these run AFTER the webhooks have already succeeded, so nothing\n// here can affect whether the booking was recorded.\npersistSubmissionHandoff(result.submissionId,submissionData);// Only the opaque submission id goes in the URL. See persistSubmissionHandoff.\nconst thankYouUrl=result.submissionId?`/thank-you/?sid=${encodeURIComponent(result.submissionId)}`:\"/thank-you/\";window.location.href=thankYouUrl;},[form,finalizingVenue,ageAuthority,termsAgree,termsScrolledToEnd,termsGateArmed]);const primaryStyles=useMemo(()=>({background:background,color:primary,borderRadius:8,padding:isMobile?16:20,display:\"flex\",flexDirection:\"column\",alignItems:\"stretch\",justifyContent:\"flex-start\",gap:isMobile?14:12,...font,...style,position:\"relative\",boxSizing:\"border-box\"}),[background,primary,font,style,isMobile]);const inputStyles=useMemo(()=>({fontSize:isMobile?16:16,padding:isMobile?\"14px 14px\":\"12px 14px\",borderRadius:6,border:`1px solid ${borderColor}`,outline:\"none\",color:primary,backgroundColor:background,WebkitAppearance:\"none\",MozAppearance:\"none\",appearance:\"none\",width:\"100%\",boxSizing:\"border-box\",minHeight:isMobile?48:44,...font}),[primary,background,borderColor,font,isMobile]);const renderField=field=>{const value=form[field.key]||\"\";// Handle conditional visibility\nif(field.conditionalOn){const conditionMet=form[field.conditionalOn]===field.conditionalValue;if(!conditionMet)return null;}if(field.type===\"string\"||field.type===\"address\"){return /*#__PURE__*/_jsx(\"input\",{id:field.key,name:field.key,type:\"text\",placeholder:field.placeholder,value:value,onChange:handleInput(field.key),style:inputStyles},field.key);}if(field.type===\"email\"){return /*#__PURE__*/_jsx(\"input\",{id:field.key,name:field.key,type:\"email\",placeholder:field.placeholder,value:value,onChange:handleInput(field.key),style:inputStyles},field.key);}if(field.type===\"tel\"){return /*#__PURE__*/_jsx(\"input\",{id:field.key,name:field.key,type:\"tel\",inputMode:\"numeric\",pattern:\"[0-9]*\",maxLength:10,placeholder:field.placeholder,value:value,onChange:handleInput(field.key,\"tel\"),style:inputStyles},field.key);}if(field.type===\"number\"){return /*#__PURE__*/_jsx(\"input\",{id:field.key,name:field.key,type:\"number\",min:\"0\",placeholder:field.placeholder,value:value,onChange:handleInput(field.key),style:inputStyles},field.key);}if(field.type===\"date\"){// Get today's date in YYYY-MM-DD format for min attribute\nconst today=new Date().toISOString().split(\"T\")[0];return /*#__PURE__*/_jsx(\"input\",{id:field.key,name:field.key,type:\"date\",min:today,placeholder:field.placeholder,value:value,onChange:handleInput(field.key,\"date\"),style:inputStyles},field.key);}if(field.type===\"yesno\"){return /*#__PURE__*/_jsxs(\"div\",{style:{display:\"flex\",flexDirection:\"column\",gap:10},children:[/*#__PURE__*/_jsx(\"label\",{style:{fontWeight:600,color:primary,fontSize:isMobile?14:15,...font},children:field.label}),/*#__PURE__*/_jsx(\"div\",{style:{display:\"flex\",gap:isMobile?8:10,flexWrap:\"wrap\"},children:[\"Yes\",\"No\",\"Unsure\"].map(option=>/*#__PURE__*/_jsx(\"button\",{type:\"button\",onClick:()=>handleEnumSelect(field.key,option),style:{padding:isMobile?\"12px 28px\":\"10px 24px\",borderRadius:6,border:value===option?`2px solid ${accent}`:`1px solid ${borderColor}`,background:value===option?accent:background,color:value===option?buttonText:primary,cursor:\"pointer\",fontWeight:500,minHeight:isMobile?44:\"auto\",flex:isMobile?1:\"0 1 auto\",...buttonFont},children:option},option))})]},field.key);}if(field.type===\"enum\"){return /*#__PURE__*/_jsxs(\"div\",{style:{display:\"flex\",flexDirection:\"column\",gap:10},children:[/*#__PURE__*/_jsx(\"label\",{style:{fontWeight:600,color:primary,fontSize:isMobile?14:15,...font},children:field.label}),/*#__PURE__*/_jsx(\"div\",{style:{display:\"flex\",gap:isMobile?8:10,flexWrap:\"wrap\",flexDirection:isMobile&&(field.options?.length||0)>3?\"column\":\"row\"},children:field.options?.map(option=>/*#__PURE__*/_jsx(\"button\",{type:\"button\",onClick:()=>handleEnumSelect(field.key,option),style:{padding:isMobile?\"12px 16px\":\"10px 18px\",borderRadius:6,border:value===option?`2px solid ${accent}`:`1px solid ${borderColor}`,background:value===option?accent:background,color:value===option?buttonText:primary,cursor:\"pointer\",fontWeight:500,flex:isMobile&&(field.options?.length||0)>3?\"none\":\"0 1 auto\",width:isMobile&&(field.options?.length||0)>3?\"100%\":\"auto\",minHeight:isMobile?44:\"auto\",...buttonFont},children:option},option))}),field.helperText&&/*#__PURE__*/_jsx(\"p\",{style:{fontSize:13,color:`${primary}99`,margin:\"4px 0 0 0\",fontStyle:\"italic\",...font},children:field.helperText})]},field.key);}if(field.type===\"terms\"){const checkboxStyle={width:18,height:18,marginTop:3,accentColor:accent,cursor:termsLocked?\"not-allowed\":\"pointer\",flexShrink:0};const rowStyle={display:\"flex\",alignItems:\"flex-start\",gap:10,cursor:termsLocked?\"not-allowed\":\"pointer\",opacity:termsLocked?.55:1,...font};const labelTextStyle={color:primary,fontSize:16,lineHeight:1.5};return /*#__PURE__*/_jsxs(\"div\",{style:{display:\"flex\",flexDirection:\"column\",gap:12},children:[/*#__PURE__*/_jsx(\"style\",{children:LEGAL_CSS}),/*#__PURE__*/_jsxs(\"div\",{ref:termsPanelRef,className:\"hg-legal\",tabIndex:0,role:\"region\",\"aria-label\":`Customer Terms and Conditions, version ${TERMS.version}, effective ${TERMS.effective}`,style:{minHeight:320,maxHeight:\"max(320px, 50vh)\",overflowY:\"auto\",overscrollBehavior:\"contain\",border:`1px solid ${borderColor}`,borderRadius:6,fontSize:16},children:[/*#__PURE__*/_jsx(\"div\",{className:\"wrap\",style:{padding:\"20px 16px\"},dangerouslySetInnerHTML:{__html:TERMS.html}}),/*#__PURE__*/_jsx(\"div\",{ref:termsEndRef,\"aria-hidden\":\"true\",style:{height:1}})]}),termsLocked&&/*#__PURE__*/_jsx(\"div\",{role:\"status\",style:{color:primary,fontSize:15,opacity:.85,...font},children:\"Please scroll to the end of the terms to continue.\"}),/*#__PURE__*/_jsxs(\"fieldset\",{className:\"assent\",style:{border:\"none\",margin:0,padding:0,display:\"flex\",flexDirection:\"column\",gap:12},children:[/*#__PURE__*/_jsx(\"input\",{type:\"hidden\",name:\"terms_version\",value:TERMS.version}),/*#__PURE__*/_jsx(\"input\",{type:\"hidden\",name:\"terms_effective\",value:TERMS.effective}),/*#__PURE__*/_jsxs(\"label\",{style:rowStyle,children:[/*#__PURE__*/_jsx(\"input\",{type:\"checkbox\",name:\"age_authority\",checked:ageAuthority,disabled:termsLocked,\"aria-required\":\"true\",onChange:e=>{setAgeAuthority(e.target.checked);setValidationError(\"\");},style:checkboxStyle}),/*#__PURE__*/_jsx(\"span\",{ref:ageLabelRef,style:labelTextStyle,children:\"I am at least 18 years old and have the authority to agree to these Terms on behalf of myself, my party, and the venue where the event will be held.\"})]}),/*#__PURE__*/_jsxs(\"label\",{style:rowStyle,children:[/*#__PURE__*/_jsx(\"input\",{type:\"checkbox\",name:\"terms_agree\",checked:termsAgree,disabled:termsLocked,\"aria-required\":\"true\",onChange:e=>{setTermsAgree(e.target.checked);setValidationError(\"\");},style:checkboxStyle}),/*#__PURE__*/_jsxs(\"span\",{ref:termsLabelRef,style:labelTextStyle,children:[\"I have read and agree to the\",\" \",/*#__PURE__*/_jsx(\"a\",{href:\"/terms\",target:\"_blank\",rel:\"noopener\",style:{color:accent},children:\"Customer Terms and Conditions\"}),\", including the Assumption of Risk, Limitation of Liability, and No Claims Against Hibachi Guru sections, and the jury waiver and class action waiver in the Governing Law and Dispute Resolution section.\"]})]})]})]},field.key);}return null;};// Render address layout with venue checkbox\nconst renderAddressLayout=()=>{const addressFields=currentStep.fields;return /*#__PURE__*/_jsxs(\"div\",{style:{display:\"flex\",flexDirection:\"column\",gap:10},children:[/*#__PURE__*/_jsxs(\"label\",{style:{display:\"flex\",alignItems:\"center\",gap:10,cursor:\"pointer\",marginBottom:6,...font},children:[/*#__PURE__*/_jsx(\"input\",{type:\"checkbox\",checked:finalizingVenue,onChange:e=>setFinalizingVenue(e.target.checked),style:{width:18,height:18,accentColor:accent,cursor:\"pointer\"}}),/*#__PURE__*/_jsx(\"span\",{style:{color:primary,fontSize:14},children:\"Still finalizing venue (address will be provided later)\"})]}),/*#__PURE__*/_jsxs(\"div\",{style:{opacity:finalizingVenue?.5:1,display:\"flex\",flexDirection:\"column\",gap:10},children:[renderField(addressFields[0]),/*#__PURE__*/_jsxs(\"div\",{style:{display:\"flex\",flexDirection:isMobile?\"column\":\"row\",gap:10},children:[/*#__PURE__*/_jsx(\"div\",{style:{flex:isMobile?\"none\":2,width:isMobile?\"100%\":\"auto\"},children:renderField(addressFields[1])}),/*#__PURE__*/_jsxs(\"div\",{style:{display:\"flex\",gap:10,flex:isMobile?\"none\":2,width:isMobile?\"100%\":\"auto\"},children:[/*#__PURE__*/_jsx(\"div\",{style:{flex:1},children:renderField(addressFields[2])}),/*#__PURE__*/_jsx(\"div\",{style:{flex:1},children:renderField(addressFields[3])})]})]})]})]});};// Render allergies layout with Yes/No and conditional input\nconst renderAllergiesLayout=()=>{const yesNoField=currentStep.fields[0];const detailField=currentStep.fields[1];return /*#__PURE__*/_jsxs(\"div\",{style:{display:\"flex\",flexDirection:\"column\",gap:10},children:[renderField(yesNoField),form[yesNoField.key]===\"Yes\"&&renderField(detailField)]});};if(submitted)return /*#__PURE__*/_jsx(\"div\",{style:primaryStyles,children:/*#__PURE__*/_jsx(\"span\",{style:{fontWeight:600,...font},children:\"Thank you! We'll be in touch soon.\"})});return /*#__PURE__*/_jsxs(\"form\",{autoComplete:\"off\",style:primaryStyles,onSubmit:e=>{e.preventDefault();e.stopPropagation();// Extra guard against double-submit\nif(submitting||hasSubmittedRef.current)return;// Enter-key implicit submission reaches here even when the SUBMIT\n// button is disabled, so re-check step validity before submitting.\nif(!canNext)return;if(isLast)handleSubmit();else handleNext();},\"aria-label\":\"Step by Step Form\",children:[/*#__PURE__*/_jsx(\"style\",{children:`\r\n                form[aria-label=\"Step by Step Form\"] input::placeholder {\r\n                    color: ${placeholderColor};\r\n                    opacity: 1;\r\n                }\r\n                form[aria-label=\"Step by Step Form\"] input[type=\"date\"]::-webkit-calendar-picker-indicator {\r\n                    filter: invert(1);\r\n                    cursor: pointer;\r\n                }\r\n            `}),/*#__PURE__*/_jsx(\"h3\",{style:{fontSize:isMobile?26:32,fontWeight:700,color:primary,margin:0,marginBottom:isMobile?12:16,textAlign:\"center\",...font},children:currentStep.title}),currentStep.layout===\"address\"?renderAddressLayout():currentStep.layout===\"allergies\"?renderAllergiesLayout():currentStep.layout===\"row\"?/*#__PURE__*/_jsx(\"div\",{style:{display:\"flex\",flexDirection:isMobile?\"column\":\"row\",gap:12},children:currentStep.fields.map(field=>/*#__PURE__*/_jsx(\"div\",{style:{flex:isMobile?\"none\":1,width:isMobile?\"100%\":\"auto\"},children:renderField(field)},field.key))}):currentStep.fields.map(field=>renderField(field)),/*#__PURE__*/_jsxs(\"div\",{style:{display:\"flex\",flexDirection:isMobile&&canBack?\"column-reverse\":\"row\",justifyContent:canBack?\"space-between\":\"flex-end\",alignItems:isMobile?\"stretch\":\"center\",gap:isMobile?8:10,marginTop:6},children:[canBack&&/*#__PURE__*/_jsx(\"button\",{type:\"button\",onClick:handleBack,disabled:submitting,style:{padding:isMobile?\"10px 20px\":\"12px 24px\",borderRadius:50,border:\"none\",background:\"transparent\",color:primary,cursor:\"pointer\",fontWeight:500,textAlign:\"center\",...buttonFont},children:\"← BACK\"}),/*#__PURE__*/_jsxs(\"button\",{type:isLast?\"submit\":\"button\",onClick:isLast?undefined:handleNext,disabled:!canNext||submitting||isLast&&hasSubmittedRef.current,style:{padding:isMobile?\"14px 20px\":\"12px 24px\",borderRadius:50,border:\"none\",background:canNext?buttonBackground:disabledButtonBackground,color:buttonText,cursor:canNext?\"pointer\":\"not-allowed\",fontWeight:600,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",gap:6,width:isMobile?\"100%\":\"auto\",...buttonFont},children:[isLast?submitting?\"SENDING...\":\"SUBMIT\":\"NEXT\",/*#__PURE__*/_jsx(\"span\",{style:{fontSize:16},children:\"→\"})]})]}),!!error&&/*#__PURE__*/_jsx(\"div\",{style:{color:\"#E84C3D\",marginTop:6,fontSize:14},children:error}),!!validationError&&/*#__PURE__*/_jsx(\"div\",{style:{color:\"#E84C3D\",marginTop:6,fontSize:14},children:validationError}),/*#__PURE__*/_jsxs(\"div\",{style:{fontSize:12,color:`${primary}99`,marginTop:6,textAlign:\"center\"},children:[\"Step \",step+1,\" of \",steps.length]})]});}addPropertyControls(StepByStepForm,{background:{type:ControlType.Color,title:\"Background\",defaultValue:\"#000000\"},primary:{type:ControlType.Color,title:\"Text Color\",defaultValue:\"#FFFFFF\"},accent:{type:ControlType.Color,title:\"Accent\",defaultValue:\"#FF6B00\"},buttonBackground:{type:ControlType.Color,title:\"Button Background\",defaultValue:\"#FF6B00\"},disabledButtonBackground:{type:ControlType.Color,title:\"Disabled Button\",defaultValue:\"#B34700\"},buttonText:{type:ControlType.Color,title:\"Button Text\",defaultValue:\"#FFFFFF\"},placeholderColor:{type:ControlType.Color,title:\"Placeholder\",defaultValue:\"#999999\"},borderColor:{type:ControlType.Color,title:\"Border Color\",defaultValue:\"#4D4D4D\"},font:{type:ControlType.Font,title:\"Font\",controls:\"extended\",defaultFontType:\"sans-serif\"},buttonFont:{type:ControlType.Font,title:\"Button Font\",controls:\"extended\",defaultFontType:\"sans-serif\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"StepByStepForm\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerIntrinsicWidth\":\"400\",\"framerSupportedLayoutHeight\":\"any-prefer-fixed\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerIntrinsicHeight\":\"460\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./StepByStepForm.map"],"mappings":"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"}