{"id":103462,"date":"2026-07-14T16:28:50","date_gmt":"2026-07-14T16:28:50","guid":{"rendered":"https:\/\/onlytexaspros.com\/soluciones-digitales\/?page_id=103462"},"modified":"2026-07-15T01:19:57","modified_gmt":"2026-07-15T01:19:57","slug":"outdoor-kitchen-interactive-estimator","status":"publish","type":"page","link":"https:\/\/onlytexaspros.com\/soluciones-digitales\/outdoor-kitchen-interactive-estimator\/","title":{"rendered":"Outdoor Kitchen Interactive Estimator"},"content":{"rendered":"<div class=\"et_pb_section_0 et_pb_section et_section_regular et_block_section\">\n<div class=\"et_pb_row_0 et_pb_row et_block_row\">\n<div class=\"et_pb_column_0 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\n<div class=\"et_pb_code_0 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><!-- ======================================================\n     TEXAS PAVERS \u2014 OUTDOOR KITCHEN INTERACTIVE HERO\n     TEMPORARY DEMO VERSION\n======================================================= -->\n\n<section id=\"otp-kitchen-hero\">\n\n  <!-- ====================================================\n       HEADER \/ NAVIGATION\n  ===================================================== -->\n  <header class=\"otp-kitchen-header\">\n\n    <div class=\"otp-kitchen-header-inner\">\n\n      <!-- LOGO -->\n      <a class=\"otp-kitchen-logo\" href=\"https:\/\/texaspaversoutdoorliving.com\/\" aria-label=\"Texas Pavers Outdoor Living\" target=\"_blank\" rel=\"noopener\">\n        <img decoding=\"async\"\n          src=\"https:\/\/texaspaversoutdoorliving.com\/wp-content\/uploads\/2026\/06\/texas-pavers-logo.webp\"\n          alt=\"Texas Pavers Outdoor Living\"\n        >\n      <\/a>\n\n      <!-- DESKTOP NAVIGATION -->\n      <nav\n        class=\"otp-kitchen-nav\"\n        aria-label=\"Main navigation\"\n      >\n        <a href=\"#otp-kitchen-services\">\n          Services\n          <span class=\"otp-kitchen-nav-arrow\">\u2304<\/span>\n        <\/a>\n\n        <a href=\"#otp-kitchen-projects\">\n          Projects\n        <\/a>\n\n        <a\n          href=\"#otp-kitchen-designer\"\n          class=\"is-active\"\n        >\n          Design Your Kitchen\n        <\/a>\n\n        <a href=\"#otp-kitchen-process\">\n          Process\n        <\/a>\n\n        <a href=\"#otp-kitchen-about\">\n          About Us\n        <\/a>\n\n        <a href=\"#otp-kitchen-blog\">\n          Blog\n        <\/a>\n      <\/nav>\n\n      <!-- HEADER CTA -->\n      <a\n        class=\"otp-kitchen-header-cta\"\n        href=\"#otp-kitchen-consultation\"\n      >\n        Contact Us\n      <\/a>\n\n      <!-- MOBILE MENU BUTTON -->\n      <button\n        class=\"otp-kitchen-menu-toggle\"\n        type=\"button\"\n        aria-label=\"Open navigation menu\"\n        aria-expanded=\"false\"\n      >\n        <span><\/span>\n        <span><\/span>\n        <span><\/span>\n      <\/button>\n\n    <\/div>\n\n    <!-- MOBILE NAVIGATION -->\n    <nav\n      class=\"otp-kitchen-mobile-nav\"\n      aria-label=\"Mobile navigation\"\n    >\n      <a href=\"#otp-kitchen-services\">Services<\/a>\n      <a href=\"#otp-kitchen-projects\">Projects<\/a>\n      <a href=\"#otp-kitchen-designer\">Design Your Kitchen<\/a>\n      <a href=\"#otp-kitchen-process\">Process<\/a>\n      <a href=\"#otp-kitchen-about\">About Us<\/a>\n      <a href=\"#otp-kitchen-blog\">Blog<\/a>\n      <a\n        class=\"otp-kitchen-mobile-cta\"\n        href=\"#otp-kitchen-consultation\"\n      >\n        Contact Us\n      <\/a>\n    <\/nav>\n\n  <\/header>\n\n\n  <!-- ====================================================\n       HERO BACKGROUND\n       TEMP IMAGE \u2014 REPLACE BEFORE FINAL LAUNCH\n  ===================================================== -->\n  <div class=\"otp-kitchen-hero-background\" aria-hidden=\"true\"><\/div>\n\n  <div class=\"otp-kitchen-hero-overlay\" aria-hidden=\"true\"><\/div>\n\n  <div class=\"otp-kitchen-hero-glow\" aria-hidden=\"true\"><\/div>\n\n\n  <!-- ====================================================\n       HERO CONTENT\n  ===================================================== -->\n  <div class=\"otp-kitchen-hero-container\">\n\n    <div class=\"otp-kitchen-hero-content\">\n\n      <span class=\"otp-kitchen-eyebrow\">\n        Visit. Configure. Understand. Schedule.\n      <\/span>\n\n      <h1>\n        Design Your Ideal\n        <span>Outdoor Kitchen<\/span>\n      <\/h1>\n\n      <p class=\"otp-kitchen-hero-description\">\n        Receive intelligent recommendations, explore materials and appliances,\n        and get a personalized idea of the size and investment your outdoor\n        kitchen may require.\n      <\/p>\n\n      <div class=\"otp-kitchen-hero-actions\">\n\n        <a\n          class=\"otp-kitchen-primary-button\"\n          href=\"#otp-kitchen-designer\"\n        >\n          Start My Design\n\n          <span aria-hidden=\"true\">\u2192<\/span>\n        <\/a>\n\n        <a\n          class=\"otp-kitchen-secondary-button\"\n          href=\"#otp-kitchen-projects\"\n        >\n          View Real Projects\n        <\/a>\n\n      <\/div>\n\n\n      <!-- HERO TRUST POINTS -->\n      <div class=\"otp-kitchen-trust-row\">\n\n        <article class=\"otp-kitchen-trust-item\">\n\n          <span class=\"otp-kitchen-trust-icon\" aria-hidden=\"true\">\n            <svg viewBox=\"0 0 24 24\">\n              <path d=\"M12 3L4.5 6v5.5c0 4.9 3 8.6 7.5 10.5 4.5-1.9 7.5-5.6 7.5-10.5V6L12 3Z\"><\/path>\n              <path d=\"m9 12 2 2 4-4\"><\/path>\n            <\/svg>\n          <\/span>\n\n          <div>\n            <strong>Custom Design<\/strong>\n            <small>Built around your space<\/small>\n          <\/div>\n\n        <\/article>\n\n        <article class=\"otp-kitchen-trust-item\">\n\n          <span class=\"otp-kitchen-trust-icon\" aria-hidden=\"true\">\n            <svg viewBox=\"0 0 24 24\">\n              <circle cx=\"12\" cy=\"8\" r=\"4\"><\/circle>\n              <path d=\"M8.5 12.5 7 21l5-3 5 3-1.5-8.5\"><\/path>\n            <\/svg>\n          <\/span>\n\n          <div>\n            <strong>Premium Construction<\/strong>\n            <small>Materials selected for Texas<\/small>\n          <\/div>\n\n        <\/article>\n\n        <article class=\"otp-kitchen-trust-item\">\n\n          <span class=\"otp-kitchen-trust-icon\" aria-hidden=\"true\">\n            <svg viewBox=\"0 0 24 24\">\n              <path d=\"M4 12h5l2-5 3 10 2-5h4\"><\/path>\n              <path d=\"M12 3a9 9 0 1 0 9 9\"><\/path>\n            <\/svg>\n          <\/span>\n\n          <div>\n            <strong>Made in Texas<\/strong>\n            <small>Designed for outdoor living<\/small>\n          <\/div>\n\n        <\/article>\n\n      <\/div>\n\n    <\/div>\n\n  <\/div>\n\n\n  <!-- ====================================================\n       HERO BOTTOM TRANSITION\n  ===================================================== -->\n  <div class=\"otp-kitchen-hero-bottom\">\n\n    <div class=\"otp-kitchen-hero-bottom-inner\">\n\n      <div class=\"otp-kitchen-bottom-label\">\n        <span>01<\/span>\n\n        <div>\n          <strong>Outdoor Kitchen Assistant<\/strong>\n          <small>Configure your project step by step.<\/small>\n        <\/div>\n      <\/div>\n\n      <a href=\"#otp-kitchen-designer\">\n        Begin configuration\n        <span aria-hidden=\"true\">\u2193<\/span>\n      <\/a>\n\n    <\/div>\n\n  <\/div>\n\n<\/section>\n\n\n<\/div><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_section_1 et_pb_section et_section_regular et_block_section\">\n<div class=\"et_pb_row_1 et_pb_row et_block_row\">\n<div class=\"et_pb_column_1 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\n<div class=\"et_pb_code_1 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><!-- ======================================================\n     TEXAS PAVERS OUTDOOR LIVING\n     OUTDOOR KITCHEN SMART ASSISTANT\n     HTML + JAVASCRIPT DEMO VERSION\n\n     IMPORTANT:\n     - ALL PRICES ARE TEMPORARY.\n     - ALL DIMENSIONS ARE TEMPORARY.\n     - ALL IMAGES ARE TEMPORARY.\n     - REPLACE AND CALIBRATE BEFORE PUBLIC LAUNCH.\n======================================================= -->\n\n<section id=\"otp-kitchen-designer\" class=\"otp-kitchen-designer\">\n\n  <div class=\"otp-kitchen-designer-container\">\n\n    <!-- ==================================================\n         SECTION INTRODUCTION\n    =================================================== -->\n\n    <header class=\"otp-kitchen-designer-heading\">\n\n      <div class=\"otp-kitchen-heading-copy\">\n\n        <span class=\"otp-kitchen-section-icon\" aria-hidden=\"true\">\n          \u2726\n        <\/span>\n\n        <div>\n          <span class=\"otp-kitchen-section-eyebrow\">\n            Smart Project Designer\n          <\/span>\n\n          <h2>Outdoor Kitchen Assistant<\/h2>\n\n          <p>\n            Configure your outdoor kitchen step by step. The assistant will\n            calculate a preliminary size, recommend a layout and generate\n            a temporary investment range.\n          <\/p>\n        <\/div>\n\n      <\/div>\n\n      <div class=\"otp-kitchen-progress-summary\">\n\n        <span id=\"otpKitchenProgressLabel\">\n          Step 1 of 5\n        <\/span>\n\n        <div\n          class=\"otp-kitchen-progress-track\"\n          role=\"progressbar\"\n          aria-valuemin=\"1\"\n          aria-valuemax=\"5\"\n          aria-valuenow=\"1\"\n        >\n          <span id=\"otpKitchenProgressBar\"><\/span>\n        <\/div>\n\n      <\/div>\n\n    <\/header>\n\n\n    <!-- ==================================================\n         MAIN ASSISTANT GRID\n    =================================================== -->\n\n    <div class=\"otp-kitchen-assistant-grid\">\n\n      <!-- ================================================\n           LEFT COLUMN \u2014 GUIDED CONFIGURATOR\n      ================================================= -->\n\n      <div class=\"otp-kitchen-configurator\">\n\n        <!-- STEP NAVIGATION -->\n\n        <nav class=\"otp-kitchen-step-navigation\" aria-label=\"Kitchen configuration steps\">\n\n          <button\n            class=\"otp-kitchen-step-button is-active\"\n            type=\"button\"\n            data-step-target=\"1\"\n          >\n            <span class=\"otp-kitchen-step-number\">1<\/span>\n\n            <span class=\"otp-kitchen-step-copy\">\n              <small>Step one<\/small>\n              <strong>Kitchen Layout<\/strong>\n            <\/span>\n\n            <span class=\"otp-kitchen-step-status\" aria-hidden=\"true\">\n              \u2713\n            <\/span>\n          <\/button>\n\n          <button\n            class=\"otp-kitchen-step-button\"\n            type=\"button\"\n            data-step-target=\"2\"\n          >\n            <span class=\"otp-kitchen-step-number\">2<\/span>\n\n            <span class=\"otp-kitchen-step-copy\">\n              <small>Step two<\/small>\n              <strong>Appliances<\/strong>\n            <\/span>\n\n            <span class=\"otp-kitchen-step-status\" aria-hidden=\"true\">\n              \u2713\n            <\/span>\n          <\/button>\n\n          <button\n            class=\"otp-kitchen-step-button\"\n            type=\"button\"\n            data-step-target=\"3\"\n          >\n            <span class=\"otp-kitchen-step-number\">3<\/span>\n\n            <span class=\"otp-kitchen-step-copy\">\n              <small>Step three<\/small>\n              <strong>Exterior Finish<\/strong>\n            <\/span>\n\n            <span class=\"otp-kitchen-step-status\" aria-hidden=\"true\">\n              \u2713\n            <\/span>\n          <\/button>\n\n          <button\n            class=\"otp-kitchen-step-button\"\n            type=\"button\"\n            data-step-target=\"4\"\n          >\n            <span class=\"otp-kitchen-step-number\">4<\/span>\n\n            <span class=\"otp-kitchen-step-copy\">\n              <small>Step four<\/small>\n              <strong>Countertop<\/strong>\n            <\/span>\n\n            <span class=\"otp-kitchen-step-status\" aria-hidden=\"true\">\n              \u2713\n            <\/span>\n          <\/button>\n\n          <button\n            class=\"otp-kitchen-step-button\"\n            type=\"button\"\n            data-step-target=\"5\"\n          >\n            <span class=\"otp-kitchen-step-number\">5<\/span>\n\n            <span class=\"otp-kitchen-step-copy\">\n              <small>Step five<\/small>\n              <strong>Extras & Site<\/strong>\n            <\/span>\n\n            <span class=\"otp-kitchen-step-status\" aria-hidden=\"true\">\n              \u2713\n            <\/span>\n          <\/button>\n\n        <\/nav>\n\n\n        <!-- ==============================================\n             STEP PANELS\n        =============================================== -->\n\n        <div class=\"otp-kitchen-step-panels\">\n\n          <!-- ============================================\n               STEP 1 \u2014 LAYOUT\n          ============================================= -->\n\n          <section\n            class=\"otp-kitchen-step-panel is-active\"\n            data-step-panel=\"1\"\n            aria-labelledby=\"otpKitchenStepOneTitle\"\n          >\n\n            <div class=\"otp-kitchen-panel-heading\">\n\n              <div>\n                <span class=\"otp-kitchen-panel-kicker\">\n                  Begin with the overall shape\n                <\/span>\n\n                <h3 id=\"otpKitchenStepOneTitle\">\n                  Which kitchen layout best fits your vision?\n                <\/h3>\n\n                <p>\n                  Select the closest option. The final layout will be confirmed\n                  after measuring the project area.\n                <\/p>\n              <\/div>\n\n            <\/div>\n\n\n            <div\n              class=\"otp-kitchen-option-grid otp-kitchen-layout-grid\"\n              id=\"otpKitchenLayoutOptions\"\n            >\n\n              <button\n                class=\"otp-kitchen-visual-option is-selected\"\n                type=\"button\"\n                data-option-group=\"layout\"\n                data-option-value=\"straight\"\n                aria-pressed=\"true\"\n              >\n                <span class=\"otp-kitchen-option-image\">\n<img\nsrc=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/outdoor_kitchen_flagstone.webp\"\nalt=\"Premium straight outdoor kitchen with flagstone veneer and luxury countertop\"\nloading=\"lazy\"\n>\n                  >\n                <\/span>\n\n                <span class=\"otp-kitchen-option-content\">\n                  <strong>Straight Kitchen<\/strong>\n                  <small>Efficient for narrow or simple spaces.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n              <\/button>\n\n\n              <button\n                class=\"otp-kitchen-visual-option\"\n                type=\"button\"\n                data-option-group=\"layout\"\n                data-option-value=\"lShape\"\n                aria-pressed=\"false\"\n              >\n                <span class=\"otp-kitchen-option-image\">\n <img\nsrc=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/outdoor_kitchen_l_shape_flagstone.webp\"\nalt=\"L-shaped outdoor kitchen with flagstone stone veneer, grill, side burner and premium countertop\"\nloading=\"lazy\"\n>\n                  >\n                <\/span>\n\n                <span class=\"otp-kitchen-option-content\">\n                  <strong>L-Shaped Kitchen<\/strong>\n                  <small>More preparation space and better work zones.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n              <\/button>\n\n\n              <button\n                class=\"otp-kitchen-visual-option\"\n                type=\"button\"\n                data-option-group=\"layout\"\n                data-option-value=\"uShape\"\n                aria-pressed=\"false\"\n              >\n                <span class=\"otp-kitchen-option-image\">\n<img\nsrc=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/outdoor_kitchen_u_shape_flagstone.webp\"\nalt=\"U-shaped outdoor kitchen with flagstone veneer, built-in grill, storage and premium countertop\"\nloading=\"lazy\"\n>\n                  >\n                <\/span>\n\n                <span class=\"otp-kitchen-option-content\">\n                  <strong>U-Shaped Kitchen<\/strong>\n                  <small>Maximum workspace, storage and entertaining.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n              <\/button>\n\n\n              <button\n                class=\"otp-kitchen-visual-option\"\n                type=\"button\"\n                data-option-group=\"layout\"\n                data-option-value=\"island\"\n                aria-pressed=\"false\"\n              >\n                <span class=\"otp-kitchen-option-image\">\n<img\nsrc=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/outdoor_kitchen_flagstone_premium.webp\"\nalt=\"Luxury outdoor kitchen island with flagstone, stainless steel appliances and premium slab countertop\"\nloading=\"lazy\"\n>\n                  >\n                <\/span>\n\n                <span class=\"otp-kitchen-option-content\">\n                  <strong>Kitchen Island<\/strong>\n                  <small>A social focal point with seating possibilities.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n              <\/button>\n\n            <\/div>\n\n\n            <div class=\"otp-kitchen-question-card\">\n\n              <div>\n                <label for=\"otpKitchenGuestCount\">\n                  How many people do you usually entertain?\n                <\/label>\n\n                <p>\n                  This helps us recommend preparation and seating space.\n                <\/p>\n              <\/div>\n\n              <select id=\"otpKitchenGuestCount\">\n                <option value=\"4\">Up to 4 people<\/option>\n                <option value=\"8\" selected>5\u20138 people<\/option>\n                <option value=\"12\">9\u201312 people<\/option>\n                <option value=\"16\">More than 12 people<\/option>\n              <\/select>\n\n            <\/div>\n\n          <\/section>\n\n\n          <!-- ============================================\n               STEP 2 \u2014 APPLIANCES\n          ============================================= -->\n\n          <section\n            class=\"otp-kitchen-step-panel\"\n            data-step-panel=\"2\"\n            aria-labelledby=\"otpKitchenStepTwoTitle\"\n            hidden\n          >\n\n            <div class=\"otp-kitchen-panel-heading\">\n\n              <div>\n                <span class=\"otp-kitchen-panel-kicker\">\n                  Build your cooking and entertainment zone\n                <\/span>\n\n                <h3 id=\"otpKitchenStepTwoTitle\">\n                  Which appliances would you like to include?\n                <\/h3>\n\n                <p>\n                  Select all that apply. Appliance widths and temporary landing\n                  spaces will be included in the recommendation.\n                <\/p>\n              <\/div>\n\n            <\/div>\n\n\n            <div class=\"otp-kitchen-appliance-category\">\n\n              <div class=\"otp-kitchen-category-heading\">\n                <span>01<\/span>\n\n                <div>\n                  <h4>Cooking appliances<\/h4>\n                  <p>Main equipment used to prepare food.<\/p>\n                <\/div>\n              <\/div>\n\n\n              <div class=\"otp-kitchen-appliance-grid\">\n\n                <article class=\"otp-kitchen-appliance-card\">\n\n                  <button\n                    class=\"otp-kitchen-appliance-select is-selected\"\n                    type=\"button\"\n                    data-appliance=\"grill36\"\n                    aria-pressed=\"true\"\n                  >\n                    <span class=\"otp-kitchen-applia<span class=\"otp-kitchen-appliance-icon\">\n  <img decoding=\"async\" \n    src=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/36_inch_grill_icon.webp\"\n    alt=\"36 inch grill icon\"\n    loading=\"lazy\"\n  >\n<\/span>\n\n                   \n\n                    <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n                  <\/button>\n\n                  <div class=\"otp-kitchen-appliance-quantity\">\n                    <button type=\"button\" data-quantity-action=\"decrease\" data-appliance=\"grill36\">\n                      \u2212\n                    <\/button>\n\n                    <output data-appliance-quantity=\"grill36\">1<\/output>\n\n                    <button type=\"button\" data-quantity-action=\"increase\" data-appliance=\"grill36\">\n                      +\n                    <\/button>\n                  <\/div>\n\n                <\/article>\n\n\n                <article class=\"otp-kitchen-appliance-card\">\n\n                  <button\n                    class=\"otp-kitchen-appliance-select\"\n                    type=\"button\"\n                    data-appliance=\"sideBurner\"\n                    aria-pressed=\"false\"\n                  >\n                    <span class=\"ot<span class=\"otp-kitchen-appliance-icon\">\n  <img decoding=\"async\" \n    src=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/side_burner_icon.webp\"\n    alt=\"Side burner icon\"\n    loading=\"lazy\"\n  >\n\n\n                    <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n                  <\/button>\n\n                  <div class=\"otp-kitchen-appliance-quantity\">\n                    <button type=\"button\" data-quantity-action=\"decrease\" data-appliance=\"sideBurner\">\n                      \u2212\n                    <\/button>\n\n                    <output data-appliance-quantity=\"sideBurner\">0<\/output>\n\n                    <button type=\"button\" data-quantity-action=\"increase\" data-appliance=\"sideBurner\">\n                      +\n                    <\/button>\n                  <\/div>\n\n                <\/article>\n\n\n                <article class=\"otp-kitchen-appliance-card\">\n\n                  <button\n                    class=\"otp-kitchen-appliance-select\"\n                    type=\"button\"\n                    data-appliance=\"powerBurner\"\n                    aria-pressed=\"false\"\n                  >\n                    <span class=\"otp-kitchen-appli<span class=\"otp-kitchen-appliance-icon\">\n  <img decoding=\"async\" \n    src=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/power_burner_icon.webp\"\n    alt=\"Power burner icon\"\n    loading=\"lazy\"\n  >\n\n\n                    <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n                  <\/button>\n\n                  <div class=\"otp-kitchen-appliance-quantity\">\n                    <button type=\"button\" data-quantity-action=\"decrease\" data-appliance=\"powerBurner\">\n                      \u2212\n                    <\/button>\n\n                    <output data-appliance-quantity=\"powerBurner\">0<\/output>\n\n                    <button type=\"button\" data-quantity-action=\"increase\" data-appliance=\"powerBurner\">\n                      +\n                    <\/button>\n                  <\/div>\n\n                <\/article>\n\n\n                <article class=\"otp-kitchen-appliance-card\">\n\n                  <button\n                    class=\"otp-kitchen-appliance-select\"\n                    type=\"button\"\n                    data-appliance=\"griddle\"\n                    aria-pressed=\"false\"\n                  >\n                    <span class=\"otp-kitchen-applianc<span class=\"otp-kitchen-appliance-icon\">\n  <img decoding=\"async\" \n    src=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/built_in_griddle_icon.webp\"\n    alt=\"Built in griddle icon\"\n    loading=\"lazy\"\n  >\n\n\n                    <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n                  <\/button>\n\n                  <div class=\"otp-kitchen-appliance-quantity\">\n                    <button type=\"button\" data-quantity-action=\"decrease\" data-appliance=\"griddle\">\n                      \u2212\n                    <\/button>\n\n                    <output data-appliance-quantity=\"griddle\">0<\/output>\n\n                    <button type=\"button\" data-quantity-action=\"increase\" data-appliance=\"griddle\">\n                      +\n                    <\/button>\n                  <\/div>\n\n                <\/article>\n\n\n                <article class=\"otp-kitchen-appliance-card\">\n\n                  <button\n                    class=\"otp-kitchen-appliance-select\"\n                    type=\"button\"\n                    data-appliance=\"pizzaOven\"\n                    aria-pressed=\"false\"\n                  >\n                    <span class=\"otp-k<span class=\"otp-kitchen-appliance-icon\">\n  <img decoding=\"async\" \n    src=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/pizza_oven_icon.webp\"\n    alt=\"Pizza oven icon\"\n    loading=\"lazy\"\n  >\n\n\n                    <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n                  <\/button>\n\n                  <div class=\"otp-kitchen-appliance-quantity\">\n                    <button type=\"button\" data-quantity-action=\"decrease\" data-appliance=\"pizzaOven\">\n                      \u2212\n                    <\/button>\n\n                    <output data-appliance-quantity=\"pizzaOven\">0<\/output>\n\n                    <button type=\"button\" data-quantity-action=\"increase\" data-appliance=\"pizzaOven\">\n                      +\n                    <\/button>\n                  <\/div>\n\n                <\/article>\n\n              <\/div>\n\n            <\/div>\n\n\n            <div class=\"otp-kitchen-appliance-category\">\n\n              <div class=\"otp-kitchen-category-heading\">\n                <span>02<\/span>\n\n                <div>\n                  <h4>Water, refrigeration and cleaning<\/h4>\n                  <p>Appliances that may require utility connections.<\/p>\n                <\/div>\n              <\/div>\n\n\n              <div class=\"otp-kitchen-appliance-grid\">\n\n<article class=\"otp-kitchen-appliance-card\"> <button class=\"otp-kitchen-appliance-select\" type=\"button\" data-appliance=\"refrigerator\" aria-pressed=\"false\" > <span class=\"otp-k<span class=\"otp-kitchen-appliance-icon\"> \n                  <img decoding=\"async\" src=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/outdoor_sink_icon.webp\" alt=\"Outdoor sink icon\" loading=\"lazy\" >\n<\/span> <span class=\"otp-kitchen-option-check\">\u2713<\/span> <\/button> <div class=\"otp-kitchen-appliance-quantity\"> <button type=\"button\" data-quantity-action=\"decrease\" data-appliance=\"sink\"> \u2212 <\/button> <output data-appliance-quantity=\"sink\">0<\/output> <button type=\"button\" data-quantity-action=\"increase\" data-appliance=\"sink\"> + <\/button> <\/div> <\/article>\n\n\n                                                                                               \n                                                                                               \n                <article class=\"otp-kitchen-appliance-card\">\n\n                  <button\n                    class=\"otp-kitchen-appliance-select\"\n                    type=\"button\"\n                    data-appliance=\"refrigerator\"\n                    aria-pressed=\"false\"\n                  >\n                    <span class=\"otp-k<span class=\"otp-kitchen-appliance-icon\">\n  <img decoding=\"async\" \n    src=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/refrigerator_icon.webp\"\n    alt=\"Outdoor refrigerator icon\"\n    loading=\"lazy\"\n  >\n\n\n                    <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n                  <\/button>\n\n                  <div class=\"otp-kitchen-appliance-quantity\">\n                    <button type=\"button\" data-quantity-action=\"decrease\" data-appliance=\"refrigerator\">\n                      \u2212\n                    <\/button>\n\n                    <output data-appliance-quantity=\"refrigerator\">0<\/output>\n\n                    <button type=\"button\" data-quantity-action=\"increase\" data-appliance=\"refrigerator\">\n                      +\n                    <\/button>\n                  <\/div>\n\n                <\/article>\n\n\n                <article class=\"otp-kitchen-appliance-card\">\n\n                  <button\n                    class=\"otp-kitchen-appliance-select\"\n                    type=\"button\"\n                    data-appliance=\"iceMaker\"\n                    aria-pressed=\"false\"\n                  >\n                    <span class=\"o<span class=\"otp-kitchen-appliance-icon\">\n  <img decoding=\"async\" \n    src=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/ice_maker_icon.webp\"\n    alt=\"Ice maker icon\"\n    loading=\"lazy\"\n  >\n\n                    <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n                  <\/button>\n\n                  <div class=\"otp-kitchen-appliance-quantity\">\n                    <button type=\"button\" data-quantity-action=\"decrease\" data-appliance=\"iceMaker\">\n                      \u2212\n                    <\/button>\n\n                    <output data-appliance-quantity=\"iceMaker\">0<\/output>\n\n                    <button type=\"button\" data-quantity-action=\"increase\" data-appliance=\"iceMaker\">\n                      +\n                    <\/button>\n                  <\/div>\n\n                <\/article>\n\n\n                <article class=\"otp-kitchen-appliance-card\">\n\n                  <button\n                    class=\"otp-kitchen-appliance-select\"\n                    type=\"button\"\n                    data-appliance=\"trashDrawer\"\n                    aria-pressed=\"false\"\n                  >\n                    <span class=\"otp-kit<span class=\"otp-kitchen-appliance-icon\">\n  <img decoding=\"async\" \n    src=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/trash_drawer_icon.webp\"\n    alt=\"Trash drawer icon\"\n    loading=\"lazy\"\n  >\n\n                    <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n                  <\/button>\n\n                  <div class=\"otp-kitchen-appliance-quantity\">\n                    <button type=\"button\" data-quantity-action=\"decrease\" data-appliance=\"trashDrawer\">\n                      \u2212\n                    <\/button>\n\n                    <output data-appliance-quantity=\"trashDrawer\">0<\/output>\n\n                    <button type=\"button\" data-quantity-action=\"increase\" data-appliance=\"trashDrawer\">\n                      +\n                    <\/button>\n                  <\/div>\n\n                <\/article>\n\n              <\/div>\n\n            <\/div>\n\n\n            <div class=\"otp-kitchen-appliance-category\">\n\n              <div class=\"otp-kitchen-category-heading\">\n                <span>03<\/span>\n\n                <div>\n                  <h4>Storage<\/h4>\n                  <p>Cabinets, access doors and functional organization.<\/p>\n                <\/div>\n              <\/div>\n\n\n              <div class=\"otp-kitchen-appliance-grid\">\n\n<article class=\"otp-kitchen-appliance-card\"> <button class=\"otp-kitchen-appliance-select\" type=\"button\" data-appliance=\"doubleDoors\" aria-pressed=\"false\" ><span class=\"otp-k\n                         <span class=\"otp-kitchen-appliance-icon\">\n  <img decoding=\"async\" \n    src=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/double_access_doors_icon.webp\"\n    alt=\"Double access doors icon\"\n    loading=\"lazy\"\n  >\n<\/button>  <div class=\"otp-kitchen-appliance-quantity\">\n\n                    <button type=\"button\" data-quantity-action=\"decrease\" data-appliance=\"doubleDoors\">\n\n                      \u2212\n\n                    <\/button>\n\n\n\n                    <output data-appliance-quantity=\"doubleDoors\">0<\/output>\n\n\n\n                    <button type=\"button\" data-quantity-action=\"increase\" data-appliance=\"doubleDoors\">\n\n                      +\n\n                    <\/button>\n\n                  <\/div>\n\n\n\n                <\/article>\n\n                <article class=\"otp-kitchen-appliance-card\">\n\n                  <button\n                    class=\"otp-kitchen-appliance-select\"\n                    type=\"button\"\n                    data-appliance=\"tripleDrawers\"\n                    aria-pressed=\"false\"\n                  >\n                    <span class=\"<span class=\"otp-kitchen-appliance-icon\">\n  <img decoding=\"async\" \n    src=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/drawer_door_combo_icon.webp\"\n    alt=\"Drawer door combo icon\"\n    loading=\"lazy\"\n  >\n\n\n                    <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n                  <\/button>\n\n                  <div class=\"otp-kitchen-appliance-quantity\">\n                    <button type=\"button\" data-quantity-action=\"decrease\" data-appliance=\"tripleDrawers\">\n                      \u2212\n                    <\/button>\n\n                    <output data-appliance-quantity=\"tripleDrawers\">0<\/output>\n\n                    <button type=\"button\" data-quantity-action=\"increase\" data-appliance=\"tripleDrawers\">\n                      +\n                    <\/button>\n                  <\/div>\n\n                <\/article>\n\n\n                <article class=\"otp-kitchen-appliance-card\">\n\n                  <button\n                    class=\"otp-kitchen-appliance-select\"\n                    type=\"button\"\n                    data-appliance=\"comboStorage\"\n                    aria-pressed=\"false\"\n                  >\n                    <span class=\"o<span class=\"otp-kitchen-appliance-icon\">\n  <img decoding=\"async\" \n    src=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/drawer_door_combo_icon.webp\"\n    alt=\"Drawer door combo icon\"\n    loading=\"lazy\"\n  >\n\n\n                    <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n                  <\/button>\n\n                  <div class=\"otp-kitchen-appliance-quantity\">\n                    <button type=\"button\" data-quantity-action=\"decrease\" data-appliance=\"comboStorage\">\n                      \u2212\n                    <\/button>\n\n                    <output data-appliance-quantity=\"comboStorage\">0<\/output>\n\n                    <button type=\"button\" data-quantity-action=\"increase\" data-appliance=\"comboStorage\">\n                      +\n                    <\/button>\n                  <\/div>\n\n                <\/article>\n\n              <\/div>\n\n            <\/div>\n\n          <\/section>\n\n\n          <!-- ============================================\n               STEP 3 \u2014 EXTERIOR FINISH\n          ============================================= -->\n\n          <section\n            class=\"otp-kitchen-step-panel\"\n            data-step-panel=\"3\"\n            aria-labelledby=\"otpKitchenStepThreeTitle\"\n            hidden\n          >\n\n            <div class=\"otp-kitchen-panel-heading\">\n\n              <div>\n                <span class=\"otp-kitchen-panel-kicker\">\n                  Choose the exterior appearance\n                <\/span>\n\n                <h3 id=\"otpKitchenStepThreeTitle\">\n                  Which finish best matches your home?\n                <\/h3>\n\n                <p>\n                  The images and pricing factors shown here are temporary\n                  demonstration content.\n                <\/p>\n              <\/div>\n\n            <\/div>\n\n\n            <div class=\"otp-kitchen-option-grid otp-kitchen-material-grid\">\n\n              <button\n                class=\"otp-kitchen-visual-option is-selected\"\n                type=\"button\"\n                data-option-group=\"finish\"\n                data-option-value=\"stucco\"\n                aria-pressed=\"true\"\n              >\n                <span class=\"otp-kitchen-option-image\">\n<img\nsrc=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/outdoor_kitchen_smooth_stucco.webp\"\nalt=\"Outdoor kitchen with smooth stucco exterior finish\"\nloading=\"lazy\"\n                  >\n                <\/span>\n\n                <span class=\"otp-kitchen-option-content\">\n                  <strong>Smooth Stucco<\/strong>\n                  <small>Clean, flexible and budget-friendly.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n              <\/button>\n\n\n              <button\n                class=\"otp-kitchen-visual-option\"\n                type=\"button\"\n                data-option-group=\"finish\"\n                data-option-value=\"flagstone\"\n                aria-pressed=\"false\"\n              >\n                <span class=\"otp-kitchen-option-image\">\n<img\nsrc=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/outdoor_kitchen_flagstone-1.webp\"\nalt=\"Outdoor kitchen with natural flagstone veneer finish\"\nloading=\"lazy\"\n                  >\n                <\/span>\n\n                <span class=\"otp-kitchen-option-content\">\n                  <strong>Flagstone<\/strong>\n                  <small>Natural texture with a Texas character.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n              <\/button>\n\n\n              <button\n                class=\"otp-kitchen-visual-option\"\n                type=\"button\"\n                data-option-group=\"finish\"\n                data-option-value=\"naturalStone\"\n                aria-pressed=\"false\"\n              >\n                <span class=\"otp-kitchen-option-image\">\n<img\nsrc=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/outdoor_kitchen_natural_stone.webp\"\nalt=\"Luxury outdoor kitchen with natural stone veneer exterior\"\nloading=\"lazy\"\n                  >\n                <\/span>\n\n                <span class=\"otp-kitchen-option-content\">\n                  <strong>Natural Stone<\/strong>\n                  <small>Premium depth, texture and timeless appeal.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n              <\/button>\n\n\n              <button\n                class=\"otp-kitchen-visual-option\"\n                type=\"button\"\n                data-option-group=\"finish\"\n                data-option-value=\"ledgestone\"\n                aria-pressed=\"false\"\n              >\n                <span class=\"otp-kitchen-option-image\">\n<img\nsrc=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/outdoor_kitchen_ledgerstone.webp\"\nalt=\"Outdoor kitchen with ledgestone stacked stone veneer\"\nloading=\"lazy\"\n                  >\n                <\/span>\n\n                <span class=\"otp-kitchen-option-content\">\n                  <strong>Ledgestone<\/strong>\n                  <small>Layered texture for a modern premium look.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n              <\/button>\n\n\n              <button\n                class=\"otp-kitchen-visual-option\"\n                type=\"button\"\n                data-option-group=\"finish\"\n                data-option-value=\"brick\"\n                aria-pressed=\"false\"\n              >\n                <span class=\"otp-kitchen-option-image\">\n<img\nsrc=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/outdoor_kitchen_masonry_brick.webp\"\nalt=\"Outdoor kitchen with masonry brick exterior finish\"\nloading=\"lazy\"\n                  >\n                <\/span>\n\n                <span class=\"otp-kitchen-option-content\">\n                  <strong>Masonry Brick<\/strong>\n                  <small>Traditional style and strong visual character.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n              <\/button>\n\n\n              <button\n                class=\"otp-kitchen-visual-option\"\n                type=\"button\"\n                data-option-group=\"finish\"\n                data-option-value=\"porcelainVeneer\"\n                aria-pressed=\"false\"\n              >\n                <span class=\"otp-kitchen-option-image\">\n<img\nsrc=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/outdoor_kitchen_porcelain_veneer.webp\"\nalt=\"Modern outdoor kitchen with porcelain veneer exterior finish\"\nloading=\"lazy\"\n                  >\n                <\/span>\n\n                <span class=\"otp-kitchen-option-content\">\n                  <strong>Porcelain Veneer<\/strong>\n                  <small>Contemporary finish with refined surfaces.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n              <\/button>\n\n            <\/div>\n\n          <\/section>\n\n\n          <!-- ============================================\n               STEP 4 \u2014 COUNTERTOP\n          ============================================= -->\n\n          <section\n            class=\"otp-kitchen-step-panel\"\n            data-step-panel=\"4\"\n            aria-labelledby=\"otpKitchenStepFourTitle\"\n            hidden\n          >\n\n            <div class=\"otp-kitchen-panel-heading\">\n\n              <div>\n                <span class=\"otp-kitchen-panel-kicker\">\n                  Complete the work surface\n                <\/span>\n\n                <h3 id=\"otpKitchenStepFourTitle\">\n                  Select a countertop material\n                <\/h3>\n\n                <p>\n                  Final availability, color and suitability will be reviewed\n                  by a project specialist.\n                <\/p>\n              <\/div>\n\n            <\/div>\n\n\n            <div class=\"otp-kitchen-option-grid otp-kitchen-countertop-grid\">\n\n              <button\n                class=\"otp-kitchen-visual-option is-selected\"\n                type=\"button\"\n                data-option-group=\"countertop\"\n                data-option-value=\"granite\"\n                aria-pressed=\"true\"\n              >\n                <span class=\"otp-kitchen-option-image\">\n<img decoding=\"async\" \n  src=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/granite_countertop_card.webp\"\n  alt=\"Outdoor kitchen granite countertop\"\n  loading=\"lazy\"\n>\n>\n>\n>\n                  >\n                <\/span>\n\n                <span class=\"otp-kitchen-option-content\">\n                  <strong>Granite<\/strong>\n                  <small>Natural pattern with a durable premium surface.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n              <\/button>\n\n\n              <button\n                class=\"otp-kitchen-visual-option\"\n                type=\"button\"\n                data-option-group=\"countertop\"\n                data-option-value=\"porcelain\"\n                aria-pressed=\"false\"\n              >\n                <span class=\"otp-kitchen-option-image\">\n<img decoding=\"async\" \n  src=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/granite_countertop_card_1784051333.webp\"\n  alt=\"Outdoor kitchen natural stone countertop\"\n  loading=\"lazy\"\n>\n>\n                  >\n                <\/span>\n\n                <span class=\"otp-kitchen-option-content\">\n                  <strong>Porcelain<\/strong>\n                  <small>Modern appearance with refined color options.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n              <\/button>\n\n\n              <button\n                class=\"otp-kitchen-visual-option\"\n                type=\"button\"\n                data-option-group=\"countertop\"\n                data-option-value=\"concrete\"\n                aria-pressed=\"false\"\n              >\n                <span class=\"otp-kitchen-option-image\">\n<img decoding=\"async\" \n  src=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/concrete_countertop_card.webp\"\n  alt=\"Outdoor kitchen finished concrete countertop\"\n  loading=\"lazy\"\n>\n>\n                  >\n                <\/span>\n\n                <span class=\"otp-kitchen-option-content\">\n                  <strong>Finished Concrete<\/strong>\n                  <small>Contemporary style with a substantial appearance.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n              <\/button>\n\n\n              <button\n                class=\"otp-kitchen-visual-option\"\n                type=\"button\"\n                data-option-group=\"countertop\"\n                data-option-value=\"naturalStoneTop\"\n                aria-pressed=\"false\"\n              >\n                <span class=\"otp-kitchen-option-image\">\n<img decoding=\"async\" \n  src=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/porcelain_countertop_card_1784051374.webp\"\n  alt=\"Outdoor kitchen porcelain countertop\"\n  loading=\"lazy\"\n>\n>\n                  >\n                <\/span>\n\n                <span class=\"otp-kitchen-option-content\">\n                  <strong>Natural Stone<\/strong>\n                  <small>Organic texture and traditional luxury.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-option-check\">\u2713<\/span>\n              <\/button>\n\n            <\/div>\n\n\n            <div class=\"otp-kitchen-question-card\">\n\n              <div>\n                <label for=\"otpKitchenCounterDepth\">\n                  Preferred countertop depth\n                <\/label>\n\n                <p>\n                  Standard and expanded depths use temporary demo allowances.\n                <\/p>\n              <\/div>\n\n              <select id=\"otpKitchenCounterDepth\">\n                <option value=\"standard\" selected>Standard depth<\/option>\n                <option value=\"expanded\">Expanded preparation depth<\/option>\n                <option value=\"bar\">Extended bar-seating depth<\/option>\n              <\/select>\n\n            <\/div>\n\n          <\/section>\n\n\n          <!-- ============================================\n               STEP 5 \u2014 EXTRAS AND SITE CONDITIONS\n          ============================================= -->\n\n          <section\n            class=\"otp-kitchen-step-panel\"\n            data-step-panel=\"5\"\n            aria-labelledby=\"otpKitchenStepFiveTitle\"\n            hidden\n          >\n\n            <div class=\"otp-kitchen-panel-heading\">\n\n              <div>\n                <span class=\"otp-kitchen-panel-kicker\">\n                  Complete your project configuration\n                <\/span>\n\n                <h3 id=\"otpKitchenStepFiveTitle\">\n                  Which features and site conditions apply?\n                <\/h3>\n\n                <p>\n                  These choices help adjust the temporary estimate and identify\n                  items that require professional review.\n                <\/p>\n              <\/div>\n\n            <\/div>\n\n\n            <div class=\"otp-kitchen-extra-grid\">\n\n              <button\n                class=\"otp-kitchen-toggle-option\"\n                type=\"button\"\n                data-extra=\"barSeating\"\n                aria-pressed=\"false\"\n              >\n<span class=\"otp-kitchen-toggle-icon\">\n<img \nsrc=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/bar_seating_icon.webp\"\nalt=\"Bar seating icon\"\nloading=\"lazy\">\n<\/span>\n\n                <span>\n                  <strong>Bar Seating<\/strong>\n                  <small>Add an entertaining overhang or raised bar.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-switch\" aria-hidden=\"true\">\n                  <span><\/span>\n                <\/span>\n              <\/button>\n\n\n              <button\n                class=\"otp-kitchen-toggle-option\"\n                type=\"button\"\n                data-extra=\"lighting\"\n                aria-pressed=\"false\"\n              >\n<span class=\"otp-kitchen-toggle-icon\">\n<img \nsrc=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/integrated_lighting_icon.webp\"\nalt=\"Integrated lighting icon\"\nloading=\"lazy\">\n<\/span>\n\n                <span>\n                  <strong>Integrated Lighting<\/strong>\n                  <small>Task or accent lighting allowance.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-switch\" aria-hidden=\"true\">\n                  <span><\/span>\n                <\/span>\n              <\/button>\n\n\n              <button\n                class=\"otp-kitchen-toggle-option\"\n                type=\"button\"\n                data-extra=\"pergola\"\n                aria-pressed=\"false\"\n              >\n<span class=\"otp-kitchen-toggle-icon\">\n<img \nsrc=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/pergola_or_cover_icon.webp\"\nalt=\"Pergola cover icon\"\nloading=\"lazy\">\n<\/span>\n\n                <span>\n                  <strong>Pergola or Cover<\/strong>\n                  <small>Include a temporary covered-structure allowance.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-switch\" aria-hidden=\"true\">\n                  <span><\/span>\n                <\/span>\n              <\/button>\n\n\n              <button\n                class=\"otp-kitchen-toggle-option\"\n                type=\"button\"\n                data-extra=\"newSlab\"\n                aria-pressed=\"false\"\n              >\n<span class=\"otp-kitchen-toggle-icon\">\n<img \nsrc=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/new_foundation_slab_icon.webp\"\nalt=\"New foundation slab icon\"\nloading=\"lazy\">\n<\/span>\n\n                <span>\n                  <strong>New Foundation Slab<\/strong>\n                  <small>A new concrete base may be required.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-switch\" aria-hidden=\"true\">\n                  <span><\/span>\n                <\/span>\n              <\/button>\n\n\n              <button\n                class=\"otp-kitchen-toggle-option\"\n                type=\"button\"\n                data-extra=\"backsplash\"\n                aria-pressed=\"false\"\n              >\n<span class=\"otp-kitchen-toggle-icon\">\n<img \nsrc=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/backsplash_wall_icon.webp\"\nalt=\"Backsplash wall icon\"\nloading=\"lazy\">\n<\/span>\n\n                <span>\n                  <strong>Backsplash Wall<\/strong>\n                  <small>Add height, protection and visual detail.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-switch\" aria-hidden=\"true\">\n                  <span><\/span>\n                <\/span>\n              <\/button>\n\n\n              <button\n                class=\"otp-kitchen-toggle-option\"\n                type=\"button\"\n                data-extra=\"outlets\"\n                aria-pressed=\"false\"\n              >\n <span class=\"otp-kitchen-toggle-icon\">\n<img \nsrc=\"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-content\/uploads\/2026\/07\/electrical_outlets_icon.webp\"\nalt=\"Electrical outlets icon\"\nloading=\"lazy\">\n<\/span>\n\n                <span>\n                  <strong>Electrical Outlets<\/strong>\n                  <small>Convenience outlets for outdoor use.<\/small>\n                <\/span>\n\n                <span class=\"otp-kitchen-switch\" aria-hidden=\"true\">\n                  <span><\/span>\n                <\/span>\n              <\/button>\n\n            <\/div>\n\n\n            <div class=\"otp-kitchen-site-grid\">\n\n              <div class=\"otp-kitchen-field\">\n\n                <label for=\"otpKitchenSurface\">\n                  What currently exists in the project area?\n                <\/label>\n\n                <select id=\"otpKitchenSurface\">\n                  <option value=\"existingConcrete\">Existing concrete slab<\/option>\n                  <option value=\"existingPavers\">Existing paver patio<\/option>\n                  <option value=\"grass\">Grass or soil<\/option>\n                  <option value=\"deck\">Existing deck<\/option>\n                  <option value=\"unknown\">I am not sure<\/option>\n                <\/select>\n\n              <\/div>\n\n\n              <div class=\"otp-kitchen-field\">\n\n                <label for=\"otpKitchenGas\">\n                  Gas connection\n                <\/label>\n\n                <select id=\"otpKitchenGas\">\n                  <option value=\"nearby\">Connection is nearby<\/option>\n                  <option value=\"extension\">May require an extension<\/option>\n                  <option value=\"propane\">Plan to use propane<\/option>\n                  <option value=\"unknown\">I am not sure<\/option>\n                <\/select>\n\n              <\/div>\n\n\n              <div class=\"otp-kitchen-field\">\n\n                <label for=\"otpKitchenWater\">\n                  Water connection\n                <\/label>\n\n                <select id=\"otpKitchenWater\">\n                  <option value=\"notNeeded\">Not needed<\/option>\n                  <option value=\"nearby\">Connection is nearby<\/option>\n                  <option value=\"extension\">May require an extension<\/option>\n                  <option value=\"unknown\">I am not sure<\/option>\n                <\/select>\n\n              <\/div>\n\n\n              <div class=\"otp-kitchen-field\">\n\n                <label for=\"otpKitchenElectrical\">\n                  Electrical connection\n                <\/label>\n\n                <select id=\"otpKitchenElectrical\">\n                  <option value=\"nearby\">Outdoor power is nearby<\/option>\n                  <option value=\"extension\">May require new electrical work<\/option>\n                  <option value=\"unknown\">I am not sure<\/option>\n                <\/select>\n\n              <\/div>\n\n\n              <div class=\"otp-kitchen-field\">\n\n                <label for=\"otpKitchenAccess\">\n                  Backyard access\n                <\/label>\n\n                <select id=\"otpKitchenAccess\">\n                  <option value=\"easy\">Wide and easy access<\/option>\n                  <option value=\"standard\">Standard gate access<\/option>\n                  <option value=\"limited\">Limited or narrow access<\/option>\n                  <option value=\"unknown\">I am not sure<\/option>\n                <\/select>\n\n              <\/div>\n\n\n              <div class=\"otp-kitchen-field\">\n\n                <label for=\"otpKitchenProjectTiming\">\n                  Ideal project timing\n                <\/label>\n\n                <select id=\"otpKitchenProjectTiming\">\n                  <option value=\"soon\">Within 1\u20132 months<\/option>\n                  <option value=\"quarter\">Within 3\u20134 months<\/option>\n                  <option value=\"sixMonths\">Within 6 months<\/option>\n                  <option value=\"researching\">I am currently researching<\/option>\n                <\/select>\n\n              <\/div>\n\n            <\/div>\n\n          <\/section>\n\n        <\/div>\n\n\n        <!-- ==============================================\n             PANEL NAVIGATION\n        =============================================== -->\n\n        <footer class=\"otp-kitchen-panel-navigation\">\n\n          <button\n            id=\"otpKitchenPreviousButton\"\n            class=\"otp-kitchen-navigation-button otp-kitchen-navigation-secondary\"\n            type=\"button\"\n            disabled\n          >\n            <span aria-hidden=\"true\">\u2190<\/span>\n            Previous\n          <\/button>\n\n          <button\n            id=\"otpKitchenNextButton\"\n            class=\"otp-kitchen-navigation-button otp-kitchen-navigation-primary\"\n            type=\"button\"\n          >\n            Continue to appliances\n            <span aria-hidden=\"true\">\u2192<\/span>\n          <\/button>\n\n        <\/footer>\n\n      <\/div>\n\n\n      <!-- ================================================\n           RIGHT COLUMN \u2014 REAL-TIME RECOMMENDATION\n      ================================================= -->\n\n      <aside class=\"otp-kitchen-recommendation-panel\">\n\n        <header class=\"otp-kitchen-recommendation-header\">\n\n          <span aria-hidden=\"true\">\u2726<\/span>\n\n          <div>\n            <small>Live project guidance<\/small>\n            <h3>Real-Time Recommendation<\/h3>\n          <\/div>\n\n        <\/header>\n\n\n        <div class=\"otp-kitchen-recommendation-body\">\n\n          <div class=\"otp-kitchen-main-recommendation\">\n\n            <span>Based on your current selections<\/span>\n\n            <p>\n              We recommend no less than\n            <\/p>\n\n            <strong id=\"otpKitchenMinimumLength\">\n              12 ft\n            <\/strong>\n\n            <hr>\n\n            <p>\n              For a more comfortable and premium design\n            <\/p>\n\n            <strong id=\"otpKitchenPremiumLength\">\n              16\u201318 ft\n            <\/strong>\n\n          <\/div>\n\n\n          <div class=\"otp-kitchen-recommendation-message\">\n\n            <span class=\"otp-kitchen-recommendation-message-icon\">\n              i\n            <\/span>\n\n            <p id=\"otpKitchenRecommendationMessage\">\n              Your current straight layout provides a simple starting point.\n              Add appliances to receive a more personalized recommendation.\n            <\/p>\n\n          <\/div>\n\n\n          <div class=\"otp-kitchen-layout-recommendations\">\n\n            <div class=\"otp-kitchen-subheading\">\n              <span>Suggested configurations<\/span>\n              <small>Temporary linear measurements<\/small>\n            <\/div>\n\n\n            <article class=\"otp-kitchen-layout-tier\">\n\n              <div class=\"otp-kitchen-layout-diagram\" aria-hidden=\"true\">\n                <span><\/span>\n                <span><\/span>\n                <span><\/span>\n              <\/div>\n\n              <div>\n                <span>Compact<\/span>\n\n                <strong id=\"otpKitchenCompactLength\">\n                  12 ft\n                <\/strong>\n\n                <p>\n                  Functional arrangement with reduced preparation space.\n                <\/p>\n              <\/div>\n\n            <\/article>\n\n\n            <article class=\"otp-kitchen-layout-tier is-recommended\">\n\n              <div class=\"otp-kitchen-layout-diagram\" aria-hidden=\"true\">\n                <span><\/span>\n                <span><\/span>\n                <span><\/span>\n                <span><\/span>\n              <\/div>\n\n              <div>\n                <span>Comfortable<\/span>\n\n                <strong id=\"otpKitchenComfortLength\">\n                  16 ft\n                <\/strong>\n\n                <p>\n                  Better movement, separation and countertop preparation.\n                <\/p>\n              <\/div>\n\n              <small class=\"otp-kitchen-recommended-label\">\n                Recommended\n              <\/small>\n\n            <\/article>\n\n\n            <article class=\"otp-kitchen-layout-tier\">\n\n              <div class=\"otp-kitchen-layout-diagram\" aria-hidden=\"true\">\n                <span><\/span>\n                <span><\/span>\n                <span><\/span>\n                <span><\/span>\n                <span><\/span>\n              <\/div>\n\n              <div>\n                <span>Premium<\/span>\n\n                <strong id=\"otpKitchenLuxuryLength\">\n                  18 ft\n                <\/strong>\n\n                <p>\n                  Expanded preparation, storage and entertaining space.\n                <\/p>\n              <\/div>\n\n            <\/article>\n\n          <\/div>\n\n\n          <div class=\"otp-kitchen-current-selection\">\n\n            <div class=\"otp-kitchen-subheading\">\n              <span>Current design summary<\/span>\n\n              <button\n                id=\"otpKitchenResetButton\"\n                type=\"button\"\n              >\n                Reset\n              <\/button>\n            <\/div>\n\n\n            <dl class=\"otp-kitchen-selection-list\">\n\n              <div>\n                <dt>Layout<\/dt>\n                <dd id=\"otpKitchenSummaryLayout\">Straight Kitchen<\/dd>\n              <\/div>\n\n              <div>\n                <dt>Appliances<\/dt>\n                <dd id=\"otpKitchenSummaryAppliances\">36-inch Grill<\/dd>\n              <\/div>\n\n              <div>\n                <dt>Exterior<\/dt>\n                <dd id=\"otpKitchenSummaryFinish\">Smooth Stucco<\/dd>\n              <\/div>\n\n              <div>\n                <dt>Countertop<\/dt>\n                <dd id=\"otpKitchenSummaryCountertop\">Granite<\/dd>\n              <\/div>\n\n              <div>\n                <dt>Extras<\/dt>\n                <dd id=\"otpKitchenSummaryExtras\">None selected<\/dd>\n              <\/div>\n\n            <\/dl>\n\n          <\/div>\n\n\n          <div class=\"otp-kitchen-estimate-card\">\n\n            <div class=\"otp-kitchen-estimate-card-heading\">\n\n              <span class=\"otp-kitchen-estimate-icon\">\n                $\n              <\/span>\n\n              <div>\n                <small>Preliminary demo estimate<\/small>\n                <strong id=\"otpKitchenEstimateRange\">\n                  $18,500\u2013$24,500\n                <\/strong>\n              <\/div>\n\n            <\/div>\n\n            <p>\n              This temporary range is generated from demonstration pricing.\n              A specialist must verify dimensions, utilities, materials and\n              site conditions.\n            <\/p>\n\n          <\/div>\n\n        <\/div>\n\n      <\/aside>\n\n    <\/div>\n\n\n    <!-- ==================================================\n         FULL-WIDTH INSTANT ESTIMATE\n    =================================================== -->\n\n    <div class=\"otp-kitchen-instant-estimate\">\n\n      <div class=\"otp-kitchen-instant-estimate-label\">\n\n        <span class=\"otp-kitchen-calculator-icon\" aria-hidden=\"true\">\n          \u25a6\n        <\/span>\n\n        <div>\n          <small>Instant preliminary estimate<\/small>\n          <strong>Current configuration range<\/strong>\n        <\/div>\n\n      <\/div>\n\n      <div\n        class=\"otp-kitchen-instant-estimate-value\"\n        id=\"otpKitchenEstimateRangeLarge\"\n      >\n        $18,500\u2013$24,500\n      <\/div>\n\n      <p>\n        Final pricing may be adjusted after a professional site review.\n      <\/p>\n\n    <\/div>\n\n\n    <!-- ==================================================\n         DESIGN SUMMARY + LEAD CAPTURE\n    =================================================== -->\n\n    <section class=\"otp-kitchen-lead-section\" id=\"otp-kitchen-consultation\">\n\n      <div class=\"otp-kitchen-lead-intro\">\n\n        <span class=\"otp-kitchen-section-eyebrow\">\n          Your preliminary design is ready\n        <\/span>\n\n        <h2>\n          Request a specialist review\n        <\/h2>\n\n        <p>\n          Submit your configuration so a project specialist can confirm the\n          measurements, review the property and help adjust the design to your\n          preferred investment range.\n        <\/p>\n\n\n        <div class=\"otp-kitchen-generated-summary\">\n\n          <div class=\"otp-kitchen-generated-summary-heading\">\n\n            <div>\n              <small>Project configuration<\/small>\n              <strong id=\"otpKitchenLeadSummaryTitle\">\n                Straight outdoor kitchen\n              <\/strong>\n            <\/div>\n\n            <button\n              id=\"otpKitchenCopySummaryButton\"\n              type=\"button\"\n            >\n              Copy summary\n            <\/button>\n\n          <\/div>\n\n          <ul id=\"otpKitchenLeadSummaryList\">\n            <li>Recommended length: 12\u201316 ft<\/li>\n            <li>Selected appliance: 36-inch Grill<\/li>\n            <li>Exterior finish: Smooth Stucco<\/li>\n            <li>Countertop: Granite<\/li>\n          <\/ul>\n\n        <\/div>\n\n      <\/div>\n\n\n      <form\n        class=\"otp-kitchen-lead-form\"\n        id=\"otpKitchenLeadForm\"\n        novalidate\n      >\n\n        <div class=\"otp-kitchen-lead-form-heading\">\n          <span>Project contact information<\/span>\n\n          <h3>Where should we send your design summary?<\/h3>\n        <\/div>\n\n\n        <div class=\"otp-kitchen-form-grid\">\n\n          <div class=\"otp-kitchen-field\">\n            <label for=\"otpKitchenCustomerName\">\n              Full name\n            <\/label>\n\n            <input\n              id=\"otpKitchenCustomerName\"\n              name=\"customerName\"\n              type=\"text\"\n              autocomplete=\"name\"\n              placeholder=\"Your full name\"\n              required\n            >\n          <\/div>\n\n\n          <div class=\"otp-kitchen-field\">\n            <label for=\"otpKitchenCustomerPhone\">\n              Phone number\n            <\/label>\n\n            <input\n              id=\"otpKitchenCustomerPhone\"\n              name=\"customerPhone\"\n              type=\"tel\"\n              autocomplete=\"tel\"\n              placeholder=\"(000) 000-0000\"\n              required\n            >\n          <\/div>\n\n\n          <div class=\"otp-kitchen-field\">\n            <label for=\"otpKitchenCustomerEmail\">\n              Email address\n            <\/label>\n\n            <input\n              id=\"otpKitchenCustomerEmail\"\n              name=\"customerEmail\"\n              type=\"email\"\n              autocomplete=\"email\"\n              placeholder=\"name@email.com\"\n              required\n            >\n          <\/div>\n\n\n          <div class=\"otp-kitchen-field\">\n            <label for=\"otpKitchenCustomerCity\">\n              City or ZIP code\n            <\/label>\n\n            <input\n              id=\"otpKitchenCustomerCity\"\n              name=\"customerCity\"\n              type=\"text\"\n              autocomplete=\"postal-code\"\n              placeholder=\"Arlington, TX\"\n              required\n            >\n          <\/div>\n\n\n          <div class=\"otp-kitchen-field\">\n            <label for=\"otpKitchenCustomerBudget\">\n              Preferred investment range\n            <\/label>\n\n            <select\n              id=\"otpKitchenCustomerBudget\"\n              name=\"customerBudget\"\n              required\n            >\n              <option value=\"\">Select a range<\/option>\n              <option value=\"15000-25000\">$15,000\u2013$25,000<\/option>\n              <option value=\"25000-35000\">$25,000\u2013$35,000<\/option>\n              <option value=\"35000-50000\">$35,000\u2013$50,000<\/option>\n              <option value=\"50000-plus\">$50,000+<\/option>\n              <option value=\"not-sure\">I am not sure<\/option>\n            <\/select>\n          <\/div>\n\n\n          <div class=\"otp-kitchen-field\">\n            <label for=\"otpKitchenPreferredContact\">\n              Preferred contact method\n            <\/label>\n\n            <select\n              id=\"otpKitchenPreferredContact\"\n              name=\"preferredContact\"\n            >\n              <option value=\"phone\">Phone call<\/option>\n              <option value=\"text\">Text message<\/option>\n              <option value=\"email\">Email<\/option>\n            <\/select>\n          <\/div>\n\n\n          <div class=\"otp-kitchen-field otp-kitchen-field-full\">\n            <label for=\"otpKitchenCustomerMessage\">\n              Tell us more about your project\n            <\/label>\n\n            <textarea\n              id=\"otpKitchenCustomerMessage\"\n              name=\"customerMessage\"\n              rows=\"5\"\n              placeholder=\"Describe your space, preferred style, questions or special considerations.\"\n            ><\/textarea>\n          <\/div>\n\n\n          <div class=\"otp-kitchen-field otp-kitchen-field-full\">\n\n            <label for=\"otpKitchenProjectPhotos\">\n              Upload project-area photos\n            <\/label>\n\n            <input\n              id=\"otpKitchenProjectPhotos\"\n              name=\"projectPhotos\"\n              type=\"file\"\n              accept=\"image\/*\"\n              multiple\n            >\n\n            <small>\n              Demo input only. File storage requires a server or CRM integration.\n            <\/small>\n\n          <\/div>\n\n        <\/div>\n\n\n        <label class=\"otp-kitchen-consent\">\n\n          <input\n            id=\"otpKitchenCustomerConsent\"\n            name=\"customerConsent\"\n            type=\"checkbox\"\n            required\n          >\n\n          <span>\n            I agree to be contacted about this project and understand that\n            this estimate is preliminary and based on temporary demonstration\n            data.\n          <\/span>\n\n        <\/label>\n\n\n        <button\n          class=\"otp-kitchen-submit-button\"\n          type=\"submit\"\n        >\n          Save Design & Request Review\n          <span aria-hidden=\"true\">\u2192<\/span>\n        <\/button>\n\n\n        <div\n          class=\"otp-kitchen-form-response\"\n          id=\"otpKitchenFormResponse\"\n          role=\"status\"\n          aria-live=\"polite\"\n        ><\/div>\n\n      <\/form>\n\n    <\/section>\n\n\n    <!-- ==================================================\n         CRM DEMO CONFIRMATION\n    =================================================== -->\n\n    <section\n      class=\"otp-kitchen-crm-confirmation\"\n      id=\"otpKitchenCrmConfirmation\"\n      hidden\n    >\n\n      <div class=\"otp-kitchen-crm-confirmation-icon\">\n        \u2713\n      <\/div>\n\n      <div>\n\n        <span>Configuration saved<\/span>\n\n        <h2>Your outdoor kitchen request has been added to the demo CRM.<\/h2>\n\n        <p>\n          This demonstration stores the lead only in this browser using\n          localStorage. A production version will send it securely to the\n          real Only Texas Pros CRM and notification system.\n        <\/p>\n\n        <div class=\"otp-kitchen-crm-reference\">\n\n          <span>Demo lead reference<\/span>\n\n          <strong id=\"otpKitchenLeadReference\">\n            OTP-KITCHEN-000001\n          <\/strong>\n\n        <\/div>\n\n      <\/div>\n\n    <\/section>\n\n  <\/div>\n\n<\/section>\n\n\n<script>\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n\n  \"use strict\";\n\n  \/* =====================================================\n     TEMPORARY DEMO CONFIGURATION\n\n     CHANGE PRICES, WIDTHS, RECOMMENDATIONS AND LABELS HERE.\n     DO NOT SCATTER FINAL VALUES THROUGHOUT THE SCRIPT.\n  ===================================================== *\/\n\n  const KITCHEN_CONFIG = {\n\n    storageKeys: {\n      draft: \"otpOutdoorKitchenDraftV1\",\n      leads: \"otpOutdoorKitchenLeadsV1\"\n    },\n\n    steps: {\n      total: 5,\n\n      nextLabels: {\n        1: \"Continue to appliances\",\n        2: \"Continue to exterior finish\",\n        3: \"Continue to countertop\",\n        4: \"Continue to extras and site\",\n        5: \"Review my complete design\"\n      }\n    },\n\n    labels: {\n\n      layouts: {\n        straight: \"Straight Kitchen\",\n        lShape: \"L-Shaped Kitchen\",\n        uShape: \"U-Shaped Kitchen\",\n        island: \"Kitchen Island\"\n      },\n\n      finishes: {\n        stucco: \"Smooth Stucco\",\n        flagstone: \"Flagstone\",\n        naturalStone: \"Natural Stone\",\n        ledgestone: \"Ledgestone\",\n        brick: \"Masonry Brick\",\n        porcelainVeneer: \"Porcelain Veneer\"\n      },\n\n      countertops: {\n        granite: \"Granite\",\n        porcelain: \"Porcelain\",\n        concrete: \"Finished Concrete\",\n        naturalStoneTop: \"Natural Stone\"\n      },\n\n      extras: {\n        barSeating: \"Bar Seating\",\n        lighting: \"Integrated Lighting\",\n        pergola: \"Pergola or Cover\",\n        newSlab: \"New Foundation Slab\",\n        backsplash: \"Backsplash Wall\",\n        outlets: \"Electrical Outlets\"\n      }\n    },\n\n    layouts: {\n\n      straight: {\n        baseFeet: 2,\n        multiplier: 1,\n        basePrice: 3000\n      },\n\n      lShape: {\n        baseFeet: 4,\n        multiplier: 1.08,\n        basePrice: 5200\n      },\n\n      uShape: {\n        baseFeet: 6,\n        multiplier: 1.18,\n        basePrice: 7800\n      },\n\n      island: {\n        baseFeet: 4,\n        multiplier: 1.12,\n        basePrice: 5900\n      }\n    },\n\n appliances: {\n\n  \/*\n   * COUNTERTOP APPLIANCES\n   * Installed above the cabinet structure\n   *\/\n\n  grill36: {\n    label: \"36-inch Grill\",\n    widthInches: 36,\n    landingInches: 36,\n    price: 2600,\n    category: \"cooking\",\n\n    position: \"countertop\",\n    moduleType: \"grill\",\n    pairsWith: \"doubleDoors\"\n  },\n\n\n  sideBurner: {\n    label: \"Side Burner\",\n    widthInches: 12,\n    landingInches: 18,\n    price: 900,\n    category: \"cooking\",\n\n    position: \"countertop\",\n    moduleType: \"burner\",\n    pairsWith: \"comboStorage\"\n  },\n\n\n  powerBurner: {\n    label: \"Power Burner\",\n    widthInches: 18,\n    landingInches: 24,\n    price: 1650,\n    category: \"cooking\",\n\n    position: \"countertop\",\n    moduleType: \"burner\",\n    pairsWith: \"comboStorage\"\n  },\n\n\n  griddle: {\n    label: \"Built-In Griddle\",\n    widthInches: 30,\n    landingInches: 24,\n    price: 2100,\n    category: \"cooking\",\n\n    position: \"countertop\",\n    moduleType: \"griddle\",\n    pairsWith: \"comboStorage\"\n  },\n\n\n  pizzaOven: {\n    label: \"Pizza Oven\",\n    widthInches: 36,\n    landingInches: 30,\n    price: 4200,\n    category: \"cooking\",\n\n    position: \"countertop\",\n    moduleType: \"pizzaOven\",\n    pairsWith: \"doubleDoors\"\n  },\n\n\n  sink: {\n    label: \"Outdoor Sink\",\n    widthInches: 18,\n    landingInches: 24,\n    price: 1250,\n    category: \"water\",\n\n    position: \"countertop\",\n    moduleType: \"sink\",\n    pairsWith: \"doubleDoors\"\n  },\n\n\n  \/*\n   * BASE \/ LOWER CABINET MODULES\n   * Installed below countertop\n   *\/\n\n\n  refrigerator: {\n    label: \"Outdoor Refrigerator\",\n    widthInches: 24,\n    landingInches: 12,\n    price: 1850,\n    category: \"refrigeration\",\n\n    position: \"base\",\n    moduleType: \"refrigeration\",\n    standalone: true\n  },\n\n\n  iceMaker: {\n    label: \"Ice Maker\",\n    widthInches: 15,\n    landingInches: 12,\n    price: 2400,\n    category: \"refrigeration\",\n\n    position: \"base\",\n    moduleType: \"refrigeration\",\n    standalone: true\n  },\n\n\n  trashDrawer: {\n    label: \"Trash Drawer\",\n    widthInches: 18,\n    landingInches: 6,\n    price: 780,\n    category: \"storage\",\n\n    position: \"base\",\n    moduleType: \"storage\",\n    standalone: true\n  },\n\n\n  doubleDoors: {\n    label: \"Double Access Doors\",\n    widthInches: 30,\n    landingInches: 0,\n    price: 680,\n    category: \"storage\",\n\n    position: \"base\",\n    moduleType: \"storage\",\n    usedUnder: [\n      \"grill36\",\n      \"pizzaOven\",\n      \"sink\"\n    ]\n  },\n\n\n  tripleDrawers: {\n    label: \"Triple Drawers\",\n    widthInches: 18,\n    landingInches: 0,\n    price: 950,\n    category: \"storage\",\n\n    position: \"base\",\n    moduleType: \"storage\",\n    standalone: true\n  },\n\n\n  comboStorage: {\n    label: \"Drawer-Door Combo\",\n    widthInches: 30,\n    landingInches: 0,\n    price: 1100,\n    category: \"storage\",\n\n    position: \"base\",\n    moduleType: \"storage\",\n    usedUnder: [\n      \"sideBurner\",\n      \"powerBurner\",\n      \"griddle\"\n    ]\n  }\n\n},\n    finishes: {\n\n      stucco: {\n        multiplier: 1,\n        flatPrice: 0\n      },\n\n      flagstone: {\n        multiplier: 1.10,\n        flatPrice: 1200\n      },\n\n      naturalStone: {\n        multiplier: 1.19,\n        flatPrice: 2400\n      },\n\n      ledgestone: {\n        multiplier: 1.16,\n        flatPrice: 2100\n      },\n\n      brick: {\n        multiplier: 1.12,\n        flatPrice: 1600\n      },\n\n      porcelainVeneer: {\n        multiplier: 1.23,\n        flatPrice: 3100\n      }\n    },\n\n    countertops: {\n\n      granite: {\n        multiplier: 1,\n        pricePerFoot: 290\n      },\n\n      porcelain: {\n        multiplier: 1.12,\n        pricePerFoot: 360\n      },\n\n      concrete: {\n        multiplier: 0.94,\n        pricePerFoot: 250\n      },\n\n      naturalStoneTop: {\n        multiplier: 1.16,\n        pricePerFoot: 390\n      }\n    },\n\n    countertopDepth: {\n\n      standard: {\n        multiplier: 1,\n        addedFeet: 0\n      },\n\n      expanded: {\n        multiplier: 1.06,\n        addedFeet: 1\n      },\n\n      bar: {\n        multiplier: 1.12,\n        addedFeet: 2\n      }\n    },\n\n    extras: {\n\n      barSeating: {\n        price: 2800,\n        addedFeet: 2\n      },\n\n      lighting: {\n        price: 1450,\n        addedFeet: 0\n      },\n\n      pergola: {\n        price: 9800,\n        addedFeet: 0\n      },\n\n      newSlab: {\n        price: 4800,\n        addedFeet: 0\n      },\n\n      backsplash: {\n        price: 2600,\n        addedFeet: 1\n      },\n\n      outlets: {\n        price: 950,\n        addedFeet: 0\n      }\n    },\n\n    utilities: {\n\n      gas: {\n        nearby: 350,\n        extension: 2700,\n        propane: 800,\n        unknown: 1800\n      },\n\n      water: {\n        notNeeded: 0,\n        nearby: 750,\n        extension: 3200,\n        unknown: 1900\n      },\n\n      electrical: {\n        nearby: 450,\n        extension: 2500,\n        unknown: 1400\n      }\n    },\n\n    surfaces: {\n      existingConcrete: 0,\n      existingPavers: 900,\n      grass: 4200,\n      deck: 3800,\n      unknown: 2200\n    },\n\n    access: {\n      easy: 0,\n      standard: 350,\n      limited: 1600,\n      unknown: 600\n    },\n\n    guests: {\n      4: 0,\n      8: 1,\n      12: 2,\n      16: 4\n    },\n\n    pricing: {\n      baseConstruction: 7200,\n      constructionPerFoot: 520,\n      lowerRangeFactor: 0.93,\n      upperRangeFactor: 1.13,\n      roundTo: 500\n    }\n  };\n\n\n  \/* =====================================================\n     APPLICATION STATE\n  ===================================================== *\/\n\n  const defaultState = {\n    currentStep: 1,\n    layout: \"straight\",\n    guestCount: \"8\",\n\n    appliances: {\n      grill36: 1,\n      sideBurner: 0,\n      powerBurner: 0,\n      griddle: 0,\n      pizzaOven: 0,\n      sink: 0,\n      refrigerator: 0,\n      iceMaker: 0,\n      trashDrawer: 0,\n      doubleDoors: 0,\n      tripleDrawers: 0,\n      comboStorage: 0\n    },\n\n    finish: \"stucco\",\n    countertop: \"granite\",\n    countertopDepth: \"standard\",\n\n    extras: {\n      barSeating: false,\n      lighting: false,\n      pergola: false,\n      newSlab: false,\n      backsplash: false,\n      outlets: false\n    },\n\n    site: {\n      surface: \"existingConcrete\",\n      gas: \"nearby\",\n      water: \"notNeeded\",\n      electrical: \"nearby\",\n      access: \"easy\",\n      timing: \"soon\"\n    }\n  };\n\n  let state = loadDraft();\n\n\n  \/* =====================================================\n     ELEMENT REFERENCES\n  ===================================================== *\/\n\n  const root = document.querySelector(\"#otp-kitchen-designer\");\n\n  if (!root) {\n    return;\n  }\n\n  const stepButtons = Array.from(\n    root.querySelectorAll(\"[data-step-target]\")\n  );\n\n  const stepPanels = Array.from(\n    root.querySelectorAll(\"[data-step-panel]\")\n  );\n\n  const previousButton = root.querySelector(\"#otpKitchenPreviousButton\");\n  const nextButton = root.querySelector(\"#otpKitchenNextButton\");\n\n  const progressLabel = root.querySelector(\"#otpKitchenProgressLabel\");\n  const progressBar = root.querySelector(\"#otpKitchenProgressBar\");\n  const progressTrack = root.querySelector(\".otp-kitchen-progress-track\");\n\n  const minimumLengthOutput = root.querySelector(\"#otpKitchenMinimumLength\");\n  const premiumLengthOutput = root.querySelector(\"#otpKitchenPremiumLength\");\n  const compactLengthOutput = root.querySelector(\"#otpKitchenCompactLength\");\n  const comfortLengthOutput = root.querySelector(\"#otpKitchenComfortLength\");\n  const luxuryLengthOutput = root.querySelector(\"#otpKitchenLuxuryLength\");\n\n  const recommendationMessage = root.querySelector(\n    \"#otpKitchenRecommendationMessage\"\n  );\n\n  const estimateRange = root.querySelector(\"#otpKitchenEstimateRange\");\n  const estimateRangeLarge = root.querySelector(\n    \"#otpKitchenEstimateRangeLarge\"\n  );\n\n  const summaryLayout = root.querySelector(\"#otpKitchenSummaryLayout\");\n  const summaryAppliances = root.querySelector(\n    \"#otpKitchenSummaryAppliances\"\n  );\n  const summaryFinish = root.querySelector(\"#otpKitchenSummaryFinish\");\n  const summaryCountertop = root.querySelector(\n    \"#otpKitchenSummaryCountertop\"\n  );\n  const summaryExtras = root.querySelector(\"#otpKitchenSummaryExtras\");\n\n  const leadSummaryTitle = root.querySelector(\n    \"#otpKitchenLeadSummaryTitle\"\n  );\n  const leadSummaryList = root.querySelector(\"#otpKitchenLeadSummaryList\");\n\n  const resetButton = root.querySelector(\"#otpKitchenResetButton\");\n  const copySummaryButton = root.querySelector(\n    \"#otpKitchenCopySummaryButton\"\n  );\n\n  const guestCountSelect = root.querySelector(\"#otpKitchenGuestCount\");\n  const countertopDepthSelect = root.querySelector(\n    \"#otpKitchenCounterDepth\"\n  );\n\n  const surfaceSelect = root.querySelector(\"#otpKitchenSurface\");\n  const gasSelect = root.querySelector(\"#otpKitchenGas\");\n  const waterSelect = root.querySelector(\"#otpKitchenWater\");\n  const electricalSelect = root.querySelector(\"#otpKitchenElectrical\");\n  const accessSelect = root.querySelector(\"#otpKitchenAccess\");\n  const timingSelect = root.querySelector(\"#otpKitchenProjectTiming\");\n\n  const leadForm = root.querySelector(\"#otpKitchenLeadForm\");\n  const formResponse = root.querySelector(\"#otpKitchenFormResponse\");\n  const crmConfirmation = root.querySelector(\n    \"#otpKitchenCrmConfirmation\"\n  );\n  const leadReferenceOutput = root.querySelector(\n    \"#otpKitchenLeadReference\"\n  );\n\n\n  \/* =====================================================\n     STORAGE HELPERS\n  ===================================================== *\/\n\n  function loadDraft() {\n\n    try {\n      const saved = window.localStorage.getItem(\n        KITCHEN_CONFIG.storageKeys.draft\n      );\n\n      if (!saved) {\n        return structuredCloneSafe(defaultState);\n      }\n\n      const parsed = JSON.parse(saved);\n\n      return mergeState(\n        structuredCloneSafe(defaultState),\n        parsed\n      );\n\n    } catch (error) {\n      console.warn(\"Unable to load kitchen assistant draft:\", error);\n\n      return structuredCloneSafe(defaultState);\n    }\n  }\n\n\n  function saveDraft() {\n\n    try {\n      window.localStorage.setItem(\n        KITCHEN_CONFIG.storageKeys.draft,\n        JSON.stringify(state)\n      );\n    } catch (error) {\n      console.warn(\"Unable to save kitchen assistant draft:\", error);\n    }\n  }\n\n\n  function structuredCloneSafe(value) {\n\n    if (typeof structuredClone === \"function\") {\n      return structuredClone(value);\n    }\n\n    return JSON.parse(JSON.stringify(value));\n  }\n\n\n  function mergeState(base, saved) {\n\n    return {\n      ...base,\n      ...saved,\n\n      appliances: {\n        ...base.appliances,\n        ...(saved?.appliances || {})\n      },\n\n      extras: {\n        ...base.extras,\n        ...(saved?.extras || {})\n      },\n\n      site: {\n        ...base.site,\n        ...(saved?.site || {})\n      }\n    };\n  }\n\n\n  \/* =====================================================\n     CALCULATION ENGINE\n  ===================================================== *\/\n\nfunction calculateKitchen() {\n\n  const selectedLayout =\n    KITCHEN_CONFIG.layouts[state.layout] ||\n    KITCHEN_CONFIG.layouts.straight;\n\n\n  const guestAdjustment =\n    KITCHEN_CONFIG.guests[state.guestCount] || 0;\n\n\n  let applianceWidthInches = 0;\n  let landingWidthInches = 0;\n  let appliancePrice = 0;\n\n  let selectedApplianceCount = 0;\n\n\n  \/*\n   * Outdoor kitchen module tracking\n   *\n   * Countertop modules:\n   * Grill, burners, sink, griddle, pizza oven\n   *\n   * Base modules:\n   * Refrigerator, doors, drawers, trash\n   *\/\n\n  let countertopWidthInches = 0;\n  let baseWidthInches = 0;\n\n  let countertopModuleCount = 0;\n  let baseModuleCount = 0;\n\n\n  \/*\n   * Track vertical relationships\n   *\n   * Example:\n   * Grill + Double Doors = ONE cooking station\n   *\/\n\n  let pairedBaseCount = 0;\n\n\n  Object.entries(state.appliances).forEach(\n    function ([applianceId, quantity]) {\n\n\n      const appliance =\n        KITCHEN_CONFIG.appliances[applianceId];\n\n\n      if (!appliance || quantity <= 0) {\n        return;\n      }\n\n\n      const totalWidth =\n        appliance.widthInches * quantity;\n\n\n      \/*\n       * Existing calculations\n       *\/\n\n      applianceWidthInches += totalWidth;\n\n\n      landingWidthInches +=\n        appliance.landingInches * quantity;\n\n\n      appliancePrice +=\n        appliance.price * quantity;\n\n\n      selectedApplianceCount += quantity;\n\n\n\n      \/*\n       * Separate countertop and base modules\n       *\/\n\n      if (appliance.position === \"countertop\") {\n\n        countertopWidthInches += totalWidth;\n\n        countertopModuleCount += quantity;\n\n      }\n\n\n      if (appliance.position === \"base\") {\n\n        baseWidthInches += totalWidth;\n\n        baseModuleCount += quantity;\n\n      }\n\n\n\n      \/*\n       * Detect paired modules\n       *\n       * Example:\n       * Grill -> Double Doors\n       * Sink -> Double Doors\n       *\/\n\n      if (appliance.pairsWith) {\n\n        pairedBaseCount += quantity;\n\n      }\n\n\n    }\n  );\n\n    \/*\n     * Demo spacing rule:\n     * Every additional selected unit adds a temporary separator allowance.\n     *\/\n\n    const separatorInches = Math.max(\n      0,\n      selectedApplianceCount - 1\n    ) * 6;\n\n    const requiredInches =\n      applianceWidthInches +\n      landingWidthInches +\n      separatorInches;\n\n    const rawApplianceFeet = requiredInches \/ 12;\n\n    const selectedDepth =\n      KITCHEN_CONFIG.countertopDepth[state.countertopDepth] ||\n      KITCHEN_CONFIG.countertopDepth.standard;\n\n    const extraAddedFeet = Object.entries(state.extras)\n      .reduce(function (total, [extraId, isSelected]) {\n\n        if (!isSelected) {\n          return total;\n        }\n\n        return total +\n          (KITCHEN_CONFIG.extras[extraId]?.addedFeet || 0);\n      }, 0);\n\n    const layoutAddedFeet = selectedLayout.baseFeet;\n\n    const rawCompactFeet =\n      rawApplianceFeet +\n      layoutAddedFeet +\n      guestAdjustment +\n      selectedDepth.addedFeet +\n      extraAddedFeet;\n\n    const compactFeet = Math.max(\n      6,\n      roundUpToEven(rawCompactFeet)\n    );\n\n    const comfortableFeet = roundUpToEven(\n      compactFeet + Math.max(3, selectedApplianceCount * 0.75)\n    );\n\n    const premiumFeet = roundUpToEven(\n      comfortableFeet + Math.max(2, selectedApplianceCount * 0.5)\n    );\n\n    const finish =\n      KITCHEN_CONFIG.finishes[state.finish] ||\n      KITCHEN_CONFIG.finishes.stucco;\n\n    const countertop =\n      KITCHEN_CONFIG.countertops[state.countertop] ||\n      KITCHEN_CONFIG.countertops.granite;\n\n    const constructionPrice =\n      KITCHEN_CONFIG.pricing.baseConstruction +\n      selectedLayout.basePrice +\n      (\n        comfortableFeet *\n        KITCHEN_CONFIG.pricing.constructionPerFoot\n      );\n\n    const countertopPrice =\n      comfortableFeet *\n      countertop.pricePerFoot *\n      countertop.multiplier *\n      selectedDepth.multiplier;\n\n    const finishPrice =\n      constructionPrice *\n      (finish.multiplier - 1) +\n      finish.flatPrice;\n\n    const extrasPrice = Object.entries(state.extras)\n      .reduce(function (total, [extraId, isSelected]) {\n\n        if (!isSelected) {\n          return total;\n        }\n\n        return total +\n          (KITCHEN_CONFIG.extras[extraId]?.price || 0);\n      }, 0);\n\n    const sitePrice =\n      (KITCHEN_CONFIG.surfaces[state.site.surface] || 0) +\n      (KITCHEN_CONFIG.utilities.gas[state.site.gas] || 0) +\n      (KITCHEN_CONFIG.utilities.water[state.site.water] || 0) +\n      (\n        KITCHEN_CONFIG.utilities.electrical[\n          state.site.electrical\n        ] || 0\n      ) +\n      (KITCHEN_CONFIG.access[state.site.access] || 0);\n\n    const preliminaryTotal =\n      (\n        constructionPrice +\n        countertopPrice +\n        finishPrice +\n        appliancePrice +\n        extrasPrice +\n        sitePrice\n      ) * selectedLayout.multiplier;\n\n    const lowEstimate = roundCurrency(\n      preliminaryTotal *\n      KITCHEN_CONFIG.pricing.lowerRangeFactor\n    );\n\n    const highEstimate = roundCurrency(\n      preliminaryTotal *\n      KITCHEN_CONFIG.pricing.upperRangeFactor\n    );\n\n    return {\n      applianceWidthInches,\n      landingWidthInches,\n      separatorInches,\n      selectedApplianceCount,\n      compactFeet,\n      comfortableFeet,\n      premiumFeet,\n      lowEstimate,\n      highEstimate,\n      preliminaryTotal\n    };\n  }\n\n\n  function roundUpToEven(value) {\n\n    const rounded = Math.ceil(value);\n\n    return rounded % 2 === 0\n      ? rounded\n      : rounded + 1;\n  }\n\n\n  function roundCurrency(value) {\n\n    const increment = KITCHEN_CONFIG.pricing.roundTo;\n\n    return Math.round(value \/ increment) * increment;\n  }\n\n\n  function formatCurrency(value) {\n\n    return new Intl.NumberFormat(\"en-US\", {\n      style: \"currency\",\n      currency: \"USD\",\n      maximumFractionDigits: 0\n    }).format(value);\n  }\n\n\n  function formatEstimateRange(calculation) {\n\n    return (\n      formatCurrency(calculation.lowEstimate) +\n      \"\u2013\" +\n      formatCurrency(calculation.highEstimate)\n    );\n  }\n\n\n  \/* =====================================================\n     STEP MANAGEMENT\n  ===================================================== *\/\n\n  function setStep(stepNumber, shouldScroll) {\n\n    const nextStep = Math.min(\n      KITCHEN_CONFIG.steps.total,\n      Math.max(1, Number(stepNumber))\n    );\n\n    state.currentStep = nextStep;\n\n    stepPanels.forEach(function (panel) {\n\n      const panelStep = Number(panel.dataset.stepPanel);\n      const isActive = panelStep === nextStep;\n\n      panel.classList.toggle(\"is-active\", isActive);\n      panel.hidden = !isActive;\n    });\n\n    stepButtons.forEach(function (button) {\n\n      const buttonStep = Number(button.dataset.stepTarget);\n\n      button.classList.toggle(\n        \"is-active\",\n        buttonStep === nextStep\n      );\n\n      button.classList.toggle(\n        \"is-complete\",\n        buttonStep < nextStep\n      );\n    });\n\n    previousButton.disabled = nextStep === 1;\n\n    nextButton.innerHTML =\n      KITCHEN_CONFIG.steps.nextLabels[nextStep] +\n      '<span aria-hidden=\"true\">\u2192<\/span>';\n\n    progressLabel.textContent =\n      \"Step \" +\n      nextStep +\n      \" of \" +\n      KITCHEN_CONFIG.steps.total;\n\n    const percentage =\n      (nextStep \/ KITCHEN_CONFIG.steps.total) * 100;\n\n    progressBar.style.width = percentage + \"%\";\n\n    progressTrack.setAttribute(\n      \"aria-valuenow\",\n      String(nextStep)\n    );\n\n    saveDraft();\n\n    if (shouldScroll) {\n      root.scrollIntoView({\n        behavior: \"smooth\",\n        block: \"start\"\n      });\n    }\n  }\n\n\n  function goToNextStep() {\n\n    if (state.currentStep < KITCHEN_CONFIG.steps.total) {\n      setStep(state.currentStep + 1, true);\n      return;\n    }\n\n    root.querySelector(\"#otp-kitchen-consultation\")\n      ?.scrollIntoView({\n        behavior: \"smooth\",\n        block: \"start\"\n      });\n  }\n\n\n  function goToPreviousStep() {\n\n    if (state.currentStep > 1) {\n      setStep(state.currentStep - 1, true);\n    }\n  }\n\n\n  \/* =====================================================\n     OPTION SELECTION\n  ===================================================== *\/\n\n  function selectSingleOption(group, value) {\n\n    if (!group || !value) {\n      return;\n    }\n\n    if (group === \"layout\") {\n      state.layout = value;\n    }\n\n    if (group === \"finish\") {\n      state.finish = value;\n    }\n\n    if (group === \"countertop\") {\n      state.countertop = value;\n    }\n\n    root\n      .querySelectorAll(\n        '[data-option-group=\"' + group + '\"]'\n      )\n      .forEach(function (button) {\n\n        const isSelected =\n          button.dataset.optionValue === value;\n\n        button.classList.toggle(\n          \"is-selected\",\n          isSelected\n        );\n\n        button.setAttribute(\n          \"aria-pressed\",\n          String(isSelected)\n        );\n      });\n\n    updateApplication();\n  }\n\n\n  function toggleExtra(extraId) {\n\n    if (!(extraId in state.extras)) {\n      return;\n    }\n\n    state.extras[extraId] = !state.extras[extraId];\n\n    const button = root.querySelector(\n      '[data-extra=\"' + extraId + '\"]'\n    );\n\n    if (button) {\n      button.classList.toggle(\n        \"is-selected\",\n        state.extras[extraId]\n      );\n\n      button.setAttribute(\n        \"aria-pressed\",\n        String(state.extras[extraId])\n      );\n    }\n\n    updateApplication();\n  }\n\n\n  function setApplianceQuantity(applianceId, quantity) {\n\n    if (!(applianceId in state.appliances)) {\n      return;\n    }\n\n    const safeQuantity = Math.max(\n      0,\n      Math.min(3, Number(quantity) || 0)\n    );\n\n    state.appliances[applianceId] = safeQuantity;\n\n    updateApplianceInterface(applianceId);\n    updateApplication();\n  }\n\n\n  function toggleAppliance(applianceId) {\n\n    const currentQuantity =\n      state.appliances[applianceId] || 0;\n\n    setApplianceQuantity(\n      applianceId,\n      currentQuantity > 0 ? 0 : 1\n    );\n  }\n\n\n  function updateApplianceInterface(applianceId) {\n\n    const quantity =\n      state.appliances[applianceId] || 0;\n\n    const selectButton = root.querySelector(\n      '[data-appliance=\"' +\n      applianceId +\n      '\"].otp-kitchen-appliance-select'\n    );\n\n    const output = root.querySelector(\n      '[data-appliance-quantity=\"' +\n      applianceId +\n      '\"]'\n    );\n\n    if (selectButton) {\n\n      selectButton.classList.toggle(\n        \"is-selected\",\n        quantity > 0\n      );\n\n      selectButton.setAttribute(\n        \"aria-pressed\",\n        String(quantity > 0)\n      );\n    }\n\n    if (output) {\n      output.textContent = String(quantity);\n    }\n  }\n\n\n  \/* =====================================================\n     CONTENT GENERATION\n  ===================================================== *\/\n\n  function getSelectedApplianceLabels() {\n\n    return Object.entries(state.appliances)\n      .filter(function ([, quantity]) {\n        return quantity > 0;\n      })\n      .map(function ([applianceId, quantity]) {\n\n        const label =\n          KITCHEN_CONFIG.appliances[applianceId]?.label ||\n          applianceId;\n\n        return quantity > 1\n          ? quantity + \" \u00d7 \" + label\n          : label;\n      });\n  }\n\n\n  function getSelectedExtraLabels() {\n\n    return Object.entries(state.extras)\n      .filter(function ([, isSelected]) {\n        return isSelected;\n      })\n      .map(function ([extraId]) {\n        return (\n          KITCHEN_CONFIG.labels.extras[extraId] ||\n          extraId\n        );\n      });\n  }\n\n\n  function createRecommendationMessage(calculation) {\n\n    const messages = [];\n\n    const cookingCount = Object.entries(state.appliances)\n      .filter(function ([applianceId, quantity]) {\n\n        return (\n          quantity > 0 &&\n          KITCHEN_CONFIG.appliances[applianceId]?.category ===\n          \"cooking\"\n        );\n      })\n      .reduce(function (total, [, quantity]) {\n        return total + quantity;\n      }, 0);\n\n    if (calculation.selectedApplianceCount <= 1) {\n      messages.push(\n        \"Your current selection creates a simple starter kitchen. Add storage, refrigeration or preparation features for a more complete design.\"\n      );\n    }\n\n    if (cookingCount >= 3) {\n      messages.push(\n        \"You selected several cooking appliances. A larger layout or an L-shaped configuration may provide safer separation and improved preparation space.\"\n      );\n    }\n\n    if (\n      state.appliances.sink > 0 &&\n      state.site.water === \"notNeeded\"\n    ) {\n      messages.push(\n        \"You selected an outdoor sink, but the project currently indicates that water is not needed. Please review the water-connection option.\"\n      );\n    }\n\n    if (\n      (\n        state.appliances.refrigerator > 0 ||\n        state.appliances.iceMaker > 0\n      ) &&\n      state.site.electrical === \"unknown\"\n    ) {\n      messages.push(\n        \"Refrigeration requires electrical service. A specialist should verify the available outdoor power connection.\"\n      );\n    }\n\n    if (\n      state.extras.barSeating &&\n      state.countertopDepth !== \"bar\"\n    ) {\n      messages.push(\n        \"Bar seating is selected. Consider the extended bar-seating countertop depth for additional comfort.\"\n      );\n    }\n\n    if (\n      state.layout === \"straight\" &&\n      calculation.comfortableFeet >= 20\n    ) {\n      messages.push(\n        \"The recommended straight kitchen is becoming long. An L-shaped layout may use the available area more efficiently.\"\n      );\n    }\n\n    if (!messages.length) {\n      messages.push(\n        \"Your selections create a balanced preliminary design. A site measurement will determine the final appliance spacing and countertop areas.\"\n      );\n    }\n\n    return messages.join(\" \");\n  }\n\n\n  function buildLeadSummary(calculation) {\n\n    const appliances = getSelectedApplianceLabels();\n    const extras = getSelectedExtraLabels();\n\n    return [\n      \"Layout: \" +\n        KITCHEN_CONFIG.labels.layouts[state.layout],\n\n      \"Recommended minimum length: \" +\n        calculation.compactFeet +\n        \" ft\",\n\n      \"Comfortable recommendation: \" +\n        calculation.comfortableFeet +\n        \" ft\",\n\n      \"Premium recommendation: \" +\n        calculation.premiumFeet +\n        \" ft\",\n\n      \"Appliances: \" +\n        (\n          appliances.length\n            ? appliances.join(\", \")\n            : \"No appliances selected\"\n        ),\n\n      \"Exterior finish: \" +\n        KITCHEN_CONFIG.labels.finishes[state.finish],\n\n      \"Countertop: \" +\n        KITCHEN_CONFIG.labels.countertops[\n          state.countertop\n        ],\n\n      \"Extras: \" +\n        (\n          extras.length\n            ? extras.join(\", \")\n            : \"None selected\"\n        ),\n\n      \"Preliminary demo estimate: \" +\n        formatEstimateRange(calculation)\n    ];\n  }\n\n\n  function updateRecommendationPanel(calculation) {\n\n    minimumLengthOutput.textContent =\n      calculation.compactFeet + \" ft\";\n\n    premiumLengthOutput.textContent =\n      calculation.comfortableFeet +\n      \"\u2013\" +\n      calculation.premiumFeet +\n      \" ft\";\n\n    compactLengthOutput.textContent =\n      calculation.compactFeet + \" ft\";\n\n    comfortLengthOutput.textContent =\n      calculation.comfortableFeet + \" ft\";\n\n    luxuryLengthOutput.textContent =\n      calculation.premiumFeet + \" ft\";\n\n    recommendationMessage.textContent =\n      createRecommendationMessage(calculation);\n\n    const rangeText = formatEstimateRange(calculation);\n\n    estimateRange.textContent = rangeText;\n    estimateRangeLarge.textContent = rangeText;\n\n    const appliances = getSelectedApplianceLabels();\n    const extras = getSelectedExtraLabels();\n\n    summaryLayout.textContent =\n      KITCHEN_CONFIG.labels.layouts[state.layout];\n\n    summaryAppliances.textContent =\n      appliances.length\n        ? appliances.join(\", \")\n        : \"No appliances selected\";\n\n    summaryFinish.textContent =\n      KITCHEN_CONFIG.labels.finishes[state.finish];\n\n    summaryCountertop.textContent =\n      KITCHEN_CONFIG.labels.countertops[\n        state.countertop\n      ];\n\n    summaryExtras.textContent =\n      extras.length\n        ? extras.join(\", \")\n        : \"None selected\";\n\n    leadSummaryTitle.textContent =\n      KITCHEN_CONFIG.labels.layouts[state.layout];\n\n    const summaryItems = buildLeadSummary(calculation);\n\n    leadSummaryList.innerHTML = \"\";\n\n    summaryItems.forEach(function (item) {\n\n      const listItem = document.createElement(\"li\");\n      listItem.textContent = item;\n\n      leadSummaryList.appendChild(listItem);\n    });\n  }\n\n\n  \/* =====================================================\n     INTERFACE SYNCHRONIZATION\n  ===================================================== *\/\n\n  function syncInterfaceFromState() {\n\n    root\n      .querySelectorAll(\"[data-option-group]\")\n      .forEach(function (button) {\n\n        const group = button.dataset.optionGroup;\n        const value = button.dataset.optionValue;\n\n        let selectedValue = \"\";\n\n        if (group === \"layout\") {\n          selectedValue = state.layout;\n        }\n\n        if (group === \"finish\") {\n          selectedValue = state.finish;\n        }\n\n        if (group === \"countertop\") {\n          selectedValue = state.countertop;\n        }\n\n        const isSelected = selectedValue === value;\n\n        button.classList.toggle(\n          \"is-selected\",\n          isSelected\n        );\n\n        button.setAttribute(\n          \"aria-pressed\",\n          String(isSelected)\n        );\n      });\n\n    Object.keys(state.appliances).forEach(\n      updateApplianceInterface\n    );\n\n    Object.entries(state.extras).forEach(\n      function ([extraId, isSelected]) {\n\n        const button = root.querySelector(\n          '[data-extra=\"' + extraId + '\"]'\n        );\n\n        if (!button) {\n          return;\n        }\n\n        button.classList.toggle(\n          \"is-selected\",\n          isSelected\n        );\n\n        button.setAttribute(\n          \"aria-pressed\",\n          String(isSelected)\n        );\n      }\n    );\n\n    guestCountSelect.value = state.guestCount;\n    countertopDepthSelect.value = state.countertopDepth;\n\n    surfaceSelect.value = state.site.surface;\n    gasSelect.value = state.site.gas;\n    waterSelect.value = state.site.water;\n    electricalSelect.value = state.site.electrical;\n    accessSelect.value = state.site.access;\n    timingSelect.value = state.site.timing;\n\n    setStep(state.currentStep, false);\n  }\n\n\n  function updateApplication() {\n\n    const calculation = calculateKitchen();\n\n    updateRecommendationPanel(calculation);\n    saveDraft();\n  }\n\n\n  \/* =====================================================\n     RESET\n  ===================================================== *\/\n\n  function resetAssistant() {\n\n    const confirmed = window.confirm(\n      \"Reset the current outdoor kitchen configuration?\"\n    );\n\n    if (!confirmed) {\n      return;\n    }\n\n    state = structuredCloneSafe(defaultState);\n\n    syncInterfaceFromState();\n    updateApplication();\n\n    crmConfirmation.hidden = true;\n    formResponse.textContent = \"\";\n  }\n\n\n  \/* =====================================================\n     COPY SUMMARY\n  ===================================================== *\/\n\n  async function copyProjectSummary() {\n\n    const calculation = calculateKitchen();\n\n    const summaryText = [\n      \"OUTDOOR KITCHEN DESIGN SUMMARY\",\n      \"\",\n      ...buildLeadSummary(calculation),\n      \"\",\n      \"This is a preliminary demonstration estimate.\"\n    ].join(\"\\n\");\n\n    try {\n\n      await navigator.clipboard.writeText(summaryText);\n\n      copySummaryButton.textContent = \"Copied\";\n\n      window.setTimeout(function () {\n        copySummaryButton.textContent = \"Copy summary\";\n      }, 1800);\n\n    } catch (error) {\n\n      console.warn(\"Clipboard access failed:\", error);\n\n      window.prompt(\n        \"Copy your outdoor kitchen summary:\",\n        summaryText\n      );\n    }\n  }\n\n\n  \/* =====================================================\n     CRM DEMO STORAGE\n  ===================================================== *\/\n\n  function generateLeadReference() {\n\n    const datePart = new Date()\n      .toISOString()\n      .slice(0, 10)\n      .replaceAll(\"-\", \"\");\n\n    const randomPart = Math.floor(\n      1000 + Math.random() * 9000\n    );\n\n    return (\n      \"OTP-KITCHEN-\" +\n      datePart +\n      \"-\" +\n      randomPart\n    );\n  }\n\n\n  function readStoredLeads() {\n\n    try {\n\n      const stored = window.localStorage.getItem(\n        KITCHEN_CONFIG.storageKeys.leads\n      );\n\n      return stored\n        ? JSON.parse(stored)\n        : [];\n\n    } catch (error) {\n\n      console.warn(\"Unable to read demo CRM leads:\", error);\n\n      return [];\n    }\n  }\n\n\n  function saveLeadToDemoCrm(lead) {\n\n    const leads = readStoredLeads();\n\n    leads.unshift(lead);\n\n    window.localStorage.setItem(\n      KITCHEN_CONFIG.storageKeys.leads,\n      JSON.stringify(leads)\n    );\n  }\n\n\n  \/* =====================================================\n     FORM SUBMISSION\n  ===================================================== *\/\n\n  function handleLeadSubmission(event) {\n\n    event.preventDefault();\n\n    formResponse.textContent = \"\";\n\n    if (!leadForm.checkValidity()) {\n\n      leadForm.reportValidity();\n\n      formResponse.textContent =\n        \"Please complete all required fields before submitting.\";\n\n      formResponse.className =\n        \"otp-kitchen-form-response is-error\";\n\n      return;\n    }\n\n    const calculation = calculateKitchen();\n    const formData = new FormData(leadForm);\n    const reference = generateLeadReference();\n\n    const uploadedFiles = Array.from(\n      formData.getAll(\"projectPhotos\")\n    )\n      .filter(function (file) {\n        return file instanceof File && file.name;\n      })\n      .map(function (file) {\n\n        return {\n          name: file.name,\n          type: file.type,\n          size: file.size\n        };\n      });\n\n    const lead = {\n\n      reference,\n      createdAt: new Date().toISOString(),\n\n      status: \"new\",\n      source: \"Outdoor Kitchen Smart Assistant\",\n      leadScore: calculateLeadScore(),\n\n      customer: {\n        name: String(\n          formData.get(\"customerName\") || \"\"\n        ).trim(),\n\n        phone: String(\n          formData.get(\"customerPhone\") || \"\"\n        ).trim(),\n\n        email: String(\n          formData.get(\"customerEmail\") || \"\"\n        ).trim(),\n\n        city: String(\n          formData.get(\"customerCity\") || \"\"\n        ).trim(),\n\n        budget: String(\n          formData.get(\"customerBudget\") || \"\"\n        ),\n\n        preferredContact: String(\n          formData.get(\"preferredContact\") || \"\"\n        ),\n\n        message: String(\n          formData.get(\"customerMessage\") || \"\"\n        ).trim()\n      },\n\n      design: structuredCloneSafe(state),\n\n      recommendation: {\n        minimumFeet: calculation.compactFeet,\n        comfortableFeet: calculation.comfortableFeet,\n        premiumFeet: calculation.premiumFeet\n      },\n\n      estimate: {\n        low: calculation.lowEstimate,\n        high: calculation.highEstimate,\n        formatted: formatEstimateRange(calculation),\n        disclaimer:\n          \"Temporary demonstration values requiring professional verification.\"\n      },\n\n      summary: buildLeadSummary(calculation),\n\n      uploadedFiles,\n\n      crmTasks: [\n        {\n          title: \"Review outdoor kitchen configuration\",\n          status: \"pending\"\n        },\n        {\n          title: \"Contact customer\",\n          status: \"pending\"\n        },\n        {\n          title: \"Confirm project-area measurements\",\n          status: \"pending\"\n        }\n      ]\n    };\n\n    try {\n\n      saveLeadToDemoCrm(lead);\n\n      formResponse.textContent =\n        \"Your design has been saved successfully.\";\n\n      formResponse.className =\n        \"otp-kitchen-form-response is-success\";\n\n      leadReferenceOutput.textContent = reference;\n\n      crmConfirmation.hidden = false;\n\n      crmConfirmation.scrollIntoView({\n        behavior: \"smooth\",\n        block: \"center\"\n      });\n\n      \/*\n       * PRODUCTION INTEGRATION PLACEHOLDER\n       *\n       * Replace demo CRM storage with:\n       *\n       * fetch(\"\/api\/outdoor-kitchen-leads\", {\n       *   method: \"POST\",\n       *   headers: {\n       *     \"Content-Type\": \"application\/json\"\n       *   },\n       *   body: JSON.stringify(lead)\n       * });\n       *\/\n\n    } catch (error) {\n\n      console.error(\"Unable to save demo CRM lead:\", error);\n\n      formResponse.textContent =\n        \"The demo CRM could not save this lead in the browser.\";\n\n      formResponse.className =\n        \"otp-kitchen-form-response is-error\";\n    }\n  }\n\n\n  function calculateLeadScore() {\n\n    let score = 30;\n\n    const selectedAppliances = Object.values(\n      state.appliances\n    ).reduce(function (total, quantity) {\n      return total + quantity;\n    }, 0);\n\n    const selectedExtras = Object.values(\n      state.extras\n    ).filter(Boolean).length;\n\n    score += Math.min(25, selectedAppliances * 4);\n    score += Math.min(15, selectedExtras * 3);\n\n    if (state.site.timing === \"soon\") {\n      score += 20;\n    }\n\n    if (state.site.timing === \"quarter\") {\n      score += 12;\n    }\n\n    return Math.min(100, score);\n  }\n\n\n  \/* =====================================================\n     EVENT LISTENERS\n  ===================================================== *\/\n\n  stepButtons.forEach(function (button) {\n\n    button.addEventListener(\"click\", function () {\n\n      setStep(\n        Number(button.dataset.stepTarget),\n        true\n      );\n    });\n  });\n\n\n  previousButton.addEventListener(\n    \"click\",\n    goToPreviousStep\n  );\n\n  nextButton.addEventListener(\n    \"click\",\n    goToNextStep\n  );\n\n\n  root\n    .querySelectorAll(\"[data-option-group]\")\n    .forEach(function (button) {\n\n      button.addEventListener(\"click\", function () {\n\n        selectSingleOption(\n          button.dataset.optionGroup,\n          button.dataset.optionValue\n        );\n      });\n    });\n\n\n  root\n    .querySelectorAll(\".otp-kitchen-appliance-select\")\n    .forEach(function (button) {\n\n      button.addEventListener(\"click\", function () {\n\n        toggleAppliance(\n          button.dataset.appliance\n        );\n      });\n    });\n\n\n  root\n    .querySelectorAll(\"[data-quantity-action]\")\n    .forEach(function (button) {\n\n      button.addEventListener(\"click\", function () {\n\n        const applianceId =\n          button.dataset.appliance;\n\n        const currentQuantity =\n          state.appliances[applianceId] || 0;\n\n        const change =\n          button.dataset.quantityAction === \"increase\"\n            ? 1\n            : -1;\n\n        setApplianceQuantity(\n          applianceId,\n          currentQuantity + change\n        );\n      });\n    });\n\n\n  root\n    .querySelectorAll(\"[data-extra]\")\n    .forEach(function (button) {\n\n      button.addEventListener(\"click\", function () {\n\n        toggleExtra(\n          button.dataset.extra\n        );\n      });\n    });\n\n\n  guestCountSelect.addEventListener(\n    \"change\",\n    function () {\n\n      state.guestCount = guestCountSelect.value;\n      updateApplication();\n    }\n  );\n\n\n  countertopDepthSelect.addEventListener(\n    \"change\",\n    function () {\n\n      state.countertopDepth =\n        countertopDepthSelect.value;\n\n      updateApplication();\n    }\n  );\n\n\n  surfaceSelect.addEventListener(\n    \"change\",\n    function () {\n\n      state.site.surface = surfaceSelect.value;\n      updateApplication();\n    }\n  );\n\n\n  gasSelect.addEventListener(\n    \"change\",\n    function () {\n\n      state.site.gas = gasSelect.value;\n      updateApplication();\n    }\n  );\n\n\n  waterSelect.addEventListener(\n    \"change\",\n    function () {\n\n      state.site.water = waterSelect.value;\n      updateApplication();\n    }\n  );\n\n\n  electricalSelect.addEventListener(\n    \"change\",\n    function () {\n\n      state.site.electrical =\n        electricalSelect.value;\n\n      updateApplication();\n    }\n  );\n\n\n  accessSelect.addEventListener(\n    \"change\",\n    function () {\n\n      state.site.access = accessSelect.value;\n      updateApplication();\n    }\n  );\n\n\n  timingSelect.addEventListener(\n    \"change\",\n    function () {\n\n      state.site.timing = timingSelect.value;\n      updateApplication();\n    }\n  );\n\n\n  resetButton.addEventListener(\n    \"click\",\n    resetAssistant\n  );\n\n  copySummaryButton.addEventListener(\n    \"click\",\n    copyProjectSummary\n  );\n\n  leadForm.addEventListener(\n    \"submit\",\n    handleLeadSubmission\n  );\n\n\n  \/* =====================================================\n     INITIALIZE APPLICATION\n  ===================================================== *\/\n\n  syncInterfaceFromState();\n  updateApplication();\n\n});\n<\/script><\/div><\/div>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"wf_page_folders":[56],"class_list":["post-103462","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-json\/wp\/v2\/pages\/103462","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-json\/wp\/v2\/comments?post=103462"}],"version-history":[{"count":68,"href":"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-json\/wp\/v2\/pages\/103462\/revisions"}],"predecessor-version":[{"id":103570,"href":"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-json\/wp\/v2\/pages\/103462\/revisions\/103570"}],"wp:attachment":[{"href":"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-json\/wp\/v2\/media?parent=103462"}],"wp:term":[{"taxonomy":"wf_page_folders","embeddable":true,"href":"https:\/\/onlytexaspros.com\/soluciones-digitales\/wp-json\/wp\/v2\/wf_page_folders?post=103462"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}