{"id":881,"date":"2026-07-10T11:30:47","date_gmt":"2026-07-10T15:30:47","guid":{"rendered":"https:\/\/tplei.com\/?page_id=881"},"modified":"2026-07-14T15:01:41","modified_gmt":"2026-07-14T19:01:41","slug":"events-2","status":"publish","type":"page","link":"https:\/\/tplei.com\/?page_id=881","title":{"rendered":"Private Parties"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"881\" class=\"elementor elementor-881\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-eca848b e-flex e-con-boxed e-con e-parent\" data-id=\"eca848b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-726322b elementor-widget elementor-widget-heading\" data-id=\"726322b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Private Parties<\/h1>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f129927 e-con e-atomic-element e-flexbox-base e-dcb6069 \" data-id=\"f129927\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"f129927\" data-e-type=\"e-flexbox\" data-id=\"f129927\">\n    \t\t<div class=\"elementor-element elementor-element-4c28e07 elementor-widget elementor-widget-heading\" data-id=\"4c28e07\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">From birthdays and bachelor parties to corporate outings and retirement celebrations, we'll help you create a memorable event at The Perfect Lie Golf Bar. Customize your experience with simulator time, decorating, food, desserts, and more.<\/h3>\t\t\t\t<\/div>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-c08fe41 e-flex e-con-boxed e-con e-parent\" data-id=\"c08fe41\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0bf8d60 elementor-widget elementor-widget-html\" data-id=\"0bf8d60\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div id=\"tpl-event-form\">\n  <style>\n    #tpl-event-form {\n      --tpl-navy: #12353b;\n      --tpl-teal: #1f6f6d;\n      --tpl-aqua: #76c7bd;\n      --tpl-orange: #e9783f;\n      --tpl-sand: #f7efe2;\n      --tpl-white: #ffffff;\n      --tpl-muted: #6b6b6b;\n      --tpl-border: #d9d0c2;\n      --tpl-soft-teal: #effaf8;\n      font-family: inherit;\n      color: var(--tpl-navy);\n      max-width: 980px;\n      margin: 0 auto;\n    }\n\n    #tpl-event-form * { box-sizing: border-box; }\n\n    .tpl-planner-hero,\n    .tpl-step-card {\n      background: var(--tpl-sand);\n      border: 1px solid var(--tpl-border);\n      border-radius: 18px;\n      padding: 22px;\n      margin-bottom: 16px;\n      box-shadow: 0 6px 18px rgba(0,0,0,.05);\n    }\n\n    .tpl-planner-hero { text-align: center; padding: 28px 22px; }\n    .tpl-eyebrow {\n      margin: 0 0 7px;\n      color: var(--tpl-orange);\n      font-size: 12px;\n      font-weight: 900;\n      letter-spacing: .12em;\n      text-transform: uppercase;\n    }\n\n    .tpl-form-title {\n      margin: 0 0 9px;\n      font-size: 34px;\n      line-height: 1.08;\n      color: var(--tpl-navy);\n    }\n\n    .tpl-form-intro {\n      margin: 0 auto;\n      max-width: 720px;\n      color: var(--tpl-muted);\n      font-size: 16px;\n      line-height: 1.55;\n    }\n\n    .tpl-step-heading {\n      display: flex;\n      align-items: flex-start;\n      gap: 12px;\n      margin-bottom: 15px;\n    }\n\n    .tpl-step-number {\n      flex: 0 0 34px;\n      width: 34px;\n      height: 34px;\n      border-radius: 999px;\n      display: grid;\n      place-items: center;\n      background: var(--tpl-teal);\n      color: #fff;\n      font-weight: 900;\n      font-size: 14px;\n    }\n\n    .tpl-step-copy h3 {\n      margin: 0 0 3px;\n      color: var(--tpl-navy);\n      font-size: 22px;\n      line-height: 1.2;\n    }\n\n    .tpl-step-copy p {\n      margin: 0;\n      color: var(--tpl-muted);\n      font-size: 13px;\n      line-height: 1.45;\n    }\n\n    .tpl-subsection {\n      margin-top: 18px;\n      padding-top: 18px;\n      border-top: 1px solid var(--tpl-border);\n    }\n\n    .tpl-subsection:first-of-type {\n      margin-top: 0;\n      padding-top: 0;\n      border-top: 0;\n    }\n\n    .tpl-subtitle {\n      margin: 0 0 9px;\n      font-size: 17px;\n      color: var(--tpl-navy);\n    }\n\n    .tpl-note {\n      font-size: 13px;\n      color: var(--tpl-muted);\n      margin: 8px 0 0;\n      line-height: 1.45;\n    }\n\n    .tpl-note a {\n      color: var(--tpl-teal);\n      font-weight: 800;\n    }\n\n    .tpl-grid {\n      display: grid;\n      grid-template-columns: repeat(2, minmax(0, 1fr));\n      gap: 12px;\n    }\n\n    .tpl-field {\n      display: flex;\n      flex-direction: column;\n      gap: 5px;\n    }\n\n    .tpl-field label,\n    .tpl-mini-label {\n      font-size: 13px;\n      font-weight: 800;\n      color: var(--tpl-navy);\n    }\n\n    .tpl-field input,\n    .tpl-field select,\n    .tpl-field textarea {\n      width: 100%;\n      border: 1px solid var(--tpl-border);\n      border-radius: 12px;\n      padding: 11px 12px;\n      font-size: 15px;\n      background: #fff;\n      color: var(--tpl-navy);\n      font-family: inherit;\n    }\n\n    .tpl-field textarea {\n      min-height: 90px;\n      resize: vertical;\n    }\n\n    .tpl-option-grid {\n      display: grid;\n      grid-template-columns: repeat(2, minmax(0, 1fr));\n      gap: 10px;\n    }\n\n    .tpl-option-grid.three {\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n    }\n\n    #tpl-event-form button.tpl-option {\n      appearance: none;\n      width: 100%;\n      border: 2px solid var(--tpl-border) !important;\n      background: #fff !important;\n      background-image: none !important;\n      color: var(--tpl-navy) !important;\n      border-radius: 15px;\n      padding: 13px;\n      cursor: pointer;\n      transition: transform .18s ease, border-color .18s ease, box-shadow .18s ease;\n      min-height: 88px;\n      text-align: left;\n      font-family: inherit;\n      outline: none !important;\n    }\n\n    #tpl-event-form button.tpl-option:hover,\n    #tpl-event-form button.tpl-option:focus,\n    #tpl-event-form button.tpl-option:active {\n      transform: translateY(-2px);\n      border-color: var(--tpl-aqua) !important;\n      background: #fff !important;\n      color: var(--tpl-navy) !important;\n    }\n\n    #tpl-event-form button.tpl-option.selected,\n    #tpl-event-form button.tpl-option.selected:hover {\n      border-color: var(--tpl-teal) !important;\n      background: var(--tpl-soft-teal) !important;\n      box-shadow: 0 6px 14px rgba(31,111,109,.14);\n    }\n\n    .tpl-option-title {\n      display: block;\n      font-weight: 900;\n      font-size: 15px;\n      margin-bottom: 4px;\n      color: var(--tpl-navy) !important;\n    }\n\n    .tpl-option-meta {\n      display: block;\n      font-size: 13px;\n      color: var(--tpl-muted) !important;\n      line-height: 1.35;\n    }\n\n    .tpl-option-price {\n      display: block;\n      margin-top: 8px;\n      font-weight: 900;\n      color: var(--tpl-teal) !important;\n      font-size: 14px;\n    }\n\n    .tpl-reveal-box,\n    .tpl-recommendation {\n      margin-top: 13px;\n      padding: 15px;\n      border: 1px solid var(--tpl-border);\n      border-radius: 15px;\n      background: #fff;\n    }\n\n    .tpl-recommendation {\n      background: var(--tpl-soft-teal);\n      border-color: var(--tpl-aqua);\n      font-size: 13px;\n      line-height: 1.45;\n    }\n\n    .tpl-recommendation strong { color: var(--tpl-teal); }\n\n    .tpl-flavor-grid {\n      margin-top: 12px;\n      padding: 12px;\n      background: var(--tpl-sand);\n      border-radius: 12px;\n      display: grid;\n      grid-template-columns: repeat(2, minmax(0, 1fr));\n      gap: 8px 12px;\n    }\n\n    .tpl-flavor-grid label {\n      display: flex;\n      align-items: center;\n      gap: 7px;\n      font-size: 13px;\n      font-weight: 700;\n      color: var(--tpl-navy);\n    }\n\n    .tpl-flavor-grid input { accent-color: var(--tpl-teal); }\n\n    .tpl-external-box {\n      margin-top: 14px;\n      padding-top: 14px;\n      border-top: 1px solid var(--tpl-border);\n    }\n\n    .tpl-consent {\n      display: flex;\n      gap: 9px;\n      align-items: flex-start;\n      font-size: 13px;\n      color: var(--tpl-muted);\n      line-height: 1.4;\n      margin-top: 12px;\n    }\n\n    .tpl-consent input { margin-top: 2px; }\n\n    .tpl-hidden { display: none !important; }\n\n    .tpl-estimate {\n      position: fixed;\n      right: 20px;\n      bottom: 20px;\n      z-index: 9999;\n    \n      width: 250px;\n      max-width: calc(100vw - 40px);\n    \n      margin: 0;\n      padding: 14px 16px;\n    \n      border-radius: 16px;\n      background: var(--tpl-navy);\n      color: #fff;\n      box-shadow: 0 8px 22px rgba(0,0,0,.22);\n    }\n    \n    @media (max-width: 760px) {\n      .tpl-estimate {\n        position: relative;\n        right: auto;\n        bottom: auto;\n        width: 100%;\n        max-width: none;\n        margin-top: 18px;\n      }\n    \n      .tpl-estimate.is-minimized {\n        width: 100%;\n        max-width: none;\n      }\n    }\n \n    .tpl-estimate h3 {\n      margin: 0 36px 8px 0;\n      color: #fff;\n      font-size: 17px;\n    }\n\n    .tpl-estimate-toggle {\n      position: absolute;\n      top: 10px;\n      right: 12px;\n      width: 28px;\n      height: 28px;\n      border: 0;\n      border-radius: 999px;\n      background: #fff;\n      color: var(--tpl-navy);\n      font-size: 20px;\n      line-height: 1;\n      cursor: pointer;\n      font-weight: 900;\n    }\n\n    .tpl-line-items {\n      border-top: 1px solid rgba(255,255,255,.18);\n      border-bottom: 1px solid rgba(255,255,255,.18);\n      padding: 6px 0;\n      margin-bottom: 8px;\n      max-height: 130px;\n      overflow-y: auto;\n    }\n\n    .tpl-line,\n    .tpl-total-row,\n    .tpl-deposit-row {\n      display: flex;\n      justify-content: space-between;\n      gap: 10px;\n    }\n\n    .tpl-line {\n      font-size: 12px;\n      padding: 3px 0;\n    }\n\n    .tpl-line span:last-child { font-weight: 900; white-space: nowrap; }\n\n    .tpl-total-row {\n      font-size: 17px;\n      font-weight: 900;\n      margin: 4px 0;\n    }\n\n    .tpl-deposit-row {\n      font-size: 13px;\n      font-weight: 800;\n      color: #a8fff4;\n    }\n\n    .tpl-submit {\n      width: 100%;\n      border: 0;\n      border-radius: 11px;\n      background: var(--tpl-orange);\n      color: #fff;\n      font-size: 14px;\n      font-weight: 900;\n      padding: 11px 14px;\n      margin-top: 10px;\n      cursor: pointer;\n      font-family: inherit;\n    }\n\n    .tpl-secondary-submit { background: var(--tpl-teal); }\n\n    .tpl-small-white {\n      color: rgba(255,255,255,.72);\n      font-size: 10.5px;\n      line-height: 1.35;\n      margin: 7px 0 0;\n    }\n\n    .tpl-estimate.is-minimized {\n      width: auto;\n      min-width: 220px;\n      max-width: 280px;\n      padding: 12px 42px 12px 14px;\n    }\n\n    .tpl-estimate.is-minimized .tpl-line-items,\n    .tpl-estimate.is-minimized .tpl-deposit-row,\n    .tpl-estimate.is-minimized .tpl-submit,\n    .tpl-estimate.is-minimized .tpl-small-white {\n      display: none !important;\n    }\n\n    .tpl-estimate.is-minimized h3 { margin: 0; font-size: 15px; }\n    .tpl-estimate.is-minimized .tpl-total-row { display: block; font-size: 15px; margin: 4px 0 0; }\n    .tpl-estimate.is-minimized .tpl-total-row span { display: block; }\n    .tpl-estimate.is-minimized #tpl-total { font-size: 22px; }\n\n    @media (max-width: 760px) {\n      .tpl-grid,\n      .tpl-option-grid,\n      .tpl-option-grid.three,\n      .tpl-flavor-grid {\n        grid-template-columns: 1fr;\n      }\n\n      .tpl-form-title { font-size: 27px; }\n      .tpl-estimate { position: relative; bottom: auto; width: 100%; }\n      .tpl-estimate.is-minimized { width: 100%; max-width: none; }\n    }\n\n\n    \/* Final workflow overrides *\/\n    #tpl-event-form {\n      padding-bottom: 160px;\n    }\n\n    #tpl-event-form button.tpl-option:hover,\n    #tpl-event-form button.tpl-option:focus,\n    #tpl-event-form button.tpl-option:active {\n      background: var(--tpl-soft-teal) !important;\n      color: var(--tpl-navy) !important;\n      border-color: var(--tpl-aqua) !important;\n    }\n\n    .tpl-bay-recommendation-card {\n      margin: 0 0 12px;\n      padding: 15px;\n      border: 1px solid var(--tpl-aqua);\n      border-radius: 15px;\n      background: var(--tpl-soft-teal);\n      font-size: 13px;\n      line-height: 1.45;\n    }\n\n    .tpl-bay-recommendation-card strong {\n      color: var(--tpl-teal);\n    }\n\n    .tpl-estimate {\n      position: fixed !important;\n      right: 20px !important;\n      bottom: 20px !important;\n      width: 300px;\n      max-width: calc(100vw - 40px);\n    }\n\n    .tpl-estimate.is-minimized {\n      width: auto;\n      min-width: 220px;\n      max-width: 280px;\n    }\n\n    @media (max-width: 760px) {\n      #tpl-event-form {\n        padding-bottom: 120px;\n      }\n\n      .tpl-estimate,\n      .tpl-estimate.is-minimized {\n        position: fixed !important;\n        right: 12px !important;\n        bottom: 12px !important;\n        width: 300px;\n        max-width: calc(100vw - 24px);\n      }\n    }\n  <\/style>\n\n  <div class=\"tpl-planner-hero\">\n    <p class=\"tpl-eyebrow\">Private Events at The Perfect Lie<\/p>\n    <h2 class=\"tpl-form-title\">Build Your Event, Step by Step<\/h2>\n    <p class=\"tpl-form-intro\">\n      Start with the basics, choose your simulator space, then personalize the celebration with decorating, food, desserts, beverages, and optional transportation.\n    <\/p>\n  <\/div>\n\n  <div class=\"tpl-step-card\">\n    <div class=\"tpl-step-heading\">\n      <span class=\"tpl-step-number\">1<\/span>\n      <div class=\"tpl-step-copy\">\n        <h3>Tell Us About Your Event<\/h3>\n        <p>Give us the key details so recommendations and pricing can adjust to your group.<\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"tpl-grid\">\n      <div class=\"tpl-field\">\n        <label for=\"tpl-name\">Name<\/label>\n        <input id=\"tpl-name\" type=\"text\" placeholder=\"Your name\">\n      <\/div>\n      <div class=\"tpl-field\">\n        <label for=\"tpl-email\">Email<\/label>\n        <input id=\"tpl-email\" type=\"email\" placeholder=\"you@example.com\">\n      <\/div>\n      <div class=\"tpl-field\">\n        <label for=\"tpl-phone\">Phone<\/label>\n        <input id=\"tpl-phone\" type=\"tel\" placeholder=\"Phone number\">\n      <\/div>\n      <div class=\"tpl-field\">\n        <label for=\"tpl-event-type\">Event Type<\/label>\n        <select id=\"tpl-event-type\">\n          <option value=\"\">Select one<\/option>\n          <option>Birthday Party<\/option>\n          <option>Bachelor \/ Bachelorette Party<\/option>\n          <option>Team Outing<\/option>\n          <option>Corporate \/ Client Event<\/option>\n          <option>Retirement Party<\/option>\n          <option>Private Celebration<\/option>\n          <option>Other<\/option>\n        <\/select>\n      <\/div>\n      <div class=\"tpl-field\">\n        <label for=\"tpl-date\">Preferred Date<\/label>\n        <input id=\"tpl-date\" type=\"date\">\n      <\/div>\n      <div class=\"tpl-field\">\n        <label for=\"tpl-time\">Preferred Start Time<\/label>\n        <input id=\"tpl-time\" type=\"time\">\n      <\/div>\n      <div class=\"tpl-field\">\n        <label for=\"tpl-guests\">Guest Count<\/label>\n        <input id=\"tpl-guests\" type=\"number\" min=\"1\" max=\"80\" value=\"8\">\n      <\/div>\n      <div class=\"tpl-field\">\n        <label for=\"tpl-hours\">Event Length<\/label>\n        <select id=\"tpl-hours\">\n          <option value=\"2\">2 hours<\/option>\n          <option value=\"3\">3 hours<\/option>\n          <option value=\"4\">4 hours<\/option>\n          <option value=\"5\">5 hours<\/option>\n        <\/select>\n      <\/div>\n    <\/div>\n\n    <p class=\"tpl-note\">\n      Custom event requests require at least 96 hours\u2019 notice so we can confirm availability with local partners.\n    <\/p>\n  <\/div>\n\n  <div class=\"tpl-step-card\">\n    <div class=\"tpl-step-heading\">\n      <span class=\"tpl-step-number\">2<\/span>\n      <div class=\"tpl-step-copy\">\n        <h3>Choose Your Space<\/h3>\n        <p>Select the simulator setup that best fits your group.<\/p>\n      <\/div>\n    <\/div>\n\n    <div id=\"tpl-bay-recommendation\" class=\"tpl-bay-recommendation-card\">\n      <strong>Recommendation<\/strong><br>\n      We recommend 4\u20136 golfers per bay.\n    <\/div>\n\n    <div class=\"tpl-option-grid\">\n      <button type=\"button\" class=\"tpl-option selected\" data-group=\"bay\" data-id=\"oneBay\" data-label=\"1 Bay\" data-price=\"50\">\n        <span class=\"tpl-option-title\">1 Bay<\/span>\n        <span class=\"tpl-option-meta\">Great for smaller groups<\/span>\n        <span class=\"tpl-option-price\">$50\/hour<\/span>\n      <\/button>\n      <button type=\"button\" class=\"tpl-option\" data-group=\"bay\" data-id=\"bothBays\" data-label=\"Both Bays\" data-price=\"95\">\n        <span class=\"tpl-option-title\">Both Bays<\/span>\n        <span class=\"tpl-option-meta\">Best for parties and private groups<\/span>\n        <span class=\"tpl-option-price\">$95\/hour<\/span>\n      <\/button>\n    <\/div>\n  <\/div>\n\n  <div class=\"tpl-step-card\">\n    <div class=\"tpl-step-heading\">\n      <span class=\"tpl-step-number\">3<\/span>\n      <div class=\"tpl-step-copy\">\n        <h3>Set the Scene<\/h3>\n        <p>Keep it simple or add decorations that match the celebration.<\/p>\n      <\/div>\n    <\/div>\n\n    <p class=\"tpl-note\" style=\"margin-bottom:12px;\">\n      Decorating services are provided by\n      <a href=\"https:\/\/www.facebook.com\/profile.php?id=61589200585188\" target=\"_blank\" rel=\"noopener\">The Confetti Co.<\/a>\n    <\/p>\n\n    <div class=\"tpl-option-grid\">\n      <button type=\"button\" class=\"tpl-option selected\" data-group=\"decorating\" data-id=\"noDecoration\" data-label=\"No Decoration\" data-none=\"true\">\n        <span class=\"tpl-option-title\">No Decoration<\/span>\n        <span class=\"tpl-option-meta\">Skip this add-on<\/span>\n        <span class=\"tpl-option-price\">$0<\/span>\n      <\/button>\n      <button type=\"button\" class=\"tpl-option\" data-group=\"decorating\" data-id=\"bannerOnly\" data-label=\"Custom 3' x 5' Hand-Painted Banner\" data-price=\"50\" data-decor-type=\"banner\">\n        <span class=\"tpl-option-title\">Hand-Painted Banner<\/span>\n        <span class=\"tpl-option-meta\">Custom 3' x 5' banner only<\/span>\n        <span class=\"tpl-option-price\">$50<\/span>\n      <\/button>\n      <button type=\"button\" class=\"tpl-option\" data-group=\"decorating\" data-id=\"partyReady\" data-label=\"Party Ready Decorating Package\" data-price=\"40\" data-decor-type=\"tier\">\n        <span class=\"tpl-option-title\">Party Ready<\/span>\n        <span class=\"tpl-option-meta\">Tableware + standard balloon display<\/span>\n        <span class=\"tpl-option-price\">$40<\/span>\n      <\/button>\n      <button type=\"button\" class=\"tpl-option\" data-group=\"decorating\" data-id=\"partyPlus\" data-label=\"Party Plus Decorating Package\" data-price=\"60\" data-decor-type=\"tier\">\n        <span class=\"tpl-option-title\">Party Plus<\/span>\n        <span class=\"tpl-option-meta\">Tableware + upgraded 6-foot balloon display<\/span>\n        <span class=\"tpl-option-price\">$60<\/span>\n      <\/button>\n      <button type=\"button\" class=\"tpl-option\" data-group=\"decorating\" data-id=\"partyCustom\" data-label=\"Party Custom Decorating Package\" data-price=\"120\" data-decor-type=\"tier\" data-includes-banner=\"true\">\n        <span class=\"tpl-option-title\">Party Custom<\/span>\n        <span class=\"tpl-option-meta\">Party Plus + custom 3' x 5' hand-painted banner<\/span>\n        <span class=\"tpl-option-price\">$120<\/span>\n      <\/button>\n    <\/div>\n\n    <p id=\"tpl-decor-note\" class=\"tpl-note\">\n      Party Custom includes the hand-painted banner, so the standalone banner will be removed if Party Custom is selected.\n    <\/p>\n\n    <div id=\"tpl-banner-contact-note\" class=\"tpl-recommendation tpl-hidden\">\n      <strong>Custom Banner Design<\/strong><br>\n      If your event includes a hand-painted banner, a representative from\n      <a href=\"https:\/\/www.facebook.com\/profile.php?id=61589200585188\" target=\"_blank\" rel=\"noopener\">The Confetti Co.<\/a>\n      will contact you directly after your request is received to discuss colors, wording, artwork, and theme details.\n    <\/div>\n  <\/div>\n\n  <div class=\"tpl-step-card\">\n    <div class=\"tpl-step-heading\">\n      <span class=\"tpl-step-number\">4<\/span>\n      <div class=\"tpl-step-copy\">\n        <h3>Add Food & Desserts<\/h3>\n        <p>Choose only what works for your group. Each category is optional.<\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"tpl-subsection\">\n      <h4 class=\"tpl-subtitle\">Charcuterie by Coastal Grazes<\/h4>\n      <div class=\"tpl-option-grid\">\n        <button type=\"button\" class=\"tpl-option selected\" data-group=\"charcuterie\" data-id=\"noCharcuterie\" data-label=\"No Charcuterie\" data-none=\"true\">\n          <span class=\"tpl-option-title\">No Charcuterie<\/span>\n          <span class=\"tpl-option-meta\">Skip this add-on<\/span>\n          <span class=\"tpl-option-price\">$0<\/span>\n        <\/button>\n        <button type=\"button\" class=\"tpl-option\" data-group=\"charcuterie\" data-id=\"charcuterieBoxes\" data-label=\"Coastal Grazes Charcuterie Boxes\">\n          <span class=\"tpl-option-title\">Charcuterie Boxes<\/span>\n          <span class=\"tpl-option-meta\">Build an order using small, medium, or large boxes<\/span>\n          <span class=\"tpl-option-price\">Starting at $55 + tax<\/span>\n        <\/button>\n      <\/div>\n\n      <div id=\"tpl-charcuterie-recommendation\" class=\"tpl-recommendation tpl-hidden\"><\/div>\n\n      <div id=\"tpl-charcuterie-builder\" class=\"tpl-reveal-box tpl-hidden\">\n        <h4 class=\"tpl-subtitle\">Build Your Charcuterie Order<\/h4>\n        <div class=\"tpl-grid\">\n          <div class=\"tpl-field\">\n            <label for=\"tpl-charcuterie-small\">Small Box \u00b7 Feeds 2\u20133<\/label>\n            <select id=\"tpl-charcuterie-small\">\n              <option value=\"0\">0 boxes<\/option><option value=\"1\">1 box \u2014 $55<\/option><option value=\"2\">2 boxes \u2014 $110<\/option><option value=\"3\">3 boxes \u2014 $165<\/option><option value=\"4\">4 boxes \u2014 $220<\/option><option value=\"5\">5 boxes \u2014 $275<\/option><option value=\"6\">6 boxes \u2014 $330<\/option>\n            <\/select>\n          <\/div>\n          <div class=\"tpl-field\">\n            <label for=\"tpl-charcuterie-medium\">Medium Box \u00b7 Feeds 4\u20138<\/label>\n            <select id=\"tpl-charcuterie-medium\">\n              <option value=\"0\">0 boxes<\/option><option value=\"1\">1 box \u2014 $85<\/option><option value=\"2\">2 boxes \u2014 $170<\/option><option value=\"3\">3 boxes \u2014 $255<\/option><option value=\"4\">4 boxes \u2014 $340<\/option><option value=\"5\">5 boxes \u2014 $425<\/option><option value=\"6\">6 boxes \u2014 $510<\/option>\n            <\/select>\n          <\/div>\n          <div class=\"tpl-field\">\n            <label for=\"tpl-charcuterie-large\">Large Box \u00b7 Feeds 8\u201310<\/label>\n            <select id=\"tpl-charcuterie-large\">\n              <option value=\"0\">0 boxes<\/option><option value=\"1\">1 box \u2014 $150<\/option><option value=\"2\">2 boxes \u2014 $300<\/option><option value=\"3\">3 boxes \u2014 $450<\/option><option value=\"4\">4 boxes \u2014 $600<\/option><option value=\"5\">5 boxes \u2014 $750<\/option><option value=\"6\">6 boxes \u2014 $900<\/option>\n            <\/select>\n          <\/div>\n        <\/div>\n        <p class=\"tpl-note\">The recommendation is only a guide. Your estimate uses the quantities you select.<\/p>\n      <\/div>\n\n      <div class=\"tpl-external-box\">\n        <button type=\"button\" class=\"tpl-option\" data-group=\"charcuterie\" data-id=\"customCharcuterie\" data-label=\"Custom Charcuterie Board\" data-external=\"true\" data-quote=\"true\" data-external-url=\"https:\/\/coastalgrazes.com\">\n          <span class=\"tpl-option-title\">Custom Charcuterie Board<\/span>\n          <span class=\"tpl-option-meta\">Custom displays, grazing tables, or specialty boards<\/span>\n          <span class=\"tpl-option-price\">Order directly through Coastal Grazes<\/span>\n        <\/button>\n        <p class=\"tpl-note\">Custom boards are ordered at <a href=\"https:\/\/coastalgrazes.com\" target=\"_blank\" rel=\"noopener\">coastalgrazes.com<\/a> and are not included in this estimate.<\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"tpl-subsection\">\n      <h4 class=\"tpl-subtitle\">Cake by Jiggle Bellies Bakery<\/h4>\n      <div class=\"tpl-option-grid\">\n        <button type=\"button\" class=\"tpl-option selected\" data-group=\"cake\" data-id=\"noCake\" data-label=\"No Cake\" data-none=\"true\">\n          <span class=\"tpl-option-title\">No Cake<\/span><span class=\"tpl-option-meta\">Skip this add-on<\/span><span class=\"tpl-option-price\">$0<\/span>\n        <\/button>\n        <button type=\"button\" class=\"tpl-option\" data-group=\"cake\" data-id=\"cake4\" data-label='4\u201d Standard Cake' data-price=\"55\">\n          <span class=\"tpl-option-title\">4\u201d Standard Cake<\/span><span class=\"tpl-option-meta\">Serves 4\u20138<\/span><span class=\"tpl-option-price\">$55<\/span>\n        <\/button>\n        <button type=\"button\" class=\"tpl-option\" data-group=\"cake\" data-id=\"cake6\" data-label='6\u201d Standard Cake' data-price=\"65\">\n          <span class=\"tpl-option-title\">6\u201d Standard Cake<\/span><span class=\"tpl-option-meta\">Serves 12\u201316<\/span><span class=\"tpl-option-price\">$65<\/span>\n        <\/button>\n        <button type=\"button\" class=\"tpl-option\" data-group=\"cake\" data-id=\"cake8\" data-label='8\u201d Standard Cake' data-price=\"85\">\n          <span class=\"tpl-option-title\">8\u201d Standard Cake<\/span><span class=\"tpl-option-meta\">Serves 16\u201326<\/span><span class=\"tpl-option-price\">$85<\/span>\n        <\/button>\n        <button type=\"button\" class=\"tpl-option\" data-group=\"cake\" data-id=\"customCake\" data-label=\"Custom Cake \u2014 Ordered Directly Through Jiggle Bellies Bakery\" data-external=\"true\" data-quote=\"true\" data-external-url=\"https:\/\/www.jigglebelliesbakery.com\/\">\n          <span class=\"tpl-option-title\">Custom Cake<\/span><span class=\"tpl-option-meta\">Special themes, designs, or larger custom cakes<\/span><span class=\"tpl-option-price\">Contact Jiggle Bellies Bakery for a quote<\/span>\n        <\/button>\n      <\/div>\n\n      <div id=\"tpl-standard-cake-fields\" class=\"tpl-grid tpl-hidden\" style=\"margin-top:14px;\">\n        <div class=\"tpl-field\"><label for=\"tpl-cake-flavor\">Cake Flavor<\/label><select id=\"tpl-cake-flavor\"><option value=\"\">Select one<\/option><option>Chocolate<\/option><option>Vanilla<\/option><\/select><\/div>\n        <div class=\"tpl-field\"><label for=\"tpl-buttercream\">Buttercream<\/label><select id=\"tpl-buttercream\"><option value=\"\">Select one<\/option><option>Chocolate<\/option><option>Vanilla<\/option><\/select><\/div>\n        <div class=\"tpl-field\"><label for=\"tpl-cake-message\">Cake Message<\/label><input id=\"tpl-cake-message\" type=\"text\" placeholder=\"Happy Birthday, name, etc.\"><\/div>\n        <div class=\"tpl-field\"><label for=\"tpl-message-color\">Message Color<\/label><input id=\"tpl-message-color\" type=\"text\" placeholder=\"Example: teal, blue, pink\"><\/div>\n      <\/div>\n\n      <p class=\"tpl-note\">Standard cakes are four-layer chocolate or vanilla cakes with chocolate or vanilla buttercream and a message in one color. Custom cakes are ordered directly at <a href=\"https:\/\/www.jigglebelliesbakery.com\/\" target=\"_blank\" rel=\"noopener\">Jiggle Bellies Bakery<\/a> and are not included in this estimate.<\/p>\n    <\/div>\n\n    <div class=\"tpl-subsection\">\n      <h4 class=\"tpl-subtitle\">Cookie Platters<\/h4>\n      <p class=\"tpl-note\" style=\"margin-bottom:10px;\">2 oz cookies \u00b7 $18\/dozen \u00b7 Suggested quantity is 3 cookies per guest.<\/p>\n\n      <div class=\"tpl-option-grid\">\n        <button type=\"button\" class=\"tpl-option selected\" data-group=\"cookies\" data-id=\"noCookies\" data-label=\"No Cookies\" data-none=\"true\">\n          <span class=\"tpl-option-title\">No Cookies<\/span><span class=\"tpl-option-meta\">Skip this add-on<\/span><span class=\"tpl-option-price\">$0<\/span>\n        <\/button>\n        <button type=\"button\" class=\"tpl-option\" data-group=\"cookies\" data-id=\"cookiePlatter\" data-label=\"Cookie Platter\" data-price=\"18\">\n          <span class=\"tpl-option-title\">Cookie Platters<\/span><span class=\"tpl-option-meta\">Choose quantity and flavor style<\/span><span class=\"tpl-option-price\">$18\/dozen<\/span>\n        <\/button>\n      <\/div>\n\n      <div id=\"tpl-cookie-recommendation\" class=\"tpl-recommendation tpl-hidden\"><\/div>\n\n      <div id=\"tpl-cookie-fields\" class=\"tpl-reveal-box tpl-hidden\">\n        <h4 class=\"tpl-subtitle\">Build Your Cookie Platter<\/h4>\n        <div class=\"tpl-grid\">\n          <div class=\"tpl-field\">\n            <label for=\"tpl-cookie-dozens\">How many dozen?<\/label>\n            <select id=\"tpl-cookie-dozens\">\n              <option value=\"1\">1 dozen \u2014 $18<\/option><option value=\"2\">2 dozen \u2014 $36<\/option><option value=\"3\">3 dozen \u2014 $54<\/option><option value=\"4\">4 dozen \u2014 $72<\/option><option value=\"5\">5 dozen \u2014 $90<\/option><option value=\"6\">6 dozen \u2014 $108<\/option><option value=\"7\">7 dozen \u2014 $126<\/option><option value=\"8\">8 dozen \u2014 $144<\/option><option value=\"9\">9 dozen \u2014 $162<\/option><option value=\"10\">10 dozen \u2014 $180<\/option>\n            <\/select>\n          <\/div>\n          <div class=\"tpl-field\">\n            <label for=\"tpl-cookie-style\">Flavor Preference<\/label>\n            <select id=\"tpl-cookie-style\">\n              <option value=\"Assortment\">Assortment \u2014 3 of each flavor per dozen<\/option>\n              <option value=\"One Flavor\">One Flavor<\/option>\n              <option value=\"Two Flavors\">Two Flavors \u2014 split evenly<\/option>\n              <option value=\"Four Flavors\">Four Flavors \u2014 even mix<\/option>\n            <\/select>\n          <\/div>\n        <\/div>\n\n        <div id=\"tpl-cookie-flavor-box\" class=\"tpl-flavor-grid tpl-hidden\">\n          <p class=\"tpl-mini-label\" style=\"grid-column:1\/-1;margin:0;\">Choose flavor(s)<\/p>\n          <label><input type=\"checkbox\" class=\"tpl-cookie-flavor\" value=\"Chocolate Chip\">Chocolate Chip<\/label>\n          <label><input type=\"checkbox\" class=\"tpl-cookie-flavor\" value=\"Peanut Butter\">Peanut Butter<\/label>\n          <label><input type=\"checkbox\" class=\"tpl-cookie-flavor\" value=\"Sugar\">Sugar<\/label>\n          <label><input type=\"checkbox\" class=\"tpl-cookie-flavor\" value=\"Oatmeal Raisin\">Oatmeal Raisin<\/label>\n        <\/div>\n\n        <p id=\"tpl-cookie-style-note\" class=\"tpl-note\">Assortment includes 3 chocolate chip, 3 peanut butter, 3 sugar, and 3 oatmeal raisin cookies per dozen.<\/p>\n        <div class=\"tpl-field\" style=\"margin-top:12px;\"><label for=\"tpl-cookie-notes\">Cookie Notes<\/label><textarea id=\"tpl-cookie-notes\" placeholder=\"Optional notes\"><\/textarea><\/div>\n      <\/div>\n\n      <div class=\"tpl-external-box\">\n        <button type=\"button\" class=\"tpl-option\" data-group=\"cookies\" data-id=\"customIcedCookies\" data-label=\"Custom Iced Cookies \u2014 Ordered Directly Through Jiggle Bellies Bakery\" data-external=\"true\" data-quote=\"true\" data-external-url=\"https:\/\/www.jigglebelliesbakery.com\/\">\n          <span class=\"tpl-option-title\">Custom Iced Cookies<\/span><span class=\"tpl-option-meta\">Names, themes, logos, or decorated designs<\/span><span class=\"tpl-option-price\">Contact Jiggle Bellies Bakery for a quote<\/span>\n        <\/button>\n        <p class=\"tpl-note\">Custom iced cookies are ordered directly at <a href=\"https:\/\/www.jigglebelliesbakery.com\/\" target=\"_blank\" rel=\"noopener\">Jiggle Bellies Bakery<\/a> and are not included in this estimate.<\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"tpl-subsection\">\n      <h4 class=\"tpl-subtitle\">Other Food Requests<\/h4>\n      <button type=\"button\" class=\"tpl-option\" data-group=\"otherFood\" data-id=\"otherFood\" data-label=\"Other Food Request\" data-quote=\"true\">\n        <span class=\"tpl-option-title\">Help Me Add Food<\/span><span class=\"tpl-option-meta\">Pizza, sandwich platters, or another local option<\/span><span class=\"tpl-option-price\">Quote needed<\/span>\n      <\/button>\n      <div id=\"tpl-other-food-fields\" class=\"tpl-grid tpl-hidden\" style=\"margin-top:14px;\">\n        <div class=\"tpl-field\"><label for=\"tpl-other-food-notes\">What kind of food would you like?<\/label><input id=\"tpl-other-food-notes\" type=\"text\" placeholder=\"Pizza, Jersey Mike\u2019s platters, sandwiches, etc.\"><\/div>\n        <div class=\"tpl-field\"><label for=\"tpl-food-budget\">Approximate Food Budget<\/label><select id=\"tpl-food-budget\"><option value=\"\">Select one<\/option><option>Under $100<\/option><option>$100\u2013$200<\/option><option>$200\u2013$300<\/option><option>$300+<\/option><option>Not sure<\/option><\/select><\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"tpl-step-card\">\n    <div class=\"tpl-step-heading\">\n      <span class=\"tpl-step-number\">5<\/span>\n      <div class=\"tpl-step-copy\">\n        <h3>Food Allergies & Dietary Needs<\/h3>\n        <p>Help us and our local partners prepare safely for your group.<\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"tpl-option-grid\">\n      <button type=\"button\" class=\"tpl-option selected\" data-group=\"allergies\" data-id=\"noAllergies\" data-label=\"No Food Allergies or Dietary Restrictions\">\n        <span class=\"tpl-option-title\">No Food Allergies or Dietary Restrictions<\/span>\n        <span class=\"tpl-option-meta\">No special accommodations needed<\/span>\n      <\/button>\n\n      <button type=\"button\" class=\"tpl-option\" data-group=\"allergies\" data-id=\"hasAllergies\" data-label=\"Food Allergies or Dietary Needs Reported\">\n        <span class=\"tpl-option-title\">Someone in Our Group Has Dietary Needs<\/span>\n        <span class=\"tpl-option-meta\">Tell us about allergies, sensitivities, or dietary preferences<\/span>\n      <\/button>\n    <\/div>\n\n    <div id=\"tpl-allergy-fields\" class=\"tpl-reveal-box tpl-hidden\">\n      <div class=\"tpl-field\">\n        <label for=\"tpl-allergy-notes\">Please describe any allergies or dietary needs<\/label>\n        <textarea id=\"tpl-allergy-notes\" placeholder=\"Examples: peanut allergy, tree nut allergy, gluten-free, dairy-free, vegetarian, vegan, shellfish allergy, or other dietary accommodations.\"><\/textarea>\n      <\/div>\n\n      <p class=\"tpl-note\">\n        <strong>Please note:<\/strong> We will share this information with the selected food partners, but food may be prepared in commercial kitchens where cross-contact can occur. We cannot guarantee an allergen-free environment.\n      <\/p>\n    <\/div>\n  <\/div>\n\n  <div class=\"tpl-step-card\">\n    <div class=\"tpl-step-heading\">\n      <span class=\"tpl-step-number\">6<\/span>\n      <div class=\"tpl-step-copy\">\n        <h3>Drinks & Special Requests<\/h3>\n        <p>Tell us what would make the event feel complete.<\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"tpl-field\">\n      <label for=\"tpl-beverage-notes\">Special Beverage Requests<\/label>\n      <textarea id=\"tpl-beverage-notes\" placeholder=\"We serve beer, wine, THC mocktails, and nonalcoholic drinks. Let us know if there is something specific you would like us to try to have available.\"><\/textarea>\n    <\/div>\n\n    <div class=\"tpl-field\" style=\"margin-top:12px;\">\n      <label for=\"tpl-notes\">Other Event Notes<\/label>\n      <textarea id=\"tpl-notes\" placeholder=\"Theme, setup needs, surprise party details, timing, accessibility, or anything else we should know.\"><\/textarea>\n    <\/div>\n  <\/div>\n\n  <div class=\"tpl-step-card\">\n    <div class=\"tpl-step-heading\">\n      <span class=\"tpl-step-number\">7<\/span>\n      <div class=\"tpl-step-copy\">\n        <h3>Need a Ride?<\/h3>\n        <p>Request transportation details for your group. Transportation is not included in your event estimate and will be quoted after we confirm bay availability.<\/p>\n      <\/div>\n    <\/div>\n\n    <button type=\"button\" class=\"tpl-option\" data-group=\"transportation\" data-id=\"transportation\" data-label=\"Transportation Quote Request\" data-quote=\"true\">\n      <span class=\"tpl-option-title\">Transportation Quote<\/span>\n      <span class=\"tpl-option-meta\">Request pricing from Designated Driver Taxi<\/span>\n      <span class=\"tpl-option-price\">Quote provided separately<\/span>\n    <\/button>\n\n    <div id=\"tpl-transportation-fields\" class=\"tpl-grid tpl-hidden\" style=\"margin-top:14px;\">\n      <div class=\"tpl-field\"><label for=\"tpl-passengers\">Number of Passengers<\/label><input id=\"tpl-passengers\" type=\"number\" min=\"1\" placeholder=\"Example: 10\"><\/div>\n      <div class=\"tpl-field\"><label for=\"tpl-trip-type\">Trip Type<\/label><select id=\"tpl-trip-type\"><option value=\"\">Select one<\/option><option value=\"Round Trip\">Round Trip<\/option><option value=\"One Way\">One Way<\/option><\/select><\/div>\n      <div class=\"tpl-field\"><label for=\"tpl-pickup-location-type\">Pickup Location Type<\/label><select id=\"tpl-pickup-location-type\"><option value=\"\">Select one<\/option><option>Hotel<\/option><option>Vacation Rental \/ Airbnb<\/option><option>Residence<\/option><option>Restaurant or Business<\/option><option>Other<\/option><\/select><\/div>\n      <div class=\"tpl-field\"><label for=\"tpl-pickup-name\">Hotel, Rental, or Location Name<\/label><input id=\"tpl-pickup-name\" type=\"text\" placeholder=\"Example: Islander Hotel\"><\/div>\n      <div class=\"tpl-field\" style=\"grid-column:1\/-1;\"><label for=\"tpl-pickup\">Pickup Address<\/label><input id=\"tpl-pickup\" type=\"text\" placeholder=\"Full street address, city, and ZIP code\"><\/div>\n      <div class=\"tpl-field\"><label for=\"tpl-pickup-time\">Desired Pickup Time<\/label><input id=\"tpl-pickup-time\" type=\"time\"><\/div>\n      <div class=\"tpl-field\"><label for=\"tpl-destination\">Destination<\/label><input id=\"tpl-destination\" type=\"text\" value=\"The Perfect Lie Golf Bar, 8002 Emerald Drive, Unit D, Emerald Isle, NC\"><\/div>\n\n      <div id=\"tpl-return-fields\" class=\"tpl-grid tpl-hidden\" style=\"grid-column:1\/-1;\">\n        <div class=\"tpl-field\"><label for=\"tpl-return-time\">Desired Return Pickup Time<\/label><input id=\"tpl-return-time\" type=\"time\"><\/div>\n        <div class=\"tpl-field\"><label for=\"tpl-return-destination\">Return Destination<\/label><input id=\"tpl-return-destination\" type=\"text\" placeholder=\"Address where the group should be returned\"><\/div>\n      <\/div>\n\n      <div class=\"tpl-field\"><label for=\"tpl-extra-stops\">Additional Stops<\/label><input id=\"tpl-extra-stops\" type=\"text\" placeholder=\"Any additional pickup or drop-off stops\"><\/div>\n      <div class=\"tpl-field\"><label for=\"tpl-bags\">Golf Bags, Luggage, Coolers, or Large Items<\/label><input id=\"tpl-bags\" type=\"text\" placeholder=\"Example: 4 golf bags and 2 coolers\"><\/div>\n      <div class=\"tpl-field\"><label for=\"tpl-accessibility\">Accessibility or Seating Needs<\/label><input id=\"tpl-accessibility\" type=\"text\" placeholder=\"Wheelchair access, child seats, mobility needs, etc.\"><\/div>\n      <div class=\"tpl-field\"><label for=\"tpl-taxi-contact-method\">Preferred Contact Method<\/label><select id=\"tpl-taxi-contact-method\"><option value=\"\">Select one<\/option><option>Phone Call<\/option><option>Text Message<\/option><option>Email<\/option><\/select><\/div>\n      <div class=\"tpl-field\" style=\"grid-column:1\/-1;\"><label for=\"tpl-transport-notes\">Transportation Notes<\/label><textarea id=\"tpl-transport-notes\" placeholder=\"Timing details, multiple pickup locations, or anything else the taxi company should know.\"><\/textarea><\/div>\n    <\/div>\n\n    <p class=\"tpl-note\">\n      Transportation requests are collected with your event request. We\u2019ll confirm bay availability first, then follow up with transportation quote details if needed.\n    <\/p>\n  <\/div>\n\n  <div id=\"tpl-estimate-box\" class=\"tpl-estimate\">\n    <button type=\"button\" id=\"tpl-estimate-toggle\" class=\"tpl-estimate-toggle\" aria-label=\"Minimize estimate\">\u2212<\/button>\n    <h3>Your Estimate<\/h3>\n    <div id=\"tpl-line-items\" class=\"tpl-line-items\"><\/div>\n    <div class=\"tpl-total-row\"><span>Estimated Total<\/span><span id=\"tpl-total\">$0.00<\/span><\/div>\n    <div class=\"tpl-deposit-row\"><span>Estimated 50% Deposit<\/span><span id=\"tpl-deposit\">$0.00<\/span><\/div>\n\n    <button id=\"tpl-submit\" type=\"button\" class=\"tpl-submit\">Review &amp; Send Event Request<\/button>\n    <p class=\"tpl-small-white\">After clicking, your email app will open with your event request filled in. Review the details, then click send. This request does not confirm your booking. We\u2019ll check bay availability, confirm partner add-ons, and follow up with a final quote and deposit link.<\/p>\n  <\/div>\n\n  <script>\n    (function () {\n      const root = document.getElementById(\"tpl-event-form\");\n      if (!root) return;\n\n      const BUSINESS_EMAIL = \"jon@tplei.com\";\n      const SALES_TAX_RATE = 0.0675;\n\n      const state = {\n        bay: { id: \"oneBay\", label: \"1 Bay\", price: 50 },\n        decorating: { tier: null, banner: null },\n        charcuterie: { id: \"noCharcuterie\", label: \"No Charcuterie\", none: true },\n        cake: { id: \"noCake\", label: \"No Cake\", none: true },\n        cookies: { id: \"noCookies\", label: \"No Cookies\", none: true },\n        allergies: { id: \"noAllergies\", label: \"No Food Allergies or Dietary Restrictions\" },\n        otherFood: null,\n        transportation: null\n      };\n\n      const getEl = id => document.getElementById(id);\n      const getValue = id => {\n        const el = getEl(id);\n        return el ? String(el.value || \"\").trim() : \"\";\n      };\n      const getHours = () => Number(getValue(\"tpl-hours\")) || 2;\n      const getGuests = () => Number(getValue(\"tpl-guests\")) || 1;\n      const money = amount => \"$\" + Number(amount || 0).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n\n      function optionToObject(button) {\n        return {\n          id: button.dataset.id || \"\",\n          label: button.dataset.label || \"\",\n          price: Number(button.dataset.price || 0),\n          quote: button.dataset.quote === \"true\",\n          none: button.dataset.none === \"true\",\n          external: button.dataset.external === \"true\",\n          decorType: button.dataset.decorType || \"\",\n          includesBanner: button.dataset.includesBanner === \"true\"\n        };\n      }\n\n      function clearGroup(group) {\n        root.querySelectorAll('.tpl-option[data-group=\"' + group + '\"]').forEach(btn => btn.classList.remove(\"selected\"));\n      }\n\n      function selectNoDecoration() {\n        clearGroup(\"decorating\");\n        const noBtn = root.querySelector('[data-group=\"decorating\"][data-id=\"noDecoration\"]');\n        if (noBtn) noBtn.classList.add(\"selected\");\n        state.decorating.tier = null;\n        state.decorating.banner = null;\n        updateBannerContactNote();\n      }\n\n      function updateBannerContactNote() {\n        const bannerNote = getEl(\"tpl-banner-contact-note\");\n        if (!bannerNote) return;\n\n        const includesBanner =\n          !!state.decorating.banner ||\n          !!(\n            state.decorating.tier &&\n            state.decorating.tier.includesBanner\n          );\n\n        bannerNote.classList.toggle(\"tpl-hidden\", !includesBanner);\n      }\n\n      function handleDecorating(button) {\n        const item = optionToObject(button);\n        const alreadySelected = button.classList.contains(\"selected\");\n        const noBtn = root.querySelector('[data-group=\"decorating\"][data-id=\"noDecoration\"]');\n        const bannerBtn = root.querySelector('[data-group=\"decorating\"][data-id=\"bannerOnly\"]');\n        const tiers = root.querySelectorAll('[data-group=\"decorating\"][data-decor-type=\"tier\"]');\n        const note = getEl(\"tpl-decor-note\");\n\n        if (item.id === \"noDecoration\") {\n          selectNoDecoration();\n          updateEstimate();\n          return;\n        }\n\n        if (noBtn) noBtn.classList.remove(\"selected\");\n\n        if (item.decorType === \"banner\") {\n          if (state.decorating.tier && state.decorating.tier.includesBanner) {\n            button.classList.remove(\"selected\");\n            state.decorating.banner = null;\n            if (note) note.textContent = \"Party Custom already includes the hand-painted banner, so the standalone banner was not added.\";\n          } else if (alreadySelected) {\n            button.classList.remove(\"selected\");\n            state.decorating.banner = null;\n          } else {\n            button.classList.add(\"selected\");\n            state.decorating.banner = item;\n          }\n        }\n\n        if (item.decorType === \"tier\") {\n          tiers.forEach(btn => btn.classList.remove(\"selected\"));\n          if (alreadySelected) {\n            state.decorating.tier = null;\n          } else {\n            button.classList.add(\"selected\");\n            state.decorating.tier = item;\n            if (item.includesBanner) {\n              if (bannerBtn) bannerBtn.classList.remove(\"selected\");\n              state.decorating.banner = null;\n              if (note) note.textContent = \"Party Custom includes the hand-painted banner, so the standalone banner has been removed.\";\n            }\n          }\n        }\n\n        if (!state.decorating.tier && !state.decorating.banner && noBtn) noBtn.classList.add(\"selected\");\n        updateBannerContactNote();\n        updateEstimate();\n      }\n\n      function handleOption(button) {\n        const group = button.dataset.group;\n        if (group === \"decorating\") return handleDecorating(button);\n\n        const wasSelected = button.classList.contains(\"selected\");\n        const required = [\"bay\", \"charcuterie\", \"cake\", \"cookies\"].includes(group);\n        clearGroup(group);\n\n        if (wasSelected && !required) {\n          state[group] = null;\n        } else {\n          button.classList.add(\"selected\");\n          state[group] = optionToObject(button);\n\n          if (button.dataset.externalUrl && !wasSelected) {\n            window.open(button.dataset.externalUrl, \"_blank\", \"noopener\");\n          }\n        }\n\n        toggleConditionalFields();\n        updateCharcuterieRecommendation();\n        updateCookieFlavorControls();\n        updateCookieRecommendation();\n        updateReturnTripFields();\n        updateEstimate();\n      }\n\n      function toggleHidden(id, hidden) {\n        const el = getEl(id);\n        if (el) el.classList.toggle(\"tpl-hidden\", hidden);\n      }\n\n      function toggleConditionalFields() {\n        toggleHidden(\"tpl-charcuterie-builder\", !(state.charcuterie && state.charcuterie.id === \"charcuterieBoxes\"));\n        toggleHidden(\"tpl-standard-cake-fields\", !(state.cake && !state.cake.none && !state.cake.external && !state.cake.quote));\n        toggleHidden(\"tpl-cookie-fields\", !(state.cookies && state.cookies.id === \"cookiePlatter\"));\n        toggleHidden(\"tpl-allergy-fields\", !(state.allergies && state.allergies.id === \"hasAllergies\"));\n        toggleHidden(\"tpl-other-food-fields\", !state.otherFood);\n        toggleHidden(\"tpl-transportation-fields\", !state.transportation);\n      }\n\n      function getCharcuterieQuantities() {\n        return {\n          small: Number(getValue(\"tpl-charcuterie-small\")) || 0,\n          medium: Number(getValue(\"tpl-charcuterie-medium\")) || 0,\n          large: Number(getValue(\"tpl-charcuterie-large\")) || 0\n        };\n      }\n\n      function getCharcuterieSubtotal() {\n        const q = getCharcuterieQuantities();\n        return q.small * 55 + q.medium * 85 + q.large * 150;\n      }\n\n      function getCharcuterieTotal() {\n        return getCharcuterieSubtotal() * (1 + SALES_TAX_RATE);\n      }\n\n      function getCharcuterieCapacity() {\n        const q = getCharcuterieQuantities();\n        return q.small * 3 + q.medium * 8 + q.large * 10;\n      }\n\n      function getCharcuterieRecommendation() {\n        const guests = getGuests();\n        let best = null;\n\n        for (let small = 0; small <= 10; small++) {\n          for (let medium = 0; medium <= 10; medium++) {\n            for (let large = 0; large <= 10; large++) {\n              const boxCount = small + medium + large;\n              if (!boxCount) continue;\n              const capacity = small * 3 + medium * 8 + large * 10;\n              if (capacity < guests) continue;\n              const price = small * 55 + medium * 85 + large * 150;\n              const extra = capacity - guests;\n              const candidate = { small, medium, large, capacity, price, extra, boxCount };\n\n              if (!best ||\n                  candidate.extra < best.extra ||\n                  (candidate.extra === best.extra && candidate.price < best.price) ||\n                  (candidate.extra === best.extra && candidate.price === best.price && candidate.boxCount < best.boxCount)) {\n                best = candidate;\n              }\n            }\n          }\n        }\n        return best;\n      }\n\n      function formatCharcuterieCombo(combo) {\n        if (!combo) return \"\";\n        const parts = [];\n        if (combo.small) parts.push(combo.small + \" Small Box\" + (combo.small > 1 ? \"es\" : \"\"));\n        if (combo.medium) parts.push(combo.medium + \" Medium Box\" + (combo.medium > 1 ? \"es\" : \"\"));\n        if (combo.large) parts.push(combo.large + \" Large Box\" + (combo.large > 1 ? \"es\" : \"\"));\n        if (parts.length <= 1) return parts[0] || \"\";\n        if (parts.length === 2) return parts[0] + \" and \" + parts[1];\n        return parts.slice(0, -1).join(\", \") + \", and \" + parts[parts.length - 1];\n      }\n\n      function updateCharcuterieRecommendation() {\n        const box = getEl(\"tpl-charcuterie-recommendation\");\n        if (!box) return;\n\n        if (!state.charcuterie || state.charcuterie.none) {\n          box.classList.add(\"tpl-hidden\");\n          box.innerHTML = \"\";\n          return;\n        }\n\n        if (state.charcuterie.external) {\n          box.classList.remove(\"tpl-hidden\");\n          box.innerHTML = '<strong>Custom boards are ordered directly through Coastal Grazes.<\/strong><br>This selection is not included in your estimate. Visit <a href=\"https:\/\/coastalgrazes.com\" target=\"_blank\" rel=\"noopener\">coastalgrazes.com<\/a>.';\n          return;\n        }\n\n        const rec = getCharcuterieRecommendation();\n        const q = getCharcuterieQuantities();\n        const selectedCount = q.small + q.medium + q.large;\n        let selectedText = \" No boxes have been selected yet.\";\n\n        if (selectedCount) {\n          const capacity = getCharcuterieCapacity();\n          selectedText = \" You selected <strong>\" + formatCharcuterieCombo(q) + \"<\/strong>, providing for approximately <strong>\" + capacity + \" guests<\/strong>.\";\n          if (capacity < getGuests()) selectedText += \" This may not provide enough food for your full party.\";\n        }\n\n        box.classList.remove(\"tpl-hidden\");\n        box.innerHTML = \"Based on <strong>\" + getGuests() + \" guests<\/strong>, we recommend <strong>\" + formatCharcuterieCombo(rec) + \"<\/strong>, providing for approximately <strong>\" + rec.capacity + \" guests<\/strong>.\" + selectedText;\n      }\n\n      function getRecommendedCookieDozens() {\n        return Math.max(1, Math.ceil((getGuests() * 3) \/ 12));\n      }\n\n      function getCookieDozens() {\n        return Number(getValue(\"tpl-cookie-dozens\")) || 1;\n      }\n\n      function updateCookieFlavorControls() {\n        const style = getValue(\"tpl-cookie-style\") || \"Assortment\";\n        const box = getEl(\"tpl-cookie-flavor-box\");\n        const note = getEl(\"tpl-cookie-style-note\");\n        const checks = Array.from(root.querySelectorAll(\".tpl-cookie-flavor\"));\n        if (!box || !note) return;\n\n        checks.forEach(input => { input.checked = false; input.disabled = false; });\n\n        if (style === \"Assortment\") {\n          box.classList.add(\"tpl-hidden\");\n          note.textContent = \"Assortment includes 3 chocolate chip, 3 peanut butter, 3 sugar, and 3 oatmeal raisin cookies per dozen.\";\n        } else if (style === \"Four Flavors\") {\n          box.classList.add(\"tpl-hidden\");\n          note.textContent = \"Four Flavors includes an even mix of chocolate chip, peanut butter, sugar, and oatmeal raisin.\";\n        } else {\n          box.classList.remove(\"tpl-hidden\");\n          note.textContent = style === \"One Flavor\" ? \"Choose 1 flavor. All selected dozens will be that flavor.\" : \"Choose 2 flavors. The order will be split evenly between them.\";\n        }\n      }\n\n      function enforceCookieFlavorLimit(changed) {\n        const style = getValue(\"tpl-cookie-style\");\n        const max = style === \"One Flavor\" ? 1 : style === \"Two Flavors\" ? 2 : 0;\n        if (!max) return;\n        const checked = Array.from(root.querySelectorAll(\".tpl-cookie-flavor:checked\"));\n        if (checked.length > max) {\n          changed.checked = false;\n          alert(\"Please choose only \" + max + \" flavor\" + (max > 1 ? \"s\" : \"\") + \" for this option.\");\n        }\n      }\n\n      function getCookieFlavorDetails() {\n        const style = getValue(\"tpl-cookie-style\") || \"Assortment\";\n        if (style === \"Assortment\") return \"Assortment \u2014 3 of each flavor per dozen\";\n        if (style === \"Four Flavors\") return \"Four Flavors \u2014 even mix\";\n        const flavors = Array.from(root.querySelectorAll(\".tpl-cookie-flavor:checked\")).map(input => input.value);\n        const notes = getValue(\"tpl-cookie-notes\");\n        let detail = style + \" \u2014 \" + (flavors.length ? flavors.join(\", \") : \"flavor not selected yet\");\n        if (notes) detail += \" \u2014 Notes: \" + notes;\n        return detail;\n      }\n\n      function updateCookieRecommendation() {\n        const box = getEl(\"tpl-cookie-recommendation\");\n        if (!box) return;\n\n        if (!state.cookies || state.cookies.none) {\n          box.classList.add(\"tpl-hidden\");\n          box.innerHTML = \"\";\n          return;\n        }\n\n        if (state.cookies.external) {\n          box.classList.remove(\"tpl-hidden\");\n          box.innerHTML = '<strong>Custom iced cookies are ordered directly through Jiggle Bellies Bakery.<\/strong><br>This option is not included in your estimate. Visit <a href=\"https:\/\/www.jigglebelliesbakery.com\/\" target=\"_blank\" rel=\"noopener\">Jiggle Bellies Bakery<\/a>.';\n          return;\n        }\n\n        const recommended = getRecommendedCookieDozens();\n        const selected = getCookieDozens();\n        box.classList.remove(\"tpl-hidden\");\n        box.innerHTML = \"Based on <strong>\" + getGuests() + \" guests<\/strong> at approximately <strong>3 cookies per guest<\/strong>, we recommend <strong>\" + recommended + \" dozen<\/strong>. You selected <strong>\" + selected + \" dozen<\/strong>. Estimated cookie total: <strong>\" + money(selected * 18) + \"<\/strong>.\";\n      }\n\n      function getLineItems() {\n        const items = [];\n        items.push({ label: state.bay.label + \" \u00d7 \" + getHours() + \" hours\", amount: state.bay.price * getHours() });\n\n        if (state.decorating.tier) items.push({ label: state.decorating.tier.label, amount: state.decorating.tier.price });\n        if (state.decorating.banner) items.push({ label: state.decorating.banner.label, amount: state.decorating.banner.price });\n\n        if (state.charcuterie && !state.charcuterie.none) {\n          if (state.charcuterie.external) {\n            items.push({ label: \"Custom Coastal Grazes order \u2014 not included\", quote: true });\n          } else {\n            const q = getCharcuterieQuantities();\n            if (q.small + q.medium + q.large) {\n              items.push({ label: \"Coastal Grazes \u2014 \" + formatCharcuterieCombo(q) + \" incl. estimated tax\", amount: getCharcuterieTotal() });\n            } else {\n              items.push({ label: \"Charcuterie Boxes \u2014 choose quantities\", amount: 0 });\n            }\n          }\n        }\n\n        if (state.cake && !state.cake.none) {\n          if (state.cake.external || state.cake.quote) items.push({ label: state.cake.label + \" \u2014 not included\", quote: true });\n          else items.push({ label: state.cake.label, amount: state.cake.price });\n        }\n\n        if (state.cookies && !state.cookies.none) {\n          if (state.cookies.external || state.cookies.quote) items.push({ label: state.cookies.label + \" \u2014 not included\", quote: true });\n          else items.push({ label: \"Cookie Platter \u2014 \" + getCookieFlavorDetails() + \" \u00d7 \" + getCookieDozens() + \" dozen\", amount: state.cookies.price * getCookieDozens() });\n        }\n\n        if (state.otherFood) items.push({ label: \"Other Food Request\", quote: true });\n        if (state.transportation) items.push({ label: \"Transportation Quote Request\", quote: true });\n        return items;\n      }\n\n      function updateBayRecommendation() {\n        const box = getEl(\"tpl-bay-recommendation\");\n        if (!box) return;\n\n        const guests = getGuests();\n        let message = \"We recommend 4\u20136 golfers per bay.\";\n\n        if (guests > 0 && guests <= 6) {\n          message = \"For \" + guests + \" guests, 1 bay should work well. We recommend 4\u20136 golfers per bay.\";\n        } else if (guests >= 7 && guests <= 12) {\n          message = \"For \" + guests + \" guests, we recommend both bays to keep things moving.\";\n        } else if (guests > 12) {\n          message = \"For \" + guests + \" guests, both bays are recommended. For larger groups, we can help plan a rotating format.\";\n        }\n\n        box.innerHTML = \"<strong>Recommendation<\/strong><br>\" + message;\n      }\n\n      function updateEstimate() {\n        updateBayRecommendation();\n\n        const container = getEl(\"tpl-line-items\");\n        const totalEl = getEl(\"tpl-total\");\n        const depositEl = getEl(\"tpl-deposit\");\n        if (!container || !totalEl || !depositEl) return;\n\n        let total = 0;\n        container.innerHTML = \"\";\n\n        getLineItems().forEach(item => {\n          const row = document.createElement(\"div\");\n          row.className = \"tpl-line\";\n          const label = document.createElement(\"span\");\n          const amount = document.createElement(\"span\");\n          label.textContent = item.label;\n          if (item.quote) amount.textContent = \"Not included\";\n          else { total += Number(item.amount || 0); amount.textContent = money(item.amount); }\n          row.append(label, amount);\n          container.appendChild(row);\n        });\n\n        totalEl.textContent = money(total);\n        depositEl.textContent = money(total \/ 2);\n      }\n\n      function formatTime(value) {\n        if (!value) return \"\";\n        const [h, m] = value.split(\":\");\n        let hour = Number(h);\n        const suffix = hour >= 12 ? \"PM\" : \"AM\";\n        hour = hour % 12 || 12;\n        return hour + \":\" + m + \" \" + suffix;\n      }\n\n      function formatDate(value) {\n        if (!value) return \"\";\n        return new Date(value + \"T12:00:00\").toLocaleDateString(undefined, { weekday: \"long\", year: \"numeric\", month: \"long\", day: \"numeric\" });\n      }\n\n      function buildEventEmailBody() {\n        const items = getLineItems();\n        const total = items.reduce((sum,item) => sum + (item.quote ? 0 : Number(item.amount || 0)), 0);\n        const quoteItems = items.filter(item => item.quote).map(item => \"- \" + item.label).join(\"\\n\");\n\n        const needsBannerConsultation =\n          !!state.decorating.banner ||\n          !!(\n            state.decorating.tier &&\n            state.decorating.tier.includesBanner\n          );\n\n        let body = \"NEW PRIVATE EVENT REQUEST\\n=========================\\n\\n\";\n        body += \"IMPORTANT\\nThis request does not confirm the booking. Check bay availability first, then confirm partner add-ons and send final quote\/deposit link.\\n\\n\";\n\n        body += \"CONTACT\\nName: \" + getValue(\"tpl-name\") + \"\\nEmail: \" + getValue(\"tpl-email\") + \"\\nPhone: \" + getValue(\"tpl-phone\") + \"\\n\\n\";\n        body += \"EVENT\\nType: \" + getValue(\"tpl-event-type\") + \"\\nDate: \" + getValue(\"tpl-date\") + \"\\nStart Time: \" + getValue(\"tpl-time\") + \"\\nGuests: \" + getValue(\"tpl-guests\") + \"\\nLength: \" + getValue(\"tpl-hours\") + \" hours\\nBay Selection: \" + state.bay.label + \"\\n\\n\";\n\n        body += \"SELECTED OPTIONS\\n\" + items.map(item => \"- \" + item.label + \": \" + (item.quote ? \"Not included \/ quote needed\" : money(item.amount))).join(\"\\n\") + \"\\n\\n\";\n\n        body += \"VENDOR FOLLOW-UP NEEDED AFTER BAY AVAILABILITY IS CONFIRMED\\n\";\n        body += \"The Confetti Co. \/ Decorations: \" + ((state.decorating.tier || state.decorating.banner) ? \"Yes\" : \"No\") + \"\\n\";\n        body += \"Coastal Grazes \/ Charcuterie: \" + (state.charcuterie && !state.charcuterie.none ? \"Yes\" : \"No\") + \"\\n\";\n        body += \"Jiggle Bellies \/ Cake: \" + (state.cake && !state.cake.none ? \"Yes\" : \"No\") + \"\\n\";\n        body += \"Jiggle Bellies \/ Cookies: \" + (state.cookies && !state.cookies.none ? \"Yes\" : \"No\") + \"\\n\";\n        body += \"Other Food Partner: \" + (state.otherFood ? \"Yes\" : \"No\") + \"\\n\";\n        body += \"Designated Driver Taxi \/ Transportation: \" + (state.transportation ? \"Yes\" : \"No\") + \"\\n\\n\";\n\n        body += \"DECORATING\\n\";\n        body += \"Selected Package: \" + (state.decorating.tier ? state.decorating.tier.label : \"None\") + \"\\n\";\n        body += \"Standalone Banner: \" + (state.decorating.banner ? state.decorating.banner.label : \"None\") + \"\\n\";\n        body += \"Banner Consultation with The Confetti Co.: \" + (needsBannerConsultation ? \"Required\" : \"Not required\") + \"\\n\\n\";\n\n        if (state.charcuterie && !state.charcuterie.none) {\n          body += \"CHARCUTERIE - COASTAL GRAZES\\n\";\n          if (state.charcuterie.external) {\n            body += \"Custom Coastal Grazes order requested \/ ordered directly through Coastal Grazes.\\n\\n\";\n          } else {\n            const q = getCharcuterieQuantities();\n            body += \"Small Boxes: \" + q.small + \"\\n\";\n            body += \"Medium Boxes: \" + q.medium + \"\\n\";\n            body += \"Large Boxes: \" + q.large + \"\\n\";\n            body += \"Estimated Coverage: \" + getCharcuterieCapacity() + \" guests\\n\";\n            body += \"Charcuterie Total incl. estimated tax: \" + money(getCharcuterieTotal()) + \"\\n\\n\";\n          }\n        }\n\n        if (state.cake && !state.cake.none) {\n          body += \"CAKE - JIGGLE BELLIES\\n\";\n          body += \"Selection: \" + state.cake.label + \"\\n\";\n          body += \"Flavor: \" + getValue(\"tpl-cake-flavor\") + \"\\nButtercream: \" + getValue(\"tpl-buttercream\") + \"\\nMessage: \" + getValue(\"tpl-cake-message\") + \"\\nMessage Color: \" + getValue(\"tpl-message-color\") + \"\\n\\n\";\n        }\n\n        if (state.cookies && !state.cookies.none) {\n          body += \"COOKIES - JIGGLE BELLIES\\n\";\n          body += \"Selection: \" + state.cookies.label + \"\\n\";\n          body += \"Dozens: \" + getCookieDozens() + \"\\n\";\n          body += \"Flavor Details: \" + getCookieFlavorDetails() + \"\\n\\n\";\n        }\n\n        body += \"OTHER FOOD\\nRequest: \" + getValue(\"tpl-other-food-notes\") + \"\\nBudget: \" + getValue(\"tpl-food-budget\") + \"\\n\\n\";\n\n        body += \"FOOD ALLERGIES & DIETARY NEEDS\\n\";\n        if (state.allergies && state.allergies.id === \"hasAllergies\") {\n          body += (getValue(\"tpl-allergy-notes\") || \"Dietary needs were selected, but no details were entered.\") + \"\\n\\n\";\n        } else {\n          body += \"No food allergies or dietary restrictions reported.\\n\\n\";\n        }\n\n        body += \"BEVERAGE REQUESTS\\n\" + getValue(\"tpl-beverage-notes\") + \"\\n\\n\";\n\n        if (state.transportation) {\n          body += \"TRANSPORTATION REQUEST - DESIGNATED DRIVER TAXI\\n\";\n          body += \"Passengers: \" + getValue(\"tpl-passengers\") + \"\\n\";\n          body += \"Trip Type: \" + getValue(\"tpl-trip-type\") + \"\\n\";\n          body += \"Pickup Location Type: \" + getValue(\"tpl-pickup-location-type\") + \"\\n\";\n          body += \"Hotel, Rental, or Location Name: \" + getValue(\"tpl-pickup-name\") + \"\\n\";\n          body += \"Pickup Address: \" + getValue(\"tpl-pickup\") + \"\\n\";\n          body += \"Desired Pickup Time: \" + formatTime(getValue(\"tpl-pickup-time\")) + \"\\n\";\n          body += \"Destination: \" + getValue(\"tpl-destination\") + \"\\n\";\n          if (getValue(\"tpl-trip-type\") === \"Round Trip\") {\n            body += \"Desired Return Pickup Time: \" + formatTime(getValue(\"tpl-return-time\")) + \"\\n\";\n            body += \"Return Destination: \" + getValue(\"tpl-return-destination\") + \"\\n\";\n          }\n          body += \"Additional Stops: \" + getValue(\"tpl-extra-stops\") + \"\\n\";\n          body += \"Golf Bags, Luggage, Coolers, or Large Items: \" + getValue(\"tpl-bags\") + \"\\n\";\n          body += \"Accessibility or Seating Needs: \" + getValue(\"tpl-accessibility\") + \"\\n\";\n          body += \"Preferred Contact Method: \" + getValue(\"tpl-taxi-contact-method\") + \"\\n\";\n          body += \"Transportation Notes: \" + getValue(\"tpl-transport-notes\") + \"\\n\\n\";\n        }\n\n        body += \"GENERAL NOTES\\n\" + getValue(\"tpl-notes\") + \"\\n\\n\";\n        body += \"ESTIMATE\\nEstimated Total: \" + money(total) + \"\\nEstimated 50% Deposit: \" + money(total \/ 2) + \"\\n\\n\";\n        if (quoteItems) body += \"QUOTE-NEEDED \/ NOT-INCLUDED ITEMS\\n\" + quoteItems + \"\\n\\n\";\n        body += \"Final pricing must be confirmed before deposit is collected.\";\n        return body;\n      }\n\n      function submitRequest() {\n        if (!getValue(\"tpl-name\") || !getValue(\"tpl-email\") || !getValue(\"tpl-phone\")) return alert(\"Please enter your name, email, and phone number before submitting.\");\n        if (state.allergies && state.allergies.id === \"hasAllergies\" && !getValue(\"tpl-allergy-notes\")) return alert(\"Please describe the food allergies or dietary needs for your group.\");\n        const subject = encodeURIComponent(\"Private Event Request - The Perfect Lie\");\n        window.location.href = \"mailto:\" + BUSINESS_EMAIL + \"?subject=\" + subject + \"&body=\" + encodeURIComponent(buildEventEmailBody());\n      }\n\n      function updateReturnTripFields() {\n        toggleHidden(\"tpl-return-fields\", getValue(\"tpl-trip-type\") !== \"Round Trip\");\n      }\n\n      \/* -------------------------------------------------------\n         TEMPORARY REEL DEMO MODE\n         The controls appear only when the page URL includes:\n         ?event-demo=1\n         Example: https:\/\/tplei.com\/private-events\/?event-demo=1\n      ------------------------------------------------------- *\/\n\n      function demoWait(ms) {\n        const DEMO_SPEED = 1.2;\n        return new Promise(resolve => setTimeout(resolve, ms * DEMO_SPEED));\n      }\n\n      function demoSetValue(id, value) {\n        const el = getEl(id);\n        if (!el) return;\n\n        el.value = value;\n        el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n        el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n      }\n\n      async function demoTypeValue(id, value, speed = 65) {\n        const el = getEl(id);\n        if (!el) return;\n\n        el.scrollIntoView({\n          behavior: \"smooth\",\n          block: \"center\"\n        });\n\n        await demoWait(300);\n        el.focus();\n        el.value = \"\";\n\n        for (const character of value) {\n          el.value += character;\n          el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n          await demoWait(speed);\n        }\n\n        el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n        await demoWait(180);\n        el.blur();\n      }\n\n      async function demoSetValueSlow(id, value, pauseBefore = 500, pauseAfter = 750) {\n        const el = getEl(id);\n        if (!el) return;\n\n        el.scrollIntoView({\n          behavior: \"smooth\",\n          block: \"center\"\n        });\n\n        await demoWait(pauseBefore);\n        el.focus();\n        await demoWait(250);\n\n        el.value = value;\n        el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n        el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\n        await demoWait(pauseAfter);\n        el.blur();\n      }\n\n      function demoClick(group, id) {\n        const button = root.querySelector(\n          '.tpl-option[data-group=\"' + group + '\"][data-id=\"' + id + '\"]'\n        );\n\n        if (button && !button.classList.contains(\"selected\")) {\n          button.click();\n        }\n      }\n\n      async function demoShow(elementOrId, pause = 800) {\n        const el =\n          typeof elementOrId === \"string\"\n            ? getEl(elementOrId)\n            : elementOrId;\n\n        if (!el) return;\n\n        el.scrollIntoView({\n          behavior: \"smooth\",\n          block: \"center\"\n        });\n\n        await demoWait(pause);\n      }\n\n      function resetDemoForm() {\n        window.location.reload();\n      }\n\n      async function runEventPlannerDemo() {\n        const runButton = getEl(\"tpl-demo-run\");\n        if (runButton) {\n          runButton.disabled = true;\n          runButton.textContent = \"Demo Running\u2026\";\n        }\n\n        \/* Step 1: Event details *\/\n        await demoTypeValue(\"tpl-name\", \"Tommy McThreeputt\", 85);\n        await demoWait(250);\n\n        await demoTypeValue(\"tpl-email\", \"tincup@example.test\", 45);\n        await demoWait(250);\n\n        await demoTypeValue(\"tpl-phone\", \"252-555-1919\", 65);\n        await demoWait(350);\n\n        await demoSetValueSlow(\"tpl-event-type\", \"Birthday Party\", 450, 700);\n\n        \/* Date and time intentionally move more slowly for the reel. *\/\n        await demoSetValueSlow(\"tpl-date\", \"2026-08-15\", 550, 850);\n        await demoSetValueSlow(\"tpl-time\", \"18:00\", 550, 850);\n\n        await demoSetValueSlow(\"tpl-guests\", \"12\", 450, 700);\n        await demoSetValueSlow(\"tpl-hours\", \"2\", 450, 900);\n\n        \/* Step 2: Space *\/\n        const bothBays = root.querySelector(\n          '.tpl-option[data-group=\"bay\"][data-id=\"bothBays\"]'\n        );\n        await demoShow(bothBays);\n        demoClick(\"bay\", \"bothBays\");\n        await demoWait(700);\n\n        \/* Step 3: Decorating *\/\n        const partyCustom = root.querySelector(\n          '.tpl-option[data-group=\"decorating\"][data-id=\"partyCustom\"]'\n        );\n        await demoShow(partyCustom);\n        demoClick(\"decorating\", \"partyCustom\");\n        await demoWait(800);\n\n        \/* Step 4: Charcuterie *\/\n        const charcuterieBoxes = root.querySelector(\n          '.tpl-option[data-group=\"charcuterie\"][data-id=\"charcuterieBoxes\"]'\n        );\n        await demoShow(charcuterieBoxes);\n        demoClick(\"charcuterie\", \"charcuterieBoxes\");\n        await demoWait(450);\n        demoSetValue(\"tpl-charcuterie-small\", \"2\");\n        demoSetValue(\"tpl-charcuterie-medium\", \"1\");\n        await demoWait(900);\n\n        \/* Cake *\/\n        const cake = root.querySelector(\n          '.tpl-option[data-group=\"cake\"][data-id=\"cake6\"]'\n        );\n        await demoShow(cake);\n        demoClick(\"cake\", \"cake6\");\n        await demoWait(350);\n        await demoSetValueSlow(\"tpl-cake-flavor\", \"Chocolate\", 350, 500);\n        await demoSetValueSlow(\"tpl-buttercream\", \"Vanilla\", 350, 500);\n        await demoTypeValue(\"tpl-cake-message\", \"Still Under Par!\", 65);\n        await demoTypeValue(\"tpl-message-color\", \"Teal\", 75);\n        await demoWait(850);\n\n        \/* Cookies *\/\n        const cookies = root.querySelector(\n          '.tpl-option[data-group=\"cookies\"][data-id=\"cookiePlatter\"]'\n        );\n        await demoShow(cookies);\n        demoClick(\"cookies\", \"cookiePlatter\");\n        await demoWait(350);\n        demoSetValue(\"tpl-cookie-dozens\", \"3\");\n        demoSetValue(\"tpl-cookie-style\", \"Assortment\");\n        await demoWait(850);\n\n        \/* Step 5: Allergies *\/\n        const allergyButton = root.querySelector(\n          '.tpl-option[data-group=\"allergies\"][data-id=\"hasAllergies\"]'\n        );\n        await demoShow(allergyButton);\n        demoClick(\"allergies\", \"hasAllergies\");\n        await demoTypeValue(\n          \"tpl-allergy-notes\",\n          \"One guest has a peanut allergy. Please avoid peanuts where possible.\",\n          26\n        );\n        await demoWait(700);\n\n        \/* Step 6: Notes *\/\n        await demoShow(\"tpl-beverage-notes\");\n        await demoTypeValue(\n          \"tpl-beverage-notes\",\n          \"Please have a vanilla porter available and plenty of pinot noir for Aunt Martha.\",\n          28\n        );\n        await demoTypeValue(\n          \"tpl-notes\",\n          \"Birthday surprise. If Uncle Bob starts offering swing advice, please distract him with beer.\",\n          28\n        );\n        await demoWait(900);\n\n        \/* Step 6: Transportation *\/\n        const transportation = root.querySelector(\n          '.tpl-option[data-group=\"transportation\"][data-id=\"transportation\"]'\n        );\n        await demoShow(transportation);\n        demoClick(\"transportation\", \"transportation\");\n        await demoWait(350);\n\n        await demoSetValueSlow(\"tpl-passengers\", \"12\", 350, 500);\n        await demoSetValueSlow(\"tpl-trip-type\", \"Round Trip\", 400, 650);\n        await demoSetValueSlow(\n          \"tpl-pickup-location-type\",\n          \"Vacation Rental \/ Airbnb\",\n          400,\n          650\n        );\n        await demoTypeValue(\"tpl-pickup-name\", \"The Nineteenth Hole\", 50);\n        await demoTypeValue(\n          \"tpl-pickup\",\n          \"101 Ocean Drive, Emerald Isle, NC 28594\",\n          32\n        );\n\n        \/* Transportation times also move more slowly. *\/\n        await demoSetValueSlow(\"tpl-pickup-time\", \"17:30\", 500, 800);\n        await demoSetValueSlow(\"tpl-return-time\", \"21:30\", 500, 800);\n\n        await demoTypeValue(\n          \"tpl-return-destination\",\n          \"101 Ocean Drive, Emerald Isle, NC 28594\",\n          32\n        );\n        await demoTypeValue(\"tpl-bags\", \"4 golf bags\", 55);\n        await demoSetValueSlow(\"tpl-taxi-contact-method\", \"Text Message\", 350, 650);\nupdateEstimate();\n        await demoWait(700);\n\n        \/* Finish on the estimator *\/\n        await demoShow(\"tpl-estimate-box\", 900);\n\n        if (runButton) {\n          runButton.disabled = false;\n          runButton.textContent = \"Run Demo Again\";\n        }\n      }\n\n      function installDemoControls() {\n        const params = new URLSearchParams(window.location.search);\n        if (params.get(\"event-demo\") !== \"1\") return;\n\n        const toolbar = document.createElement(\"div\");\n        toolbar.id = \"tpl-demo-toolbar\";\n        toolbar.innerHTML =\n          '<button type=\"button\" id=\"tpl-demo-run\">\u25b6 Run Reel Demo<\/button>' +\n          '<button type=\"button\" id=\"tpl-demo-reset\">\u21bb Reset<\/button>';\n\n        toolbar.style.cssText =\n          \"position:fixed;top:14px;right:14px;z-index:99999;\" +\n          \"display:flex;gap:8px;padding:9px;background:#12353b;\" +\n          \"border-radius:12px;box-shadow:0 8px 24px rgba(0,0,0,.24);\";\n\n        document.body.appendChild(toolbar);\n\n        [getEl(\"tpl-demo-run\"), getEl(\"tpl-demo-reset\")].forEach(button => {\n          if (!button) return;\n          button.style.cssText =\n            \"border:0;border-radius:9px;padding:9px 12px;\" +\n            \"font:700 13px inherit;cursor:pointer;color:#12353b;\" +\n            \"background:#fff;\";\n        });\n\n        getEl(\"tpl-demo-run\")?.addEventListener(\"click\", runEventPlannerDemo);\n        getEl(\"tpl-demo-reset\")?.addEventListener(\"click\", resetDemoForm);\n      }\n\n      root.querySelectorAll(\".tpl-option\").forEach(button => button.addEventListener(\"click\", () => handleOption(button)));\n\n      [\"tpl-hours\",\"tpl-guests\",\"tpl-charcuterie-small\",\"tpl-charcuterie-medium\",\"tpl-charcuterie-large\",\"tpl-cookie-dozens\",\"tpl-cookie-style\",\"tpl-cookie-notes\",\"tpl-allergy-notes\"].forEach(id => {\n        const el = getEl(id);\n        if (!el) return;\n        [\"input\",\"change\"].forEach(eventName => el.addEventListener(eventName, () => {\n          updateCharcuterieRecommendation();\n          if (id === \"tpl-cookie-style\") updateCookieFlavorControls();\n          updateCookieRecommendation();\n          updateEstimate();\n        }));\n      });\n\n      root.querySelectorAll(\".tpl-cookie-flavor\").forEach(input => input.addEventListener(\"change\", () => {\n        enforceCookieFlavorLimit(input);\n        updateCookieRecommendation();\n        updateEstimate();\n      }));\n\n      getEl(\"tpl-trip-type\")?.addEventListener(\"change\", updateReturnTripFields);\n      getEl(\"tpl-submit\")?.addEventListener(\"click\", submitRequest);\n      getEl(\"tpl-estimate-toggle\")?.addEventListener(\"click\", function () {\n        const box = getEl(\"tpl-estimate-box\");\n        if (!box) return;\n        box.classList.toggle(\"is-minimized\");\n        const minimized = box.classList.contains(\"is-minimized\");\n        this.textContent = minimized ? \"+\" : \"\u2212\";\n        this.setAttribute(\"aria-label\", minimized ? \"Expand estimate\" : \"Minimize estimate\");\n      });\n\n      function minimizeEstimateOnMobile() {\n        const box = getEl(\"tpl-estimate-box\");\n        const toggle = getEl(\"tpl-estimate-toggle\");\n        if (!box || !toggle) return;\n        if (window.innerWidth <= 760) {\n          box.classList.add(\"is-minimized\");\n          toggle.textContent = \"+\";\n          toggle.setAttribute(\"aria-label\", \"Expand estimate\");\n        }\n      }\n\n      selectNoDecoration();\n      updateBannerContactNote();\n      toggleConditionalFields();\n      updateReturnTripFields();\n      updateCookieFlavorControls();\n      updateCharcuterieRecommendation();\n      updateCookieRecommendation();\n      updateEstimate();\n      minimizeEstimateOnMobile();\n      installDemoControls();\n    })();\n  <\/script>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Private Parties From birthdays and bachelor parties to corporate outings and retirement celebrations, we&#8217;ll help you create a memorable event at The Perfect Lie Golf Bar. Customize your experience with simulator time, decorating, food, desserts, and more. Private Events at The Perfect Lie Build Your Event, Step by Step Start with the basics, choose your [&hellip;]<\/p>\n","protected":false},"author":271999950,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_angie_page":false,"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_seo_schema_type":"","_wpcom_ai_launchpad_about_page":false,"_wpcom_ai_launchpad_gallery_page":false,"_wpcom_ai_launchpad_contact_page":false,"_wpcom_ai_launchpad_events_page":false,"_wpcom_ai_launchpad_video_page":false,"_wpcom_ai_launchpad_portfolio_piece":false,"footnotes":"","big_sky_generated":false},"class_list":["post-881","page","type-page","status-publish","hentry"],"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/PgRcKJ-ed","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/tplei.com\/index.php?rest_route=\/wp\/v2\/pages\/881","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tplei.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tplei.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tplei.com\/index.php?rest_route=\/wp\/v2\/users\/271999950"}],"replies":[{"embeddable":true,"href":"https:\/\/tplei.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=881"}],"version-history":[{"count":100,"href":"https:\/\/tplei.com\/index.php?rest_route=\/wp\/v2\/pages\/881\/revisions"}],"predecessor-version":[{"id":1092,"href":"https:\/\/tplei.com\/index.php?rest_route=\/wp\/v2\/pages\/881\/revisions\/1092"}],"wp:attachment":[{"href":"https:\/\/tplei.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=881"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}