{"id":216,"date":"2026-07-18T19:57:07","date_gmt":"2026-07-18T19:57:07","guid":{"rendered":"https:\/\/transferinsurancefl.com\/?page_id=216"},"modified":"2026-10-14T13:42:40","modified_gmt":"2026-10-14T18:42:40","slug":"insurance","status":"publish","type":"page","link":"https:\/\/transferinsurancefl.com\/en\/insurance\/","title":{"rendered":"Insurance"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"216\" class=\"elementor elementor-216\" data-elementor-settings=\"{&quot;ha_cmc_init_switcher&quot;:&quot;no&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6a440b1 e-con e-atomic-element e-flexbox-base e-default-div e-4053877 \" data-id=\"6a440b1\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"6a440b1\">\n    <div class=\"elementor-element elementor-element-4b93581 e-flex e-con-boxed e-con e-parent\" data-id=\"4b93581\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false,&quot;sticky_logo_enable&quot;:&quot;no&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-39c008b sticky-heading-prefixstyle elementor-widget elementor-widget-heading\" data-id=\"39c008b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Insurance Services<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6e8886f sticky-heading-prefixstyle elementor-widget elementor-widget-heading\" data-id=\"6e8886f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Protecting What Matters Most<\/h3>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-cae6f47 e-flex e-con-boxed e-con e-parent\" data-id=\"cae6f47\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false,&quot;sticky_logo_enable&quot;:&quot;no&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f286074 elementor-widget elementor-widget-text-editor\" data-id=\"f286074\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>At Transfer Insurance FL, we help individuals, families, and businesses find reliable insurance coverage tailored to their needs. Our goal is to make the insurance process simple, transparent, and stress-free while connecting you with coverage options that provide confidence and financial protection.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0ccb9e3 elementor-widget elementor-widget-text-editor\" data-id=\"0ccb9e3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Whether you&#8217;re looking to protect your home, vehicle, or business, our team is here to guide you every step of the way.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-395d90c e-con-full e-flex e-con e-parent\" data-id=\"395d90c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;_ha_eqh_enable&quot;:false,&quot;sticky_logo_enable&quot;:&quot;no&quot;}\">\n\t\t<div class=\"ha-bg-parallax-wrap-hide elementor-element elementor-element-ceddd10 ha-bg-parallax-yes e-flex e-con-boxed e-con e-child\" data-ha-bg-parallax=\"{&quot;type&quot;:&quot;scroll-opacity&quot;,&quot;speed&quot;:0.5,&quot;android&quot;:1,&quot;ios&quot;:1,&quot;size&quot;:&quot;cover&quot;,&quot;repeat&quot;:&quot;no-repeat&quot;}\" data-id=\"ceddd10\" data-element_type=\"container\" data-e-type=\"container\" id=\"vehicle\" data-settings=\"{&quot;ha_bg_parallax_switcher&quot;:&quot;yes&quot;,&quot;ha_bg_parallax_type&quot;:&quot;scroll-opacity&quot;,&quot;sticky_logo_enable&quot;:&quot;no&quot;,&quot;ha_bg_parallax_speed&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-2d0c778 e-con-full e-flex e-con e-child\" data-id=\"2d0c778\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;,&quot;_ha_eqh_enable&quot;:false,&quot;sticky_logo_enable&quot;:&quot;no&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1c56156 sticky-icon-prefixstyle elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"1c56156\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" id=\"Capa_1\" data-name=\"Capa 1\" viewBox=\"0 0 503 368\"><defs><style>      .cls-1 {        fill: #163a5f;      }      .cls-1, .cls-2 {        opacity: .9;      }      .cls-3 {        fill: #fff;      }      .cls-2 {        fill: #184191;      }    <\/style><\/defs><circle class=\"cls-2\" cx=\"251.5\" cy=\"184\" r=\"182.5\"><\/circle><circle class=\"cls-1\" cx=\"251.5\" cy=\"184\" r=\"159\"><\/circle><path class=\"cls-3\" d=\"M364.88,128.75v3.2l-4.14,2.09-13.16,5.7c-2.39,1.04-3.77,4.72-3.47,6.97,2.15,1.18,4.85,1.75,6.54,3.42,6.8,6.71,9.53,23.24,9.57,33.06l.15,45.23-2.94.67v15.34c-.01,2.72-1.97,6.16-5.12,6.16l-40.28.02c-2.88,0-5.27-3.14-5.32-5.76l-.16-9.51c-3.21.08-6.37,1.36-8.79-.03-4.57-2.6-8.65-6.09-13.42-8.08l-5.68,1.77c-1.56,4.8-6,7.89-11.06,8.04l-2.47,3.45c-4.64,5.1-12.31,5.18-17.23.03-3.81,4.63-9.31,7.21-15.13,6.87-5.19-.3-8.93-3.77-10.06-8.92-3.9-.99-6.78-3.58-8.02-7.52l-7.15,4.82c-2.98.14-5.89-.19-8.9-.39l.03,9.07c0,2.86-2.16,6.15-5.46,6.16l-39.4.04c-3,0-5.85-2.29-5.86-5.37l-.07-16.29-2.24-.46.05-45.55c.01-9.86,2.59-25.18,8.99-32.32,1.83-2.04,4.41-2.64,7.1-3.94.07-1.95-.93-5.63-3.07-6.7-5.38-2.71-10.73-4.72-16.29-7.08-.66-.28-1.79-1.27-1.84-1.91-.17-1.89,1.81-6.02,5.83-5.79l16.96.99c.83.05,2.07.53,2.5,1.03s.85,2.11.74,2.78l-1.66,9.74c1.34,1.16,2.51,2.02,4.29,2.71l15.8-36.26c3.68-1.58,7.11-2.71,11.05-3.42,12.24-2.2,24.31-3.02,36.8-3.45,22.91-.79,51.33-.55,73.73,2.87,4.98.76,9.5,1.98,14.15,3.93l15.81,36.21c1.78-.38,3.39-1.53,4.33-2.77l-1.66-9.5c-.32-1.81.96-3.68,2.7-3.78l17.85-1.03c1.18-.07,3.25.62,3.76,1.46l1.33,1.99ZM261.4,229.52c-1.08-1.7-3.07-3.06-4.38-4.45l-2.68-2.86c-.69-.74-1.07-1.57-.64-2.94,2.16,1.33,3.68,3.08,5.48,4.9l4.88,4.93c2.25,2.28,6.19,1.89,7.86-.53,2.16-3.13,1.03-6.19-1.39-8.63l-4.26-4.29c-1.37-1.39-3.1-2.41-2.83-5.01,2.23,1.68,4.01,3.33,5.86,5.18l5.12,5.11c1.79,1.79,4.33,2.01,6.29.97s3.05-3.28,2.75-5.85c-.24-2.02-1.63-3.6-3.09-5.03l-2.96-2.9c-1.51-1.48-2.69-2.99-3.84-4.83,1.66-1.33,6.99,4.43,9.74,7.36,1.38,1.47,2.88,2.35,4.71,2.12,1.39-.17,3.02-1.36,4.03-2.75,1.59-2.19.98-5.33-.82-7.08l-10.77-10.44-3.12-3-2.24-2.39c-2.94-3.13-5.98-6.41-9.67-8.68-2.37-1.45-5.43-.09-7.48.98l-10.64,5.56c-1.8.94-4.24,2.03-6.27,2.12-6.75.3-11.94-5.06-12.14-11.96-.11-3.69,1.75-8.39,4.8-10.7,3.47-2.63,6.86-4.85,10.44-7.13l6.59-4.2c-8.92-9.26-22.98.5-32.5,7.2-3.94,2.78-8.01,3.29-12.55,1.63-1.47-.54-3.57-.8-5.1-1.18l-5.75-1.43-5.09-1.2-10.82-2.5c-2.76-.64-5.38-1.33-8.24-2.24,2.98-2.09,5.09-3.64,7.37-5.82l1.77-4.08,7.94-18.45,2.53-6.03,2.01-4.92c2.64-.9,5.89-1.63,8.86-2.03l6.34-.84,8.91-.96,20.93-1,13.23-.18.04-4.71-10.36.2-6.66.24-7.16.4-7.19.41-6.76.51c-7.69.58-15.95,1.53-23.22,4.3l-10.67,24.74-1.54,3.56c-3.03,7.03-2.82,7.61-10.64,11.49l-4.49,2.23c-3.49,1.73-4.94,3.37-6.4,6.83-.54,1.29-1.19,2.74-1.58,4.26l-1.1,4.25c-.32,1.22-.44,2.61-.6,3.92l-.46,3.55-.44,4.12c-.29,2.72-.25,5.27-.24,8.11l.07,36.53c.94-.11,2.31.17,2.3.8l-.28,13.28c-.05,2.49.02,5.43,2.38,6.96l32.34.06c1.54,0,4.81-.47,4.84-2.71l.18-13.02c4.66.46,8.78.73,13.16.84l4.78-3.3-2.42-3.84-3.47,2.6c-3.08.08-6.35-.16-9.48-.57l-6.69-.86-.21,16.35h-30.89s.16-3.39.16-3.39l.11-17-2.42-.45-.37-4.96.07-18.35,23.77,3.87,21.08,3.75c1.05-1.86,2.03-4.2,3.61-5.66,3.04-2.8,6.86-4.58,11.08-4.58,2.26,0,4.82,1.34,6.74,2.55,2.19,1.38,3.14,3.81,4.07,6.31,4.02.97,7.06,3.93,8,8.16,4.16,1.21,7.09,4.31,8.24,8.71,4.74,1.35,8,5.25,8.52,10.19l.46,4.32c1.22,1.87,2.71,3.45,4.14,3.76,2.2.47,4.26.09,5.6-1.49,1.44-1.71,2.13-4.81.84-6.84ZM350.23,216.2l.16,3.58-3.05,1.31v19.58s-30.71-.05-30.71-.05l-.13-16.18-7.32.77-7.21.76-5.22-3.15-6.35-3.82-1.64,3.26c-.21-.02.47,1.38.97,1.6,3.03,1.35,6.83,4.64,10.2,5.91,4.09,1.53,8.08-.68,12.38-.53l.09,12.03c.01,1.93,1.63,3.88,3.98,3.88l31.41.09c2.6,0,4.23-2.06,4.22-4.44l-.05-16.53,3.1-.66-.08-37.48-.34-4.99-1.6-13.17c-.69-5.64-2.84-12.55-7.68-14.7-4.91-1.63-10.63-4.65-13.84-8.65l-15.05-34.17c-3.55-1.28-6.88-2.12-10.47-2.74l-4.26-.74c-3.3-.58-6.54-.57-9.92-.82l-14.12-1.05-10.75-.41c-4.04-.15-7.56-.25-11.76-.17l-.12,4.56,17.89.12,6.81.46,9.64.53,14.11,1.63,7.92,1.41c1.3.23,2.26,1.23,2.8,2.48l7.28,16.89,3.84,8.79c1.1,2.51,2.13,5.64,4.04,7.49l2.93,2.83-20.71,6.11-7.49,2.32-4.27,1.08c-2.9.73-6.03,1.02-8.49-1.06l-7.58-6.4c-2.54-2.15-4.85-4.38-7.89-6.03-1.73-.94-4.97-.56-6.61.46l-15.53,9.64-11.49,7.38-2.98,1.87c-2.34,1.47-4.69,3.44-4.87,6.4s.89,5.46,3.03,6.79c2.45,1.52,5.08,1.13,7.51-.27l11.14-6.38,3.01-1.83c4.25-2.58,8.75-1.61,11.8,2.26,1.08,1.37,2.87,2.75,4.24,4.09l17.64,17.34c5.49,5.4,7.51,4.32,15.71,2.32l41.55-10.11c.41,1.8.17,3.05.17,4.69l.04,23.78ZM230.43,231.12l-1.13,3.57c-.59,1.87-.47,3.76,1.01,5.01,1.12.94,2.71,1.71,4.29,1.42,3.4-.62,6.29-1.85,8.22-4.56,1.81-2.55,2.31-5.69.46-8.3-1.65-2.33-4.45-3.61-7.85-2.33.76-2.88.78-5.23-1.1-7.12-1.56-1.56-4.06-2.68-6.45-1.86.03-2.08-.2-4.26-1.22-5.88-1.57-2.5-4.17-3.05-6.89-2.49.15-1.77.2-3.74-.44-4.9-1.52-2.75-3.78-3.81-6.97-3.25-4.6.81-9.03,7.94-7.25,12.56.47,1.22,2.02,3.25,3.89,3.01,1.45-.19,2.82-.69,4.69-1.18-.1,2.99-2.34,5.77,1.15,8.86l3.65.31,3.39-1.03-1.04,4.38c-.53,2.24,1.52,5.19,3.89,4.78l5.72-1Z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0d9335d sticky-heading-prefixstyle elementor-widget elementor-widget-heading\" data-id=\"0d9335d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Vehicle Insurance<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d100b20 elementor-widget elementor-widget-text-editor\" data-id=\"d100b20\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Get reliable vehicle insurance coverage tailored to your needs. We help Florida drivers protect their cars, trucks, SUVs, and motorcycles with affordable policies that provide financial security, liability protection, and peace of mind on every journey.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-09ed122 e-con-full e-flex e-con e-child\" data-id=\"09ed122\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false,&quot;sticky_logo_enable&quot;:&quot;no&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f64883c elementor-widget elementor-widget-html\" data-id=\"f64883c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n<title>Vehicle Insurance Quote Form<\/title>\r\n<style>\r\n\/* =====================================================================\r\n   Quote form v7-2026-10-13 (biling\u00fce EN\/ES) \u2014 CSS limpio y consolidado\r\n   Lo cr\u00edtico (review, botones, campos) NO depende de media queries.\r\n   ===================================================================== *\/\r\n\r\n.qw-wrap, .qw-wrap *, .qw-wrap *::before, .qw-wrap *::after{box-sizing:border-box;}\r\n\r\n.qw-page{display:flex;flex-direction:column;gap:56px;}\r\n\r\n.qw-wrap{\r\n  font-family:'Inter',-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;\r\n  width:100%;\r\n  max-width:820px;\r\n  margin:0 auto;\r\n  padding:0 16px 20px;\r\n  color:#163a5f;\r\n}\r\n\r\n\/* ---- SVG blindados: el tema no puede estirarlos ---- *\/\r\n.qw-wrap svg{max-width:none !important;flex:none;display:block;}\r\n.qw-wrap .qw-step-icon svg,\r\n.qw-wrap .qw-coverage-icon svg{width:20px !important;height:20px !important;}\r\n.qw-wrap .qw-file-upload-icon svg{width:24px !important;height:24px !important;margin:0 auto;}\r\n.qw-wrap .qw-file-item-icon svg{width:16px !important;height:16px !important;}\r\n.qw-wrap .qw-success-icon svg{width:30px !important;height:30px !important;}\r\n\r\n\/* ---- Indicador de pasos ---- *\/\r\n.qw-steps{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:36px;padding:4px 4px 0;overflow:visible;}\r\n.qw-step{display:flex;flex-direction:column;align-items:center;flex:0 0 auto;position:relative;z-index:2;}\r\n.qw-step-icon{\r\n  width:44px;height:44px;border-radius:50%;\r\n  display:flex;align-items:center;justify-content:center;\r\n  background:#e9ebee;color:#9aa1ac;transition:background .25s,color .25s;flex-shrink:0;\r\n}\r\n.qw-step-label{margin-top:8px;font-size:13px;font-weight:600;color:#9aa1ac;white-space:nowrap;}\r\n.qw-step.done .qw-step-icon{background:#184191;color:#fff;}\r\n.qw-step.done .qw-step-label{color:#184191;}\r\n.qw-step.active .qw-step-icon{background:#FFC000;color:#163a5f;box-shadow:0 0 0 4px rgba(224,183,90,.35);}\r\n.qw-step.active .qw-step-label{color:#184191;}\r\n.qw-connector{flex:1 1 auto;min-width:8px;height:2px;background:#e5e7eb;margin:22px 6px 0;position:relative;}\r\n.qw-connector.filled{background:#184191;}\r\n\r\n\/* ---- Tarjeta ---- *\/\r\n.qw-card{\r\n  background:#fff;border:1px solid #e5e7eb;border-radius:14px;padding:36px;\r\n  box-shadow:0 1px 3px rgba(0,0,0,.04);transition:opacity .4s ease;opacity:1;\r\n  overflow:hidden;max-width:100%;\r\n}\r\n.qw-card.qw-fade-out{opacity:0;}\r\n.qw-card h2{font-family:'mainweather',Georgia,\"Times New Roman\",serif;font-size:26px;margin:0 0 6px;color:#163a5f;line-height:1.2;}\r\n.qw-wrap .qw-card > p.qw-sub{margin:0 0 26px;color:#6b7280 !important;font-size:15px !important;font-weight:400 !important;line-height:1.5 !important;}\r\n\r\n\/* ---- Campos: se apilan solos con flex-wrap (sin media query) ---- *\/\r\n.qw-row{display:flex;gap:20px;margin-bottom:18px;flex-wrap:wrap;}\r\n.qw-field{flex:1 1 220px;min-width:0;display:flex;flex-direction:column;gap:6px;}\r\n.qw-field--full{flex:1 1 100%;}\r\n.qw-field label{font-size:13px;font-weight:700;color:#163a5f;}\r\n.qw-field input,.qw-field textarea{\r\n  border:1px solid #e5e7eb;border-radius:8px;padding:11px 13px;font-size:14px;\r\n  font-family:inherit;color:#163a5f;width:100%;min-width:0;max-width:100%;background:#fff;\r\n}\r\n.qw-field input[type=date]{-webkit-appearance:none;appearance:none;min-height:44px;}\r\n.qw-field input:focus,.qw-field textarea:focus{outline:none;border-color:#184191;box-shadow:0 0 0 3px rgba(24,65,145,.15);}\r\n.qw-field .qw-error{display:none;color:#c0392b;font-size:12px;}\r\n.qw-field.invalid input{border-color:#c0392b;}\r\n.qw-field.invalid .qw-error{display:block;}\r\n.qw-driver-error{display:none;color:#c0392b;font-size:12px;margin-top:-4px;}\r\n\/* iOS: 16px evita el zoom autom\u00e1tico al enfocar (sin media query) *\/\r\n@supports (-webkit-touch-callout:none){\r\n  .qw-field input,.qw-field textarea{font-size:16px;}\r\n}\r\n\r\n\/* ---- Textarea (Additional Notes) ---- *\/\r\n.qw-field textarea{\r\n  display:block !important;height:auto !important;min-height:120px !important;\r\n  resize:vertical;line-height:1.4;\r\n}\r\n.qw-field textarea::placeholder{white-space:normal;line-height:1.35;opacity:.7;}\r\n\r\n\/* ---- Coverage cards ---- *\/\r\n.qw-coverage-grid{display:flex;gap:18px;margin-bottom:28px;flex-wrap:wrap;}\r\n.qw-coverage-card{\r\n  flex:1 1 180px;min-width:0;border:1px solid #e5e7eb;border-radius:12px;padding:22px 18px;\r\n  cursor:pointer;transition:border-color .15s,background .15s;\r\n}\r\n.qw-coverage-card:hover{border-color:#c7cedb;}\r\n.qw-coverage-card.selected{border-color:#184191;background:#f7f8fb;}\r\n.qw-coverage-icon{\r\n  width:44px;height:44px;border-radius:10px;display:flex;align-items:center;justify-content:center;\r\n  background:#f4f5f7;color:#163a5f;margin-bottom:14px;\r\n}\r\n.qw-coverage-card.selected .qw-coverage-icon{background:#184191;color:#FFC000;}\r\n.qw-coverage-card h3{font-family:'mainweather',Georgia,\"Times New Roman\",serif;font-size:18px;margin:0 0 6px;color:#163a5f;}\r\n.qw-coverage-card p{margin:0;font-size:13px;color:#6b7280;line-height:1.4;}\r\n\r\n\/* ---- Veh\u00edculos \/ conductores ---- *\/\r\n.qw-count-control{display:flex;align-items:center;gap:14px;margin-bottom:10px;flex-wrap:wrap;}\r\n.qw-wrap .qw-count-control button{\r\n  width:38px;height:38px;min-width:38px;padding:0;border-radius:8px;border:1px solid #e5e7eb;\r\n  background:#fff;font-size:18px;cursor:pointer;line-height:1;color:#163a5f;\r\n}\r\n.qw-wrap .qw-count-control button:hover:not(:disabled){background:#f4f5f7;}\r\n.qw-wrap .qw-count-control button:disabled{opacity:.45;cursor:not-allowed;}\r\n.qw-count-note{font-size:12px;color:#9aa1ac;margin:0 0 20px;}\r\n.qw-item-box{border:1px solid #e5e7eb;border-radius:10px;padding:20px;margin-bottom:16px;background:#f4f5f7;position:relative;}\r\n.qw-item-box h4{margin:0 0 14px;font-size:14px;color:#163a5f;}\r\n.qw-wrap .qw-item-remove{\r\n  position:absolute;top:14px;right:14px;background:none;border:none;color:#c0392b;font-size:12px;\r\n  font-weight:700;cursor:pointer;font-family:inherit;text-decoration:underline;padding:0;\r\n}\r\n\r\n\/* ---- Subida de archivos ---- *\/\r\n.qw-file-upload{\r\n  display:block;border:2px dashed #d7dbe2;border-radius:10px;padding:22px 16px;text-align:center;\r\n  cursor:pointer;transition:border-color .15s,background .15s;margin-bottom:12px;\r\n}\r\n.qw-file-upload:hover,.qw-file-upload.dragover{border-color:#184191;background:#f7f8fb;}\r\n.qw-file-upload input[type=file]{display:none;}\r\n.qw-file-upload-icon{color:#9aa1ac;margin-bottom:6px;}\r\n.qw-file-upload p{margin:2px 0;font-size:12.5px;color:#6b7280;}\r\n.qw-file-upload .qw-file-upload-title{font-weight:700;color:#163a5f;font-size:14px;margin-bottom:2px;}\r\n.qw-file-list{display:flex;flex-direction:column;gap:8px;margin-bottom:12px;}\r\n.qw-file-item{display:flex;align-items:center;gap:10px;min-width:0;border:1px solid #e5e7eb;border-radius:8px;padding:9px 12px;background:#fff;}\r\n.qw-file-item-icon{width:30px;height:30px;border-radius:6px;background:#f4f5f7;color:#163a5f;display:flex;align-items:center;justify-content:center;flex-shrink:0;}\r\n.qw-file-item-name{flex:1;min-width:0;font-size:13px;color:#163a5f;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}\r\n.qw-file-item-size{font-size:11px;color:#9aa1ac;flex-shrink:0;}\r\n.qw-wrap .qw-file-item-remove{background:none;border:none;color:#c0392b;cursor:pointer;font-size:22px;line-height:1;padding:0 6px;flex-shrink:0;}\r\n.qw-file-error{color:#c0392b;font-size:12px;margin:-4px 0 14px;display:none;}\r\n.qw-file-error.show{display:block;}\r\n.qw-file-max-note{font-size:12px;color:#9aa1ac;margin:-2px 0 14px;}\r\n.qw-upload-label{font-size:13px;font-weight:700;color:#163a5f;display:block;margin-bottom:8px;}\r\n\r\n\/* ---- Review: UNA columna, cada dato es una fila (etiqueta | valor) ---- *\/\r\n.qw-review-box{background:#f4f5f7;border-radius:10px;padding:16px 18px;margin-bottom:24px;width:100%;max-width:100%;overflow:hidden;}\r\n.qw-review-box h4{margin:0 0 6px;font-family:'mainweather',Georgia,serif;font-size:16px;color:#163a5f;}\r\n.qw-review-box,\r\n.qw-review-box *{white-space:normal !important;overflow-wrap:anywhere !important;word-break:break-word;}\r\n.qw-rv-row{display:flex;flex-direction:row;align-items:flex-start;gap:12px;padding:10px 0;border-bottom:1px solid #e5e7eb;}\r\n.qw-rv-row .qw-rv-label{flex:0 0 38%;max-width:38%;min-width:0;}\r\n.qw-rv-row .qw-rv-value{flex:1 1 0;min-width:0;}\r\n.qw-rv-block{display:block;padding:10px 0;border-bottom:1px solid #e5e7eb;}\r\n.qw-rv-block .qw-rv-value{margin:4px 0 0;}\r\n.qw-rv-row:last-child,.qw-rv-block:last-child{border-bottom:0;}\r\n.qw-rv-label{font-size:11px;font-weight:600;letter-spacing:.03em;text-transform:uppercase;color:#6b7280;line-height:1.4;margin:0;}\r\n.qw-rv-value{font-size:14px;font-weight:600;color:#163a5f;line-height:1.4;margin:0;}\r\n.qw-rv-sub{margin-top:6px;font-size:14px;font-weight:600;color:#163a5f;line-height:1.4;}\r\n.qw-rv-sublabel{display:block;font-size:11px;font-weight:600;letter-spacing:.03em;color:#6b7280;text-transform:uppercase;margin-bottom:2px;}\r\n\r\n\/* ---- Botones: SIEMPRE en fila, misma altura y mismo ancho ---- *\/\r\n.qw-actions{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:stretch;gap:12px;margin-top:28px;width:100%;}\r\n.qw-actions--end{justify-content:flex-end;}\r\n.qw-actions--center{justify-content:center;margin-top:20px;}\r\n.qw-wrap .qw-btn{\r\n  flex:1 1 0;width:auto;min-width:0;height:auto;min-height:48px;margin:0;padding:10px 14px;\r\n  border:none;border-radius:8px;font-size:15px;font-weight:700;line-height:1.2;\r\n  letter-spacing:normal;text-transform:none;box-shadow:none;\r\n  display:inline-flex;align-items:center;justify-content:center;gap:8px;\r\n  white-space:normal;text-align:center;cursor:pointer;font-family:inherit;\r\n}\r\n.qw-actions--end .qw-btn,\r\n.qw-actions--center .qw-btn{flex:0 1 auto;min-width:140px;}\r\n.qw-wrap .qw-btn-primary{background:#163a5f;color:#fff;}\r\n.qw-wrap .qw-btn-primary:hover{background:#184191;color:#fff;}\r\n.qw-wrap .qw-btn-secondary{background:#fff;color:#163a5f;border:1px solid #e5e7eb;}\r\n.qw-wrap .qw-btn-secondary:hover{background:#f4f5f7;color:#163a5f;}\r\n.qw-wrap .qw-btn:disabled{opacity:.6;cursor:not-allowed;}\r\n\r\n.qw-submit-error{color:#c0392b;font-size:13px;margin-top:14px;display:none;}\r\n.qw-submit-error.show{display:block;}\r\n\r\n\/* ---- \u00c9xito \/ error ---- *\/\r\n.qw-success{text-align:center;padding:50px 20px;}\r\n.qw-success .qw-success-icon{\r\n  width:64px;height:64px;border-radius:50%;background:#e6f4ea;color:#1e7e34;\r\n  display:flex;align-items:center;justify-content:center;margin:0 auto 18px;\r\n}\r\n.qw-success h2{font-family:'mainweather',Georgia,serif;color:#163a5f;margin:0 0 8px;}\r\n.qw-success .qw-timer-note{font-size:12px;color:#9aa1ac;margin-top:18px;}\r\n.qw-wrap .qw-success .qw-new-quote-link{\r\n  background:none;border:none;color:#184191;font-weight:700;font-size:13px;cursor:pointer;\r\n  text-decoration:underline;margin-top:6px;font-family:inherit;\r\n}\r\n.qw-success p{color:#6b7280;margin:0;}\r\n.qw-success .qw-detail{font-size:12px;color:#9aa1ac;margin-top:10px;overflow-wrap:anywhere;}\r\n\r\n\/* ---- Solo ajustes cosm\u00e9ticos en pantallas peque\u00f1as ---- *\/\r\n@media (max-width:600px){\r\n  .qw-wrap{padding:0 10px 90px;}              \/* deja espacio al bot\u00f3n flotante de WhatsApp *\/\r\n  .qw-card{padding:22px 16px;}\r\n  .qw-card h2{font-size:22px;}\r\n  .qw-wrap .qw-card > p.qw-sub{font-size:14px !important;margin-bottom:20px;}\r\n  .qw-steps{margin-bottom:24px;}\r\n  .qw-step-icon{width:36px;height:36px;}\r\n  .qw-wrap .qw-step-icon svg{width:18px !important;height:18px !important;}\r\n  .qw-step-label{display:none;}\r\n  .qw-connector{margin:17px 4px 0;}\r\n  .qw-item-box{padding:16px 14px;}\r\n  .qw-item-box h4{padding-right:70px;}\r\n  .qw-file-upload{padding:18px 12px;}\r\n  .qw-success{padding:36px 8px;}\r\n}\r\n<\/style>\r\n<\/head>\r\n<body>\r\n\r\n<div class=\"qw-page\">\r\n\r\n  <!-- data-no-translation: TranslatePress no toca este bloque; el formulario se\r\n       traduce solo con el diccionario del script (seg\u00fan el idioma de la p\u00e1gina). -->\r\n  <section class=\"qw-instance\" id=\"section-vehicle\">\r\n    <div class=\"qw-wrap\" data-no-translation>\r\n      <div class=\"qw-steps\" id=\"vehicleQuote-qwSteps\"><\/div>\r\n      <div class=\"qw-card\" id=\"vehicleQuote-qwCard\"><\/div>\r\n    <\/div>\r\n  <\/section>\r\n\r\n<\/div>\r\n\r\n<script>\r\n(function(){\r\n\r\n  const QW_VERSION = 'v7-2026-10-13-i18n';\r\n\r\n  \/\/ ------------------------------------------------------------------\r\n  \/\/ IDIOMA \/ DICCIONARIO\r\n  \/\/ El idioma se lee del atributo lang del <html> (TranslatePress lo pone\r\n  \/\/ en es-ES al navegar por \/es\/). Las claves son el texto en ingl\u00e9s; si\r\n  \/\/ una clave no existe en el diccionario, se muestra el ingl\u00e9s tal cual.\r\n  \/\/ Los {marcadores} se sustituyen por valores din\u00e1micos.\r\n  \/\/ ------------------------------------------------------------------\r\n  const LANG = (document.documentElement.lang || 'en').slice(0, 2).toLowerCase() === 'es' ? 'es' : 'en';\r\n\r\n  const ES = {\r\n    \/\/ Pasos\r\n    'Your Info': 'Sus datos',\r\n    'Coverage Level': 'Nivel de cobertura',\r\n    'Vehicle Details': 'Datos del veh\u00edculo',\r\n    'Business Details': 'Datos del negocio',\r\n    'Property Details': 'Datos de la propiedad',\r\n    'Drivers': 'Conductores',\r\n    'Review': 'Revisi\u00f3n',\r\n\r\n    \/\/ Comunes\r\n    'Continue': 'Continuar',\r\n    'Back': 'Atr\u00e1s',\r\n    'Remove': 'Eliminar',\r\n    'This field is required.': 'Este campo es obligatorio.',\r\n    'Address': 'Direcci\u00f3n',\r\n    'Street, city, state': 'Calle, ciudad, estado',\r\n\r\n    \/\/ Paso 1\r\n    'Customer Information': 'Informaci\u00f3n del cliente',\r\n    'Tell us about yourself so we can prepare your quote.': 'Cu\u00e9ntenos sobre usted para que podamos preparar su cotizaci\u00f3n.',\r\n    'First Name': 'Nombre',\r\n    'Last Name': 'Apellido',\r\n    'Email': 'Correo electr\u00f3nico',\r\n    'Mobile Phone': 'Tel\u00e9fono m\u00f3vil',\r\n    'Please enter a valid email address (e.g. name@example.com).': 'Ingrese un correo electr\u00f3nico v\u00e1lido (ej. nombre@ejemplo.com).',\r\n    'Please enter a valid phone number (numbers only).': 'Ingrese un n\u00famero de tel\u00e9fono v\u00e1lido (solo n\u00fameros).',\r\n\r\n    \/\/ Nivel de cobertura\r\n    'Select Coverage Level': 'Seleccione el nivel de cobertura',\r\n    \"Optional \u2014 pick a level if you already know what you need, or skip this and we'll help you choose.\": 'Opcional: elija un nivel si ya sabe lo que necesita, u omita este paso y le ayudaremos a elegir.',\r\n    'Basic': 'B\u00e1sica',\r\n    'PIP + Property Damage': 'PIP + Da\u00f1os a la propiedad',\r\n    'Liability': 'Responsabilidad civil',\r\n    'Bodily Injury + Property Damage': 'Lesiones corporales + Da\u00f1os a la propiedad',\r\n    'Full Coverage': 'Cobertura completa',\r\n    'Liability + Comprehensive + Collision': 'Responsabilidad civil + Comprensiva + Colisi\u00f3n',\r\n    'Others Coverage': 'Otra cobertura',\r\n    'Not sure, or need something different': 'No estoy seguro, o necesito algo diferente',\r\n\r\n    \/\/ Tipos de seguro (resumen)\r\n    'Vehicle Insurance': 'Seguro de Veh\u00edculo',\r\n    'Business Insurance': 'Seguro de Negocio',\r\n    'Property Insurance': 'Seguro de Propiedad',\r\n\r\n    \/\/ Veh\u00edculos\r\n    'Vehicle': 'Veh\u00edculo',\r\n    'VIN (optional)': 'VIN (opcional)',\r\n    'Upload Documents for this Vehicle': 'Subir documentos de este veh\u00edculo',\r\n    \"Tell us about the vehicles you'd like to insure.\": 'Cu\u00e9ntenos sobre los veh\u00edculos que desea asegurar.',\r\n    'Number of Vehicles': 'N\u00famero de veh\u00edculos',\r\n    \"You've reached the maximum of {n} vehicles. Add the rest in the notes on the review step.\": 'Ha alcanzado el m\u00e1ximo de {n} veh\u00edculos. Agregue el resto en las notas del paso de revisi\u00f3n.',\r\n    'Add up to {n} vehicles.': 'Puede agregar hasta {n} veh\u00edculos.',\r\n\r\n    \/\/ Conductores\r\n    'Driver': 'Conductor',\r\n    \"Upload Driver's License\": 'Subir licencia de conducir',\r\n    '\u2014 or enter their information manually \u2014': '\u2014 o ingrese sus datos manualmente \u2014',\r\n    'Date of Birth': 'Fecha de nacimiento',\r\n    'License Number': 'N\u00famero de licencia',\r\n    'Expiration Date': 'Fecha de vencimiento',\r\n    'Full Name': 'Nombre completo',\r\n    \"Please upload the driver's license, or fill in all five fields above.\": 'Suba la licencia de conducir o complete los cinco campos de arriba.',\r\n    \"Tell us who will be driving. Upload each driver's license \u2014 or skip that and enter their details manually.\": 'Cu\u00e9ntenos qui\u00e9n va a conducir. Suba la licencia de cada conductor, u om\u00edtala e ingrese sus datos manualmente.',\r\n    'Number of Drivers': 'N\u00famero de conductores',\r\n    \"You've reached the maximum of {n} drivers.\": 'Ha alcanzado el m\u00e1ximo de {n} conductores.',\r\n    'Add up to {n} drivers.': 'Puede agregar hasta {n} conductores.',\r\n\r\n    \/\/ Archivos\r\n    'Upload Documents': 'Subir documentos',\r\n    '(Optional \u2014 up to {n})': '(Opcional \u2014 hasta {n})',\r\n    'Remove file': 'Quitar archivo',\r\n    'Click to upload or drag files here': 'Haga clic para subir o arrastre los archivos aqu\u00ed',\r\n    'JPG, JPEG, DOC, DOCX or PDF \u2014 up to 1 more file (max {mb}MB each)': 'JPG, JPEG, DOC, DOCX o PDF \u2014 1 archivo m\u00e1s (m\u00e1x. {mb}MB cada uno)',\r\n    'JPG, JPEG, DOC, DOCX or PDF \u2014 up to {n} more files (max {mb}MB each)': 'JPG, JPEG, DOC, DOCX o PDF \u2014 hasta {n} archivos m\u00e1s (m\u00e1x. {mb}MB cada uno)',\r\n    'Maximum of {n} files reached.': 'Se alcanz\u00f3 el m\u00e1ximo de {n} archivos.',\r\n    'limit reached': 'l\u00edmite alcanzado',\r\n    'unsupported type': 'tipo no admitido',\r\n    'over {mb}MB': 'supera {mb}MB',\r\n    'total over {mb}MB': 'el total supera {mb}MB',\r\n    'Some files were not added: ': 'Algunos archivos no se agregaron: ',\r\n    'file(s)': 'archivo(s)',\r\n\r\n    \/\/ Negocio\r\n    'Tell us about your business.': 'Cu\u00e9ntenos sobre su negocio.',\r\n    'Business Name': 'Nombre del negocio',\r\n    'Business Type': 'Tipo de negocio',\r\n    'Restaurant, retail store, office...': 'Restaurante, tienda, oficina...',\r\n    'Number of Employees': 'N\u00famero de empleados',\r\n    'Please enter the business name.': 'Ingrese el nombre del negocio.',\r\n    'Please enter the business type.': 'Ingrese el tipo de negocio.',\r\n    'Please enter the address.': 'Ingrese la direcci\u00f3n.',\r\n    'Please enter the number of employees.': 'Ingrese el n\u00famero de empleados.',\r\n    'Please enter a number (digits only).': 'Ingrese un n\u00famero (solo d\u00edgitos).',\r\n\r\n    \/\/ Propiedad\r\n    \"Tell us about the property you'd like to insure.\": 'Cu\u00e9ntenos sobre la propiedad que desea asegurar.',\r\n    'Property Address': 'Direcci\u00f3n de la propiedad',\r\n    'Property Type': 'Tipo de propiedad',\r\n    'House, apartment, rental...': 'Casa, apartamento, alquiler...',\r\n    'Estimated Value': 'Valor estimado',\r\n    'Please enter the property address.': 'Ingrese la direcci\u00f3n de la propiedad.',\r\n    'Please enter the property type.': 'Ingrese el tipo de propiedad.',\r\n    'Please enter an estimated value.': 'Ingrese un valor estimado.',\r\n    'Please enter a valid dollar amount (e.g. $250,000).': 'Ingrese un monto v\u00e1lido en d\u00f3lares (ej. $250,000).',\r\n\r\n    \/\/ Revisi\u00f3n\r\n    'Review &amp; Additional Notes': 'Revisi\u00f3n y notas adicionales',\r\n    'Review your information and add any additional details.': 'Revise su informaci\u00f3n y agregue cualquier detalle adicional.',\r\n    'Your Information': 'Su informaci\u00f3n',\r\n    'NAME': 'NOMBRE',\r\n    'EMAIL': 'CORREO ELECTR\u00d3NICO',\r\n    'PHONE': 'TEL\u00c9FONO',\r\n    'COVERAGE TYPE': 'TIPO DE COBERTURA',\r\n    'COVERAGE LEVEL': 'NIVEL DE COBERTURA',\r\n    'BUSINESS': 'NEGOCIO',\r\n    'TYPE': 'TIPO',\r\n    'ADDRESS': 'DIRECCI\u00d3N',\r\n    'EMPLOYEES': 'EMPLEADOS',\r\n    'ESTIMATED VALUE': 'VALOR ESTIMADO',\r\n    'VEHICLES': 'VEH\u00cdCULOS',\r\n    'DRIVERS': 'CONDUCTORES',\r\n    'ATTACHED FILES': 'ARCHIVOS ADJUNTOS',\r\n    'License uploaded': 'Licencia subida',\r\n    'Details provided manually': 'Datos ingresados manualmente',\r\n    'Additional Notes (Optional)': 'Notas adicionales (opcional)',\r\n    'Tell us anything else we should know...': 'Cu\u00e9ntenos cualquier otra cosa que debamos saber...',\r\n    'Request my free quote': 'Solicitar mi cotizaci\u00f3n gratis',\r\n    'Sending...': 'Enviando...',\r\n\r\n    \/\/ \u00c9xito \/ error\r\n    'Request Received!': '\u00a1Solicitud recibida!',\r\n    \"Thanks, {name}! We'll be in touch soon with your quote.\": '\u00a1Gracias, {name}! Nos pondremos en contacto pronto con su cotizaci\u00f3n.',\r\n    'This form will reset automatically in a few seconds...': 'Este formulario se reiniciar\u00e1 autom\u00e1ticamente en unos segundos...',\r\n    'Start a new quote now': 'Iniciar una nueva cotizaci\u00f3n ahora',\r\n    'Something Went Wrong': 'Algo sali\u00f3 mal',\r\n    \"We couldn't send your request. Please try again, or call us directly.\": 'No pudimos enviar su solicitud. Int\u00e9ntelo de nuevo o ll\u00e1menos directamente.',\r\n    'Try again': 'Intentar de nuevo',\r\n    'Network error': 'Error de red',\r\n    'upload too large for the server': 'los archivos son demasiado grandes para el servidor'\r\n  };\r\n\r\n  function t(key, vars){\r\n    let s = (LANG === 'es' && ES[key]) ? ES[key] : key;\r\n    if(vars){\r\n      Object.keys(vars).forEach(k=>{ s = s.split('{' + k + '}').join(vars[k]); });\r\n    }\r\n    return s;\r\n  }\r\n\r\n  const ALLOWED_FILE_TYPES = ['.jpg','.jpeg','.doc','.docx','.pdf'];\r\n  const MAX_FILES = 3;               \/\/ por zona de subida\r\n  const MAX_FILE_SIZE_MB = 10;       \/\/ por archivo \u2014 mantener <= upload_max_filesize de PHP\r\n  const MAX_VEHICLES = 4;\r\n  const MAX_DRIVERS = 6;\r\n  const MAX_TOTAL_UPLOAD_MB = 20;    \/\/ toda la solicitud \u2014 mantener < post_max_size de PHP\r\n\r\n  const ICONS = {\r\n    person: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"8\" r=\"4\"\/><path d=\"M4 20c0-4 3.5-6 8-6s8 2 8 6\"\/><\/svg>',\r\n    level: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 3l9 5-9 5-9-5 9-5z\"\/><path d=\"M3 13l9 5 9-5\"\/><\/svg>',\r\n    vehicle: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 13l1.5-5A2 2 0 016.4 6.5h11.2A2 2 0 0119.5 8L21 13\"\/><rect x=\"2\" y=\"13\" width=\"20\" height=\"6\" rx=\"2\"\/><circle cx=\"7\" cy=\"19\" r=\"1.5\"\/><circle cx=\"17\" cy=\"19\" r=\"1.5\"\/><\/svg>',\r\n    business: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"4\" y=\"3\" width=\"16\" height=\"18\"\/><path d=\"M9 7h1M14 7h1M9 11h1M14 11h1M9 15h1M14 15h1\"\/><\/svg>',\r\n    property: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 11l9-7 9 7\"\/><path d=\"M5 10v10h14V10\"\/><\/svg>',\r\n    drivers: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"\/><circle cx=\"8.5\" cy=\"11.5\" r=\"2\"\/><path d=\"M5.5 16c0-1.7 1.3-3 3-3s3 1.3 3 3\"\/><path d=\"M14 9.5h5M14 13h3.5\"\/><\/svg>',\r\n    review: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M6 2h9l5 5v15H6z\"\/><path d=\"M14 2v5h5\"\/><\/svg>'\r\n  };\r\n  \/\/ Tama\u00f1o propio en el atributo: aunque el tema pise el CSS, el \u00edcono no se estira\r\n  Object.keys(ICONS).forEach(k=>{ ICONS[k] = ICONS[k].replace('<svg ', '<svg width=\"20\" height=\"20\" '); });\r\n\r\n  const COVERAGE_LEVELS = [\r\n    { key:'basic', title:'Basic', desc:'PIP + Property Damage', tier:1 },\r\n    { key:'liability', title:'Liability', desc:'Bodily Injury + Property Damage', tier:2 },\r\n    { key:'full', title:'Full Coverage', desc:'Liability + Comprehensive + Collision', tier:3 },\r\n    { key:'other', title:'Others Coverage', desc:'Not sure, or need something different', tier:null }\r\n  ];\r\n\r\n  \/\/ ---------- Helpers ----------\r\n  \/\/ Escapa texto del usuario antes de meterlo en innerHTML \/ atributos\r\n  function esc(v){\r\n    return String(v == null ? '' : v)\r\n      .replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;')\r\n      .replace(\/\"\/g,'&quot;').replace(\/'\/g,'&#39;');\r\n  }\r\n\r\n  function getFileExt(filename){\r\n    const parts = filename.split('.');\r\n    return parts.length > 1 ? '.' + parts.pop().toLowerCase() : '';\r\n  }\r\n  function stripExt(filename){\r\n    const ext = getFileExt(filename);\r\n    return ext ? filename.slice(0, -ext.length) : filename;\r\n  }\r\n  function isAllowedFile(file){ return ALLOWED_FILE_TYPES.includes(getFileExt(file.name)); }\r\n  function formatFileSize(bytes){\r\n    if(bytes < 1024) return bytes + ' B';\r\n    if(bytes < 1024*1024) return (bytes\/1024).toFixed(0) + ' KB';\r\n    return (bytes\/(1024*1024)).toFixed(1) + ' MB';\r\n  }\r\n  function fileIconSvg(filename){\r\n    const ext = getFileExt(filename);\r\n    if(ext === '.pdf' || ext === '.doc' || ext === '.docx'){\r\n      return '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M6 2h9l5 5v15H6z\"\/><path d=\"M14 2v5h5\"\/><\/svg>';\r\n    }\r\n    return '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"\/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"\/><path d=\"M21 15l-5-5L5 21\"\/><\/svg>';\r\n  }\r\n  function isValidEmail(v){ return \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(v); }\r\n  function isValidPhone(v){\r\n    if(!\/^[0-9+\\-()\\s]+$\/.test(v)) return false;\r\n    return v.replace(\/\\D\/g,'').length >= 7;\r\n  }\r\n  function isValidCurrency(v){\r\n    const cleaned = v.replace(\/[$,]\/g,'').trim();\r\n    return \/^[0-9]+(\\.[0-9]{1,2})?$\/.test(cleaned);\r\n  }\r\n  function formatCurrencyInput(v){\r\n    const cleaned = v.replace(\/[^0-9.]\/g,'');\r\n    if(!cleaned) return '';\r\n    const parts = cleaned.split('.');\r\n    const intPart = parts[0].replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, ',');\r\n    const decPart = parts.length > 1 ? '.' + parts[1].slice(0,2) : '';\r\n    return '$' + intPart + decPart;\r\n  }\r\n\r\n  function fileUploadWidgetHtml(filesArray, idSuffix, label){\r\n    const remaining = MAX_FILES - filesArray.length;\r\n    const listHtml = filesArray.map((f,i)=>`\r\n      <div class=\"qw-file-item\">\r\n        <div class=\"qw-file-item-icon\">${fileIconSvg(f.name)}<\/div>\r\n        <div class=\"qw-file-item-name\" title=\"${esc(f.name)}\">${esc(f.name)}<\/div>\r\n        <div class=\"qw-file-item-size\">${formatFileSize(f.size)}<\/div>\r\n        <button type=\"button\" class=\"qw-file-item-remove\" data-idx=\"${i}\" data-suffix=\"${idSuffix}\" aria-label=\"${t('Remove file')}\">\u00d7<\/button>\r\n      <\/div>\r\n    `).join('');\r\n\r\n    const hint = remaining === 1\r\n      ? t('JPG, JPEG, DOC, DOCX or PDF \u2014 up to 1 more file (max {mb}MB each)', { mb: MAX_FILE_SIZE_MB })\r\n      : t('JPG, JPEG, DOC, DOCX or PDF \u2014 up to {n} more files (max {mb}MB each)', { n: remaining, mb: MAX_FILE_SIZE_MB });\r\n\r\n    return `\r\n      <label class=\"qw-upload-label\">${label || t('Upload Documents')} ${t('(Optional \u2014 up to {n})', { n: MAX_FILES })}<\/label>\r\n      ${filesArray.length ? `<div class=\"qw-file-list\">${listHtml}<\/div>` : ''}\r\n      ${remaining > 0 ? `\r\n      <label class=\"qw-file-upload\" id=\"fileDropZone-${idSuffix}\">\r\n        <input type=\"file\" id=\"fileInput-${idSuffix}\" accept=\".jpg,.jpeg,.doc,.docx,.pdf\" multiple>\r\n        <div class=\"qw-file-upload-icon\">\r\n          <svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 16V4\"\/><path d=\"M7 9l5-5 5 5\"\/><path d=\"M4 16v3a2 2 0 002 2h12a2 2 0 002-2v-3\"\/><\/svg>\r\n        <\/div>\r\n        <p class=\"qw-file-upload-title\">${t('Click to upload or drag files here')}<\/p>\r\n        <p>${hint}<\/p>\r\n      <\/label>` : `<p class=\"qw-file-max-note\">${t('Maximum of {n} files reached.', { n: MAX_FILES })}<\/p>`}\r\n      <div class=\"qw-file-error\" id=\"fileError-${idSuffix}\"><\/div>\r\n    `;\r\n  }\r\n\r\n  function fieldTemplate(id,label,placeholder,value,type){\r\n    type = type || 'text';\r\n    return `<div class=\"qw-field\" id=\"field-${id}\">\r\n      <label for=\"${id}\">${label}<\/label>\r\n      <input type=\"${type}\" id=\"${id}\" placeholder=\"${placeholder}\" value=\"${esc(value)}\">\r\n      <span class=\"qw-error\">${t('This field is required.')}<\/span>\r\n    <\/div>`;\r\n  }\r\n\r\n  function isLevelVisuallySelected(level, coverageLevel){\r\n    if(!coverageLevel) return false;\r\n    if(coverageLevel === 'other') return level.key === 'other';\r\n    if(level.key === 'other') return false;\r\n    const selectedLevel = COVERAGE_LEVELS.find(l=>l.key === coverageLevel);\r\n    if(!selectedLevel || selectedLevel.tier == null) return false;\r\n    return level.tier != null && level.tier <= selectedLevel.tier;\r\n  }\r\n\r\n  function coverageLevelCardHtml(level, coverageLevel){\r\n    const selected = isLevelVisuallySelected(level, coverageLevel) ? 'selected' : '';\r\n    return `<div class=\"qw-coverage-card ${selected}\" data-key=\"${level.key}\">\r\n      <div class=\"qw-coverage-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" width=\"20\" height=\"20\"><path d=\"M12 3l8 3v6c0 5-3.5 8.5-8 11-4.5-2.5-8-6-8-11V5l8-3z\"\/><path d=\"M9 12l2 2 4-4\"\/><\/svg><\/div>\r\n      <h3>${t(level.title)}<\/h3>\r\n      <p>${t(level.desc)}<\/p>\r\n    <\/div>`;\r\n  }\r\n\r\n  function coverageLevelLabelFor(coverageLevel){\r\n    const found = COVERAGE_LEVELS.find(l=>l.key === coverageLevel);\r\n    return found ? t(found.title) : '';\r\n  }\r\n\r\n  \/\/ Fila del Review (etiqueta | valor). Si no hay valor, no se muestra.\r\n  function reviewRow(label, value){\r\n    if(!value) return '';\r\n    return `<div class=\"qw-rv-row\"><div class=\"qw-rv-label\">${label}<\/div><div class=\"qw-rv-value\">${esc(value)}<\/div><\/div>`;\r\n  }\r\n  \/\/ Bloque ancho (t\u00edtulo arriba, contenido debajo)\r\n  function reviewBlock(label, innerHtml){\r\n    return `<div class=\"qw-rv-block\"><div class=\"qw-rv-label\">${label}<\/div>${innerHtml}<\/div>`;\r\n  }\r\n\r\n  \/* =========================================================================\r\n     Widget: una instancia independiente por formulario\r\n     ========================================================================= *\/\r\n  function createInsuranceQuoteWidget(prefix, fixedCoverage){\r\n    function ID(name){ return prefix + '-' + name; }\r\n    function Q(name){ return document.getElementById(ID(name)); }\r\n\r\n    const card = Q('qwCard');\r\n    if(!card) return;\r\n\r\n    \/\/ Marcador de versi\u00f3n (para comprobar qu\u00e9 c\u00f3digo est\u00e1 cargando la p\u00e1gina)\r\n    card.setAttribute('data-qw-version', QW_VERSION);\r\n    console.log('[quote-form] ' + QW_VERSION + ' \u00b7 ' + prefix + ' \u00b7 lang=' + LANG);\r\n    if(\/[?&]qwdebug\\b\/.test(location.search)){\r\n      const badge = document.createElement('div');\r\n      badge.textContent = 'Quote form ' + QW_VERSION + ' \u00b7 ' + prefix + ' \u00b7 lang ' + LANG + ' \u00b7 viewport ' + window.innerWidth + 'px';\r\n      badge.style.cssText = 'background:#FFC000;color:#163a5f;font:700 12px\/1.4 sans-serif;padding:6px 10px;border-radius:6px;margin-bottom:10px;';\r\n      const stepsEl = Q('qwSteps');\r\n      if(stepsEl && stepsEl.parentNode) stepsEl.parentNode.insertBefore(badge, stepsEl);\r\n    }\r\n\r\n    const state = {\r\n      step: 1,\r\n      info: { firstName:'', lastName:'', email:'', phone:'' },\r\n      coverage: fixedCoverage,\r\n      coverageLevel: null,\r\n      vehicles: [ { vin:'', files:[] } ],\r\n      drivers: [ { files:[], dob:'', licenseNumber:'', expiration:'', fullName:'', address:'' } ],\r\n      business: { name:'', type:'', address:'', employees:'' },\r\n      property: { address:'', type:'', value:'' },\r\n      notes: '',\r\n      files: []\r\n    };\r\n\r\n    function detailsStepLabel(){\r\n      if(state.coverage === 'vehicle') return t('Vehicle Details');\r\n      if(state.coverage === 'business') return t('Business Details');\r\n      return t('Property Details');\r\n    }\r\n    function detailsStepIcon(){\r\n      if(state.coverage === 'vehicle') return ICONS.vehicle;\r\n      if(state.coverage === 'business') return ICONS.business;\r\n      return ICONS.property;\r\n    }\r\n\r\n    \/\/ Info -> Coverage Level -> Details -> [Drivers, solo veh\u00edculo] -> Review\r\n    function getStepDefs(){\r\n      const defs = [\r\n        { key:'info', label:t('Your Info'), icon: ICONS.person },\r\n        { key:'level', label:t('Coverage Level'), icon: ICONS.level },\r\n        { key:'details', label: detailsStepLabel(), icon: detailsStepIcon() }\r\n      ];\r\n      if(state.coverage === 'vehicle'){\r\n        defs.push({ key:'drivers', label:t('Drivers'), icon: ICONS.drivers });\r\n      }\r\n      defs.push({ key:'review', label:t('Review'), icon: ICONS.review });\r\n      return defs;\r\n    }\r\n    function reviewStepNumber(){ return getStepDefs().findIndex(d=>d.key === 'review') + 1; }\r\n\r\n    function updateStepIndicator(){\r\n      const defs = getStepDefs();\r\n      if(state.step > defs.length) state.step = defs.length;\r\n      const container = Q('qwSteps');\r\n      let html = '';\r\n      defs.forEach((d,i)=>{\r\n        const n = i + 1;\r\n        let cls = 'qw-step';\r\n        if(n < state.step) cls += ' done';\r\n        else if(n === state.step) cls += ' active';\r\n        html += `<div class=\"${cls}\" data-step=\"${n}\">\r\n          <div class=\"qw-step-icon\">${d.icon}<\/div>\r\n          <div class=\"qw-step-label\">${d.label}<\/div>\r\n        <\/div>`;\r\n        if(i < defs.length - 1){\r\n          html += `<div class=\"qw-connector${n < state.step ? ' filled' : ''}\"><\/div>`;\r\n        }\r\n      });\r\n      container.innerHTML = html;\r\n    }\r\n\r\n    \/\/ Al cambiar de paso, lleva la vista al inicio del formulario.\r\n    \/\/ SCROLL_OFFSET = alto aproximado del header fijo del sitio (+ un margen). Aj\u00fastalo si hace falta.\r\n    const SCROLL_OFFSET = 100;\r\n    let hasRendered = false;\r\n    function scrollToFormTop(){\r\n      const target = Q('qwSteps') || card;\r\n      const top = target.getBoundingClientRect().top;\r\n      if(top >= SCROLL_OFFSET) return; \/\/ el inicio del formulario ya se ve: no mover nada\r\n      const reduce = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n      window.scrollTo({ top: Math.max(0, top + window.pageYOffset - SCROLL_OFFSET), behavior: reduce ? 'auto' : 'smooth' });\r\n    }\r\n\r\n    function render(){\r\n      updateStepIndicator();\r\n      const defs = getStepDefs();\r\n      const key = defs[state.step - 1] ? defs[state.step - 1].key : defs[defs.length - 1].key;\r\n      if(key === 'info') renderInfo();\r\n      else if(key === 'level') renderCoverageLevel();\r\n      else if(key === 'details') renderDetails();\r\n      else if(key === 'drivers') renderStepDrivers();\r\n      else if(key === 'review') renderReview();\r\n      if(hasRendered) scrollToFormTop(); \/\/ no en la primera carga de la p\u00e1gina\r\n      hasRendered = true;\r\n    }\r\n\r\n    \/\/ ---------- Subida de archivos ----------\r\n    function totalUploadBytes(){\r\n      return getAllFiles().reduce((sum,item)=> sum + item.file.size, 0);\r\n    }\r\n\r\n    function attachFileUploadHandlers(filesArray, idSuffix, afterChangeCallback){\r\n      const dropZone = document.getElementById(`fileDropZone-${idSuffix}`);\r\n      const input = document.getElementById(`fileInput-${idSuffix}`);\r\n      const errorEl = document.getElementById(`fileError-${idSuffix}`);\r\n\r\n      function clearFileError(){\r\n        if(!errorEl) return;\r\n        errorEl.textContent = '';\r\n        errorEl.classList.remove('show');\r\n      }\r\n\r\n      function handleFiles(fileList){\r\n        clearFileError();\r\n        const incoming = Array.from(fileList);\r\n        const rejected = [];\r\n        for(const f of incoming){\r\n          if(filesArray.length >= MAX_FILES){ rejected.push(f.name + ' (' + t('limit reached') + ')'); continue; }\r\n          if(!isAllowedFile(f)){ rejected.push(f.name + ' (' + t('unsupported type') + ')'); continue; }\r\n          if(f.size > MAX_FILE_SIZE_MB * 1024 * 1024){ rejected.push(f.name + ' (' + t('over {mb}MB', { mb: MAX_FILE_SIZE_MB }) + ')'); continue; }\r\n          if(totalUploadBytes() + f.size > MAX_TOTAL_UPLOAD_MB * 1024 * 1024){ rejected.push(f.name + ' (' + t('total over {mb}MB', { mb: MAX_TOTAL_UPLOAD_MB }) + ')'); continue; }\r\n          filesArray.push(f);\r\n        }\r\n        afterChangeCallback();\r\n        if(rejected.length){\r\n          \/\/ Tras re-renderizar, el contenedor de error es uno nuevo: se vuelve a buscar\r\n          const el = document.getElementById(`fileError-${idSuffix}`);\r\n          if(el){ el.textContent = t('Some files were not added: ') + rejected.join(', '); el.classList.add('show'); }\r\n        }\r\n      }\r\n\r\n      if(input){\r\n        input.addEventListener('change', (e)=>{ handleFiles(e.target.files); e.target.value = ''; });\r\n      }\r\n      if(dropZone){\r\n        dropZone.addEventListener('dragover', (e)=>{ e.preventDefault(); dropZone.classList.add('dragover'); });\r\n        dropZone.addEventListener('dragleave', (e)=>{ e.preventDefault(); dropZone.classList.remove('dragover'); });\r\n        dropZone.addEventListener('drop', (e)=>{\r\n          e.preventDefault();\r\n          dropZone.classList.remove('dragover');\r\n          if(e.dataTransfer && e.dataTransfer.files) handleFiles(e.dataTransfer.files);\r\n        });\r\n      }\r\n      card.querySelectorAll(`.qw-file-item-remove[data-suffix=\"${idSuffix}\"]`).forEach(btn=>{\r\n        btn.addEventListener('click', ()=>{\r\n          const idx = parseInt(btn.dataset.idx,10);\r\n          filesArray.splice(idx,1);\r\n          afterChangeCallback();\r\n        });\r\n      });\r\n    }\r\n\r\n    \/\/ ---------- Paso 1: info ----------\r\n    function renderInfo(){\r\n      card.innerHTML = `\r\n        <h2>${t('Customer Information')}<\/h2>\r\n        <p class=\"qw-sub\">${t('Tell us about yourself so we can prepare your quote.')}<\/p>\r\n        <div class=\"qw-row\">\r\n          ${fieldTemplate(ID('firstName'), t('First Name'), 'John', state.info.firstName)}\r\n          ${fieldTemplate(ID('lastName'), t('Last Name'), 'Doe', state.info.lastName)}\r\n        <\/div>\r\n        <div class=\"qw-row\">\r\n          ${fieldTemplate(ID('email'), t('Email'), 'john@example.com', state.info.email, 'email')}\r\n          ${fieldTemplate(ID('phone'), t('Mobile Phone'), '(305) 555-0192', state.info.phone, 'tel')}\r\n        <\/div>\r\n        <div class=\"qw-actions qw-actions--end\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnNext')}\">${t('Continue')}<\/button>\r\n        <\/div>\r\n      `;\r\n      Q('btnNext').addEventListener('click', ()=>{\r\n        const f = {\r\n          firstName: Q('firstName').value.trim(),\r\n          lastName: Q('lastName').value.trim(),\r\n          email: Q('email').value.trim(),\r\n          phone: Q('phone').value.trim()\r\n        };\r\n        let valid = true;\r\n        Object.keys(f).forEach(k=>{\r\n          const box = document.getElementById('field-'+ID(k));\r\n          const errorEl = box.querySelector('.qw-error');\r\n          let errorMsg = '';\r\n          if(!f[k]){\r\n            errorMsg = t('This field is required.');\r\n          } else if(k === 'email' && !isValidEmail(f[k])){\r\n            errorMsg = t('Please enter a valid email address (e.g. name@example.com).');\r\n          } else if(k === 'phone' && !isValidPhone(f[k])){\r\n            errorMsg = t('Please enter a valid phone number (numbers only).');\r\n          }\r\n          if(errorMsg){\r\n            errorEl.textContent = errorMsg;\r\n            box.classList.add('invalid');\r\n            valid = false;\r\n          } else {\r\n            box.classList.remove('invalid');\r\n          }\r\n        });\r\n        if(!valid) return;\r\n        state.info = f;\r\n        state.step = 2;\r\n        render();\r\n      });\r\n    }\r\n\r\n    \/\/ ---------- Paso 2: nivel de cobertura (opcional) ----------\r\n    function renderCoverageLevel(){\r\n      card.innerHTML = `\r\n        <h2>${t('Select Coverage Level')}<\/h2>\r\n        <p class=\"qw-sub\">${t(\"Optional \u2014 pick a level if you already know what you need, or skip this and we'll help you choose.\")}<\/p>\r\n        <div class=\"qw-coverage-grid\" id=\"${ID('coverageLevelGrid')}\">\r\n          ${COVERAGE_LEVELS.map(l=>coverageLevelCardHtml(l, state.coverageLevel)).join('')}\r\n        <\/div>\r\n        <div class=\"qw-actions\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"${ID('btnBack')}\">${t('Back')}<\/button>\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnNext')}\">${t('Continue')}<\/button>\r\n        <\/div>\r\n      `;\r\n      Q('coverageLevelGrid').querySelectorAll('.qw-coverage-card').forEach(el=>{\r\n        el.addEventListener('click', ()=>{\r\n          state.coverageLevel = (state.coverageLevel === el.dataset.key) ? null : el.dataset.key;\r\n          renderCoverageLevel();\r\n        });\r\n      });\r\n      Q('btnBack').addEventListener('click', ()=>{ state.step = 1; render(); });\r\n      Q('btnNext').addEventListener('click', ()=>{ state.step = 3; render(); });\r\n    }\r\n\r\n    function renderDetails(){\r\n      if(state.coverage === 'vehicle') renderDetailsVehicle();\r\n      else if(state.coverage === 'business') renderDetailsBusiness();\r\n      else renderDetailsProperty();\r\n    }\r\n\r\n    \/\/ ---------- Paso 3 (veh\u00edculo) ----------\r\n    function renderDetailsVehicle(){\r\n      const atMax = state.vehicles.length >= MAX_VEHICLES;\r\n      const items = state.vehicles.map((v,i)=>`\r\n        <div class=\"qw-item-box\">\r\n          <h4>${t('Vehicle')} ${i+1}<\/h4>\r\n          ${state.vehicles.length > 1 ? `<button type=\"button\" class=\"qw-item-remove\" data-remove-veh=\"${i}\">${t('Remove')}<\/button>` : ''}\r\n          <div class=\"qw-row\">\r\n            <div class=\"qw-field\"><label>${t('VIN (optional)')}<\/label><input type=\"text\" data-idx=\"${i}\" data-key=\"vin\" class=\"veh-input\" placeholder=\"1HGBH41JXMN109186\" value=\"${esc(v.vin)}\"><\/div>\r\n          <\/div>\r\n          ${fileUploadWidgetHtml(v.files, ID('veh-'+i), t('Upload Documents for this Vehicle'))}\r\n        <\/div>\r\n      `).join('');\r\n\r\n      card.innerHTML = `\r\n        <h2>${t('Vehicle Details')}<\/h2>\r\n        <p class=\"qw-sub\">${t(\"Tell us about the vehicles you'd like to insure.\")}<\/p>\r\n        <div class=\"qw-count-control\">\r\n          <label style=\"font-weight:700;font-size:13px;\">${t('Number of Vehicles')}<\/label>\r\n          <button type=\"button\" id=\"${ID('vehMinus')}\" ${state.vehicles.length <= 1 ? 'disabled' : ''}>&minus;<\/button>\r\n          <span id=\"${ID('vehCount')}\" style=\"min-width:16px;text-align:center;font-weight:700;\">${state.vehicles.length}<\/span>\r\n          <button type=\"button\" id=\"${ID('vehPlus')}\" ${atMax ? 'disabled' : ''}>+<\/button>\r\n        <\/div>\r\n        <p class=\"qw-count-note\">${atMax ? t(\"You've reached the maximum of {n} vehicles. Add the rest in the notes on the review step.\", { n: MAX_VEHICLES }) : t('Add up to {n} vehicles.', { n: MAX_VEHICLES })}<\/p>\r\n        ${items}\r\n        <div class=\"qw-actions\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"${ID('btnBack')}\">${t('Back')}<\/button>\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnNext')}\">${t('Continue')}<\/button>\r\n        <\/div>\r\n      `;\r\n\r\n      Q('vehPlus').addEventListener('click', ()=>{\r\n        if(state.vehicles.length >= MAX_VEHICLES) return;\r\n        state.vehicles.push({vin:'',files:[]});\r\n        renderDetailsVehicle();\r\n      });\r\n      Q('vehMinus').addEventListener('click', ()=>{\r\n        if(state.vehicles.length > 1){ state.vehicles.pop(); renderDetailsVehicle(); }\r\n      });\r\n      card.querySelectorAll('[data-remove-veh]').forEach(btn=>{\r\n        btn.addEventListener('click', ()=>{\r\n          state.vehicles.splice(parseInt(btn.dataset.removeVeh,10),1);\r\n          renderDetailsVehicle();\r\n        });\r\n      });\r\n      card.querySelectorAll('.veh-input').forEach(inp=>{\r\n        inp.addEventListener('input', (e)=>{\r\n          state.vehicles[parseInt(e.target.dataset.idx,10)][e.target.dataset.key] = e.target.value;\r\n        });\r\n      });\r\n      state.vehicles.forEach((v,i)=>{\r\n        attachFileUploadHandlers(v.files, ID('veh-'+i), renderDetailsVehicle);\r\n      });\r\n      Q('btnBack').addEventListener('click', ()=>{ state.step = 2; render(); });\r\n      Q('btnNext').addEventListener('click', ()=>{ state.step = state.step + 1; render(); });\r\n    }\r\n\r\n    \/\/ ---------- Paso 4 (veh\u00edculo): conductores ----------\r\n    function driverFactory(){\r\n      return { files:[], dob:'', licenseNumber:'', expiration:'', fullName:'', address:'' };\r\n    }\r\n    function isDriverManualComplete(d){\r\n      return !!(d.dob && d.licenseNumber && d.expiration && d.fullName && d.address);\r\n    }\r\n    function isDriverSatisfied(d){\r\n      return (d.files && d.files.length > 0) || isDriverManualComplete(d);\r\n    }\r\n\r\n    function renderStepDrivers(){\r\n      const atMax = state.drivers.length >= MAX_DRIVERS;\r\n      const items = state.drivers.map((d,i)=>`\r\n        <div class=\"qw-item-box\">\r\n          <h4>${t('Driver')} ${i+1}<\/h4>\r\n          ${state.drivers.length > 1 ? `<button type=\"button\" class=\"qw-item-remove\" data-remove-drv=\"${i}\">${t('Remove')}<\/button>` : ''}\r\n          ${fileUploadWidgetHtml(d.files, ID('drv-'+i), t(\"Upload Driver's License\"))}\r\n          <p style=\"font-size:12px;color:#9aa1ac;margin:-4px 0 16px;\">${t('\u2014 or enter their information manually \u2014')}<\/p>\r\n          <div class=\"qw-row\">\r\n            <div class=\"qw-field\"><label>${t('Date of Birth')}<\/label><input type=\"date\" data-idx=\"${i}\" data-key=\"dob\" class=\"drv-input\" value=\"${esc(d.dob)}\"><\/div>\r\n            <div class=\"qw-field\"><label>${t('License Number')}<\/label><input type=\"text\" data-idx=\"${i}\" data-key=\"licenseNumber\" class=\"drv-input\" placeholder=\"D123-456-78-901\" value=\"${esc(d.licenseNumber)}\"><\/div>\r\n          <\/div>\r\n          <div class=\"qw-row\">\r\n            <div class=\"qw-field\"><label>${t('Expiration Date')}<\/label><input type=\"date\" data-idx=\"${i}\" data-key=\"expiration\" class=\"drv-input\" value=\"${esc(d.expiration)}\"><\/div>\r\n            <div class=\"qw-field\"><label>${t('Full Name')}<\/label><input type=\"text\" data-idx=\"${i}\" data-key=\"fullName\" class=\"drv-input\" placeholder=\"Jane Doe\" value=\"${esc(d.fullName)}\"><\/div>\r\n          <\/div>\r\n          <div class=\"qw-row\">\r\n            <div class=\"qw-field qw-field--full\"><label>${t('Address')}<\/label><input type=\"text\" data-idx=\"${i}\" data-key=\"address\" class=\"drv-input\" placeholder=\"${t('Street, city, state')}\" value=\"${esc(d.address)}\"><\/div>\r\n          <\/div>\r\n          <div class=\"qw-driver-error\" id=\"${ID('driverError-'+i)}\">${t(\"Please upload the driver's license, or fill in all five fields above.\")}<\/div>\r\n        <\/div>\r\n      `).join('');\r\n\r\n      card.innerHTML = `\r\n        <h2>${t('Drivers')}<\/h2>\r\n        <p class=\"qw-sub\">${t(\"Tell us who will be driving. Upload each driver's license \u2014 or skip that and enter their details manually.\")}<\/p>\r\n        <div class=\"qw-count-control\">\r\n          <label style=\"font-weight:700;font-size:13px;\">${t('Number of Drivers')}<\/label>\r\n          <button type=\"button\" id=\"${ID('drvMinus')}\" ${state.drivers.length <= 1 ? 'disabled' : ''}>&minus;<\/button>\r\n          <span id=\"${ID('drvCount')}\" style=\"min-width:16px;text-align:center;font-weight:700;\">${state.drivers.length}<\/span>\r\n          <button type=\"button\" id=\"${ID('drvPlus')}\" ${atMax ? 'disabled' : ''}>+<\/button>\r\n        <\/div>\r\n        <p class=\"qw-count-note\">${atMax ? t(\"You've reached the maximum of {n} drivers.\", { n: MAX_DRIVERS }) : t('Add up to {n} drivers.', { n: MAX_DRIVERS })}<\/p>\r\n        ${items}\r\n        <div class=\"qw-actions\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"${ID('btnBack')}\">${t('Back')}<\/button>\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnNext')}\">${t('Continue')}<\/button>\r\n        <\/div>\r\n      `;\r\n\r\n      Q('drvPlus').addEventListener('click', ()=>{\r\n        if(state.drivers.length >= MAX_DRIVERS) return;\r\n        state.drivers.push(driverFactory());\r\n        renderStepDrivers();\r\n      });\r\n      Q('drvMinus').addEventListener('click', ()=>{\r\n        if(state.drivers.length > 1){ state.drivers.pop(); renderStepDrivers(); }\r\n      });\r\n      card.querySelectorAll('[data-remove-drv]').forEach(btn=>{\r\n        btn.addEventListener('click', ()=>{\r\n          state.drivers.splice(parseInt(btn.dataset.removeDrv,10),1);\r\n          renderStepDrivers();\r\n        });\r\n      });\r\n      card.querySelectorAll('.drv-input').forEach(inp=>{\r\n        inp.addEventListener('input', (e)=>{\r\n          state.drivers[parseInt(e.target.dataset.idx,10)][e.target.dataset.key] = e.target.value;\r\n        });\r\n      });\r\n      state.drivers.forEach((d,i)=>{\r\n        attachFileUploadHandlers(d.files, ID('drv-'+i), renderStepDrivers);\r\n      });\r\n      Q('btnBack').addEventListener('click', ()=>{ state.step = state.step - 1; render(); });\r\n      Q('btnNext').addEventListener('click', ()=>{\r\n        let valid = true;\r\n        state.drivers.forEach((d,i)=>{\r\n          const errEl = document.getElementById(ID('driverError-'+i));\r\n          const satisfied = isDriverSatisfied(d);\r\n          if(errEl) errEl.style.display = satisfied ? 'none' : 'block';\r\n          if(!satisfied) valid = false;\r\n        });\r\n        if(!valid) return;\r\n        state.step = state.step + 1;\r\n        render();\r\n      });\r\n    }\r\n\r\n    \/\/ ---------- Paso 3 (negocio) ----------\r\n    function renderDetailsBusiness(){\r\n      card.innerHTML = `\r\n        <h2>${t('Business Details')}<\/h2>\r\n        <p class=\"qw-sub\">${t('Tell us about your business.')}<\/p>\r\n        <div class=\"qw-row\">\r\n          <div class=\"qw-field\" id=\"field-${ID('bizName')}\"><label>${t('Business Name')}<\/label><input type=\"text\" id=\"${ID('bizName')}\" placeholder=\"My Company LLC\" value=\"${esc(state.business.name)}\"><span class=\"qw-error\">${t('Please enter the business name.')}<\/span><\/div>\r\n          <div class=\"qw-field\" id=\"field-${ID('bizType')}\"><label>${t('Business Type')}<\/label><input type=\"text\" id=\"${ID('bizType')}\" placeholder=\"${t('Restaurant, retail store, office...')}\" value=\"${esc(state.business.type)}\"><span class=\"qw-error\">${t('Please enter the business type.')}<\/span><\/div>\r\n        <\/div>\r\n        <div class=\"qw-row\">\r\n          <div class=\"qw-field\" id=\"field-${ID('bizAddress')}\"><label>${t('Address')}<\/label><input type=\"text\" id=\"${ID('bizAddress')}\" placeholder=\"${t('Street, city, state')}\" value=\"${esc(state.business.address)}\"><span class=\"qw-error\">${t('Please enter the address.')}<\/span><\/div>\r\n          <div class=\"qw-field\" id=\"field-${ID('bizEmployees')}\"><label>${t('Number of Employees')}<\/label><input type=\"text\" id=\"${ID('bizEmployees')}\" placeholder=\"5\" value=\"${esc(state.business.employees)}\"><span class=\"qw-error\" data-default-msg=\"${t('Please enter the number of employees.')}\">${t('Please enter the number of employees.')}<\/span><\/div>\r\n        <\/div>\r\n        ${fileUploadWidgetHtml(state.files, ID('shared'))}\r\n        <div class=\"qw-actions\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"${ID('btnBack')}\">${t('Back')}<\/button>\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnNext')}\">${t('Continue')}<\/button>\r\n        <\/div>\r\n      `;\r\n      \/\/ Guardar lo escrito en vivo: as\u00ed no se pierde al subir un archivo (que re-renderiza)\r\n      Q('bizName').addEventListener('input', (e)=>{ state.business.name = e.target.value; });\r\n      Q('bizType').addEventListener('input', (e)=>{ state.business.type = e.target.value; });\r\n      Q('bizAddress').addEventListener('input', (e)=>{ state.business.address = e.target.value; });\r\n      Q('bizEmployees').addEventListener('input', (e)=>{ state.business.employees = e.target.value; });\r\n      attachFileUploadHandlers(state.files, ID('shared'), renderDetailsBusiness);\r\n      Q('btnBack').addEventListener('click', ()=>{ state.step = 2; render(); });\r\n      Q('btnNext').addEventListener('click', ()=>{\r\n        const values = {\r\n          bizName: Q('bizName').value.trim(),\r\n          bizType: Q('bizType').value.trim(),\r\n          bizAddress: Q('bizAddress').value.trim(),\r\n          bizEmployees: Q('bizEmployees').value.trim()\r\n        };\r\n        let valid = true;\r\n        Object.keys(values).forEach(key=>{\r\n          const box = document.getElementById('field-'+ID(key));\r\n          const errorEl = box.querySelector('.qw-error');\r\n          let errorMsg = '';\r\n          if(!values[key]){\r\n            errorMsg = errorEl.dataset.defaultMsg || errorEl.textContent;\r\n          } else if(key === 'bizEmployees' && !\/^[0-9]+$\/.test(values[key])){\r\n            errorMsg = t('Please enter a number (digits only).');\r\n          }\r\n          if(errorMsg){\r\n            errorEl.textContent = errorMsg;\r\n            box.classList.add('invalid');\r\n            valid = false;\r\n          } else {\r\n            box.classList.remove('invalid');\r\n          }\r\n        });\r\n        if(!valid) return;\r\n        state.business = {\r\n          name: values.bizName, type: values.bizType,\r\n          address: values.bizAddress, employees: values.bizEmployees\r\n        };\r\n        state.step = 4; render();\r\n      });\r\n    }\r\n\r\n    \/\/ ---------- Paso 3 (propiedad) ----------\r\n    function renderDetailsProperty(){\r\n      card.innerHTML = `\r\n        <h2>${t('Property Details')}<\/h2>\r\n        <p class=\"qw-sub\">${t(\"Tell us about the property you'd like to insure.\")}<\/p>\r\n        <div class=\"qw-row\">\r\n          <div class=\"qw-field\" id=\"field-${ID('propAddress')}\"><label>${t('Property Address')}<\/label><input type=\"text\" id=\"${ID('propAddress')}\" placeholder=\"${t('Street, city, state')}\" value=\"${esc(state.property.address)}\"><span class=\"qw-error\">${t('Please enter the property address.')}<\/span><\/div>\r\n          <div class=\"qw-field\" id=\"field-${ID('propType')}\"><label>${t('Property Type')}<\/label><input type=\"text\" id=\"${ID('propType')}\" placeholder=\"${t('House, apartment, rental...')}\" value=\"${esc(state.property.type)}\"><span class=\"qw-error\">${t('Please enter the property type.')}<\/span><\/div>\r\n        <\/div>\r\n        <div class=\"qw-row\">\r\n          <div class=\"qw-field\" id=\"field-${ID('propValue')}\"><label>${t('Estimated Value')}<\/label><input type=\"text\" inputmode=\"decimal\" id=\"${ID('propValue')}\" placeholder=\"$250,000\" value=\"${esc(state.property.value)}\"><span class=\"qw-error\" data-default-msg=\"${t('Please enter an estimated value.')}\">${t('Please enter an estimated value.')}<\/span><\/div>\r\n        <\/div>\r\n        ${fileUploadWidgetHtml(state.files, ID('shared'))}\r\n        <div class=\"qw-actions\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"${ID('btnBack')}\">${t('Back')}<\/button>\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnNext')}\">${t('Continue')}<\/button>\r\n        <\/div>\r\n      `;\r\n      Q('propAddress').addEventListener('input', (e)=>{ state.property.address = e.target.value; });\r\n      Q('propType').addEventListener('input', (e)=>{ state.property.type = e.target.value; });\r\n      Q('propValue').addEventListener('input', (e)=>{\r\n        const formatted = formatCurrencyInput(e.target.value);\r\n        e.target.value = formatted;\r\n        state.property.value = formatted;\r\n      });\r\n      attachFileUploadHandlers(state.files, ID('shared'), renderDetailsProperty);\r\n      Q('btnBack').addEventListener('click', ()=>{ state.step = 2; render(); });\r\n      Q('btnNext').addEventListener('click', ()=>{\r\n        const values = {\r\n          propAddress: Q('propAddress').value.trim(),\r\n          propType: Q('propType').value.trim(),\r\n          propValue: Q('propValue').value.trim()\r\n        };\r\n        let valid = true;\r\n        Object.keys(values).forEach(key=>{\r\n          const box = document.getElementById('field-'+ID(key));\r\n          const errorEl = box.querySelector('.qw-error');\r\n          let errorMsg = '';\r\n          if(!values[key]){\r\n            errorMsg = errorEl.dataset.defaultMsg || errorEl.textContent;\r\n          } else if(key === 'propValue' && !isValidCurrency(values[key])){\r\n            errorMsg = t('Please enter a valid dollar amount (e.g. $250,000).');\r\n          }\r\n          if(errorMsg){\r\n            errorEl.textContent = errorMsg;\r\n            box.classList.add('invalid');\r\n            valid = false;\r\n          } else {\r\n            box.classList.remove('invalid');\r\n          }\r\n        });\r\n        if(!valid) return;\r\n        state.property = {\r\n          address: values.propAddress, type: values.propType, value: values.propValue\r\n        };\r\n        state.step = 4; render();\r\n      });\r\n    }\r\n\r\n    function coverageLabel(){\r\n      const labels = { vehicle:'Vehicle Insurance', business:'Business Insurance', property:'Property Insurance' };\r\n      return labels[state.coverage] ? t(labels[state.coverage]) : '\u2014';\r\n    }\r\n\r\n    \/\/ Devuelve [{ file, name, vehicle, driver }]; `name` es \u00daNICO en toda la solicitud\r\n    function getAllFiles(){\r\n      const out = [];\r\n      const used = Object.create(null);\r\n\r\n      function push(file, prefixLabel, tags){\r\n        tags = tags || {};\r\n        let base = (prefixLabel ? prefixLabel + '-' : '') + stripExt(file.name).replace(\/[^\\w\\-. ]+\/g,'_');\r\n        const ext = getFileExt(file.name);\r\n        let name = base + ext;\r\n        let n = 2;\r\n        while(used[name.toLowerCase()]){ name = base + '-' + n + ext; n++; }\r\n        used[name.toLowerCase()] = true;\r\n        out.push({ file: file, name: name, vehicle: tags.vehicle || null, driver: tags.driver || null });\r\n      }\r\n\r\n      if(state.coverage === 'vehicle'){\r\n        state.vehicles.forEach((v,i)=>{\r\n          (v.files || []).forEach(f=> push(f, 'vehicle' + (i+1), { vehicle: i+1 }));\r\n        });\r\n        state.drivers.forEach((d,i)=>{\r\n          (d.files || []).forEach(f=> push(f, 'driver' + (i+1), { driver: i+1 }));\r\n        });\r\n      } else {\r\n        state.files.forEach(f=> push(f, '', {}));\r\n      }\r\n      return out;\r\n    }\r\n\r\n    \/\/ ---------- Review ----------\r\n    function detailsSummaryHtml(){\r\n      let html = '';\r\n      if(state.coverage === 'vehicle'){\r\n        const vehRows = state.vehicles.map((v,i)=>{\r\n          const parts = [];\r\n          if(v.vin) parts.push('VIN: ' + esc(v.vin));\r\n          if(v.files.length) parts.push(v.files.length + ' ' + t('file(s)'));\r\n          return `<div class=\"qw-rv-value\">${i+1}. ${t('Vehicle')}${parts.length ? ' \u2014 ' + parts.join(' \u2014 ') : ''}<\/div>`;\r\n        }).join('');\r\n        html += reviewBlock(t('VEHICLES') + ' (' + state.vehicles.length + ')', vehRows);\r\n\r\n        const drvRows = state.drivers.map((d,i)=>{\r\n          const parts = [];\r\n          if(d.fullName) parts.push(esc(d.fullName));\r\n          if(d.files && d.files.length) parts.push(t('License uploaded') + ' (' + d.files.length + ' ' + t('file(s)') + ')');\r\n          else if(isDriverManualComplete(d)) parts.push(t('Details provided manually'));\r\n          return `<div class=\"qw-rv-value\">${i+1}. ${parts.length ? parts.join(' \u2014 ') : t('Driver') + ' ' + (i+1)}<\/div>`;\r\n        }).join('');\r\n        html += reviewBlock(t('DRIVERS') + ' (' + state.drivers.length + ')', drvRows);\r\n      } else if(state.coverage === 'business'){\r\n        html += reviewRow(t('BUSINESS'), state.business.name)\r\n              + reviewRow(t('TYPE'), state.business.type)\r\n              + reviewRow(t('ADDRESS'), state.business.address)\r\n              + reviewRow(t('EMPLOYEES'), state.business.employees);\r\n      } else if(state.coverage === 'property'){\r\n        html += reviewRow(t('ADDRESS'), state.property.address)\r\n              + reviewRow(t('TYPE'), state.property.type)\r\n              + reviewRow(t('ESTIMATED VALUE'), state.property.value);\r\n      }\r\n\r\n      const allFiles = getAllFiles();\r\n      if(allFiles.length){\r\n        const totalMb = (totalUploadBytes()\/(1024*1024)).toFixed(1);\r\n        let groupsHtml = '';\r\n        if(state.coverage === 'vehicle'){\r\n          state.vehicles.forEach((v,i)=>{\r\n            const files = allFiles.filter(f=>f.vehicle === i+1);\r\n            if(files.length){\r\n              groupsHtml += `<div class=\"qw-rv-sub\"><span class=\"qw-rv-sublabel\">${t('Vehicle')} ${i+1}<\/span>${files.map(f=>esc(f.name)).join(', ')}<\/div>`;\r\n            }\r\n          });\r\n          state.drivers.forEach((d,i)=>{\r\n            const files = allFiles.filter(f=>f.driver === i+1);\r\n            if(files.length){\r\n              groupsHtml += `<div class=\"qw-rv-sub\"><span class=\"qw-rv-sublabel\">${t('Driver')} ${i+1}<\/span>${files.map(f=>esc(f.name)).join(', ')}<\/div>`;\r\n            }\r\n          });\r\n        } else {\r\n          groupsHtml = `<div class=\"qw-rv-value\">${allFiles.map(f=>esc(f.name)).join(', ')}<\/div>`;\r\n        }\r\n        html += reviewBlock(t('ATTACHED FILES') + ' (' + allFiles.length + ' \u2014 ' + totalMb + ' MB)', groupsHtml);\r\n      }\r\n      return html;\r\n    }\r\n\r\n    function renderReview(){\r\n      card.innerHTML = `\r\n        <h2>${t('Review &amp; Additional Notes')}<\/h2>\r\n        <p class=\"qw-sub\">${t('Review your information and add any additional details.')}<\/p>\r\n        <div class=\"qw-review-box\">\r\n          <h4>${t('Your Information')}<\/h4>\r\n          <div class=\"qw-review-list\">\r\n            ${reviewRow(t('NAME'), `${state.info.firstName} ${state.info.lastName}`.trim())}\r\n            ${reviewRow(t('EMAIL'), state.info.email)}\r\n            ${reviewRow(t('PHONE'), state.info.phone)}\r\n            ${reviewRow(t('COVERAGE TYPE'), coverageLabel())}\r\n            ${reviewRow(t('COVERAGE LEVEL'), coverageLevelLabelFor(state.coverageLevel))}\r\n            ${detailsSummaryHtml()}\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"qw-field\" style=\"margin-bottom:10px;\">\r\n          <label for=\"${ID('notes')}\">${t('Additional Notes (Optional)')}<\/label>\r\n          <textarea id=\"${ID('notes')}\" rows=\"4\" placeholder=\"${t('Tell us anything else we should know...')}\">${esc(state.notes)}<\/textarea>\r\n        <\/div>\r\n        <div class=\"qw-actions\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"${ID('btnBack')}\">${t('Back')}<\/button>\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnSubmit')}\">${t('Request my free quote')}<\/button>\r\n        <\/div>\r\n        <div class=\"qw-submit-error\" id=\"${ID('submitError')}\"><\/div>\r\n      `;\r\n      Q('btnBack').addEventListener('click', ()=>{ state.step = state.step - 1; render(); });\r\n      Q('btnSubmit').addEventListener('click', ()=>{\r\n        state.notes = Q('notes').value;\r\n        submitQuote();\r\n      });\r\n    }\r\n\r\n    async function submitQuote(){\r\n      const attachments = getAllFiles();\r\n\r\n      const payload = {\r\n        language: LANG, \/\/ 'en' o 'es': idioma en el que el cliente llen\u00f3 el formulario\r\n        info: state.info,\r\n        coverage: state.coverage,\r\n        coverageLevel: state.coverageLevel,\r\n        vehicles: state.coverage === 'vehicle'\r\n          ? state.vehicles.map((v,i)=>({\r\n              index: i+1,\r\n              vin: v.vin,\r\n              files: attachments.filter(a=>a.vehicle === i+1).map(a=>a.name)\r\n            }))\r\n          : undefined,\r\n        drivers: state.coverage === 'vehicle'\r\n          ? state.drivers.map((d,i)=>({\r\n              index: i+1,\r\n              dob: d.dob,\r\n              licenseNumber: d.licenseNumber,\r\n              expiration: d.expiration,\r\n              fullName: d.fullName,\r\n              address: d.address,\r\n              files: attachments.filter(a=>a.driver === i+1).map(a=>a.name)\r\n            }))\r\n          : undefined,\r\n        business: state.coverage === 'business' ? state.business : undefined,\r\n        property: state.coverage === 'property' ? state.property : undefined,\r\n        notes: state.notes,\r\n        attachments: attachments.map(a=>({ name:a.name, size:a.file.size, vehicle:a.vehicle, driver:a.driver })),\r\n        attachmentCount: attachments.length\r\n      };\r\n\r\n      const submitBtn = Q('btnSubmit');\r\n      const backBtn = Q('btnBack');\r\n      const errorEl = Q('submitError');\r\n      if(errorEl){ errorEl.classList.remove('show'); errorEl.textContent = ''; }\r\n      if(submitBtn){ submitBtn.disabled = true; submitBtn.textContent = t('Sending...'); }\r\n      if(backBtn){ backBtn.disabled = true; }\r\n\r\n      try {\r\n        \/\/ Mismo endpoint REST de WordPress para los 3 formularios; `coverage` indica el tipo\r\n        const formData = new FormData();\r\n        formData.append('data', JSON.stringify(payload));\r\n        attachments.forEach((item, i)=>{\r\n          formData.append('files[]', item.file, item.name);\r\n          formData.append('file_' + i, item.file, item.name);\r\n        });\r\n        formData.append('file_count', String(attachments.length));\r\n\r\n        const response = await fetch('\/wp-json\/quote-form\/v1\/submit', {\r\n          method: 'POST',\r\n          body: formData\r\n        });\r\n\r\n        let result = {};\r\n        try { result = await response.json(); } catch(e) { \/* ignorar errores de parseo *\/ }\r\n\r\n        if(response.ok && result.success){\r\n          showSuccess();\r\n        } else {\r\n          const detail = result.message || ('HTTP ' + response.status + (response.status === 413 ? ' \u2014 ' + t('upload too large for the server') : ''));\r\n          console.error('Quote form submission failed:', detail, result);\r\n          showError(detail);\r\n        }\r\n      } catch(err){\r\n        console.error('Quote form submission error:', err);\r\n        showError(err && err.message ? err.message : t('Network error'));\r\n      }\r\n    }\r\n\r\n    function resetState(){\r\n      state.step = 1;\r\n      state.info = { firstName:'', lastName:'', email:'', phone:'' };\r\n      state.coverageLevel = null;\r\n      state.vehicles = [ { vin:'', files:[] } ];\r\n      state.drivers = [ driverFactory() ];\r\n      state.business = { name:'', type:'', address:'', employees:'' };\r\n      state.property = { address:'', type:'', value:'' };\r\n      state.notes = '';\r\n      state.files = [];\r\n      \/\/ state.coverage no se toca: es fijo para este formulario\r\n    }\r\n\r\n    const AUTO_RESET_DELAY = 5000;\r\n    const FADE_DURATION = 400;\r\n    let autoResetTimer = null;\r\n\r\n    function scheduleAutoReset(){\r\n      clearTimeout(autoResetTimer);\r\n      autoResetTimer = setTimeout(()=>{\r\n        card.classList.add('qw-fade-out');\r\n        setTimeout(()=>{\r\n          card.classList.remove('qw-fade-out');\r\n          resetState();\r\n          render();\r\n        }, FADE_DURATION);\r\n      }, AUTO_RESET_DELAY);\r\n    }\r\n\r\n    function showSuccess(){\r\n      card.innerHTML = `\r\n        <div class=\"qw-success\">\r\n          <div class=\"qw-success-icon\">\r\n            <svg viewBox=\"0 0 24 24\" width=\"30\" height=\"30\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M20 6L9 17l-5-5\"\/><\/svg>\r\n          <\/div>\r\n          <h2>${t('Request Received!')}<\/h2>\r\n          <p>${t(\"Thanks, {name}! We'll be in touch soon with your quote.\", { name: esc(state.info.firstName) })}<\/p>\r\n          <p class=\"qw-timer-note\">${t('This form will reset automatically in a few seconds...')}<\/p>\r\n          <button type=\"button\" class=\"qw-new-quote-link\" id=\"${ID('btnNewQuote')}\">${t('Start a new quote now')}<\/button>\r\n        <\/div>\r\n      `;\r\n      Q('btnNewQuote').addEventListener('click', ()=>{\r\n        clearTimeout(autoResetTimer);\r\n        resetState();\r\n        render();\r\n      });\r\n      scheduleAutoReset();\r\n    }\r\n\r\n    function showError(detail){\r\n      card.innerHTML = `\r\n        <div class=\"qw-success\">\r\n          <div class=\"qw-success-icon\" style=\"background:#fdecea;color:#c0392b;\">\r\n            <svg viewBox=\"0 0 24 24\" width=\"30\" height=\"30\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M12 8v5\"\/><path d=\"M12 16.5h.01\"\/><circle cx=\"12\" cy=\"12\" r=\"9\"\/><\/svg>\r\n          <\/div>\r\n          <h2>${t('Something Went Wrong')}<\/h2>\r\n          <p>${t(\"We couldn't send your request. Please try again, or call us directly.\")}<\/p>\r\n          ${detail ? `<p class=\"qw-detail\">${esc(detail)}<\/p>` : ''}\r\n          <div class=\"qw-actions qw-actions--center\">\r\n            <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnRetry')}\">${t('Try again')}<\/button>\r\n          <\/div>\r\n        <\/div>\r\n      `;\r\n      Q('btnRetry').addEventListener('click', ()=>{ state.step = reviewStepNumber(); render(); });\r\n    }\r\n\r\n    render();\r\n  } \/\/ fin de createInsuranceQuoteWidget\r\n\r\n  function bootAllWidgets(){\r\n    createInsuranceQuoteWidget('vehicleQuote', 'vehicle');\r\n  }\r\n\r\n  if(document.readyState === 'loading'){\r\n    document.addEventListener('DOMContentLoaded', bootAllWidgets);\r\n  } else {\r\n    bootAllWidgets();\r\n  }\r\n\r\n})();\r\n<\/script>\r\n\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e85a591 e-flex e-con-boxed e-con e-child\" data-id=\"e85a591\" data-element_type=\"container\" data-e-type=\"container\" id=\"business\" data-settings=\"{&quot;sticky_logo_enable&quot;:&quot;no&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-4e6080a e-con-full e-flex e-con e-child\" data-id=\"4e6080a\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false,&quot;sticky_logo_enable&quot;:&quot;no&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3a3df35 elementor-widget elementor-widget-html\" data-id=\"3a3df35\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n<title>Business Insurance Quote Form<\/title>\r\n<style>\r\n\/* =====================================================================\r\n   Quote form v7-2026-10-13 (biling\u00fce EN\/ES) \u2014 CSS limpio y consolidado\r\n   Lo cr\u00edtico (review, botones, campos) NO depende de media queries.\r\n   ===================================================================== *\/\r\n\r\n.qw-wrap, .qw-wrap *, .qw-wrap *::before, .qw-wrap *::after{box-sizing:border-box;}\r\n\r\n.qw-page{display:flex;flex-direction:column;gap:56px;}\r\n\r\n.qw-wrap{\r\n  font-family:'Inter',-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;\r\n  width:100%;\r\n  max-width:820px;\r\n  margin:0 auto;\r\n  padding:0 16px 20px;\r\n  color:#163a5f;\r\n}\r\n\r\n\/* ---- SVG blindados: el tema no puede estirarlos ---- *\/\r\n.qw-wrap svg{max-width:none !important;flex:none;display:block;}\r\n.qw-wrap .qw-step-icon svg,\r\n.qw-wrap .qw-coverage-icon svg{width:20px !important;height:20px !important;}\r\n.qw-wrap .qw-file-upload-icon svg{width:24px !important;height:24px !important;margin:0 auto;}\r\n.qw-wrap .qw-file-item-icon svg{width:16px !important;height:16px !important;}\r\n.qw-wrap .qw-success-icon svg{width:30px !important;height:30px !important;}\r\n\r\n\/* ---- Indicador de pasos ---- *\/\r\n.qw-steps{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:36px;padding:4px 4px 0;overflow:visible;}\r\n.qw-step{display:flex;flex-direction:column;align-items:center;flex:0 0 auto;position:relative;z-index:2;}\r\n.qw-step-icon{\r\n  width:44px;height:44px;border-radius:50%;\r\n  display:flex;align-items:center;justify-content:center;\r\n  background:#e9ebee;color:#9aa1ac;transition:background .25s,color .25s;flex-shrink:0;\r\n}\r\n.qw-step-label{margin-top:8px;font-size:13px;font-weight:600;color:#9aa1ac;white-space:nowrap;}\r\n.qw-step.done .qw-step-icon{background:#184191;color:#fff;}\r\n.qw-step.done .qw-step-label{color:#184191;}\r\n.qw-step.active .qw-step-icon{background:#FFC000;color:#163a5f;box-shadow:0 0 0 4px rgba(224,183,90,.35);}\r\n.qw-step.active .qw-step-label{color:#184191;}\r\n.qw-connector{flex:1 1 auto;min-width:8px;height:2px;background:#e5e7eb;margin:22px 6px 0;position:relative;}\r\n.qw-connector.filled{background:#184191;}\r\n\r\n\/* ---- Tarjeta ---- *\/\r\n.qw-card{\r\n  background:#fff;border:1px solid #e5e7eb;border-radius:14px;padding:36px;\r\n  box-shadow:0 1px 3px rgba(0,0,0,.04);transition:opacity .4s ease;opacity:1;\r\n  overflow:hidden;max-width:100%;\r\n}\r\n.qw-card.qw-fade-out{opacity:0;}\r\n.qw-card h2{font-family:'mainweather',Georgia,\"Times New Roman\",serif;font-size:26px;margin:0 0 6px;color:#163a5f;line-height:1.2;}\r\n.qw-wrap .qw-card > p.qw-sub{margin:0 0 26px;color:#6b7280 !important;font-size:15px !important;font-weight:400 !important;line-height:1.5 !important;}\r\n\r\n\/* ---- Campos: se apilan solos con flex-wrap (sin media query) ---- *\/\r\n.qw-row{display:flex;gap:20px;margin-bottom:18px;flex-wrap:wrap;}\r\n.qw-field{flex:1 1 220px;min-width:0;display:flex;flex-direction:column;gap:6px;}\r\n.qw-field--full{flex:1 1 100%;}\r\n.qw-field label{font-size:13px;font-weight:700;color:#163a5f;}\r\n.qw-field input,.qw-field textarea{\r\n  border:1px solid #e5e7eb;border-radius:8px;padding:11px 13px;font-size:14px;\r\n  font-family:inherit;color:#163a5f;width:100%;min-width:0;max-width:100%;background:#fff;\r\n}\r\n.qw-field input[type=date]{-webkit-appearance:none;appearance:none;min-height:44px;}\r\n.qw-field input:focus,.qw-field textarea:focus{outline:none;border-color:#184191;box-shadow:0 0 0 3px rgba(24,65,145,.15);}\r\n.qw-field .qw-error{display:none;color:#c0392b;font-size:12px;}\r\n.qw-field.invalid input{border-color:#c0392b;}\r\n.qw-field.invalid .qw-error{display:block;}\r\n.qw-driver-error{display:none;color:#c0392b;font-size:12px;margin-top:-4px;}\r\n\/* iOS: 16px evita el zoom autom\u00e1tico al enfocar (sin media query) *\/\r\n@supports (-webkit-touch-callout:none){\r\n  .qw-field input,.qw-field textarea{font-size:16px;}\r\n}\r\n\r\n\/* ---- Textarea (Additional Notes) ---- *\/\r\n.qw-field textarea{\r\n  display:block !important;height:auto !important;min-height:120px !important;\r\n  resize:vertical;line-height:1.4;\r\n}\r\n.qw-field textarea::placeholder{white-space:normal;line-height:1.35;opacity:.7;}\r\n\r\n\/* ---- Coverage cards ---- *\/\r\n.qw-coverage-grid{display:flex;gap:18px;margin-bottom:28px;flex-wrap:wrap;}\r\n.qw-coverage-card{\r\n  flex:1 1 180px;min-width:0;border:1px solid #e5e7eb;border-radius:12px;padding:22px 18px;\r\n  cursor:pointer;transition:border-color .15s,background .15s;\r\n}\r\n.qw-coverage-card:hover{border-color:#c7cedb;}\r\n.qw-coverage-card.selected{border-color:#184191;background:#f7f8fb;}\r\n.qw-coverage-icon{\r\n  width:44px;height:44px;border-radius:10px;display:flex;align-items:center;justify-content:center;\r\n  background:#f4f5f7;color:#163a5f;margin-bottom:14px;\r\n}\r\n.qw-coverage-card.selected .qw-coverage-icon{background:#184191;color:#FFC000;}\r\n.qw-coverage-card h3{font-family:'mainweather',Georgia,\"Times New Roman\",serif;font-size:18px;margin:0 0 6px;color:#163a5f;}\r\n.qw-coverage-card p{margin:0;font-size:13px;color:#6b7280;line-height:1.4;}\r\n\r\n\/* ---- Veh\u00edculos \/ conductores ---- *\/\r\n.qw-count-control{display:flex;align-items:center;gap:14px;margin-bottom:10px;flex-wrap:wrap;}\r\n.qw-wrap .qw-count-control button{\r\n  width:38px;height:38px;min-width:38px;padding:0;border-radius:8px;border:1px solid #e5e7eb;\r\n  background:#fff;font-size:18px;cursor:pointer;line-height:1;color:#163a5f;\r\n}\r\n.qw-wrap .qw-count-control button:hover:not(:disabled){background:#f4f5f7;}\r\n.qw-wrap .qw-count-control button:disabled{opacity:.45;cursor:not-allowed;}\r\n.qw-count-note{font-size:12px;color:#9aa1ac;margin:0 0 20px;}\r\n.qw-item-box{border:1px solid #e5e7eb;border-radius:10px;padding:20px;margin-bottom:16px;background:#f4f5f7;position:relative;}\r\n.qw-item-box h4{margin:0 0 14px;font-size:14px;color:#163a5f;}\r\n.qw-wrap .qw-item-remove{\r\n  position:absolute;top:14px;right:14px;background:none;border:none;color:#c0392b;font-size:12px;\r\n  font-weight:700;cursor:pointer;font-family:inherit;text-decoration:underline;padding:0;\r\n}\r\n\r\n\/* ---- Subida de archivos ---- *\/\r\n.qw-file-upload{\r\n  display:block;border:2px dashed #d7dbe2;border-radius:10px;padding:22px 16px;text-align:center;\r\n  cursor:pointer;transition:border-color .15s,background .15s;margin-bottom:12px;\r\n}\r\n.qw-file-upload:hover,.qw-file-upload.dragover{border-color:#184191;background:#f7f8fb;}\r\n.qw-file-upload input[type=file]{display:none;}\r\n.qw-file-upload-icon{color:#9aa1ac;margin-bottom:6px;}\r\n.qw-file-upload p{margin:2px 0;font-size:12.5px;color:#6b7280;}\r\n.qw-file-upload .qw-file-upload-title{font-weight:700;color:#163a5f;font-size:14px;margin-bottom:2px;}\r\n.qw-file-list{display:flex;flex-direction:column;gap:8px;margin-bottom:12px;}\r\n.qw-file-item{display:flex;align-items:center;gap:10px;min-width:0;border:1px solid #e5e7eb;border-radius:8px;padding:9px 12px;background:#fff;}\r\n.qw-file-item-icon{width:30px;height:30px;border-radius:6px;background:#f4f5f7;color:#163a5f;display:flex;align-items:center;justify-content:center;flex-shrink:0;}\r\n.qw-file-item-name{flex:1;min-width:0;font-size:13px;color:#163a5f;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}\r\n.qw-file-item-size{font-size:11px;color:#9aa1ac;flex-shrink:0;}\r\n.qw-wrap .qw-file-item-remove{background:none;border:none;color:#c0392b;cursor:pointer;font-size:22px;line-height:1;padding:0 6px;flex-shrink:0;}\r\n.qw-file-error{color:#c0392b;font-size:12px;margin:-4px 0 14px;display:none;}\r\n.qw-file-error.show{display:block;}\r\n.qw-file-max-note{font-size:12px;color:#9aa1ac;margin:-2px 0 14px;}\r\n.qw-upload-label{font-size:13px;font-weight:700;color:#163a5f;display:block;margin-bottom:8px;}\r\n\r\n\/* ---- Review: UNA columna, cada dato es una fila (etiqueta | valor) ---- *\/\r\n.qw-review-box{background:#f4f5f7;border-radius:10px;padding:16px 18px;margin-bottom:24px;width:100%;max-width:100%;overflow:hidden;}\r\n.qw-review-box h4{margin:0 0 6px;font-family:'mainweather',Georgia,serif;font-size:16px;color:#163a5f;}\r\n.qw-review-box,\r\n.qw-review-box *{white-space:normal !important;overflow-wrap:anywhere !important;word-break:break-word;}\r\n.qw-rv-row{display:flex;flex-direction:row;align-items:flex-start;gap:12px;padding:10px 0;border-bottom:1px solid #e5e7eb;}\r\n.qw-rv-row .qw-rv-label{flex:0 0 38%;max-width:38%;min-width:0;}\r\n.qw-rv-row .qw-rv-value{flex:1 1 0;min-width:0;}\r\n.qw-rv-block{display:block;padding:10px 0;border-bottom:1px solid #e5e7eb;}\r\n.qw-rv-block .qw-rv-value{margin:4px 0 0;}\r\n.qw-rv-row:last-child,.qw-rv-block:last-child{border-bottom:0;}\r\n.qw-rv-label{font-size:11px;font-weight:600;letter-spacing:.03em;text-transform:uppercase;color:#6b7280;line-height:1.4;margin:0;}\r\n.qw-rv-value{font-size:14px;font-weight:600;color:#163a5f;line-height:1.4;margin:0;}\r\n.qw-rv-sub{margin-top:6px;font-size:14px;font-weight:600;color:#163a5f;line-height:1.4;}\r\n.qw-rv-sublabel{display:block;font-size:11px;font-weight:600;letter-spacing:.03em;color:#6b7280;text-transform:uppercase;margin-bottom:2px;}\r\n\r\n\/* ---- Botones: SIEMPRE en fila, misma altura y mismo ancho ---- *\/\r\n.qw-actions{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:stretch;gap:12px;margin-top:28px;width:100%;}\r\n.qw-actions--end{justify-content:flex-end;}\r\n.qw-actions--center{justify-content:center;margin-top:20px;}\r\n.qw-wrap .qw-btn{\r\n  flex:1 1 0;width:auto;min-width:0;height:auto;min-height:48px;margin:0;padding:10px 14px;\r\n  border:none;border-radius:8px;font-size:15px;font-weight:700;line-height:1.2;\r\n  letter-spacing:normal;text-transform:none;box-shadow:none;\r\n  display:inline-flex;align-items:center;justify-content:center;gap:8px;\r\n  white-space:normal;text-align:center;cursor:pointer;font-family:inherit;\r\n}\r\n.qw-actions--end .qw-btn,\r\n.qw-actions--center .qw-btn{flex:0 1 auto;min-width:140px;}\r\n.qw-wrap .qw-btn-primary{background:#163a5f;color:#fff;}\r\n.qw-wrap .qw-btn-primary:hover{background:#184191;color:#fff;}\r\n.qw-wrap .qw-btn-secondary{background:#fff;color:#163a5f;border:1px solid #e5e7eb;}\r\n.qw-wrap .qw-btn-secondary:hover{background:#f4f5f7;color:#163a5f;}\r\n.qw-wrap .qw-btn:disabled{opacity:.6;cursor:not-allowed;}\r\n\r\n.qw-submit-error{color:#c0392b;font-size:13px;margin-top:14px;display:none;}\r\n.qw-submit-error.show{display:block;}\r\n\r\n\/* ---- \u00c9xito \/ error ---- *\/\r\n.qw-success{text-align:center;padding:50px 20px;}\r\n.qw-success .qw-success-icon{\r\n  width:64px;height:64px;border-radius:50%;background:#e6f4ea;color:#1e7e34;\r\n  display:flex;align-items:center;justify-content:center;margin:0 auto 18px;\r\n}\r\n.qw-success h2{font-family:'mainweather',Georgia,serif;color:#163a5f;margin:0 0 8px;}\r\n.qw-success .qw-timer-note{font-size:12px;color:#9aa1ac;margin-top:18px;}\r\n.qw-wrap .qw-success .qw-new-quote-link{\r\n  background:none;border:none;color:#184191;font-weight:700;font-size:13px;cursor:pointer;\r\n  text-decoration:underline;margin-top:6px;font-family:inherit;\r\n}\r\n.qw-success p{color:#6b7280;margin:0;}\r\n.qw-success .qw-detail{font-size:12px;color:#9aa1ac;margin-top:10px;overflow-wrap:anywhere;}\r\n\r\n\/* ---- Solo ajustes cosm\u00e9ticos en pantallas peque\u00f1as ---- *\/\r\n@media (max-width:600px){\r\n  .qw-wrap{padding:0 10px 90px;}              \/* deja espacio al bot\u00f3n flotante de WhatsApp *\/\r\n  .qw-card{padding:22px 16px;}\r\n  .qw-card h2{font-size:22px;}\r\n  .qw-wrap .qw-card > p.qw-sub{font-size:14px !important;margin-bottom:20px;}\r\n  .qw-steps{margin-bottom:24px;}\r\n  .qw-step-icon{width:36px;height:36px;}\r\n  .qw-wrap .qw-step-icon svg{width:18px !important;height:18px !important;}\r\n  .qw-step-label{display:none;}\r\n  .qw-connector{margin:17px 4px 0;}\r\n  .qw-item-box{padding:16px 14px;}\r\n  .qw-item-box h4{padding-right:70px;}\r\n  .qw-file-upload{padding:18px 12px;}\r\n  .qw-success{padding:36px 8px;}\r\n}\r\n<\/style>\r\n<\/head>\r\n<body>\r\n\r\n<div class=\"qw-page\">\r\n\r\n  <!-- data-no-translation: TranslatePress no toca este bloque; el formulario se\r\n       traduce solo con el diccionario del script (seg\u00fan el idioma de la p\u00e1gina). -->\r\n  <section class=\"qw-instance\" id=\"section-business\">\r\n    <div class=\"qw-wrap\" data-no-translation>\r\n      <div class=\"qw-steps\" id=\"businessQuote-qwSteps\"><\/div>\r\n      <div class=\"qw-card\" id=\"businessQuote-qwCard\"><\/div>\r\n    <\/div>\r\n  <\/section>\r\n\r\n<\/div>\r\n\r\n<script>\r\n(function(){\r\n\r\n  const QW_VERSION = 'v7-2026-10-13-i18n';\r\n\r\n  \/\/ ------------------------------------------------------------------\r\n  \/\/ IDIOMA \/ DICCIONARIO\r\n  \/\/ El idioma se lee del atributo lang del <html> (TranslatePress lo pone\r\n  \/\/ en es-ES al navegar por \/es\/). Las claves son el texto en ingl\u00e9s; si\r\n  \/\/ una clave no existe en el diccionario, se muestra el ingl\u00e9s tal cual.\r\n  \/\/ Los {marcadores} se sustituyen por valores din\u00e1micos.\r\n  \/\/ ------------------------------------------------------------------\r\n  const LANG = (document.documentElement.lang || 'en').slice(0, 2).toLowerCase() === 'es' ? 'es' : 'en';\r\n\r\n  const ES = {\r\n    \/\/ Pasos\r\n    'Your Info': 'Sus datos',\r\n    'Coverage Level': 'Nivel de cobertura',\r\n    'Vehicle Details': 'Datos del veh\u00edculo',\r\n    'Business Details': 'Datos del negocio',\r\n    'Property Details': 'Datos de la propiedad',\r\n    'Drivers': 'Conductores',\r\n    'Review': 'Revisi\u00f3n',\r\n\r\n    \/\/ Comunes\r\n    'Continue': 'Continuar',\r\n    'Back': 'Atr\u00e1s',\r\n    'Remove': 'Eliminar',\r\n    'This field is required.': 'Este campo es obligatorio.',\r\n    'Address': 'Direcci\u00f3n',\r\n    'Street, city, state': 'Calle, ciudad, estado',\r\n\r\n    \/\/ Paso 1\r\n    'Customer Information': 'Informaci\u00f3n del cliente',\r\n    'Tell us about yourself so we can prepare your quote.': 'Cu\u00e9ntenos sobre usted para que podamos preparar su cotizaci\u00f3n.',\r\n    'First Name': 'Nombre',\r\n    'Last Name': 'Apellido',\r\n    'Email': 'Correo electr\u00f3nico',\r\n    'Mobile Phone': 'Tel\u00e9fono m\u00f3vil',\r\n    'Please enter a valid email address (e.g. name@example.com).': 'Ingrese un correo electr\u00f3nico v\u00e1lido (ej. nombre@ejemplo.com).',\r\n    'Please enter a valid phone number (numbers only).': 'Ingrese un n\u00famero de tel\u00e9fono v\u00e1lido (solo n\u00fameros).',\r\n\r\n    \/\/ Nivel de cobertura\r\n    'Select Coverage Level': 'Seleccione el nivel de cobertura',\r\n    \"Optional \u2014 pick a level if you already know what you need, or skip this and we'll help you choose.\": 'Opcional: elija un nivel si ya sabe lo que necesita, u omita este paso y le ayudaremos a elegir.',\r\n    'Basic': 'B\u00e1sica',\r\n    'PIP + Property Damage': 'PIP + Da\u00f1os a la propiedad',\r\n    'Liability': 'Responsabilidad civil',\r\n    'Bodily Injury + Property Damage': 'Lesiones corporales + Da\u00f1os a la propiedad',\r\n    'Full Coverage': 'Cobertura completa',\r\n    'Liability + Comprehensive + Collision': 'Responsabilidad civil + Comprensiva + Colisi\u00f3n',\r\n    'Others Coverage': 'Otra cobertura',\r\n    'Not sure, or need something different': 'No estoy seguro, o necesito algo diferente',\r\n\r\n    \/\/ Tipos de seguro (resumen)\r\n    'Vehicle Insurance': 'Seguro de Veh\u00edculo',\r\n    'Business Insurance': 'Seguro de Negocio',\r\n    'Property Insurance': 'Seguro de Propiedad',\r\n\r\n    \/\/ Veh\u00edculos\r\n    'Vehicle': 'Veh\u00edculo',\r\n    'VIN (optional)': 'VIN (opcional)',\r\n    'Upload Documents for this Vehicle': 'Subir documentos de este veh\u00edculo',\r\n    \"Tell us about the vehicles you'd like to insure.\": 'Cu\u00e9ntenos sobre los veh\u00edculos que desea asegurar.',\r\n    'Number of Vehicles': 'N\u00famero de veh\u00edculos',\r\n    \"You've reached the maximum of {n} vehicles. Add the rest in the notes on the review step.\": 'Ha alcanzado el m\u00e1ximo de {n} veh\u00edculos. Agregue el resto en las notas del paso de revisi\u00f3n.',\r\n    'Add up to {n} vehicles.': 'Puede agregar hasta {n} veh\u00edculos.',\r\n\r\n    \/\/ Conductores\r\n    'Driver': 'Conductor',\r\n    \"Upload Driver's License\": 'Subir licencia de conducir',\r\n    '\u2014 or enter their information manually \u2014': '\u2014 o ingrese sus datos manualmente \u2014',\r\n    'Date of Birth': 'Fecha de nacimiento',\r\n    'License Number': 'N\u00famero de licencia',\r\n    'Expiration Date': 'Fecha de vencimiento',\r\n    'Full Name': 'Nombre completo',\r\n    \"Please upload the driver's license, or fill in all five fields above.\": 'Suba la licencia de conducir o complete los cinco campos de arriba.',\r\n    \"Tell us who will be driving. Upload each driver's license \u2014 or skip that and enter their details manually.\": 'Cu\u00e9ntenos qui\u00e9n va a conducir. Suba la licencia de cada conductor, u om\u00edtala e ingrese sus datos manualmente.',\r\n    'Number of Drivers': 'N\u00famero de conductores',\r\n    \"You've reached the maximum of {n} drivers.\": 'Ha alcanzado el m\u00e1ximo de {n} conductores.',\r\n    'Add up to {n} drivers.': 'Puede agregar hasta {n} conductores.',\r\n\r\n    \/\/ Archivos\r\n    'Upload Documents': 'Subir documentos',\r\n    '(Optional \u2014 up to {n})': '(Opcional \u2014 hasta {n})',\r\n    'Remove file': 'Quitar archivo',\r\n    'Click to upload or drag files here': 'Haga clic para subir o arrastre los archivos aqu\u00ed',\r\n    'JPG, JPEG, DOC, DOCX or PDF \u2014 up to 1 more file (max {mb}MB each)': 'JPG, JPEG, DOC, DOCX o PDF \u2014 1 archivo m\u00e1s (m\u00e1x. {mb}MB cada uno)',\r\n    'JPG, JPEG, DOC, DOCX or PDF \u2014 up to {n} more files (max {mb}MB each)': 'JPG, JPEG, DOC, DOCX o PDF \u2014 hasta {n} archivos m\u00e1s (m\u00e1x. {mb}MB cada uno)',\r\n    'Maximum of {n} files reached.': 'Se alcanz\u00f3 el m\u00e1ximo de {n} archivos.',\r\n    'limit reached': 'l\u00edmite alcanzado',\r\n    'unsupported type': 'tipo no admitido',\r\n    'over {mb}MB': 'supera {mb}MB',\r\n    'total over {mb}MB': 'el total supera {mb}MB',\r\n    'Some files were not added: ': 'Algunos archivos no se agregaron: ',\r\n    'file(s)': 'archivo(s)',\r\n\r\n    \/\/ Negocio\r\n    'Tell us about your business.': 'Cu\u00e9ntenos sobre su negocio.',\r\n    'Business Name': 'Nombre del negocio',\r\n    'Business Type': 'Tipo de negocio',\r\n    'Restaurant, retail store, office...': 'Restaurante, tienda, oficina...',\r\n    'Number of Employees': 'N\u00famero de empleados',\r\n    'Please enter the business name.': 'Ingrese el nombre del negocio.',\r\n    'Please enter the business type.': 'Ingrese el tipo de negocio.',\r\n    'Please enter the address.': 'Ingrese la direcci\u00f3n.',\r\n    'Please enter the number of employees.': 'Ingrese el n\u00famero de empleados.',\r\n    'Please enter a number (digits only).': 'Ingrese un n\u00famero (solo d\u00edgitos).',\r\n\r\n    \/\/ Propiedad\r\n    \"Tell us about the property you'd like to insure.\": 'Cu\u00e9ntenos sobre la propiedad que desea asegurar.',\r\n    'Property Address': 'Direcci\u00f3n de la propiedad',\r\n    'Property Type': 'Tipo de propiedad',\r\n    'House, apartment, rental...': 'Casa, apartamento, alquiler...',\r\n    'Estimated Value': 'Valor estimado',\r\n    'Please enter the property address.': 'Ingrese la direcci\u00f3n de la propiedad.',\r\n    'Please enter the property type.': 'Ingrese el tipo de propiedad.',\r\n    'Please enter an estimated value.': 'Ingrese un valor estimado.',\r\n    'Please enter a valid dollar amount (e.g. $250,000).': 'Ingrese un monto v\u00e1lido en d\u00f3lares (ej. $250,000).',\r\n\r\n    \/\/ Revisi\u00f3n\r\n    'Review &amp; Additional Notes': 'Revisi\u00f3n y notas adicionales',\r\n    'Review your information and add any additional details.': 'Revise su informaci\u00f3n y agregue cualquier detalle adicional.',\r\n    'Your Information': 'Su informaci\u00f3n',\r\n    'NAME': 'NOMBRE',\r\n    'EMAIL': 'CORREO ELECTR\u00d3NICO',\r\n    'PHONE': 'TEL\u00c9FONO',\r\n    'COVERAGE TYPE': 'TIPO DE COBERTURA',\r\n    'COVERAGE LEVEL': 'NIVEL DE COBERTURA',\r\n    'BUSINESS': 'NEGOCIO',\r\n    'TYPE': 'TIPO',\r\n    'ADDRESS': 'DIRECCI\u00d3N',\r\n    'EMPLOYEES': 'EMPLEADOS',\r\n    'ESTIMATED VALUE': 'VALOR ESTIMADO',\r\n    'VEHICLES': 'VEH\u00cdCULOS',\r\n    'DRIVERS': 'CONDUCTORES',\r\n    'ATTACHED FILES': 'ARCHIVOS ADJUNTOS',\r\n    'License uploaded': 'Licencia subida',\r\n    'Details provided manually': 'Datos ingresados manualmente',\r\n    'Additional Notes (Optional)': 'Notas adicionales (opcional)',\r\n    'Tell us anything else we should know...': 'Cu\u00e9ntenos cualquier otra cosa que debamos saber...',\r\n    'Request my free quote': 'Solicitar mi cotizaci\u00f3n gratis',\r\n    'Sending...': 'Enviando...',\r\n\r\n    \/\/ \u00c9xito \/ error\r\n    'Request Received!': '\u00a1Solicitud recibida!',\r\n    \"Thanks, {name}! We'll be in touch soon with your quote.\": '\u00a1Gracias, {name}! Nos pondremos en contacto pronto con su cotizaci\u00f3n.',\r\n    'This form will reset automatically in a few seconds...': 'Este formulario se reiniciar\u00e1 autom\u00e1ticamente en unos segundos...',\r\n    'Start a new quote now': 'Iniciar una nueva cotizaci\u00f3n ahora',\r\n    'Something Went Wrong': 'Algo sali\u00f3 mal',\r\n    \"We couldn't send your request. Please try again, or call us directly.\": 'No pudimos enviar su solicitud. Int\u00e9ntelo de nuevo o ll\u00e1menos directamente.',\r\n    'Try again': 'Intentar de nuevo',\r\n    'Network error': 'Error de red',\r\n    'upload too large for the server': 'los archivos son demasiado grandes para el servidor'\r\n  };\r\n\r\n  function t(key, vars){\r\n    let s = (LANG === 'es' && ES[key]) ? ES[key] : key;\r\n    if(vars){\r\n      Object.keys(vars).forEach(k=>{ s = s.split('{' + k + '}').join(vars[k]); });\r\n    }\r\n    return s;\r\n  }\r\n\r\n  const ALLOWED_FILE_TYPES = ['.jpg','.jpeg','.doc','.docx','.pdf'];\r\n  const MAX_FILES = 3;               \/\/ por zona de subida\r\n  const MAX_FILE_SIZE_MB = 10;       \/\/ por archivo \u2014 mantener <= upload_max_filesize de PHP\r\n  const MAX_VEHICLES = 4;\r\n  const MAX_DRIVERS = 6;\r\n  const MAX_TOTAL_UPLOAD_MB = 20;    \/\/ toda la solicitud \u2014 mantener < post_max_size de PHP\r\n\r\n  const ICONS = {\r\n    person: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"8\" r=\"4\"\/><path d=\"M4 20c0-4 3.5-6 8-6s8 2 8 6\"\/><\/svg>',\r\n    level: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 3l9 5-9 5-9-5 9-5z\"\/><path d=\"M3 13l9 5 9-5\"\/><\/svg>',\r\n    vehicle: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 13l1.5-5A2 2 0 016.4 6.5h11.2A2 2 0 0119.5 8L21 13\"\/><rect x=\"2\" y=\"13\" width=\"20\" height=\"6\" rx=\"2\"\/><circle cx=\"7\" cy=\"19\" r=\"1.5\"\/><circle cx=\"17\" cy=\"19\" r=\"1.5\"\/><\/svg>',\r\n    business: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"4\" y=\"3\" width=\"16\" height=\"18\"\/><path d=\"M9 7h1M14 7h1M9 11h1M14 11h1M9 15h1M14 15h1\"\/><\/svg>',\r\n    property: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 11l9-7 9 7\"\/><path d=\"M5 10v10h14V10\"\/><\/svg>',\r\n    drivers: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"\/><circle cx=\"8.5\" cy=\"11.5\" r=\"2\"\/><path d=\"M5.5 16c0-1.7 1.3-3 3-3s3 1.3 3 3\"\/><path d=\"M14 9.5h5M14 13h3.5\"\/><\/svg>',\r\n    review: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M6 2h9l5 5v15H6z\"\/><path d=\"M14 2v5h5\"\/><\/svg>'\r\n  };\r\n  \/\/ Tama\u00f1o propio en el atributo: aunque el tema pise el CSS, el \u00edcono no se estira\r\n  Object.keys(ICONS).forEach(k=>{ ICONS[k] = ICONS[k].replace('<svg ', '<svg width=\"20\" height=\"20\" '); });\r\n\r\n  const COVERAGE_LEVELS = [\r\n    { key:'basic', title:'Basic', desc:'PIP + Property Damage', tier:1 },\r\n    { key:'liability', title:'Liability', desc:'Bodily Injury + Property Damage', tier:2 },\r\n    { key:'full', title:'Full Coverage', desc:'Liability + Comprehensive + Collision', tier:3 },\r\n    { key:'other', title:'Others Coverage', desc:'Not sure, or need something different', tier:null }\r\n  ];\r\n\r\n  \/\/ ---------- Helpers ----------\r\n  \/\/ Escapa texto del usuario antes de meterlo en innerHTML \/ atributos\r\n  function esc(v){\r\n    return String(v == null ? '' : v)\r\n      .replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;')\r\n      .replace(\/\"\/g,'&quot;').replace(\/'\/g,'&#39;');\r\n  }\r\n\r\n  function getFileExt(filename){\r\n    const parts = filename.split('.');\r\n    return parts.length > 1 ? '.' + parts.pop().toLowerCase() : '';\r\n  }\r\n  function stripExt(filename){\r\n    const ext = getFileExt(filename);\r\n    return ext ? filename.slice(0, -ext.length) : filename;\r\n  }\r\n  function isAllowedFile(file){ return ALLOWED_FILE_TYPES.includes(getFileExt(file.name)); }\r\n  function formatFileSize(bytes){\r\n    if(bytes < 1024) return bytes + ' B';\r\n    if(bytes < 1024*1024) return (bytes\/1024).toFixed(0) + ' KB';\r\n    return (bytes\/(1024*1024)).toFixed(1) + ' MB';\r\n  }\r\n  function fileIconSvg(filename){\r\n    const ext = getFileExt(filename);\r\n    if(ext === '.pdf' || ext === '.doc' || ext === '.docx'){\r\n      return '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M6 2h9l5 5v15H6z\"\/><path d=\"M14 2v5h5\"\/><\/svg>';\r\n    }\r\n    return '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"\/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"\/><path d=\"M21 15l-5-5L5 21\"\/><\/svg>';\r\n  }\r\n  function isValidEmail(v){ return \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(v); }\r\n  function isValidPhone(v){\r\n    if(!\/^[0-9+\\-()\\s]+$\/.test(v)) return false;\r\n    return v.replace(\/\\D\/g,'').length >= 7;\r\n  }\r\n  function isValidCurrency(v){\r\n    const cleaned = v.replace(\/[$,]\/g,'').trim();\r\n    return \/^[0-9]+(\\.[0-9]{1,2})?$\/.test(cleaned);\r\n  }\r\n  function formatCurrencyInput(v){\r\n    const cleaned = v.replace(\/[^0-9.]\/g,'');\r\n    if(!cleaned) return '';\r\n    const parts = cleaned.split('.');\r\n    const intPart = parts[0].replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, ',');\r\n    const decPart = parts.length > 1 ? '.' + parts[1].slice(0,2) : '';\r\n    return '$' + intPart + decPart;\r\n  }\r\n\r\n  function fileUploadWidgetHtml(filesArray, idSuffix, label){\r\n    const remaining = MAX_FILES - filesArray.length;\r\n    const listHtml = filesArray.map((f,i)=>`\r\n      <div class=\"qw-file-item\">\r\n        <div class=\"qw-file-item-icon\">${fileIconSvg(f.name)}<\/div>\r\n        <div class=\"qw-file-item-name\" title=\"${esc(f.name)}\">${esc(f.name)}<\/div>\r\n        <div class=\"qw-file-item-size\">${formatFileSize(f.size)}<\/div>\r\n        <button type=\"button\" class=\"qw-file-item-remove\" data-idx=\"${i}\" data-suffix=\"${idSuffix}\" aria-label=\"${t('Remove file')}\">\u00d7<\/button>\r\n      <\/div>\r\n    `).join('');\r\n\r\n    const hint = remaining === 1\r\n      ? t('JPG, JPEG, DOC, DOCX or PDF \u2014 up to 1 more file (max {mb}MB each)', { mb: MAX_FILE_SIZE_MB })\r\n      : t('JPG, JPEG, DOC, DOCX or PDF \u2014 up to {n} more files (max {mb}MB each)', { n: remaining, mb: MAX_FILE_SIZE_MB });\r\n\r\n    return `\r\n      <label class=\"qw-upload-label\">${label || t('Upload Documents')} ${t('(Optional \u2014 up to {n})', { n: MAX_FILES })}<\/label>\r\n      ${filesArray.length ? `<div class=\"qw-file-list\">${listHtml}<\/div>` : ''}\r\n      ${remaining > 0 ? `\r\n      <label class=\"qw-file-upload\" id=\"fileDropZone-${idSuffix}\">\r\n        <input type=\"file\" id=\"fileInput-${idSuffix}\" accept=\".jpg,.jpeg,.doc,.docx,.pdf\" multiple>\r\n        <div class=\"qw-file-upload-icon\">\r\n          <svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 16V4\"\/><path d=\"M7 9l5-5 5 5\"\/><path d=\"M4 16v3a2 2 0 002 2h12a2 2 0 002-2v-3\"\/><\/svg>\r\n        <\/div>\r\n        <p class=\"qw-file-upload-title\">${t('Click to upload or drag files here')}<\/p>\r\n        <p>${hint}<\/p>\r\n      <\/label>` : `<p class=\"qw-file-max-note\">${t('Maximum of {n} files reached.', { n: MAX_FILES })}<\/p>`}\r\n      <div class=\"qw-file-error\" id=\"fileError-${idSuffix}\"><\/div>\r\n    `;\r\n  }\r\n\r\n  function fieldTemplate(id,label,placeholder,value,type){\r\n    type = type || 'text';\r\n    return `<div class=\"qw-field\" id=\"field-${id}\">\r\n      <label for=\"${id}\">${label}<\/label>\r\n      <input type=\"${type}\" id=\"${id}\" placeholder=\"${placeholder}\" value=\"${esc(value)}\">\r\n      <span class=\"qw-error\">${t('This field is required.')}<\/span>\r\n    <\/div>`;\r\n  }\r\n\r\n  function isLevelVisuallySelected(level, coverageLevel){\r\n    if(!coverageLevel) return false;\r\n    if(coverageLevel === 'other') return level.key === 'other';\r\n    if(level.key === 'other') return false;\r\n    const selectedLevel = COVERAGE_LEVELS.find(l=>l.key === coverageLevel);\r\n    if(!selectedLevel || selectedLevel.tier == null) return false;\r\n    return level.tier != null && level.tier <= selectedLevel.tier;\r\n  }\r\n\r\n  function coverageLevelCardHtml(level, coverageLevel){\r\n    const selected = isLevelVisuallySelected(level, coverageLevel) ? 'selected' : '';\r\n    return `<div class=\"qw-coverage-card ${selected}\" data-key=\"${level.key}\">\r\n      <div class=\"qw-coverage-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" width=\"20\" height=\"20\"><path d=\"M12 3l8 3v6c0 5-3.5 8.5-8 11-4.5-2.5-8-6-8-11V5l8-3z\"\/><path d=\"M9 12l2 2 4-4\"\/><\/svg><\/div>\r\n      <h3>${t(level.title)}<\/h3>\r\n      <p>${t(level.desc)}<\/p>\r\n    <\/div>`;\r\n  }\r\n\r\n  function coverageLevelLabelFor(coverageLevel){\r\n    const found = COVERAGE_LEVELS.find(l=>l.key === coverageLevel);\r\n    return found ? t(found.title) : '';\r\n  }\r\n\r\n  \/\/ Fila del Review (etiqueta | valor). Si no hay valor, no se muestra.\r\n  function reviewRow(label, value){\r\n    if(!value) return '';\r\n    return `<div class=\"qw-rv-row\"><div class=\"qw-rv-label\">${label}<\/div><div class=\"qw-rv-value\">${esc(value)}<\/div><\/div>`;\r\n  }\r\n  \/\/ Bloque ancho (t\u00edtulo arriba, contenido debajo)\r\n  function reviewBlock(label, innerHtml){\r\n    return `<div class=\"qw-rv-block\"><div class=\"qw-rv-label\">${label}<\/div>${innerHtml}<\/div>`;\r\n  }\r\n\r\n  \/* =========================================================================\r\n     Widget: una instancia independiente por formulario\r\n     ========================================================================= *\/\r\n  function createInsuranceQuoteWidget(prefix, fixedCoverage){\r\n    function ID(name){ return prefix + '-' + name; }\r\n    function Q(name){ return document.getElementById(ID(name)); }\r\n\r\n    const card = Q('qwCard');\r\n    if(!card) return;\r\n\r\n    \/\/ Marcador de versi\u00f3n (para comprobar qu\u00e9 c\u00f3digo est\u00e1 cargando la p\u00e1gina)\r\n    card.setAttribute('data-qw-version', QW_VERSION);\r\n    console.log('[quote-form] ' + QW_VERSION + ' \u00b7 ' + prefix + ' \u00b7 lang=' + LANG);\r\n    if(\/[?&]qwdebug\\b\/.test(location.search)){\r\n      const badge = document.createElement('div');\r\n      badge.textContent = 'Quote form ' + QW_VERSION + ' \u00b7 ' + prefix + ' \u00b7 lang ' + LANG + ' \u00b7 viewport ' + window.innerWidth + 'px';\r\n      badge.style.cssText = 'background:#FFC000;color:#163a5f;font:700 12px\/1.4 sans-serif;padding:6px 10px;border-radius:6px;margin-bottom:10px;';\r\n      const stepsEl = Q('qwSteps');\r\n      if(stepsEl && stepsEl.parentNode) stepsEl.parentNode.insertBefore(badge, stepsEl);\r\n    }\r\n\r\n    const state = {\r\n      step: 1,\r\n      info: { firstName:'', lastName:'', email:'', phone:'' },\r\n      coverage: fixedCoverage,\r\n      coverageLevel: null,\r\n      vehicles: [ { vin:'', files:[] } ],\r\n      drivers: [ { files:[], dob:'', licenseNumber:'', expiration:'', fullName:'', address:'' } ],\r\n      business: { name:'', type:'', address:'', employees:'' },\r\n      property: { address:'', type:'', value:'' },\r\n      notes: '',\r\n      files: []\r\n    };\r\n\r\n    function detailsStepLabel(){\r\n      if(state.coverage === 'vehicle') return t('Vehicle Details');\r\n      if(state.coverage === 'business') return t('Business Details');\r\n      return t('Property Details');\r\n    }\r\n    function detailsStepIcon(){\r\n      if(state.coverage === 'vehicle') return ICONS.vehicle;\r\n      if(state.coverage === 'business') return ICONS.business;\r\n      return ICONS.property;\r\n    }\r\n\r\n    \/\/ Info -> Coverage Level -> Details -> [Drivers, solo veh\u00edculo] -> Review\r\n    function getStepDefs(){\r\n      const defs = [\r\n        { key:'info', label:t('Your Info'), icon: ICONS.person },\r\n        { key:'level', label:t('Coverage Level'), icon: ICONS.level },\r\n        { key:'details', label: detailsStepLabel(), icon: detailsStepIcon() }\r\n      ];\r\n      if(state.coverage === 'vehicle'){\r\n        defs.push({ key:'drivers', label:t('Drivers'), icon: ICONS.drivers });\r\n      }\r\n      defs.push({ key:'review', label:t('Review'), icon: ICONS.review });\r\n      return defs;\r\n    }\r\n    function reviewStepNumber(){ return getStepDefs().findIndex(d=>d.key === 'review') + 1; }\r\n\r\n    function updateStepIndicator(){\r\n      const defs = getStepDefs();\r\n      if(state.step > defs.length) state.step = defs.length;\r\n      const container = Q('qwSteps');\r\n      let html = '';\r\n      defs.forEach((d,i)=>{\r\n        const n = i + 1;\r\n        let cls = 'qw-step';\r\n        if(n < state.step) cls += ' done';\r\n        else if(n === state.step) cls += ' active';\r\n        html += `<div class=\"${cls}\" data-step=\"${n}\">\r\n          <div class=\"qw-step-icon\">${d.icon}<\/div>\r\n          <div class=\"qw-step-label\">${d.label}<\/div>\r\n        <\/div>`;\r\n        if(i < defs.length - 1){\r\n          html += `<div class=\"qw-connector${n < state.step ? ' filled' : ''}\"><\/div>`;\r\n        }\r\n      });\r\n      container.innerHTML = html;\r\n    }\r\n\r\n    \/\/ Al cambiar de paso, lleva la vista al inicio del formulario.\r\n    \/\/ SCROLL_OFFSET = alto aproximado del header fijo del sitio (+ un margen). Aj\u00fastalo si hace falta.\r\n    const SCROLL_OFFSET = 100;\r\n    let hasRendered = false;\r\n    function scrollToFormTop(){\r\n      const target = Q('qwSteps') || card;\r\n      const top = target.getBoundingClientRect().top;\r\n      if(top >= SCROLL_OFFSET) return; \/\/ el inicio del formulario ya se ve: no mover nada\r\n      const reduce = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n      window.scrollTo({ top: Math.max(0, top + window.pageYOffset - SCROLL_OFFSET), behavior: reduce ? 'auto' : 'smooth' });\r\n    }\r\n\r\n    function render(){\r\n      updateStepIndicator();\r\n      const defs = getStepDefs();\r\n      const key = defs[state.step - 1] ? defs[state.step - 1].key : defs[defs.length - 1].key;\r\n      if(key === 'info') renderInfo();\r\n      else if(key === 'level') renderCoverageLevel();\r\n      else if(key === 'details') renderDetails();\r\n      else if(key === 'drivers') renderStepDrivers();\r\n      else if(key === 'review') renderReview();\r\n      if(hasRendered) scrollToFormTop(); \/\/ no en la primera carga de la p\u00e1gina\r\n      hasRendered = true;\r\n    }\r\n\r\n    \/\/ ---------- Subida de archivos ----------\r\n    function totalUploadBytes(){\r\n      return getAllFiles().reduce((sum,item)=> sum + item.file.size, 0);\r\n    }\r\n\r\n    function attachFileUploadHandlers(filesArray, idSuffix, afterChangeCallback){\r\n      const dropZone = document.getElementById(`fileDropZone-${idSuffix}`);\r\n      const input = document.getElementById(`fileInput-${idSuffix}`);\r\n      const errorEl = document.getElementById(`fileError-${idSuffix}`);\r\n\r\n      function clearFileError(){\r\n        if(!errorEl) return;\r\n        errorEl.textContent = '';\r\n        errorEl.classList.remove('show');\r\n      }\r\n\r\n      function handleFiles(fileList){\r\n        clearFileError();\r\n        const incoming = Array.from(fileList);\r\n        const rejected = [];\r\n        for(const f of incoming){\r\n          if(filesArray.length >= MAX_FILES){ rejected.push(f.name + ' (' + t('limit reached') + ')'); continue; }\r\n          if(!isAllowedFile(f)){ rejected.push(f.name + ' (' + t('unsupported type') + ')'); continue; }\r\n          if(f.size > MAX_FILE_SIZE_MB * 1024 * 1024){ rejected.push(f.name + ' (' + t('over {mb}MB', { mb: MAX_FILE_SIZE_MB }) + ')'); continue; }\r\n          if(totalUploadBytes() + f.size > MAX_TOTAL_UPLOAD_MB * 1024 * 1024){ rejected.push(f.name + ' (' + t('total over {mb}MB', { mb: MAX_TOTAL_UPLOAD_MB }) + ')'); continue; }\r\n          filesArray.push(f);\r\n        }\r\n        afterChangeCallback();\r\n        if(rejected.length){\r\n          \/\/ Tras re-renderizar, el contenedor de error es uno nuevo: se vuelve a buscar\r\n          const el = document.getElementById(`fileError-${idSuffix}`);\r\n          if(el){ el.textContent = t('Some files were not added: ') + rejected.join(', '); el.classList.add('show'); }\r\n        }\r\n      }\r\n\r\n      if(input){\r\n        input.addEventListener('change', (e)=>{ handleFiles(e.target.files); e.target.value = ''; });\r\n      }\r\n      if(dropZone){\r\n        dropZone.addEventListener('dragover', (e)=>{ e.preventDefault(); dropZone.classList.add('dragover'); });\r\n        dropZone.addEventListener('dragleave', (e)=>{ e.preventDefault(); dropZone.classList.remove('dragover'); });\r\n        dropZone.addEventListener('drop', (e)=>{\r\n          e.preventDefault();\r\n          dropZone.classList.remove('dragover');\r\n          if(e.dataTransfer && e.dataTransfer.files) handleFiles(e.dataTransfer.files);\r\n        });\r\n      }\r\n      card.querySelectorAll(`.qw-file-item-remove[data-suffix=\"${idSuffix}\"]`).forEach(btn=>{\r\n        btn.addEventListener('click', ()=>{\r\n          const idx = parseInt(btn.dataset.idx,10);\r\n          filesArray.splice(idx,1);\r\n          afterChangeCallback();\r\n        });\r\n      });\r\n    }\r\n\r\n    \/\/ ---------- Paso 1: info ----------\r\n    function renderInfo(){\r\n      card.innerHTML = `\r\n        <h2>${t('Customer Information')}<\/h2>\r\n        <p class=\"qw-sub\">${t('Tell us about yourself so we can prepare your quote.')}<\/p>\r\n        <div class=\"qw-row\">\r\n          ${fieldTemplate(ID('firstName'), t('First Name'), 'John', state.info.firstName)}\r\n          ${fieldTemplate(ID('lastName'), t('Last Name'), 'Doe', state.info.lastName)}\r\n        <\/div>\r\n        <div class=\"qw-row\">\r\n          ${fieldTemplate(ID('email'), t('Email'), 'john@example.com', state.info.email, 'email')}\r\n          ${fieldTemplate(ID('phone'), t('Mobile Phone'), '(305) 555-0192', state.info.phone, 'tel')}\r\n        <\/div>\r\n        <div class=\"qw-actions qw-actions--end\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnNext')}\">${t('Continue')}<\/button>\r\n        <\/div>\r\n      `;\r\n      Q('btnNext').addEventListener('click', ()=>{\r\n        const f = {\r\n          firstName: Q('firstName').value.trim(),\r\n          lastName: Q('lastName').value.trim(),\r\n          email: Q('email').value.trim(),\r\n          phone: Q('phone').value.trim()\r\n        };\r\n        let valid = true;\r\n        Object.keys(f).forEach(k=>{\r\n          const box = document.getElementById('field-'+ID(k));\r\n          const errorEl = box.querySelector('.qw-error');\r\n          let errorMsg = '';\r\n          if(!f[k]){\r\n            errorMsg = t('This field is required.');\r\n          } else if(k === 'email' && !isValidEmail(f[k])){\r\n            errorMsg = t('Please enter a valid email address (e.g. name@example.com).');\r\n          } else if(k === 'phone' && !isValidPhone(f[k])){\r\n            errorMsg = t('Please enter a valid phone number (numbers only).');\r\n          }\r\n          if(errorMsg){\r\n            errorEl.textContent = errorMsg;\r\n            box.classList.add('invalid');\r\n            valid = false;\r\n          } else {\r\n            box.classList.remove('invalid');\r\n          }\r\n        });\r\n        if(!valid) return;\r\n        state.info = f;\r\n        state.step = 2;\r\n        render();\r\n      });\r\n    }\r\n\r\n    \/\/ ---------- Paso 2: nivel de cobertura (opcional) ----------\r\n    function renderCoverageLevel(){\r\n      card.innerHTML = `\r\n        <h2>${t('Select Coverage Level')}<\/h2>\r\n        <p class=\"qw-sub\">${t(\"Optional \u2014 pick a level if you already know what you need, or skip this and we'll help you choose.\")}<\/p>\r\n        <div class=\"qw-coverage-grid\" id=\"${ID('coverageLevelGrid')}\">\r\n          ${COVERAGE_LEVELS.map(l=>coverageLevelCardHtml(l, state.coverageLevel)).join('')}\r\n        <\/div>\r\n        <div class=\"qw-actions\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"${ID('btnBack')}\">${t('Back')}<\/button>\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnNext')}\">${t('Continue')}<\/button>\r\n        <\/div>\r\n      `;\r\n      Q('coverageLevelGrid').querySelectorAll('.qw-coverage-card').forEach(el=>{\r\n        el.addEventListener('click', ()=>{\r\n          state.coverageLevel = (state.coverageLevel === el.dataset.key) ? null : el.dataset.key;\r\n          renderCoverageLevel();\r\n        });\r\n      });\r\n      Q('btnBack').addEventListener('click', ()=>{ state.step = 1; render(); });\r\n      Q('btnNext').addEventListener('click', ()=>{ state.step = 3; render(); });\r\n    }\r\n\r\n    function renderDetails(){\r\n      if(state.coverage === 'vehicle') renderDetailsVehicle();\r\n      else if(state.coverage === 'business') renderDetailsBusiness();\r\n      else renderDetailsProperty();\r\n    }\r\n\r\n    \/\/ ---------- Paso 3 (veh\u00edculo) ----------\r\n    function renderDetailsVehicle(){\r\n      const atMax = state.vehicles.length >= MAX_VEHICLES;\r\n      const items = state.vehicles.map((v,i)=>`\r\n        <div class=\"qw-item-box\">\r\n          <h4>${t('Vehicle')} ${i+1}<\/h4>\r\n          ${state.vehicles.length > 1 ? `<button type=\"button\" class=\"qw-item-remove\" data-remove-veh=\"${i}\">${t('Remove')}<\/button>` : ''}\r\n          <div class=\"qw-row\">\r\n            <div class=\"qw-field\"><label>${t('VIN (optional)')}<\/label><input type=\"text\" data-idx=\"${i}\" data-key=\"vin\" class=\"veh-input\" placeholder=\"1HGBH41JXMN109186\" value=\"${esc(v.vin)}\"><\/div>\r\n          <\/div>\r\n          ${fileUploadWidgetHtml(v.files, ID('veh-'+i), t('Upload Documents for this Vehicle'))}\r\n        <\/div>\r\n      `).join('');\r\n\r\n      card.innerHTML = `\r\n        <h2>${t('Vehicle Details')}<\/h2>\r\n        <p class=\"qw-sub\">${t(\"Tell us about the vehicles you'd like to insure.\")}<\/p>\r\n        <div class=\"qw-count-control\">\r\n          <label style=\"font-weight:700;font-size:13px;\">${t('Number of Vehicles')}<\/label>\r\n          <button type=\"button\" id=\"${ID('vehMinus')}\" ${state.vehicles.length <= 1 ? 'disabled' : ''}>&minus;<\/button>\r\n          <span id=\"${ID('vehCount')}\" style=\"min-width:16px;text-align:center;font-weight:700;\">${state.vehicles.length}<\/span>\r\n          <button type=\"button\" id=\"${ID('vehPlus')}\" ${atMax ? 'disabled' : ''}>+<\/button>\r\n        <\/div>\r\n        <p class=\"qw-count-note\">${atMax ? t(\"You've reached the maximum of {n} vehicles. Add the rest in the notes on the review step.\", { n: MAX_VEHICLES }) : t('Add up to {n} vehicles.', { n: MAX_VEHICLES })}<\/p>\r\n        ${items}\r\n        <div class=\"qw-actions\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"${ID('btnBack')}\">${t('Back')}<\/button>\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnNext')}\">${t('Continue')}<\/button>\r\n        <\/div>\r\n      `;\r\n\r\n      Q('vehPlus').addEventListener('click', ()=>{\r\n        if(state.vehicles.length >= MAX_VEHICLES) return;\r\n        state.vehicles.push({vin:'',files:[]});\r\n        renderDetailsVehicle();\r\n      });\r\n      Q('vehMinus').addEventListener('click', ()=>{\r\n        if(state.vehicles.length > 1){ state.vehicles.pop(); renderDetailsVehicle(); }\r\n      });\r\n      card.querySelectorAll('[data-remove-veh]').forEach(btn=>{\r\n        btn.addEventListener('click', ()=>{\r\n          state.vehicles.splice(parseInt(btn.dataset.removeVeh,10),1);\r\n          renderDetailsVehicle();\r\n        });\r\n      });\r\n      card.querySelectorAll('.veh-input').forEach(inp=>{\r\n        inp.addEventListener('input', (e)=>{\r\n          state.vehicles[parseInt(e.target.dataset.idx,10)][e.target.dataset.key] = e.target.value;\r\n        });\r\n      });\r\n      state.vehicles.forEach((v,i)=>{\r\n        attachFileUploadHandlers(v.files, ID('veh-'+i), renderDetailsVehicle);\r\n      });\r\n      Q('btnBack').addEventListener('click', ()=>{ state.step = 2; render(); });\r\n      Q('btnNext').addEventListener('click', ()=>{ state.step = state.step + 1; render(); });\r\n    }\r\n\r\n    \/\/ ---------- Paso 4 (veh\u00edculo): conductores ----------\r\n    function driverFactory(){\r\n      return { files:[], dob:'', licenseNumber:'', expiration:'', fullName:'', address:'' };\r\n    }\r\n    function isDriverManualComplete(d){\r\n      return !!(d.dob && d.licenseNumber && d.expiration && d.fullName && d.address);\r\n    }\r\n    function isDriverSatisfied(d){\r\n      return (d.files && d.files.length > 0) || isDriverManualComplete(d);\r\n    }\r\n\r\n    function renderStepDrivers(){\r\n      const atMax = state.drivers.length >= MAX_DRIVERS;\r\n      const items = state.drivers.map((d,i)=>`\r\n        <div class=\"qw-item-box\">\r\n          <h4>${t('Driver')} ${i+1}<\/h4>\r\n          ${state.drivers.length > 1 ? `<button type=\"button\" class=\"qw-item-remove\" data-remove-drv=\"${i}\">${t('Remove')}<\/button>` : ''}\r\n          ${fileUploadWidgetHtml(d.files, ID('drv-'+i), t(\"Upload Driver's License\"))}\r\n          <p style=\"font-size:12px;color:#9aa1ac;margin:-4px 0 16px;\">${t('\u2014 or enter their information manually \u2014')}<\/p>\r\n          <div class=\"qw-row\">\r\n            <div class=\"qw-field\"><label>${t('Date of Birth')}<\/label><input type=\"date\" data-idx=\"${i}\" data-key=\"dob\" class=\"drv-input\" value=\"${esc(d.dob)}\"><\/div>\r\n            <div class=\"qw-field\"><label>${t('License Number')}<\/label><input type=\"text\" data-idx=\"${i}\" data-key=\"licenseNumber\" class=\"drv-input\" placeholder=\"D123-456-78-901\" value=\"${esc(d.licenseNumber)}\"><\/div>\r\n          <\/div>\r\n          <div class=\"qw-row\">\r\n            <div class=\"qw-field\"><label>${t('Expiration Date')}<\/label><input type=\"date\" data-idx=\"${i}\" data-key=\"expiration\" class=\"drv-input\" value=\"${esc(d.expiration)}\"><\/div>\r\n            <div class=\"qw-field\"><label>${t('Full Name')}<\/label><input type=\"text\" data-idx=\"${i}\" data-key=\"fullName\" class=\"drv-input\" placeholder=\"Jane Doe\" value=\"${esc(d.fullName)}\"><\/div>\r\n          <\/div>\r\n          <div class=\"qw-row\">\r\n            <div class=\"qw-field qw-field--full\"><label>${t('Address')}<\/label><input type=\"text\" data-idx=\"${i}\" data-key=\"address\" class=\"drv-input\" placeholder=\"${t('Street, city, state')}\" value=\"${esc(d.address)}\"><\/div>\r\n          <\/div>\r\n          <div class=\"qw-driver-error\" id=\"${ID('driverError-'+i)}\">${t(\"Please upload the driver's license, or fill in all five fields above.\")}<\/div>\r\n        <\/div>\r\n      `).join('');\r\n\r\n      card.innerHTML = `\r\n        <h2>${t('Drivers')}<\/h2>\r\n        <p class=\"qw-sub\">${t(\"Tell us who will be driving. Upload each driver's license \u2014 or skip that and enter their details manually.\")}<\/p>\r\n        <div class=\"qw-count-control\">\r\n          <label style=\"font-weight:700;font-size:13px;\">${t('Number of Drivers')}<\/label>\r\n          <button type=\"button\" id=\"${ID('drvMinus')}\" ${state.drivers.length <= 1 ? 'disabled' : ''}>&minus;<\/button>\r\n          <span id=\"${ID('drvCount')}\" style=\"min-width:16px;text-align:center;font-weight:700;\">${state.drivers.length}<\/span>\r\n          <button type=\"button\" id=\"${ID('drvPlus')}\" ${atMax ? 'disabled' : ''}>+<\/button>\r\n        <\/div>\r\n        <p class=\"qw-count-note\">${atMax ? t(\"You've reached the maximum of {n} drivers.\", { n: MAX_DRIVERS }) : t('Add up to {n} drivers.', { n: MAX_DRIVERS })}<\/p>\r\n        ${items}\r\n        <div class=\"qw-actions\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"${ID('btnBack')}\">${t('Back')}<\/button>\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnNext')}\">${t('Continue')}<\/button>\r\n        <\/div>\r\n      `;\r\n\r\n      Q('drvPlus').addEventListener('click', ()=>{\r\n        if(state.drivers.length >= MAX_DRIVERS) return;\r\n        state.drivers.push(driverFactory());\r\n        renderStepDrivers();\r\n      });\r\n      Q('drvMinus').addEventListener('click', ()=>{\r\n        if(state.drivers.length > 1){ state.drivers.pop(); renderStepDrivers(); }\r\n      });\r\n      card.querySelectorAll('[data-remove-drv]').forEach(btn=>{\r\n        btn.addEventListener('click', ()=>{\r\n          state.drivers.splice(parseInt(btn.dataset.removeDrv,10),1);\r\n          renderStepDrivers();\r\n        });\r\n      });\r\n      card.querySelectorAll('.drv-input').forEach(inp=>{\r\n        inp.addEventListener('input', (e)=>{\r\n          state.drivers[parseInt(e.target.dataset.idx,10)][e.target.dataset.key] = e.target.value;\r\n        });\r\n      });\r\n      state.drivers.forEach((d,i)=>{\r\n        attachFileUploadHandlers(d.files, ID('drv-'+i), renderStepDrivers);\r\n      });\r\n      Q('btnBack').addEventListener('click', ()=>{ state.step = state.step - 1; render(); });\r\n      Q('btnNext').addEventListener('click', ()=>{\r\n        let valid = true;\r\n        state.drivers.forEach((d,i)=>{\r\n          const errEl = document.getElementById(ID('driverError-'+i));\r\n          const satisfied = isDriverSatisfied(d);\r\n          if(errEl) errEl.style.display = satisfied ? 'none' : 'block';\r\n          if(!satisfied) valid = false;\r\n        });\r\n        if(!valid) return;\r\n        state.step = state.step + 1;\r\n        render();\r\n      });\r\n    }\r\n\r\n    \/\/ ---------- Paso 3 (negocio) ----------\r\n    function renderDetailsBusiness(){\r\n      card.innerHTML = `\r\n        <h2>${t('Business Details')}<\/h2>\r\n        <p class=\"qw-sub\">${t('Tell us about your business.')}<\/p>\r\n        <div class=\"qw-row\">\r\n          <div class=\"qw-field\" id=\"field-${ID('bizName')}\"><label>${t('Business Name')}<\/label><input type=\"text\" id=\"${ID('bizName')}\" placeholder=\"My Company LLC\" value=\"${esc(state.business.name)}\"><span class=\"qw-error\">${t('Please enter the business name.')}<\/span><\/div>\r\n          <div class=\"qw-field\" id=\"field-${ID('bizType')}\"><label>${t('Business Type')}<\/label><input type=\"text\" id=\"${ID('bizType')}\" placeholder=\"${t('Restaurant, retail store, office...')}\" value=\"${esc(state.business.type)}\"><span class=\"qw-error\">${t('Please enter the business type.')}<\/span><\/div>\r\n        <\/div>\r\n        <div class=\"qw-row\">\r\n          <div class=\"qw-field\" id=\"field-${ID('bizAddress')}\"><label>${t('Address')}<\/label><input type=\"text\" id=\"${ID('bizAddress')}\" placeholder=\"${t('Street, city, state')}\" value=\"${esc(state.business.address)}\"><span class=\"qw-error\">${t('Please enter the address.')}<\/span><\/div>\r\n          <div class=\"qw-field\" id=\"field-${ID('bizEmployees')}\"><label>${t('Number of Employees')}<\/label><input type=\"text\" id=\"${ID('bizEmployees')}\" placeholder=\"5\" value=\"${esc(state.business.employees)}\"><span class=\"qw-error\" data-default-msg=\"${t('Please enter the number of employees.')}\">${t('Please enter the number of employees.')}<\/span><\/div>\r\n        <\/div>\r\n        ${fileUploadWidgetHtml(state.files, ID('shared'))}\r\n        <div class=\"qw-actions\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"${ID('btnBack')}\">${t('Back')}<\/button>\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnNext')}\">${t('Continue')}<\/button>\r\n        <\/div>\r\n      `;\r\n      \/\/ Guardar lo escrito en vivo: as\u00ed no se pierde al subir un archivo (que re-renderiza)\r\n      Q('bizName').addEventListener('input', (e)=>{ state.business.name = e.target.value; });\r\n      Q('bizType').addEventListener('input', (e)=>{ state.business.type = e.target.value; });\r\n      Q('bizAddress').addEventListener('input', (e)=>{ state.business.address = e.target.value; });\r\n      Q('bizEmployees').addEventListener('input', (e)=>{ state.business.employees = e.target.value; });\r\n      attachFileUploadHandlers(state.files, ID('shared'), renderDetailsBusiness);\r\n      Q('btnBack').addEventListener('click', ()=>{ state.step = 2; render(); });\r\n      Q('btnNext').addEventListener('click', ()=>{\r\n        const values = {\r\n          bizName: Q('bizName').value.trim(),\r\n          bizType: Q('bizType').value.trim(),\r\n          bizAddress: Q('bizAddress').value.trim(),\r\n          bizEmployees: Q('bizEmployees').value.trim()\r\n        };\r\n        let valid = true;\r\n        Object.keys(values).forEach(key=>{\r\n          const box = document.getElementById('field-'+ID(key));\r\n          const errorEl = box.querySelector('.qw-error');\r\n          let errorMsg = '';\r\n          if(!values[key]){\r\n            errorMsg = errorEl.dataset.defaultMsg || errorEl.textContent;\r\n          } else if(key === 'bizEmployees' && !\/^[0-9]+$\/.test(values[key])){\r\n            errorMsg = t('Please enter a number (digits only).');\r\n          }\r\n          if(errorMsg){\r\n            errorEl.textContent = errorMsg;\r\n            box.classList.add('invalid');\r\n            valid = false;\r\n          } else {\r\n            box.classList.remove('invalid');\r\n          }\r\n        });\r\n        if(!valid) return;\r\n        state.business = {\r\n          name: values.bizName, type: values.bizType,\r\n          address: values.bizAddress, employees: values.bizEmployees\r\n        };\r\n        state.step = 4; render();\r\n      });\r\n    }\r\n\r\n    \/\/ ---------- Paso 3 (propiedad) ----------\r\n    function renderDetailsProperty(){\r\n      card.innerHTML = `\r\n        <h2>${t('Property Details')}<\/h2>\r\n        <p class=\"qw-sub\">${t(\"Tell us about the property you'd like to insure.\")}<\/p>\r\n        <div class=\"qw-row\">\r\n          <div class=\"qw-field\" id=\"field-${ID('propAddress')}\"><label>${t('Property Address')}<\/label><input type=\"text\" id=\"${ID('propAddress')}\" placeholder=\"${t('Street, city, state')}\" value=\"${esc(state.property.address)}\"><span class=\"qw-error\">${t('Please enter the property address.')}<\/span><\/div>\r\n          <div class=\"qw-field\" id=\"field-${ID('propType')}\"><label>${t('Property Type')}<\/label><input type=\"text\" id=\"${ID('propType')}\" placeholder=\"${t('House, apartment, rental...')}\" value=\"${esc(state.property.type)}\"><span class=\"qw-error\">${t('Please enter the property type.')}<\/span><\/div>\r\n        <\/div>\r\n        <div class=\"qw-row\">\r\n          <div class=\"qw-field\" id=\"field-${ID('propValue')}\"><label>${t('Estimated Value')}<\/label><input type=\"text\" inputmode=\"decimal\" id=\"${ID('propValue')}\" placeholder=\"$250,000\" value=\"${esc(state.property.value)}\"><span class=\"qw-error\" data-default-msg=\"${t('Please enter an estimated value.')}\">${t('Please enter an estimated value.')}<\/span><\/div>\r\n        <\/div>\r\n        ${fileUploadWidgetHtml(state.files, ID('shared'))}\r\n        <div class=\"qw-actions\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"${ID('btnBack')}\">${t('Back')}<\/button>\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnNext')}\">${t('Continue')}<\/button>\r\n        <\/div>\r\n      `;\r\n      Q('propAddress').addEventListener('input', (e)=>{ state.property.address = e.target.value; });\r\n      Q('propType').addEventListener('input', (e)=>{ state.property.type = e.target.value; });\r\n      Q('propValue').addEventListener('input', (e)=>{\r\n        const formatted = formatCurrencyInput(e.target.value);\r\n        e.target.value = formatted;\r\n        state.property.value = formatted;\r\n      });\r\n      attachFileUploadHandlers(state.files, ID('shared'), renderDetailsProperty);\r\n      Q('btnBack').addEventListener('click', ()=>{ state.step = 2; render(); });\r\n      Q('btnNext').addEventListener('click', ()=>{\r\n        const values = {\r\n          propAddress: Q('propAddress').value.trim(),\r\n          propType: Q('propType').value.trim(),\r\n          propValue: Q('propValue').value.trim()\r\n        };\r\n        let valid = true;\r\n        Object.keys(values).forEach(key=>{\r\n          const box = document.getElementById('field-'+ID(key));\r\n          const errorEl = box.querySelector('.qw-error');\r\n          let errorMsg = '';\r\n          if(!values[key]){\r\n            errorMsg = errorEl.dataset.defaultMsg || errorEl.textContent;\r\n          } else if(key === 'propValue' && !isValidCurrency(values[key])){\r\n            errorMsg = t('Please enter a valid dollar amount (e.g. $250,000).');\r\n          }\r\n          if(errorMsg){\r\n            errorEl.textContent = errorMsg;\r\n            box.classList.add('invalid');\r\n            valid = false;\r\n          } else {\r\n            box.classList.remove('invalid');\r\n          }\r\n        });\r\n        if(!valid) return;\r\n        state.property = {\r\n          address: values.propAddress, type: values.propType, value: values.propValue\r\n        };\r\n        state.step = 4; render();\r\n      });\r\n    }\r\n\r\n    function coverageLabel(){\r\n      const labels = { vehicle:'Vehicle Insurance', business:'Business Insurance', property:'Property Insurance' };\r\n      return labels[state.coverage] ? t(labels[state.coverage]) : '\u2014';\r\n    }\r\n\r\n    \/\/ Devuelve [{ file, name, vehicle, driver }]; `name` es \u00daNICO en toda la solicitud\r\n    function getAllFiles(){\r\n      const out = [];\r\n      const used = Object.create(null);\r\n\r\n      function push(file, prefixLabel, tags){\r\n        tags = tags || {};\r\n        let base = (prefixLabel ? prefixLabel + '-' : '') + stripExt(file.name).replace(\/[^\\w\\-. ]+\/g,'_');\r\n        const ext = getFileExt(file.name);\r\n        let name = base + ext;\r\n        let n = 2;\r\n        while(used[name.toLowerCase()]){ name = base + '-' + n + ext; n++; }\r\n        used[name.toLowerCase()] = true;\r\n        out.push({ file: file, name: name, vehicle: tags.vehicle || null, driver: tags.driver || null });\r\n      }\r\n\r\n      if(state.coverage === 'vehicle'){\r\n        state.vehicles.forEach((v,i)=>{\r\n          (v.files || []).forEach(f=> push(f, 'vehicle' + (i+1), { vehicle: i+1 }));\r\n        });\r\n        state.drivers.forEach((d,i)=>{\r\n          (d.files || []).forEach(f=> push(f, 'driver' + (i+1), { driver: i+1 }));\r\n        });\r\n      } else {\r\n        state.files.forEach(f=> push(f, '', {}));\r\n      }\r\n      return out;\r\n    }\r\n\r\n    \/\/ ---------- Review ----------\r\n    function detailsSummaryHtml(){\r\n      let html = '';\r\n      if(state.coverage === 'vehicle'){\r\n        const vehRows = state.vehicles.map((v,i)=>{\r\n          const parts = [];\r\n          if(v.vin) parts.push('VIN: ' + esc(v.vin));\r\n          if(v.files.length) parts.push(v.files.length + ' ' + t('file(s)'));\r\n          return `<div class=\"qw-rv-value\">${i+1}. ${t('Vehicle')}${parts.length ? ' \u2014 ' + parts.join(' \u2014 ') : ''}<\/div>`;\r\n        }).join('');\r\n        html += reviewBlock(t('VEHICLES') + ' (' + state.vehicles.length + ')', vehRows);\r\n\r\n        const drvRows = state.drivers.map((d,i)=>{\r\n          const parts = [];\r\n          if(d.fullName) parts.push(esc(d.fullName));\r\n          if(d.files && d.files.length) parts.push(t('License uploaded') + ' (' + d.files.length + ' ' + t('file(s)') + ')');\r\n          else if(isDriverManualComplete(d)) parts.push(t('Details provided manually'));\r\n          return `<div class=\"qw-rv-value\">${i+1}. ${parts.length ? parts.join(' \u2014 ') : t('Driver') + ' ' + (i+1)}<\/div>`;\r\n        }).join('');\r\n        html += reviewBlock(t('DRIVERS') + ' (' + state.drivers.length + ')', drvRows);\r\n      } else if(state.coverage === 'business'){\r\n        html += reviewRow(t('BUSINESS'), state.business.name)\r\n              + reviewRow(t('TYPE'), state.business.type)\r\n              + reviewRow(t('ADDRESS'), state.business.address)\r\n              + reviewRow(t('EMPLOYEES'), state.business.employees);\r\n      } else if(state.coverage === 'property'){\r\n        html += reviewRow(t('ADDRESS'), state.property.address)\r\n              + reviewRow(t('TYPE'), state.property.type)\r\n              + reviewRow(t('ESTIMATED VALUE'), state.property.value);\r\n      }\r\n\r\n      const allFiles = getAllFiles();\r\n      if(allFiles.length){\r\n        const totalMb = (totalUploadBytes()\/(1024*1024)).toFixed(1);\r\n        let groupsHtml = '';\r\n        if(state.coverage === 'vehicle'){\r\n          state.vehicles.forEach((v,i)=>{\r\n            const files = allFiles.filter(f=>f.vehicle === i+1);\r\n            if(files.length){\r\n              groupsHtml += `<div class=\"qw-rv-sub\"><span class=\"qw-rv-sublabel\">${t('Vehicle')} ${i+1}<\/span>${files.map(f=>esc(f.name)).join(', ')}<\/div>`;\r\n            }\r\n          });\r\n          state.drivers.forEach((d,i)=>{\r\n            const files = allFiles.filter(f=>f.driver === i+1);\r\n            if(files.length){\r\n              groupsHtml += `<div class=\"qw-rv-sub\"><span class=\"qw-rv-sublabel\">${t('Driver')} ${i+1}<\/span>${files.map(f=>esc(f.name)).join(', ')}<\/div>`;\r\n            }\r\n          });\r\n        } else {\r\n          groupsHtml = `<div class=\"qw-rv-value\">${allFiles.map(f=>esc(f.name)).join(', ')}<\/div>`;\r\n        }\r\n        html += reviewBlock(t('ATTACHED FILES') + ' (' + allFiles.length + ' \u2014 ' + totalMb + ' MB)', groupsHtml);\r\n      }\r\n      return html;\r\n    }\r\n\r\n    function renderReview(){\r\n      card.innerHTML = `\r\n        <h2>${t('Review &amp; Additional Notes')}<\/h2>\r\n        <p class=\"qw-sub\">${t('Review your information and add any additional details.')}<\/p>\r\n        <div class=\"qw-review-box\">\r\n          <h4>${t('Your Information')}<\/h4>\r\n          <div class=\"qw-review-list\">\r\n            ${reviewRow(t('NAME'), `${state.info.firstName} ${state.info.lastName}`.trim())}\r\n            ${reviewRow(t('EMAIL'), state.info.email)}\r\n            ${reviewRow(t('PHONE'), state.info.phone)}\r\n            ${reviewRow(t('COVERAGE TYPE'), coverageLabel())}\r\n            ${reviewRow(t('COVERAGE LEVEL'), coverageLevelLabelFor(state.coverageLevel))}\r\n            ${detailsSummaryHtml()}\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"qw-field\" style=\"margin-bottom:10px;\">\r\n          <label for=\"${ID('notes')}\">${t('Additional Notes (Optional)')}<\/label>\r\n          <textarea id=\"${ID('notes')}\" rows=\"4\" placeholder=\"${t('Tell us anything else we should know...')}\">${esc(state.notes)}<\/textarea>\r\n        <\/div>\r\n        <div class=\"qw-actions\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"${ID('btnBack')}\">${t('Back')}<\/button>\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnSubmit')}\">${t('Request my free quote')}<\/button>\r\n        <\/div>\r\n        <div class=\"qw-submit-error\" id=\"${ID('submitError')}\"><\/div>\r\n      `;\r\n      Q('btnBack').addEventListener('click', ()=>{ state.step = state.step - 1; render(); });\r\n      Q('btnSubmit').addEventListener('click', ()=>{\r\n        state.notes = Q('notes').value;\r\n        submitQuote();\r\n      });\r\n    }\r\n\r\n    async function submitQuote(){\r\n      const attachments = getAllFiles();\r\n\r\n      const payload = {\r\n        language: LANG, \/\/ 'en' o 'es': idioma en el que el cliente llen\u00f3 el formulario\r\n        info: state.info,\r\n        coverage: state.coverage,\r\n        coverageLevel: state.coverageLevel,\r\n        vehicles: state.coverage === 'vehicle'\r\n          ? state.vehicles.map((v,i)=>({\r\n              index: i+1,\r\n              vin: v.vin,\r\n              files: attachments.filter(a=>a.vehicle === i+1).map(a=>a.name)\r\n            }))\r\n          : undefined,\r\n        drivers: state.coverage === 'vehicle'\r\n          ? state.drivers.map((d,i)=>({\r\n              index: i+1,\r\n              dob: d.dob,\r\n              licenseNumber: d.licenseNumber,\r\n              expiration: d.expiration,\r\n              fullName: d.fullName,\r\n              address: d.address,\r\n              files: attachments.filter(a=>a.driver === i+1).map(a=>a.name)\r\n            }))\r\n          : undefined,\r\n        business: state.coverage === 'business' ? state.business : undefined,\r\n        property: state.coverage === 'property' ? state.property : undefined,\r\n        notes: state.notes,\r\n        attachments: attachments.map(a=>({ name:a.name, size:a.file.size, vehicle:a.vehicle, driver:a.driver })),\r\n        attachmentCount: attachments.length\r\n      };\r\n\r\n      const submitBtn = Q('btnSubmit');\r\n      const backBtn = Q('btnBack');\r\n      const errorEl = Q('submitError');\r\n      if(errorEl){ errorEl.classList.remove('show'); errorEl.textContent = ''; }\r\n      if(submitBtn){ submitBtn.disabled = true; submitBtn.textContent = t('Sending...'); }\r\n      if(backBtn){ backBtn.disabled = true; }\r\n\r\n      try {\r\n        \/\/ Mismo endpoint REST de WordPress para los 3 formularios; `coverage` indica el tipo\r\n        const formData = new FormData();\r\n        formData.append('data', JSON.stringify(payload));\r\n        attachments.forEach((item, i)=>{\r\n          formData.append('files[]', item.file, item.name);\r\n          formData.append('file_' + i, item.file, item.name);\r\n        });\r\n        formData.append('file_count', String(attachments.length));\r\n\r\n        const response = await fetch('\/wp-json\/quote-form\/v1\/submit', {\r\n          method: 'POST',\r\n          body: formData\r\n        });\r\n\r\n        let result = {};\r\n        try { result = await response.json(); } catch(e) { \/* ignorar errores de parseo *\/ }\r\n\r\n        if(response.ok && result.success){\r\n          showSuccess();\r\n        } else {\r\n          const detail = result.message || ('HTTP ' + response.status + (response.status === 413 ? ' \u2014 ' + t('upload too large for the server') : ''));\r\n          console.error('Quote form submission failed:', detail, result);\r\n          showError(detail);\r\n        }\r\n      } catch(err){\r\n        console.error('Quote form submission error:', err);\r\n        showError(err && err.message ? err.message : t('Network error'));\r\n      }\r\n    }\r\n\r\n    function resetState(){\r\n      state.step = 1;\r\n      state.info = { firstName:'', lastName:'', email:'', phone:'' };\r\n      state.coverageLevel = null;\r\n      state.vehicles = [ { vin:'', files:[] } ];\r\n      state.drivers = [ driverFactory() ];\r\n      state.business = { name:'', type:'', address:'', employees:'' };\r\n      state.property = { address:'', type:'', value:'' };\r\n      state.notes = '';\r\n      state.files = [];\r\n      \/\/ state.coverage no se toca: es fijo para este formulario\r\n    }\r\n\r\n    const AUTO_RESET_DELAY = 5000;\r\n    const FADE_DURATION = 400;\r\n    let autoResetTimer = null;\r\n\r\n    function scheduleAutoReset(){\r\n      clearTimeout(autoResetTimer);\r\n      autoResetTimer = setTimeout(()=>{\r\n        card.classList.add('qw-fade-out');\r\n        setTimeout(()=>{\r\n          card.classList.remove('qw-fade-out');\r\n          resetState();\r\n          render();\r\n        }, FADE_DURATION);\r\n      }, AUTO_RESET_DELAY);\r\n    }\r\n\r\n    function showSuccess(){\r\n      card.innerHTML = `\r\n        <div class=\"qw-success\">\r\n          <div class=\"qw-success-icon\">\r\n            <svg viewBox=\"0 0 24 24\" width=\"30\" height=\"30\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M20 6L9 17l-5-5\"\/><\/svg>\r\n          <\/div>\r\n          <h2>${t('Request Received!')}<\/h2>\r\n          <p>${t(\"Thanks, {name}! We'll be in touch soon with your quote.\", { name: esc(state.info.firstName) })}<\/p>\r\n          <p class=\"qw-timer-note\">${t('This form will reset automatically in a few seconds...')}<\/p>\r\n          <button type=\"button\" class=\"qw-new-quote-link\" id=\"${ID('btnNewQuote')}\">${t('Start a new quote now')}<\/button>\r\n        <\/div>\r\n      `;\r\n      Q('btnNewQuote').addEventListener('click', ()=>{\r\n        clearTimeout(autoResetTimer);\r\n        resetState();\r\n        render();\r\n      });\r\n      scheduleAutoReset();\r\n    }\r\n\r\n    function showError(detail){\r\n      card.innerHTML = `\r\n        <div class=\"qw-success\">\r\n          <div class=\"qw-success-icon\" style=\"background:#fdecea;color:#c0392b;\">\r\n            <svg viewBox=\"0 0 24 24\" width=\"30\" height=\"30\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M12 8v5\"\/><path d=\"M12 16.5h.01\"\/><circle cx=\"12\" cy=\"12\" r=\"9\"\/><\/svg>\r\n          <\/div>\r\n          <h2>${t('Something Went Wrong')}<\/h2>\r\n          <p>${t(\"We couldn't send your request. Please try again, or call us directly.\")}<\/p>\r\n          ${detail ? `<p class=\"qw-detail\">${esc(detail)}<\/p>` : ''}\r\n          <div class=\"qw-actions qw-actions--center\">\r\n            <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnRetry')}\">${t('Try again')}<\/button>\r\n          <\/div>\r\n        <\/div>\r\n      `;\r\n      Q('btnRetry').addEventListener('click', ()=>{ state.step = reviewStepNumber(); render(); });\r\n    }\r\n\r\n    render();\r\n  } \/\/ fin de createInsuranceQuoteWidget\r\n\r\n  function bootAllWidgets(){\r\n    createInsuranceQuoteWidget('businessQuote', 'business');\r\n  }\r\n\r\n  if(document.readyState === 'loading'){\r\n    document.addEventListener('DOMContentLoaded', bootAllWidgets);\r\n  } else {\r\n    bootAllWidgets();\r\n  }\r\n\r\n})();\r\n<\/script>\r\n\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f974750 e-con-full e-flex e-con e-child\" data-id=\"f974750\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;,&quot;_ha_eqh_enable&quot;:false,&quot;sticky_logo_enable&quot;:&quot;no&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2fe69a6 sticky-icon-prefixstyle elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"2fe69a6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" id=\"Capa_1\" data-name=\"Capa 1\" viewBox=\"0 0 503 368\"><defs><style>      .cls-1 {        fill: #163a5f;      }      .cls-1, .cls-2 {        opacity: .9;      }      .cls-3 {        fill: #fff;      }      .cls-2 {        fill: #184191;      }    <\/style><\/defs><circle class=\"cls-2\" cx=\"251.5\" cy=\"184.73\" r=\"182.5\"><\/circle><circle class=\"cls-1\" cx=\"251.5\" cy=\"184.73\" r=\"159\"><\/circle><g><path class=\"cls-3\" d=\"M267.35,245.26h-118.67s-.12-11.18-.12-11.18l6.27.02v-112.29s71.58,0,71.58,0v110.28s6.38.13,6.38.13V101.59s83.44-.03,83.44-.03v69.98s-6.95.02-6.95.02v-54.27s-69.54,0-69.54,0v114.97s25.77,0,25.77,0c.25,4.36.76,8.13,1.84,13ZM220.83,135.32h-60.12v98.76h60.12v-98.76Z\"><\/path><path class=\"cls-3\" d=\"M312.72,277.89c-7.07-3.36-13.92-5.9-20.79-9.79-12.11-6.85-20.46-19.79-20.51-33.8l-.1-30.71c-.03-7.92,4.85-15.56,12.1-18.77,4.73-2.09,9.51-3.21,14.37-4.88,8.67-2.98,17.75-3.77,26.57-1.04l14.6,4.52c8.93,2.76,15.5,10.61,15.48,20.25l-.06,30.07c-.03,14.48-8.55,27.68-21.04,34.71-6.79,3.82-13.5,6.39-20.62,9.44ZM312.91,270.86l14.99-6.76c11.75-5.3,20.01-17.22,20.02-30.39l.03-30.52c0-6.97-5.36-11.94-11.55-13.86l-12.97-4.02c-6.45-2-13.11-2.46-19.65-.41l-15.79,4.94c-6.22,1.95-10.32,7.79-10.3,14.35l.08,28.95c.04,14.31,9.1,26.09,21.8,31.76l13.35,5.96Z\"><\/path><path class=\"cls-3\" d=\"M315.99,97.65h-82.97c.45-4.32,3.81-7.52,8.22-7.53h66.49c4.45,0,7.82,3.21,8.26,7.53Z\"><\/path><path class=\"cls-3\" d=\"M226.22,118.59h-71.34c.56-3.93,3.4-6.54,7.22-6.54l57.62.02c3.65,0,6.3,3.36,6.5,6.52Z\"><\/path><rect class=\"cls-3\" x=\"246.38\" y=\"125.32\" width=\"14.45\" height=\"20.45\"><\/rect><rect class=\"cls-3\" x=\"267.26\" y=\"125.32\" width=\"14.52\" height=\"20.43\" transform=\"translate(-.21 .42)\"><\/rect><rect class=\"cls-3\" x=\"285.18\" y=\"128.36\" width=\"20.45\" height=\"14.38\" transform=\"translate(159.79 430.93) rotate(-89.99)\"><\/rect><rect class=\"cls-3\" x=\"246.36\" y=\"151.07\" width=\"14.48\" height=\"20.38\" transform=\"translate(-.21 .33)\"><\/rect><rect class=\"cls-3\" x=\"267.25\" y=\"151.07\" width=\"14.55\" height=\"20.36\"><\/rect><rect class=\"cls-3\" x=\"285.19\" y=\"154.05\" width=\"20.4\" height=\"14.45\" transform=\"translate(133.79 456.48) rotate(-89.94)\"><\/rect><rect class=\"cls-3\" x=\"243.37\" y=\"205.43\" width=\"20.47\" height=\"14.49\" transform=\"translate(40.85 466.22) rotate(-89.98)\"><\/rect><polygon class=\"cls-3\" points=\"260.77 197.15 246.42 197.22 246.41 176.89 260.83 176.87 260.77 197.15\"><\/polygon><path class=\"cls-3\" d=\"M281.67,179.4c-6.92,2.98-11.33,8.08-14.23,14.69l-.19-17.2h14.46s-.05,2.51-.05,2.51Z\"><\/path><rect class=\"cls-3\" x=\"184.36\" y=\"142.28\" width=\"12.51\" height=\"17.61\"><\/rect><rect class=\"cls-3\" x=\"184.36\" y=\"208.46\" width=\"12.49\" height=\"17.59\"><\/rect><rect class=\"cls-3\" x=\"163.88\" y=\"144.87\" width=\"17.63\" height=\"12.43\" transform=\"translate(21.46 323.65) rotate(-89.95)\"><\/rect><rect class=\"cls-3\" x=\"202.37\" y=\"142.27\" width=\"12.4\" height=\"17.63\"><\/rect><rect class=\"cls-3\" x=\"163.91\" y=\"211.03\" width=\"17.59\" height=\"12.43\" transform=\"translate(-44.65 389.81) rotate(-89.96)\"><\/rect><rect class=\"cls-3\" x=\"202.35\" y=\"208.45\" width=\"12.41\" height=\"17.6\" transform=\"translate(-.33 .32)\"><\/rect><rect class=\"cls-3\" x=\"202.32\" y=\"164.41\" width=\"12.44\" height=\"17.53\"><\/rect><polygon class=\"cls-3\" points=\"178.81 181.85 166.5 181.92 166.49 164.45 178.86 164.42 178.81 181.85\"><\/polygon><polygon class=\"cls-3\" points=\"196.63 174.96 196.74 181.91 184.4 181.86 184.41 164.42 196.83 164.43 196.63 174.96\"><\/polygon><polygon class=\"cls-3\" points=\"178.88 203.85 166.51 203.98 166.48 186.52 178.87 186.51 178.88 203.85\"><\/polygon><rect class=\"cls-3\" x=\"202.32\" y=\"186.47\" width=\"12.51\" height=\"17.5\" transform=\"translate(-.66 .7)\"><\/rect><polygon class=\"cls-3\" points=\"196.81 203.88 184.4 203.9 184.44 186.48 196.75 186.49 196.81 203.88\"><\/polygon><path class=\"cls-3\" d=\"M313.01,265.24l-12.14-5.48c-10.97-4.95-18.01-15.57-18-27.75l.03-28.21c0-4.7,3.41-8.09,7.56-9.35l15.4-4.69c6.24-1.9,12.78-.56,18.8,1.35l10.84,3.43c4.27,1.35,7.39,4.95,7.39,9.67l-.02,27.87c0,12.04-6.98,22.65-17.78,27.61l-12.08,5.55ZM302,242.27c1.93,1.93,4.88,2.26,6.97.16l23.95-24.01c2.12-2.13,1.99-5.13.09-6.91-2.25-2.1-4.93-1.62-7.03.48l-20.41,20.44-7.44-7.01c-1.83-1.72-5.1-.03-6.03,1.46-1.4,2.24-.95,4.54.87,6.36l9.02,9.02Z\"><\/path><\/g><\/svg>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-05841c4 sticky-heading-prefixstyle elementor-widget elementor-widget-heading\" data-id=\"05841c4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Business Insurance<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bc43ccc elementor-widget elementor-widget-text-editor\" data-id=\"bc43ccc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Protect your business from unexpected risks with customized insurance solutions designed to safeguard your operations, employees, assets, and future growth. We help Florida businesses stay protected with reliable and affordable coverage options.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-35ed6ef e-flex e-con-boxed e-con e-child\" data-id=\"35ed6ef\" data-element_type=\"container\" data-e-type=\"container\" id=\"property\" data-settings=\"{&quot;sticky_logo_enable&quot;:&quot;no&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-0cf1968 e-con-full e-flex e-con e-child\" data-id=\"0cf1968\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;,&quot;_ha_eqh_enable&quot;:false,&quot;sticky_logo_enable&quot;:&quot;no&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1e8bc55 sticky-icon-prefixstyle elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"1e8bc55\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" id=\"Capa_1\" data-name=\"Capa 1\" viewBox=\"0 0 503 368\"><defs><style>      .cls-1 {        fill: #163a5f;      }      .cls-1, .cls-2 {        opacity: .9;      }      .cls-3 {        fill: #fff;      }      .cls-2 {        fill: #184191;      }    <\/style><\/defs><circle class=\"cls-2\" cx=\"251\" cy=\"183.5\" r=\"182.5\"><\/circle><circle class=\"cls-1\" cx=\"251\" cy=\"183.5\" r=\"159\"><\/circle><g><path class=\"cls-3\" d=\"M341.8,144c5.52,4.4,6.24,11.27,1.82,16.52-4.36,5.18-10.85,5.55-16.13,1.32l-75.98-60.81-75.99,60.82c-5.68,4.55-12.88,3.73-17.02-2.55-2.8-4.21-2.98-10.62,1.55-14.25l84.49-67.62c3.7-2.96,9.36-3.53,13.09-.57l27.97,22.26.3-6.19c.33-6.85,6.27-10.41,12.38-10.33l15.4.2c4.73.06,9.87,4.98,9.89,9.95l.11,36.82,18.12,14.43ZM254.88,93.98l78.46,62.79c1.84.38,3.47-.07,4.46-1.04.8-.79,1.42-3.83.51-4.71l-83.76-67.03c-2.1-1.68-3.98-1.69-6.09,0l-83.42,66.75c-1.29,1.03-.75,4.03.15,4.94,1.06,1.07,2.6,1.46,4.48,1.09l78.68-62.98c2.34-1.88,3.94-1.88,6.52.19ZM316.06,123.39l.15-29.28c-.15-2.13-1.83-3.86-3.96-3.93l-15.29-.02c-1.86.2-3.32,1.64-3.72,3.48l-.03,11.61,22.84,18.13Z\"><\/path><path class=\"cls-3\" d=\"M337.41,265l-133.26-.1c-6.13,0-9.45-6.55-9.41-11.45s3.78-11.17,9.83-11.17h132.11c5.81,0,9.28,5.97,9.54,10.51.32,5.67-2.69,10.4-8.82,12.21Z\"><\/path><path class=\"cls-3\" d=\"M314.17,234.65l-124.49-.07c-6.43,0-10.36-6.21-10.36-11.73v-46.89c.01-4.17,1.42-7.55,4.18-10.8l65.07-52.07c1.95-1.56,3.94-1.55,5.89,0l65.07,52.07c2.75,3.29,4.15,6.59,4.15,10.82v46.78c0,5.9-3.24,10.2-9.51,11.9ZM312.38,227.01c2.76-.47,3.78-2.1,3.78-4.22v-47.46c-.38-2.18-1.32-4.16-3.14-5.61l-61.51-49.23-61.5,49.23c-1.82,1.46-2.79,3.42-3.15,5.6v47.47c.01,2.21,1.52,4.21,4.06,4.21h121.47Z\"><\/path><path class=\"cls-3\" d=\"M177.75,264.71c-4.11.53-8.67.53-12.44-.03-5.26-.78-8.15-5.53-8.5-10.15s2.07-10.28,7.29-11.6c4.75-1.2,10.44-1.21,15.19-.04,5.09,1.26,7.52,6.53,7.38,11.12-.14,4.83-3.2,9.94-8.92,10.69Z\"><\/path><path class=\"cls-3\" d=\"M251.71,217.16c-15.78-5.16-25.83-19.13-27.2-35.29l-.06-19.59c10.01-2.7,18.68-6.99,27.06-12.91,8.37,5.93,17.04,10.22,27.06,12.89l-.07,19.56c-1.34,16.04-11.02,29.65-26.79,35.34Z\"><\/path><\/g><\/svg>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3fb75c7 sticky-heading-prefixstyle elementor-widget elementor-widget-heading\" data-id=\"3fb75c7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Property Insurance<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6b64c9a elementor-widget elementor-widget-text-editor\" data-id=\"6b64c9a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Protect your home, rental property, or commercial building with dependable coverage against fire, storms, theft, and other unforeseen events. Our property insurance solutions provide financial protection and peace of mind when it matters most.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-d6f59c7 e-con-full ha-lg-yes e-flex ha-lg-abyss-glass ha-lg-soft-glow e-con e-child\" data-id=\"d6f59c7\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false,&quot;sticky_logo_enable&quot;:&quot;no&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ae8b51f elementor-widget elementor-widget-html\" data-id=\"ae8b51f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n<title>Property Insurance Quote Form<\/title>\r\n<style>\r\n\/* =====================================================================\r\n   Quote form v7-2026-10-13 (biling\u00fce EN\/ES) \u2014 CSS limpio y consolidado\r\n   Lo cr\u00edtico (review, botones, campos) NO depende de media queries.\r\n   ===================================================================== *\/\r\n\r\n.qw-wrap, .qw-wrap *, .qw-wrap *::before, .qw-wrap *::after{box-sizing:border-box;}\r\n\r\n.qw-page{display:flex;flex-direction:column;gap:56px;}\r\n\r\n.qw-wrap{\r\n  font-family:'Inter',-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;\r\n  width:100%;\r\n  max-width:820px;\r\n  margin:0 auto;\r\n  padding:0 16px 20px;\r\n  color:#163a5f;\r\n}\r\n\r\n\/* ---- SVG blindados: el tema no puede estirarlos ---- *\/\r\n.qw-wrap svg{max-width:none !important;flex:none;display:block;}\r\n.qw-wrap .qw-step-icon svg,\r\n.qw-wrap .qw-coverage-icon svg{width:20px !important;height:20px !important;}\r\n.qw-wrap .qw-file-upload-icon svg{width:24px !important;height:24px !important;margin:0 auto;}\r\n.qw-wrap .qw-file-item-icon svg{width:16px !important;height:16px !important;}\r\n.qw-wrap .qw-success-icon svg{width:30px !important;height:30px !important;}\r\n\r\n\/* ---- Indicador de pasos ---- *\/\r\n.qw-steps{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:36px;padding:4px 4px 0;overflow:visible;}\r\n.qw-step{display:flex;flex-direction:column;align-items:center;flex:0 0 auto;position:relative;z-index:2;}\r\n.qw-step-icon{\r\n  width:44px;height:44px;border-radius:50%;\r\n  display:flex;align-items:center;justify-content:center;\r\n  background:#e9ebee;color:#9aa1ac;transition:background .25s,color .25s;flex-shrink:0;\r\n}\r\n.qw-step-label{margin-top:8px;font-size:13px;font-weight:600;color:#9aa1ac;white-space:nowrap;}\r\n.qw-step.done .qw-step-icon{background:#184191;color:#fff;}\r\n.qw-step.done .qw-step-label{color:#184191;}\r\n.qw-step.active .qw-step-icon{background:#FFC000;color:#163a5f;box-shadow:0 0 0 4px rgba(224,183,90,.35);}\r\n.qw-step.active .qw-step-label{color:#184191;}\r\n.qw-connector{flex:1 1 auto;min-width:8px;height:2px;background:#e5e7eb;margin:22px 6px 0;position:relative;}\r\n.qw-connector.filled{background:#184191;}\r\n\r\n\/* ---- Tarjeta ---- *\/\r\n.qw-card{\r\n  background:#fff;border:1px solid #e5e7eb;border-radius:14px;padding:36px;\r\n  box-shadow:0 1px 3px rgba(0,0,0,.04);transition:opacity .4s ease;opacity:1;\r\n  overflow:hidden;max-width:100%;\r\n}\r\n.qw-card.qw-fade-out{opacity:0;}\r\n.qw-card h2{font-family:'mainweather',Georgia,\"Times New Roman\",serif;font-size:26px;margin:0 0 6px;color:#163a5f;line-height:1.2;}\r\n.qw-wrap .qw-card > p.qw-sub{margin:0 0 26px;color:#6b7280 !important;font-size:15px !important;font-weight:400 !important;line-height:1.5 !important;}\r\n\r\n\/* ---- Campos: se apilan solos con flex-wrap (sin media query) ---- *\/\r\n.qw-row{display:flex;gap:20px;margin-bottom:18px;flex-wrap:wrap;}\r\n.qw-field{flex:1 1 220px;min-width:0;display:flex;flex-direction:column;gap:6px;}\r\n.qw-field--full{flex:1 1 100%;}\r\n.qw-field label{font-size:13px;font-weight:700;color:#163a5f;}\r\n.qw-field input,.qw-field textarea{\r\n  border:1px solid #e5e7eb;border-radius:8px;padding:11px 13px;font-size:14px;\r\n  font-family:inherit;color:#163a5f;width:100%;min-width:0;max-width:100%;background:#fff;\r\n}\r\n.qw-field input[type=date]{-webkit-appearance:none;appearance:none;min-height:44px;}\r\n.qw-field input:focus,.qw-field textarea:focus{outline:none;border-color:#184191;box-shadow:0 0 0 3px rgba(24,65,145,.15);}\r\n.qw-field .qw-error{display:none;color:#c0392b;font-size:12px;}\r\n.qw-field.invalid input{border-color:#c0392b;}\r\n.qw-field.invalid .qw-error{display:block;}\r\n.qw-driver-error{display:none;color:#c0392b;font-size:12px;margin-top:-4px;}\r\n\/* iOS: 16px evita el zoom autom\u00e1tico al enfocar (sin media query) *\/\r\n@supports (-webkit-touch-callout:none){\r\n  .qw-field input,.qw-field textarea{font-size:16px;}\r\n}\r\n\r\n\/* ---- Textarea (Additional Notes) ---- *\/\r\n.qw-field textarea{\r\n  display:block !important;height:auto !important;min-height:120px !important;\r\n  resize:vertical;line-height:1.4;\r\n}\r\n.qw-field textarea::placeholder{white-space:normal;line-height:1.35;opacity:.7;}\r\n\r\n\/* ---- Coverage cards ---- *\/\r\n.qw-coverage-grid{display:flex;gap:18px;margin-bottom:28px;flex-wrap:wrap;}\r\n.qw-coverage-card{\r\n  flex:1 1 180px;min-width:0;border:1px solid #e5e7eb;border-radius:12px;padding:22px 18px;\r\n  cursor:pointer;transition:border-color .15s,background .15s;\r\n}\r\n.qw-coverage-card:hover{border-color:#c7cedb;}\r\n.qw-coverage-card.selected{border-color:#184191;background:#f7f8fb;}\r\n.qw-coverage-icon{\r\n  width:44px;height:44px;border-radius:10px;display:flex;align-items:center;justify-content:center;\r\n  background:#f4f5f7;color:#163a5f;margin-bottom:14px;\r\n}\r\n.qw-coverage-card.selected .qw-coverage-icon{background:#184191;color:#FFC000;}\r\n.qw-coverage-card h3{font-family:'mainweather',Georgia,\"Times New Roman\",serif;font-size:18px;margin:0 0 6px;color:#163a5f;}\r\n.qw-coverage-card p{margin:0;font-size:13px;color:#6b7280;line-height:1.4;}\r\n\r\n\/* ---- Veh\u00edculos \/ conductores ---- *\/\r\n.qw-count-control{display:flex;align-items:center;gap:14px;margin-bottom:10px;flex-wrap:wrap;}\r\n.qw-wrap .qw-count-control button{\r\n  width:38px;height:38px;min-width:38px;padding:0;border-radius:8px;border:1px solid #e5e7eb;\r\n  background:#fff;font-size:18px;cursor:pointer;line-height:1;color:#163a5f;\r\n}\r\n.qw-wrap .qw-count-control button:hover:not(:disabled){background:#f4f5f7;}\r\n.qw-wrap .qw-count-control button:disabled{opacity:.45;cursor:not-allowed;}\r\n.qw-count-note{font-size:12px;color:#9aa1ac;margin:0 0 20px;}\r\n.qw-item-box{border:1px solid #e5e7eb;border-radius:10px;padding:20px;margin-bottom:16px;background:#f4f5f7;position:relative;}\r\n.qw-item-box h4{margin:0 0 14px;font-size:14px;color:#163a5f;}\r\n.qw-wrap .qw-item-remove{\r\n  position:absolute;top:14px;right:14px;background:none;border:none;color:#c0392b;font-size:12px;\r\n  font-weight:700;cursor:pointer;font-family:inherit;text-decoration:underline;padding:0;\r\n}\r\n\r\n\/* ---- Subida de archivos ---- *\/\r\n.qw-file-upload{\r\n  display:block;border:2px dashed #d7dbe2;border-radius:10px;padding:22px 16px;text-align:center;\r\n  cursor:pointer;transition:border-color .15s,background .15s;margin-bottom:12px;\r\n}\r\n.qw-file-upload:hover,.qw-file-upload.dragover{border-color:#184191;background:#f7f8fb;}\r\n.qw-file-upload input[type=file]{display:none;}\r\n.qw-file-upload-icon{color:#9aa1ac;margin-bottom:6px;}\r\n.qw-file-upload p{margin:2px 0;font-size:12.5px;color:#6b7280;}\r\n.qw-file-upload .qw-file-upload-title{font-weight:700;color:#163a5f;font-size:14px;margin-bottom:2px;}\r\n.qw-file-list{display:flex;flex-direction:column;gap:8px;margin-bottom:12px;}\r\n.qw-file-item{display:flex;align-items:center;gap:10px;min-width:0;border:1px solid #e5e7eb;border-radius:8px;padding:9px 12px;background:#fff;}\r\n.qw-file-item-icon{width:30px;height:30px;border-radius:6px;background:#f4f5f7;color:#163a5f;display:flex;align-items:center;justify-content:center;flex-shrink:0;}\r\n.qw-file-item-name{flex:1;min-width:0;font-size:13px;color:#163a5f;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}\r\n.qw-file-item-size{font-size:11px;color:#9aa1ac;flex-shrink:0;}\r\n.qw-wrap .qw-file-item-remove{background:none;border:none;color:#c0392b;cursor:pointer;font-size:22px;line-height:1;padding:0 6px;flex-shrink:0;}\r\n.qw-file-error{color:#c0392b;font-size:12px;margin:-4px 0 14px;display:none;}\r\n.qw-file-error.show{display:block;}\r\n.qw-file-max-note{font-size:12px;color:#9aa1ac;margin:-2px 0 14px;}\r\n.qw-upload-label{font-size:13px;font-weight:700;color:#163a5f;display:block;margin-bottom:8px;}\r\n\r\n\/* ---- Review: UNA columna, cada dato es una fila (etiqueta | valor) ---- *\/\r\n.qw-review-box{background:#f4f5f7;border-radius:10px;padding:16px 18px;margin-bottom:24px;width:100%;max-width:100%;overflow:hidden;}\r\n.qw-review-box h4{margin:0 0 6px;font-family:'mainweather',Georgia,serif;font-size:16px;color:#163a5f;}\r\n.qw-review-box,\r\n.qw-review-box *{white-space:normal !important;overflow-wrap:anywhere !important;word-break:break-word;}\r\n.qw-rv-row{display:flex;flex-direction:row;align-items:flex-start;gap:12px;padding:10px 0;border-bottom:1px solid #e5e7eb;}\r\n.qw-rv-row .qw-rv-label{flex:0 0 38%;max-width:38%;min-width:0;}\r\n.qw-rv-row .qw-rv-value{flex:1 1 0;min-width:0;}\r\n.qw-rv-block{display:block;padding:10px 0;border-bottom:1px solid #e5e7eb;}\r\n.qw-rv-block .qw-rv-value{margin:4px 0 0;}\r\n.qw-rv-row:last-child,.qw-rv-block:last-child{border-bottom:0;}\r\n.qw-rv-label{font-size:11px;font-weight:600;letter-spacing:.03em;text-transform:uppercase;color:#6b7280;line-height:1.4;margin:0;}\r\n.qw-rv-value{font-size:14px;font-weight:600;color:#163a5f;line-height:1.4;margin:0;}\r\n.qw-rv-sub{margin-top:6px;font-size:14px;font-weight:600;color:#163a5f;line-height:1.4;}\r\n.qw-rv-sublabel{display:block;font-size:11px;font-weight:600;letter-spacing:.03em;color:#6b7280;text-transform:uppercase;margin-bottom:2px;}\r\n\r\n\/* ---- Botones: SIEMPRE en fila, misma altura y mismo ancho ---- *\/\r\n.qw-actions{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:stretch;gap:12px;margin-top:28px;width:100%;}\r\n.qw-actions--end{justify-content:flex-end;}\r\n.qw-actions--center{justify-content:center;margin-top:20px;}\r\n.qw-wrap .qw-btn{\r\n  flex:1 1 0;width:auto;min-width:0;height:auto;min-height:48px;margin:0;padding:10px 14px;\r\n  border:none;border-radius:8px;font-size:15px;font-weight:700;line-height:1.2;\r\n  letter-spacing:normal;text-transform:none;box-shadow:none;\r\n  display:inline-flex;align-items:center;justify-content:center;gap:8px;\r\n  white-space:normal;text-align:center;cursor:pointer;font-family:inherit;\r\n}\r\n.qw-actions--end .qw-btn,\r\n.qw-actions--center .qw-btn{flex:0 1 auto;min-width:140px;}\r\n.qw-wrap .qw-btn-primary{background:#163a5f;color:#fff;}\r\n.qw-wrap .qw-btn-primary:hover{background:#184191;color:#fff;}\r\n.qw-wrap .qw-btn-secondary{background:#fff;color:#163a5f;border:1px solid #e5e7eb;}\r\n.qw-wrap .qw-btn-secondary:hover{background:#f4f5f7;color:#163a5f;}\r\n.qw-wrap .qw-btn:disabled{opacity:.6;cursor:not-allowed;}\r\n\r\n.qw-submit-error{color:#c0392b;font-size:13px;margin-top:14px;display:none;}\r\n.qw-submit-error.show{display:block;}\r\n\r\n\/* ---- \u00c9xito \/ error ---- *\/\r\n.qw-success{text-align:center;padding:50px 20px;}\r\n.qw-success .qw-success-icon{\r\n  width:64px;height:64px;border-radius:50%;background:#e6f4ea;color:#1e7e34;\r\n  display:flex;align-items:center;justify-content:center;margin:0 auto 18px;\r\n}\r\n.qw-success h2{font-family:'mainweather',Georgia,serif;color:#163a5f;margin:0 0 8px;}\r\n.qw-success .qw-timer-note{font-size:12px;color:#9aa1ac;margin-top:18px;}\r\n.qw-wrap .qw-success .qw-new-quote-link{\r\n  background:none;border:none;color:#184191;font-weight:700;font-size:13px;cursor:pointer;\r\n  text-decoration:underline;margin-top:6px;font-family:inherit;\r\n}\r\n.qw-success p{color:#6b7280;margin:0;}\r\n.qw-success .qw-detail{font-size:12px;color:#9aa1ac;margin-top:10px;overflow-wrap:anywhere;}\r\n\r\n\/* ---- Solo ajustes cosm\u00e9ticos en pantallas peque\u00f1as ---- *\/\r\n@media (max-width:600px){\r\n  .qw-wrap{padding:0 10px 90px;}              \/* deja espacio al bot\u00f3n flotante de WhatsApp *\/\r\n  .qw-card{padding:22px 16px;}\r\n  .qw-card h2{font-size:22px;}\r\n  .qw-wrap .qw-card > p.qw-sub{font-size:14px !important;margin-bottom:20px;}\r\n  .qw-steps{margin-bottom:24px;}\r\n  .qw-step-icon{width:36px;height:36px;}\r\n  .qw-wrap .qw-step-icon svg{width:18px !important;height:18px !important;}\r\n  .qw-step-label{display:none;}\r\n  .qw-connector{margin:17px 4px 0;}\r\n  .qw-item-box{padding:16px 14px;}\r\n  .qw-item-box h4{padding-right:70px;}\r\n  .qw-file-upload{padding:18px 12px;}\r\n  .qw-success{padding:36px 8px;}\r\n}\r\n<\/style>\r\n<\/head>\r\n<body>\r\n\r\n<div class=\"qw-page\">\r\n\r\n  <!-- data-no-translation: TranslatePress no toca este bloque; el formulario se\r\n       traduce solo con el diccionario del script (seg\u00fan el idioma de la p\u00e1gina). -->\r\n  <section class=\"qw-instance\" id=\"section-property\">\r\n    <div class=\"qw-wrap\" data-no-translation>\r\n      <div class=\"qw-steps\" id=\"propertyQuote-qwSteps\"><\/div>\r\n      <div class=\"qw-card\" id=\"propertyQuote-qwCard\"><\/div>\r\n    <\/div>\r\n  <\/section>\r\n\r\n<\/div>\r\n\r\n<script>\r\n(function(){\r\n\r\n  const QW_VERSION = 'v7-2026-10-13-i18n';\r\n\r\n  \/\/ ------------------------------------------------------------------\r\n  \/\/ IDIOMA \/ DICCIONARIO\r\n  \/\/ El idioma se lee del atributo lang del <html> (TranslatePress lo pone\r\n  \/\/ en es-ES al navegar por \/es\/). Las claves son el texto en ingl\u00e9s; si\r\n  \/\/ una clave no existe en el diccionario, se muestra el ingl\u00e9s tal cual.\r\n  \/\/ Los {marcadores} se sustituyen por valores din\u00e1micos.\r\n  \/\/ ------------------------------------------------------------------\r\n  const LANG = (document.documentElement.lang || 'en').slice(0, 2).toLowerCase() === 'es' ? 'es' : 'en';\r\n\r\n  const ES = {\r\n    \/\/ Pasos\r\n    'Your Info': 'Sus datos',\r\n    'Coverage Level': 'Nivel de cobertura',\r\n    'Vehicle Details': 'Datos del veh\u00edculo',\r\n    'Business Details': 'Datos del negocio',\r\n    'Property Details': 'Datos de la propiedad',\r\n    'Drivers': 'Conductores',\r\n    'Review': 'Revisi\u00f3n',\r\n\r\n    \/\/ Comunes\r\n    'Continue': 'Continuar',\r\n    'Back': 'Atr\u00e1s',\r\n    'Remove': 'Eliminar',\r\n    'This field is required.': 'Este campo es obligatorio.',\r\n    'Address': 'Direcci\u00f3n',\r\n    'Street, city, state': 'Calle, ciudad, estado',\r\n\r\n    \/\/ Paso 1\r\n    'Customer Information': 'Informaci\u00f3n del cliente',\r\n    'Tell us about yourself so we can prepare your quote.': 'Cu\u00e9ntenos sobre usted para que podamos preparar su cotizaci\u00f3n.',\r\n    'First Name': 'Nombre',\r\n    'Last Name': 'Apellido',\r\n    'Email': 'Correo electr\u00f3nico',\r\n    'Mobile Phone': 'Tel\u00e9fono m\u00f3vil',\r\n    'Please enter a valid email address (e.g. name@example.com).': 'Ingrese un correo electr\u00f3nico v\u00e1lido (ej. nombre@ejemplo.com).',\r\n    'Please enter a valid phone number (numbers only).': 'Ingrese un n\u00famero de tel\u00e9fono v\u00e1lido (solo n\u00fameros).',\r\n\r\n    \/\/ Nivel de cobertura\r\n    'Select Coverage Level': 'Seleccione el nivel de cobertura',\r\n    \"Optional \u2014 pick a level if you already know what you need, or skip this and we'll help you choose.\": 'Opcional: elija un nivel si ya sabe lo que necesita, u omita este paso y le ayudaremos a elegir.',\r\n    'Basic': 'B\u00e1sica',\r\n    'PIP + Property Damage': 'PIP + Da\u00f1os a la propiedad',\r\n    'Liability': 'Responsabilidad civil',\r\n    'Bodily Injury + Property Damage': 'Lesiones corporales + Da\u00f1os a la propiedad',\r\n    'Full Coverage': 'Cobertura completa',\r\n    'Liability + Comprehensive + Collision': 'Responsabilidad civil + Comprensiva + Colisi\u00f3n',\r\n    'Others Coverage': 'Otra cobertura',\r\n    'Not sure, or need something different': 'No estoy seguro, o necesito algo diferente',\r\n\r\n    \/\/ Tipos de seguro (resumen)\r\n    'Vehicle Insurance': 'Seguro de Veh\u00edculo',\r\n    'Business Insurance': 'Seguro de Negocio',\r\n    'Property Insurance': 'Seguro de Propiedad',\r\n\r\n    \/\/ Veh\u00edculos\r\n    'Vehicle': 'Veh\u00edculo',\r\n    'VIN (optional)': 'VIN (opcional)',\r\n    'Upload Documents for this Vehicle': 'Subir documentos de este veh\u00edculo',\r\n    \"Tell us about the vehicles you'd like to insure.\": 'Cu\u00e9ntenos sobre los veh\u00edculos que desea asegurar.',\r\n    'Number of Vehicles': 'N\u00famero de veh\u00edculos',\r\n    \"You've reached the maximum of {n} vehicles. Add the rest in the notes on the review step.\": 'Ha alcanzado el m\u00e1ximo de {n} veh\u00edculos. Agregue el resto en las notas del paso de revisi\u00f3n.',\r\n    'Add up to {n} vehicles.': 'Puede agregar hasta {n} veh\u00edculos.',\r\n\r\n    \/\/ Conductores\r\n    'Driver': 'Conductor',\r\n    \"Upload Driver's License\": 'Subir licencia de conducir',\r\n    '\u2014 or enter their information manually \u2014': '\u2014 o ingrese sus datos manualmente \u2014',\r\n    'Date of Birth': 'Fecha de nacimiento',\r\n    'License Number': 'N\u00famero de licencia',\r\n    'Expiration Date': 'Fecha de vencimiento',\r\n    'Full Name': 'Nombre completo',\r\n    \"Please upload the driver's license, or fill in all five fields above.\": 'Suba la licencia de conducir o complete los cinco campos de arriba.',\r\n    \"Tell us who will be driving. Upload each driver's license \u2014 or skip that and enter their details manually.\": 'Cu\u00e9ntenos qui\u00e9n va a conducir. Suba la licencia de cada conductor, u om\u00edtala e ingrese sus datos manualmente.',\r\n    'Number of Drivers': 'N\u00famero de conductores',\r\n    \"You've reached the maximum of {n} drivers.\": 'Ha alcanzado el m\u00e1ximo de {n} conductores.',\r\n    'Add up to {n} drivers.': 'Puede agregar hasta {n} conductores.',\r\n\r\n    \/\/ Archivos\r\n    'Upload Documents': 'Subir documentos',\r\n    '(Optional \u2014 up to {n})': '(Opcional \u2014 hasta {n})',\r\n    'Remove file': 'Quitar archivo',\r\n    'Click to upload or drag files here': 'Haga clic para subir o arrastre los archivos aqu\u00ed',\r\n    'JPG, JPEG, DOC, DOCX or PDF \u2014 up to 1 more file (max {mb}MB each)': 'JPG, JPEG, DOC, DOCX o PDF \u2014 1 archivo m\u00e1s (m\u00e1x. {mb}MB cada uno)',\r\n    'JPG, JPEG, DOC, DOCX or PDF \u2014 up to {n} more files (max {mb}MB each)': 'JPG, JPEG, DOC, DOCX o PDF \u2014 hasta {n} archivos m\u00e1s (m\u00e1x. {mb}MB cada uno)',\r\n    'Maximum of {n} files reached.': 'Se alcanz\u00f3 el m\u00e1ximo de {n} archivos.',\r\n    'limit reached': 'l\u00edmite alcanzado',\r\n    'unsupported type': 'tipo no admitido',\r\n    'over {mb}MB': 'supera {mb}MB',\r\n    'total over {mb}MB': 'el total supera {mb}MB',\r\n    'Some files were not added: ': 'Algunos archivos no se agregaron: ',\r\n    'file(s)': 'archivo(s)',\r\n\r\n    \/\/ Negocio\r\n    'Tell us about your business.': 'Cu\u00e9ntenos sobre su negocio.',\r\n    'Business Name': 'Nombre del negocio',\r\n    'Business Type': 'Tipo de negocio',\r\n    'Restaurant, retail store, office...': 'Restaurante, tienda, oficina...',\r\n    'Number of Employees': 'N\u00famero de empleados',\r\n    'Please enter the business name.': 'Ingrese el nombre del negocio.',\r\n    'Please enter the business type.': 'Ingrese el tipo de negocio.',\r\n    'Please enter the address.': 'Ingrese la direcci\u00f3n.',\r\n    'Please enter the number of employees.': 'Ingrese el n\u00famero de empleados.',\r\n    'Please enter a number (digits only).': 'Ingrese un n\u00famero (solo d\u00edgitos).',\r\n\r\n    \/\/ Propiedad\r\n    \"Tell us about the property you'd like to insure.\": 'Cu\u00e9ntenos sobre la propiedad que desea asegurar.',\r\n    'Property Address': 'Direcci\u00f3n de la propiedad',\r\n    'Property Type': 'Tipo de propiedad',\r\n    'House, apartment, rental...': 'Casa, apartamento, alquiler...',\r\n    'Estimated Value': 'Valor estimado',\r\n    'Please enter the property address.': 'Ingrese la direcci\u00f3n de la propiedad.',\r\n    'Please enter the property type.': 'Ingrese el tipo de propiedad.',\r\n    'Please enter an estimated value.': 'Ingrese un valor estimado.',\r\n    'Please enter a valid dollar amount (e.g. $250,000).': 'Ingrese un monto v\u00e1lido en d\u00f3lares (ej. $250,000).',\r\n\r\n    \/\/ Revisi\u00f3n\r\n    'Review &amp; Additional Notes': 'Revisi\u00f3n y notas adicionales',\r\n    'Review your information and add any additional details.': 'Revise su informaci\u00f3n y agregue cualquier detalle adicional.',\r\n    'Your Information': 'Su informaci\u00f3n',\r\n    'NAME': 'NOMBRE',\r\n    'EMAIL': 'CORREO ELECTR\u00d3NICO',\r\n    'PHONE': 'TEL\u00c9FONO',\r\n    'COVERAGE TYPE': 'TIPO DE COBERTURA',\r\n    'COVERAGE LEVEL': 'NIVEL DE COBERTURA',\r\n    'BUSINESS': 'NEGOCIO',\r\n    'TYPE': 'TIPO',\r\n    'ADDRESS': 'DIRECCI\u00d3N',\r\n    'EMPLOYEES': 'EMPLEADOS',\r\n    'ESTIMATED VALUE': 'VALOR ESTIMADO',\r\n    'VEHICLES': 'VEH\u00cdCULOS',\r\n    'DRIVERS': 'CONDUCTORES',\r\n    'ATTACHED FILES': 'ARCHIVOS ADJUNTOS',\r\n    'License uploaded': 'Licencia subida',\r\n    'Details provided manually': 'Datos ingresados manualmente',\r\n    'Additional Notes (Optional)': 'Notas adicionales (opcional)',\r\n    'Tell us anything else we should know...': 'Cu\u00e9ntenos cualquier otra cosa que debamos saber...',\r\n    'Request my free quote': 'Solicitar mi cotizaci\u00f3n gratis',\r\n    'Sending...': 'Enviando...',\r\n\r\n    \/\/ \u00c9xito \/ error\r\n    'Request Received!': '\u00a1Solicitud recibida!',\r\n    \"Thanks, {name}! We'll be in touch soon with your quote.\": '\u00a1Gracias, {name}! Nos pondremos en contacto pronto con su cotizaci\u00f3n.',\r\n    'This form will reset automatically in a few seconds...': 'Este formulario se reiniciar\u00e1 autom\u00e1ticamente en unos segundos...',\r\n    'Start a new quote now': 'Iniciar una nueva cotizaci\u00f3n ahora',\r\n    'Something Went Wrong': 'Algo sali\u00f3 mal',\r\n    \"We couldn't send your request. Please try again, or call us directly.\": 'No pudimos enviar su solicitud. Int\u00e9ntelo de nuevo o ll\u00e1menos directamente.',\r\n    'Try again': 'Intentar de nuevo',\r\n    'Network error': 'Error de red',\r\n    'upload too large for the server': 'los archivos son demasiado grandes para el servidor'\r\n  };\r\n\r\n  function t(key, vars){\r\n    let s = (LANG === 'es' && ES[key]) ? ES[key] : key;\r\n    if(vars){\r\n      Object.keys(vars).forEach(k=>{ s = s.split('{' + k + '}').join(vars[k]); });\r\n    }\r\n    return s;\r\n  }\r\n\r\n  const ALLOWED_FILE_TYPES = ['.jpg','.jpeg','.doc','.docx','.pdf'];\r\n  const MAX_FILES = 3;               \/\/ por zona de subida\r\n  const MAX_FILE_SIZE_MB = 10;       \/\/ por archivo \u2014 mantener <= upload_max_filesize de PHP\r\n  const MAX_VEHICLES = 4;\r\n  const MAX_DRIVERS = 6;\r\n  const MAX_TOTAL_UPLOAD_MB = 20;    \/\/ toda la solicitud \u2014 mantener < post_max_size de PHP\r\n\r\n  const ICONS = {\r\n    person: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"8\" r=\"4\"\/><path d=\"M4 20c0-4 3.5-6 8-6s8 2 8 6\"\/><\/svg>',\r\n    level: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 3l9 5-9 5-9-5 9-5z\"\/><path d=\"M3 13l9 5 9-5\"\/><\/svg>',\r\n    vehicle: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 13l1.5-5A2 2 0 016.4 6.5h11.2A2 2 0 0119.5 8L21 13\"\/><rect x=\"2\" y=\"13\" width=\"20\" height=\"6\" rx=\"2\"\/><circle cx=\"7\" cy=\"19\" r=\"1.5\"\/><circle cx=\"17\" cy=\"19\" r=\"1.5\"\/><\/svg>',\r\n    business: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"4\" y=\"3\" width=\"16\" height=\"18\"\/><path d=\"M9 7h1M14 7h1M9 11h1M14 11h1M9 15h1M14 15h1\"\/><\/svg>',\r\n    property: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 11l9-7 9 7\"\/><path d=\"M5 10v10h14V10\"\/><\/svg>',\r\n    drivers: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"\/><circle cx=\"8.5\" cy=\"11.5\" r=\"2\"\/><path d=\"M5.5 16c0-1.7 1.3-3 3-3s3 1.3 3 3\"\/><path d=\"M14 9.5h5M14 13h3.5\"\/><\/svg>',\r\n    review: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M6 2h9l5 5v15H6z\"\/><path d=\"M14 2v5h5\"\/><\/svg>'\r\n  };\r\n  \/\/ Tama\u00f1o propio en el atributo: aunque el tema pise el CSS, el \u00edcono no se estira\r\n  Object.keys(ICONS).forEach(k=>{ ICONS[k] = ICONS[k].replace('<svg ', '<svg width=\"20\" height=\"20\" '); });\r\n\r\n  const COVERAGE_LEVELS = [\r\n    { key:'basic', title:'Basic', desc:'PIP + Property Damage', tier:1 },\r\n    { key:'liability', title:'Liability', desc:'Bodily Injury + Property Damage', tier:2 },\r\n    { key:'full', title:'Full Coverage', desc:'Liability + Comprehensive + Collision', tier:3 },\r\n    { key:'other', title:'Others Coverage', desc:'Not sure, or need something different', tier:null }\r\n  ];\r\n\r\n  \/\/ ---------- Helpers ----------\r\n  \/\/ Escapa texto del usuario antes de meterlo en innerHTML \/ atributos\r\n  function esc(v){\r\n    return String(v == null ? '' : v)\r\n      .replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;')\r\n      .replace(\/\"\/g,'&quot;').replace(\/'\/g,'&#39;');\r\n  }\r\n\r\n  function getFileExt(filename){\r\n    const parts = filename.split('.');\r\n    return parts.length > 1 ? '.' + parts.pop().toLowerCase() : '';\r\n  }\r\n  function stripExt(filename){\r\n    const ext = getFileExt(filename);\r\n    return ext ? filename.slice(0, -ext.length) : filename;\r\n  }\r\n  function isAllowedFile(file){ return ALLOWED_FILE_TYPES.includes(getFileExt(file.name)); }\r\n  function formatFileSize(bytes){\r\n    if(bytes < 1024) return bytes + ' B';\r\n    if(bytes < 1024*1024) return (bytes\/1024).toFixed(0) + ' KB';\r\n    return (bytes\/(1024*1024)).toFixed(1) + ' MB';\r\n  }\r\n  function fileIconSvg(filename){\r\n    const ext = getFileExt(filename);\r\n    if(ext === '.pdf' || ext === '.doc' || ext === '.docx'){\r\n      return '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M6 2h9l5 5v15H6z\"\/><path d=\"M14 2v5h5\"\/><\/svg>';\r\n    }\r\n    return '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"\/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"\/><path d=\"M21 15l-5-5L5 21\"\/><\/svg>';\r\n  }\r\n  function isValidEmail(v){ return \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(v); }\r\n  function isValidPhone(v){\r\n    if(!\/^[0-9+\\-()\\s]+$\/.test(v)) return false;\r\n    return v.replace(\/\\D\/g,'').length >= 7;\r\n  }\r\n  function isValidCurrency(v){\r\n    const cleaned = v.replace(\/[$,]\/g,'').trim();\r\n    return \/^[0-9]+(\\.[0-9]{1,2})?$\/.test(cleaned);\r\n  }\r\n  function formatCurrencyInput(v){\r\n    const cleaned = v.replace(\/[^0-9.]\/g,'');\r\n    if(!cleaned) return '';\r\n    const parts = cleaned.split('.');\r\n    const intPart = parts[0].replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, ',');\r\n    const decPart = parts.length > 1 ? '.' + parts[1].slice(0,2) : '';\r\n    return '$' + intPart + decPart;\r\n  }\r\n\r\n  function fileUploadWidgetHtml(filesArray, idSuffix, label){\r\n    const remaining = MAX_FILES - filesArray.length;\r\n    const listHtml = filesArray.map((f,i)=>`\r\n      <div class=\"qw-file-item\">\r\n        <div class=\"qw-file-item-icon\">${fileIconSvg(f.name)}<\/div>\r\n        <div class=\"qw-file-item-name\" title=\"${esc(f.name)}\">${esc(f.name)}<\/div>\r\n        <div class=\"qw-file-item-size\">${formatFileSize(f.size)}<\/div>\r\n        <button type=\"button\" class=\"qw-file-item-remove\" data-idx=\"${i}\" data-suffix=\"${idSuffix}\" aria-label=\"${t('Remove file')}\">\u00d7<\/button>\r\n      <\/div>\r\n    `).join('');\r\n\r\n    const hint = remaining === 1\r\n      ? t('JPG, JPEG, DOC, DOCX or PDF \u2014 up to 1 more file (max {mb}MB each)', { mb: MAX_FILE_SIZE_MB })\r\n      : t('JPG, JPEG, DOC, DOCX or PDF \u2014 up to {n} more files (max {mb}MB each)', { n: remaining, mb: MAX_FILE_SIZE_MB });\r\n\r\n    return `\r\n      <label class=\"qw-upload-label\">${label || t('Upload Documents')} ${t('(Optional \u2014 up to {n})', { n: MAX_FILES })}<\/label>\r\n      ${filesArray.length ? `<div class=\"qw-file-list\">${listHtml}<\/div>` : ''}\r\n      ${remaining > 0 ? `\r\n      <label class=\"qw-file-upload\" id=\"fileDropZone-${idSuffix}\">\r\n        <input type=\"file\" id=\"fileInput-${idSuffix}\" accept=\".jpg,.jpeg,.doc,.docx,.pdf\" multiple>\r\n        <div class=\"qw-file-upload-icon\">\r\n          <svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 16V4\"\/><path d=\"M7 9l5-5 5 5\"\/><path d=\"M4 16v3a2 2 0 002 2h12a2 2 0 002-2v-3\"\/><\/svg>\r\n        <\/div>\r\n        <p class=\"qw-file-upload-title\">${t('Click to upload or drag files here')}<\/p>\r\n        <p>${hint}<\/p>\r\n      <\/label>` : `<p class=\"qw-file-max-note\">${t('Maximum of {n} files reached.', { n: MAX_FILES })}<\/p>`}\r\n      <div class=\"qw-file-error\" id=\"fileError-${idSuffix}\"><\/div>\r\n    `;\r\n  }\r\n\r\n  function fieldTemplate(id,label,placeholder,value,type){\r\n    type = type || 'text';\r\n    return `<div class=\"qw-field\" id=\"field-${id}\">\r\n      <label for=\"${id}\">${label}<\/label>\r\n      <input type=\"${type}\" id=\"${id}\" placeholder=\"${placeholder}\" value=\"${esc(value)}\">\r\n      <span class=\"qw-error\">${t('This field is required.')}<\/span>\r\n    <\/div>`;\r\n  }\r\n\r\n  function isLevelVisuallySelected(level, coverageLevel){\r\n    if(!coverageLevel) return false;\r\n    if(coverageLevel === 'other') return level.key === 'other';\r\n    if(level.key === 'other') return false;\r\n    const selectedLevel = COVERAGE_LEVELS.find(l=>l.key === coverageLevel);\r\n    if(!selectedLevel || selectedLevel.tier == null) return false;\r\n    return level.tier != null && level.tier <= selectedLevel.tier;\r\n  }\r\n\r\n  function coverageLevelCardHtml(level, coverageLevel){\r\n    const selected = isLevelVisuallySelected(level, coverageLevel) ? 'selected' : '';\r\n    return `<div class=\"qw-coverage-card ${selected}\" data-key=\"${level.key}\">\r\n      <div class=\"qw-coverage-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" width=\"20\" height=\"20\"><path d=\"M12 3l8 3v6c0 5-3.5 8.5-8 11-4.5-2.5-8-6-8-11V5l8-3z\"\/><path d=\"M9 12l2 2 4-4\"\/><\/svg><\/div>\r\n      <h3>${t(level.title)}<\/h3>\r\n      <p>${t(level.desc)}<\/p>\r\n    <\/div>`;\r\n  }\r\n\r\n  function coverageLevelLabelFor(coverageLevel){\r\n    const found = COVERAGE_LEVELS.find(l=>l.key === coverageLevel);\r\n    return found ? t(found.title) : '';\r\n  }\r\n\r\n  \/\/ Fila del Review (etiqueta | valor). Si no hay valor, no se muestra.\r\n  function reviewRow(label, value){\r\n    if(!value) return '';\r\n    return `<div class=\"qw-rv-row\"><div class=\"qw-rv-label\">${label}<\/div><div class=\"qw-rv-value\">${esc(value)}<\/div><\/div>`;\r\n  }\r\n  \/\/ Bloque ancho (t\u00edtulo arriba, contenido debajo)\r\n  function reviewBlock(label, innerHtml){\r\n    return `<div class=\"qw-rv-block\"><div class=\"qw-rv-label\">${label}<\/div>${innerHtml}<\/div>`;\r\n  }\r\n\r\n  \/* =========================================================================\r\n     Widget: una instancia independiente por formulario\r\n     ========================================================================= *\/\r\n  function createInsuranceQuoteWidget(prefix, fixedCoverage){\r\n    function ID(name){ return prefix + '-' + name; }\r\n    function Q(name){ return document.getElementById(ID(name)); }\r\n\r\n    const card = Q('qwCard');\r\n    if(!card) return;\r\n\r\n    \/\/ Marcador de versi\u00f3n (para comprobar qu\u00e9 c\u00f3digo est\u00e1 cargando la p\u00e1gina)\r\n    card.setAttribute('data-qw-version', QW_VERSION);\r\n    console.log('[quote-form] ' + QW_VERSION + ' \u00b7 ' + prefix + ' \u00b7 lang=' + LANG);\r\n    if(\/[?&]qwdebug\\b\/.test(location.search)){\r\n      const badge = document.createElement('div');\r\n      badge.textContent = 'Quote form ' + QW_VERSION + ' \u00b7 ' + prefix + ' \u00b7 lang ' + LANG + ' \u00b7 viewport ' + window.innerWidth + 'px';\r\n      badge.style.cssText = 'background:#FFC000;color:#163a5f;font:700 12px\/1.4 sans-serif;padding:6px 10px;border-radius:6px;margin-bottom:10px;';\r\n      const stepsEl = Q('qwSteps');\r\n      if(stepsEl && stepsEl.parentNode) stepsEl.parentNode.insertBefore(badge, stepsEl);\r\n    }\r\n\r\n    const state = {\r\n      step: 1,\r\n      info: { firstName:'', lastName:'', email:'', phone:'' },\r\n      coverage: fixedCoverage,\r\n      coverageLevel: null,\r\n      vehicles: [ { vin:'', files:[] } ],\r\n      drivers: [ { files:[], dob:'', licenseNumber:'', expiration:'', fullName:'', address:'' } ],\r\n      business: { name:'', type:'', address:'', employees:'' },\r\n      property: { address:'', type:'', value:'' },\r\n      notes: '',\r\n      files: []\r\n    };\r\n\r\n    function detailsStepLabel(){\r\n      if(state.coverage === 'vehicle') return t('Vehicle Details');\r\n      if(state.coverage === 'business') return t('Business Details');\r\n      return t('Property Details');\r\n    }\r\n    function detailsStepIcon(){\r\n      if(state.coverage === 'vehicle') return ICONS.vehicle;\r\n      if(state.coverage === 'business') return ICONS.business;\r\n      return ICONS.property;\r\n    }\r\n\r\n    \/\/ Info -> Coverage Level -> Details -> [Drivers, solo veh\u00edculo] -> Review\r\n    function getStepDefs(){\r\n      const defs = [\r\n        { key:'info', label:t('Your Info'), icon: ICONS.person },\r\n        { key:'level', label:t('Coverage Level'), icon: ICONS.level },\r\n        { key:'details', label: detailsStepLabel(), icon: detailsStepIcon() }\r\n      ];\r\n      if(state.coverage === 'vehicle'){\r\n        defs.push({ key:'drivers', label:t('Drivers'), icon: ICONS.drivers });\r\n      }\r\n      defs.push({ key:'review', label:t('Review'), icon: ICONS.review });\r\n      return defs;\r\n    }\r\n    function reviewStepNumber(){ return getStepDefs().findIndex(d=>d.key === 'review') + 1; }\r\n\r\n    function updateStepIndicator(){\r\n      const defs = getStepDefs();\r\n      if(state.step > defs.length) state.step = defs.length;\r\n      const container = Q('qwSteps');\r\n      let html = '';\r\n      defs.forEach((d,i)=>{\r\n        const n = i + 1;\r\n        let cls = 'qw-step';\r\n        if(n < state.step) cls += ' done';\r\n        else if(n === state.step) cls += ' active';\r\n        html += `<div class=\"${cls}\" data-step=\"${n}\">\r\n          <div class=\"qw-step-icon\">${d.icon}<\/div>\r\n          <div class=\"qw-step-label\">${d.label}<\/div>\r\n        <\/div>`;\r\n        if(i < defs.length - 1){\r\n          html += `<div class=\"qw-connector${n < state.step ? ' filled' : ''}\"><\/div>`;\r\n        }\r\n      });\r\n      container.innerHTML = html;\r\n    }\r\n\r\n    \/\/ Al cambiar de paso, lleva la vista al inicio del formulario.\r\n    \/\/ SCROLL_OFFSET = alto aproximado del header fijo del sitio (+ un margen). Aj\u00fastalo si hace falta.\r\n    const SCROLL_OFFSET = 100;\r\n    let hasRendered = false;\r\n    function scrollToFormTop(){\r\n      const target = Q('qwSteps') || card;\r\n      const top = target.getBoundingClientRect().top;\r\n      if(top >= SCROLL_OFFSET) return; \/\/ el inicio del formulario ya se ve: no mover nada\r\n      const reduce = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n      window.scrollTo({ top: Math.max(0, top + window.pageYOffset - SCROLL_OFFSET), behavior: reduce ? 'auto' : 'smooth' });\r\n    }\r\n\r\n    function render(){\r\n      updateStepIndicator();\r\n      const defs = getStepDefs();\r\n      const key = defs[state.step - 1] ? defs[state.step - 1].key : defs[defs.length - 1].key;\r\n      if(key === 'info') renderInfo();\r\n      else if(key === 'level') renderCoverageLevel();\r\n      else if(key === 'details') renderDetails();\r\n      else if(key === 'drivers') renderStepDrivers();\r\n      else if(key === 'review') renderReview();\r\n      if(hasRendered) scrollToFormTop(); \/\/ no en la primera carga de la p\u00e1gina\r\n      hasRendered = true;\r\n    }\r\n\r\n    \/\/ ---------- Subida de archivos ----------\r\n    function totalUploadBytes(){\r\n      return getAllFiles().reduce((sum,item)=> sum + item.file.size, 0);\r\n    }\r\n\r\n    function attachFileUploadHandlers(filesArray, idSuffix, afterChangeCallback){\r\n      const dropZone = document.getElementById(`fileDropZone-${idSuffix}`);\r\n      const input = document.getElementById(`fileInput-${idSuffix}`);\r\n      const errorEl = document.getElementById(`fileError-${idSuffix}`);\r\n\r\n      function clearFileError(){\r\n        if(!errorEl) return;\r\n        errorEl.textContent = '';\r\n        errorEl.classList.remove('show');\r\n      }\r\n\r\n      function handleFiles(fileList){\r\n        clearFileError();\r\n        const incoming = Array.from(fileList);\r\n        const rejected = [];\r\n        for(const f of incoming){\r\n          if(filesArray.length >= MAX_FILES){ rejected.push(f.name + ' (' + t('limit reached') + ')'); continue; }\r\n          if(!isAllowedFile(f)){ rejected.push(f.name + ' (' + t('unsupported type') + ')'); continue; }\r\n          if(f.size > MAX_FILE_SIZE_MB * 1024 * 1024){ rejected.push(f.name + ' (' + t('over {mb}MB', { mb: MAX_FILE_SIZE_MB }) + ')'); continue; }\r\n          if(totalUploadBytes() + f.size > MAX_TOTAL_UPLOAD_MB * 1024 * 1024){ rejected.push(f.name + ' (' + t('total over {mb}MB', { mb: MAX_TOTAL_UPLOAD_MB }) + ')'); continue; }\r\n          filesArray.push(f);\r\n        }\r\n        afterChangeCallback();\r\n        if(rejected.length){\r\n          \/\/ Tras re-renderizar, el contenedor de error es uno nuevo: se vuelve a buscar\r\n          const el = document.getElementById(`fileError-${idSuffix}`);\r\n          if(el){ el.textContent = t('Some files were not added: ') + rejected.join(', '); el.classList.add('show'); }\r\n        }\r\n      }\r\n\r\n      if(input){\r\n        input.addEventListener('change', (e)=>{ handleFiles(e.target.files); e.target.value = ''; });\r\n      }\r\n      if(dropZone){\r\n        dropZone.addEventListener('dragover', (e)=>{ e.preventDefault(); dropZone.classList.add('dragover'); });\r\n        dropZone.addEventListener('dragleave', (e)=>{ e.preventDefault(); dropZone.classList.remove('dragover'); });\r\n        dropZone.addEventListener('drop', (e)=>{\r\n          e.preventDefault();\r\n          dropZone.classList.remove('dragover');\r\n          if(e.dataTransfer && e.dataTransfer.files) handleFiles(e.dataTransfer.files);\r\n        });\r\n      }\r\n      card.querySelectorAll(`.qw-file-item-remove[data-suffix=\"${idSuffix}\"]`).forEach(btn=>{\r\n        btn.addEventListener('click', ()=>{\r\n          const idx = parseInt(btn.dataset.idx,10);\r\n          filesArray.splice(idx,1);\r\n          afterChangeCallback();\r\n        });\r\n      });\r\n    }\r\n\r\n    \/\/ ---------- Paso 1: info ----------\r\n    function renderInfo(){\r\n      card.innerHTML = `\r\n        <h2>${t('Customer Information')}<\/h2>\r\n        <p class=\"qw-sub\">${t('Tell us about yourself so we can prepare your quote.')}<\/p>\r\n        <div class=\"qw-row\">\r\n          ${fieldTemplate(ID('firstName'), t('First Name'), 'John', state.info.firstName)}\r\n          ${fieldTemplate(ID('lastName'), t('Last Name'), 'Doe', state.info.lastName)}\r\n        <\/div>\r\n        <div class=\"qw-row\">\r\n          ${fieldTemplate(ID('email'), t('Email'), 'john@example.com', state.info.email, 'email')}\r\n          ${fieldTemplate(ID('phone'), t('Mobile Phone'), '(305) 555-0192', state.info.phone, 'tel')}\r\n        <\/div>\r\n        <div class=\"qw-actions qw-actions--end\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnNext')}\">${t('Continue')}<\/button>\r\n        <\/div>\r\n      `;\r\n      Q('btnNext').addEventListener('click', ()=>{\r\n        const f = {\r\n          firstName: Q('firstName').value.trim(),\r\n          lastName: Q('lastName').value.trim(),\r\n          email: Q('email').value.trim(),\r\n          phone: Q('phone').value.trim()\r\n        };\r\n        let valid = true;\r\n        Object.keys(f).forEach(k=>{\r\n          const box = document.getElementById('field-'+ID(k));\r\n          const errorEl = box.querySelector('.qw-error');\r\n          let errorMsg = '';\r\n          if(!f[k]){\r\n            errorMsg = t('This field is required.');\r\n          } else if(k === 'email' && !isValidEmail(f[k])){\r\n            errorMsg = t('Please enter a valid email address (e.g. name@example.com).');\r\n          } else if(k === 'phone' && !isValidPhone(f[k])){\r\n            errorMsg = t('Please enter a valid phone number (numbers only).');\r\n          }\r\n          if(errorMsg){\r\n            errorEl.textContent = errorMsg;\r\n            box.classList.add('invalid');\r\n            valid = false;\r\n          } else {\r\n            box.classList.remove('invalid');\r\n          }\r\n        });\r\n        if(!valid) return;\r\n        state.info = f;\r\n        state.step = 2;\r\n        render();\r\n      });\r\n    }\r\n\r\n    \/\/ ---------- Paso 2: nivel de cobertura (opcional) ----------\r\n    function renderCoverageLevel(){\r\n      card.innerHTML = `\r\n        <h2>${t('Select Coverage Level')}<\/h2>\r\n        <p class=\"qw-sub\">${t(\"Optional \u2014 pick a level if you already know what you need, or skip this and we'll help you choose.\")}<\/p>\r\n        <div class=\"qw-coverage-grid\" id=\"${ID('coverageLevelGrid')}\">\r\n          ${COVERAGE_LEVELS.map(l=>coverageLevelCardHtml(l, state.coverageLevel)).join('')}\r\n        <\/div>\r\n        <div class=\"qw-actions\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"${ID('btnBack')}\">${t('Back')}<\/button>\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnNext')}\">${t('Continue')}<\/button>\r\n        <\/div>\r\n      `;\r\n      Q('coverageLevelGrid').querySelectorAll('.qw-coverage-card').forEach(el=>{\r\n        el.addEventListener('click', ()=>{\r\n          state.coverageLevel = (state.coverageLevel === el.dataset.key) ? null : el.dataset.key;\r\n          renderCoverageLevel();\r\n        });\r\n      });\r\n      Q('btnBack').addEventListener('click', ()=>{ state.step = 1; render(); });\r\n      Q('btnNext').addEventListener('click', ()=>{ state.step = 3; render(); });\r\n    }\r\n\r\n    function renderDetails(){\r\n      if(state.coverage === 'vehicle') renderDetailsVehicle();\r\n      else if(state.coverage === 'business') renderDetailsBusiness();\r\n      else renderDetailsProperty();\r\n    }\r\n\r\n    \/\/ ---------- Paso 3 (veh\u00edculo) ----------\r\n    function renderDetailsVehicle(){\r\n      const atMax = state.vehicles.length >= MAX_VEHICLES;\r\n      const items = state.vehicles.map((v,i)=>`\r\n        <div class=\"qw-item-box\">\r\n          <h4>${t('Vehicle')} ${i+1}<\/h4>\r\n          ${state.vehicles.length > 1 ? `<button type=\"button\" class=\"qw-item-remove\" data-remove-veh=\"${i}\">${t('Remove')}<\/button>` : ''}\r\n          <div class=\"qw-row\">\r\n            <div class=\"qw-field\"><label>${t('VIN (optional)')}<\/label><input type=\"text\" data-idx=\"${i}\" data-key=\"vin\" class=\"veh-input\" placeholder=\"1HGBH41JXMN109186\" value=\"${esc(v.vin)}\"><\/div>\r\n          <\/div>\r\n          ${fileUploadWidgetHtml(v.files, ID('veh-'+i), t('Upload Documents for this Vehicle'))}\r\n        <\/div>\r\n      `).join('');\r\n\r\n      card.innerHTML = `\r\n        <h2>${t('Vehicle Details')}<\/h2>\r\n        <p class=\"qw-sub\">${t(\"Tell us about the vehicles you'd like to insure.\")}<\/p>\r\n        <div class=\"qw-count-control\">\r\n          <label style=\"font-weight:700;font-size:13px;\">${t('Number of Vehicles')}<\/label>\r\n          <button type=\"button\" id=\"${ID('vehMinus')}\" ${state.vehicles.length <= 1 ? 'disabled' : ''}>&minus;<\/button>\r\n          <span id=\"${ID('vehCount')}\" style=\"min-width:16px;text-align:center;font-weight:700;\">${state.vehicles.length}<\/span>\r\n          <button type=\"button\" id=\"${ID('vehPlus')}\" ${atMax ? 'disabled' : ''}>+<\/button>\r\n        <\/div>\r\n        <p class=\"qw-count-note\">${atMax ? t(\"You've reached the maximum of {n} vehicles. Add the rest in the notes on the review step.\", { n: MAX_VEHICLES }) : t('Add up to {n} vehicles.', { n: MAX_VEHICLES })}<\/p>\r\n        ${items}\r\n        <div class=\"qw-actions\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"${ID('btnBack')}\">${t('Back')}<\/button>\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnNext')}\">${t('Continue')}<\/button>\r\n        <\/div>\r\n      `;\r\n\r\n      Q('vehPlus').addEventListener('click', ()=>{\r\n        if(state.vehicles.length >= MAX_VEHICLES) return;\r\n        state.vehicles.push({vin:'',files:[]});\r\n        renderDetailsVehicle();\r\n      });\r\n      Q('vehMinus').addEventListener('click', ()=>{\r\n        if(state.vehicles.length > 1){ state.vehicles.pop(); renderDetailsVehicle(); }\r\n      });\r\n      card.querySelectorAll('[data-remove-veh]').forEach(btn=>{\r\n        btn.addEventListener('click', ()=>{\r\n          state.vehicles.splice(parseInt(btn.dataset.removeVeh,10),1);\r\n          renderDetailsVehicle();\r\n        });\r\n      });\r\n      card.querySelectorAll('.veh-input').forEach(inp=>{\r\n        inp.addEventListener('input', (e)=>{\r\n          state.vehicles[parseInt(e.target.dataset.idx,10)][e.target.dataset.key] = e.target.value;\r\n        });\r\n      });\r\n      state.vehicles.forEach((v,i)=>{\r\n        attachFileUploadHandlers(v.files, ID('veh-'+i), renderDetailsVehicle);\r\n      });\r\n      Q('btnBack').addEventListener('click', ()=>{ state.step = 2; render(); });\r\n      Q('btnNext').addEventListener('click', ()=>{ state.step = state.step + 1; render(); });\r\n    }\r\n\r\n    \/\/ ---------- Paso 4 (veh\u00edculo): conductores ----------\r\n    function driverFactory(){\r\n      return { files:[], dob:'', licenseNumber:'', expiration:'', fullName:'', address:'' };\r\n    }\r\n    function isDriverManualComplete(d){\r\n      return !!(d.dob && d.licenseNumber && d.expiration && d.fullName && d.address);\r\n    }\r\n    function isDriverSatisfied(d){\r\n      return (d.files && d.files.length > 0) || isDriverManualComplete(d);\r\n    }\r\n\r\n    function renderStepDrivers(){\r\n      const atMax = state.drivers.length >= MAX_DRIVERS;\r\n      const items = state.drivers.map((d,i)=>`\r\n        <div class=\"qw-item-box\">\r\n          <h4>${t('Driver')} ${i+1}<\/h4>\r\n          ${state.drivers.length > 1 ? `<button type=\"button\" class=\"qw-item-remove\" data-remove-drv=\"${i}\">${t('Remove')}<\/button>` : ''}\r\n          ${fileUploadWidgetHtml(d.files, ID('drv-'+i), t(\"Upload Driver's License\"))}\r\n          <p style=\"font-size:12px;color:#9aa1ac;margin:-4px 0 16px;\">${t('\u2014 or enter their information manually \u2014')}<\/p>\r\n          <div class=\"qw-row\">\r\n            <div class=\"qw-field\"><label>${t('Date of Birth')}<\/label><input type=\"date\" data-idx=\"${i}\" data-key=\"dob\" class=\"drv-input\" value=\"${esc(d.dob)}\"><\/div>\r\n            <div class=\"qw-field\"><label>${t('License Number')}<\/label><input type=\"text\" data-idx=\"${i}\" data-key=\"licenseNumber\" class=\"drv-input\" placeholder=\"D123-456-78-901\" value=\"${esc(d.licenseNumber)}\"><\/div>\r\n          <\/div>\r\n          <div class=\"qw-row\">\r\n            <div class=\"qw-field\"><label>${t('Expiration Date')}<\/label><input type=\"date\" data-idx=\"${i}\" data-key=\"expiration\" class=\"drv-input\" value=\"${esc(d.expiration)}\"><\/div>\r\n            <div class=\"qw-field\"><label>${t('Full Name')}<\/label><input type=\"text\" data-idx=\"${i}\" data-key=\"fullName\" class=\"drv-input\" placeholder=\"Jane Doe\" value=\"${esc(d.fullName)}\"><\/div>\r\n          <\/div>\r\n          <div class=\"qw-row\">\r\n            <div class=\"qw-field qw-field--full\"><label>${t('Address')}<\/label><input type=\"text\" data-idx=\"${i}\" data-key=\"address\" class=\"drv-input\" placeholder=\"${t('Street, city, state')}\" value=\"${esc(d.address)}\"><\/div>\r\n          <\/div>\r\n          <div class=\"qw-driver-error\" id=\"${ID('driverError-'+i)}\">${t(\"Please upload the driver's license, or fill in all five fields above.\")}<\/div>\r\n        <\/div>\r\n      `).join('');\r\n\r\n      card.innerHTML = `\r\n        <h2>${t('Drivers')}<\/h2>\r\n        <p class=\"qw-sub\">${t(\"Tell us who will be driving. Upload each driver's license \u2014 or skip that and enter their details manually.\")}<\/p>\r\n        <div class=\"qw-count-control\">\r\n          <label style=\"font-weight:700;font-size:13px;\">${t('Number of Drivers')}<\/label>\r\n          <button type=\"button\" id=\"${ID('drvMinus')}\" ${state.drivers.length <= 1 ? 'disabled' : ''}>&minus;<\/button>\r\n          <span id=\"${ID('drvCount')}\" style=\"min-width:16px;text-align:center;font-weight:700;\">${state.drivers.length}<\/span>\r\n          <button type=\"button\" id=\"${ID('drvPlus')}\" ${atMax ? 'disabled' : ''}>+<\/button>\r\n        <\/div>\r\n        <p class=\"qw-count-note\">${atMax ? t(\"You've reached the maximum of {n} drivers.\", { n: MAX_DRIVERS }) : t('Add up to {n} drivers.', { n: MAX_DRIVERS })}<\/p>\r\n        ${items}\r\n        <div class=\"qw-actions\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"${ID('btnBack')}\">${t('Back')}<\/button>\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnNext')}\">${t('Continue')}<\/button>\r\n        <\/div>\r\n      `;\r\n\r\n      Q('drvPlus').addEventListener('click', ()=>{\r\n        if(state.drivers.length >= MAX_DRIVERS) return;\r\n        state.drivers.push(driverFactory());\r\n        renderStepDrivers();\r\n      });\r\n      Q('drvMinus').addEventListener('click', ()=>{\r\n        if(state.drivers.length > 1){ state.drivers.pop(); renderStepDrivers(); }\r\n      });\r\n      card.querySelectorAll('[data-remove-drv]').forEach(btn=>{\r\n        btn.addEventListener('click', ()=>{\r\n          state.drivers.splice(parseInt(btn.dataset.removeDrv,10),1);\r\n          renderStepDrivers();\r\n        });\r\n      });\r\n      card.querySelectorAll('.drv-input').forEach(inp=>{\r\n        inp.addEventListener('input', (e)=>{\r\n          state.drivers[parseInt(e.target.dataset.idx,10)][e.target.dataset.key] = e.target.value;\r\n        });\r\n      });\r\n      state.drivers.forEach((d,i)=>{\r\n        attachFileUploadHandlers(d.files, ID('drv-'+i), renderStepDrivers);\r\n      });\r\n      Q('btnBack').addEventListener('click', ()=>{ state.step = state.step - 1; render(); });\r\n      Q('btnNext').addEventListener('click', ()=>{\r\n        let valid = true;\r\n        state.drivers.forEach((d,i)=>{\r\n          const errEl = document.getElementById(ID('driverError-'+i));\r\n          const satisfied = isDriverSatisfied(d);\r\n          if(errEl) errEl.style.display = satisfied ? 'none' : 'block';\r\n          if(!satisfied) valid = false;\r\n        });\r\n        if(!valid) return;\r\n        state.step = state.step + 1;\r\n        render();\r\n      });\r\n    }\r\n\r\n    \/\/ ---------- Paso 3 (negocio) ----------\r\n    function renderDetailsBusiness(){\r\n      card.innerHTML = `\r\n        <h2>${t('Business Details')}<\/h2>\r\n        <p class=\"qw-sub\">${t('Tell us about your business.')}<\/p>\r\n        <div class=\"qw-row\">\r\n          <div class=\"qw-field\" id=\"field-${ID('bizName')}\"><label>${t('Business Name')}<\/label><input type=\"text\" id=\"${ID('bizName')}\" placeholder=\"My Company LLC\" value=\"${esc(state.business.name)}\"><span class=\"qw-error\">${t('Please enter the business name.')}<\/span><\/div>\r\n          <div class=\"qw-field\" id=\"field-${ID('bizType')}\"><label>${t('Business Type')}<\/label><input type=\"text\" id=\"${ID('bizType')}\" placeholder=\"${t('Restaurant, retail store, office...')}\" value=\"${esc(state.business.type)}\"><span class=\"qw-error\">${t('Please enter the business type.')}<\/span><\/div>\r\n        <\/div>\r\n        <div class=\"qw-row\">\r\n          <div class=\"qw-field\" id=\"field-${ID('bizAddress')}\"><label>${t('Address')}<\/label><input type=\"text\" id=\"${ID('bizAddress')}\" placeholder=\"${t('Street, city, state')}\" value=\"${esc(state.business.address)}\"><span class=\"qw-error\">${t('Please enter the address.')}<\/span><\/div>\r\n          <div class=\"qw-field\" id=\"field-${ID('bizEmployees')}\"><label>${t('Number of Employees')}<\/label><input type=\"text\" id=\"${ID('bizEmployees')}\" placeholder=\"5\" value=\"${esc(state.business.employees)}\"><span class=\"qw-error\" data-default-msg=\"${t('Please enter the number of employees.')}\">${t('Please enter the number of employees.')}<\/span><\/div>\r\n        <\/div>\r\n        ${fileUploadWidgetHtml(state.files, ID('shared'))}\r\n        <div class=\"qw-actions\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"${ID('btnBack')}\">${t('Back')}<\/button>\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnNext')}\">${t('Continue')}<\/button>\r\n        <\/div>\r\n      `;\r\n      \/\/ Guardar lo escrito en vivo: as\u00ed no se pierde al subir un archivo (que re-renderiza)\r\n      Q('bizName').addEventListener('input', (e)=>{ state.business.name = e.target.value; });\r\n      Q('bizType').addEventListener('input', (e)=>{ state.business.type = e.target.value; });\r\n      Q('bizAddress').addEventListener('input', (e)=>{ state.business.address = e.target.value; });\r\n      Q('bizEmployees').addEventListener('input', (e)=>{ state.business.employees = e.target.value; });\r\n      attachFileUploadHandlers(state.files, ID('shared'), renderDetailsBusiness);\r\n      Q('btnBack').addEventListener('click', ()=>{ state.step = 2; render(); });\r\n      Q('btnNext').addEventListener('click', ()=>{\r\n        const values = {\r\n          bizName: Q('bizName').value.trim(),\r\n          bizType: Q('bizType').value.trim(),\r\n          bizAddress: Q('bizAddress').value.trim(),\r\n          bizEmployees: Q('bizEmployees').value.trim()\r\n        };\r\n        let valid = true;\r\n        Object.keys(values).forEach(key=>{\r\n          const box = document.getElementById('field-'+ID(key));\r\n          const errorEl = box.querySelector('.qw-error');\r\n          let errorMsg = '';\r\n          if(!values[key]){\r\n            errorMsg = errorEl.dataset.defaultMsg || errorEl.textContent;\r\n          } else if(key === 'bizEmployees' && !\/^[0-9]+$\/.test(values[key])){\r\n            errorMsg = t('Please enter a number (digits only).');\r\n          }\r\n          if(errorMsg){\r\n            errorEl.textContent = errorMsg;\r\n            box.classList.add('invalid');\r\n            valid = false;\r\n          } else {\r\n            box.classList.remove('invalid');\r\n          }\r\n        });\r\n        if(!valid) return;\r\n        state.business = {\r\n          name: values.bizName, type: values.bizType,\r\n          address: values.bizAddress, employees: values.bizEmployees\r\n        };\r\n        state.step = 4; render();\r\n      });\r\n    }\r\n\r\n    \/\/ ---------- Paso 3 (propiedad) ----------\r\n    function renderDetailsProperty(){\r\n      card.innerHTML = `\r\n        <h2>${t('Property Details')}<\/h2>\r\n        <p class=\"qw-sub\">${t(\"Tell us about the property you'd like to insure.\")}<\/p>\r\n        <div class=\"qw-row\">\r\n          <div class=\"qw-field\" id=\"field-${ID('propAddress')}\"><label>${t('Property Address')}<\/label><input type=\"text\" id=\"${ID('propAddress')}\" placeholder=\"${t('Street, city, state')}\" value=\"${esc(state.property.address)}\"><span class=\"qw-error\">${t('Please enter the property address.')}<\/span><\/div>\r\n          <div class=\"qw-field\" id=\"field-${ID('propType')}\"><label>${t('Property Type')}<\/label><input type=\"text\" id=\"${ID('propType')}\" placeholder=\"${t('House, apartment, rental...')}\" value=\"${esc(state.property.type)}\"><span class=\"qw-error\">${t('Please enter the property type.')}<\/span><\/div>\r\n        <\/div>\r\n        <div class=\"qw-row\">\r\n          <div class=\"qw-field\" id=\"field-${ID('propValue')}\"><label>${t('Estimated Value')}<\/label><input type=\"text\" inputmode=\"decimal\" id=\"${ID('propValue')}\" placeholder=\"$250,000\" value=\"${esc(state.property.value)}\"><span class=\"qw-error\" data-default-msg=\"${t('Please enter an estimated value.')}\">${t('Please enter an estimated value.')}<\/span><\/div>\r\n        <\/div>\r\n        ${fileUploadWidgetHtml(state.files, ID('shared'))}\r\n        <div class=\"qw-actions\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"${ID('btnBack')}\">${t('Back')}<\/button>\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnNext')}\">${t('Continue')}<\/button>\r\n        <\/div>\r\n      `;\r\n      Q('propAddress').addEventListener('input', (e)=>{ state.property.address = e.target.value; });\r\n      Q('propType').addEventListener('input', (e)=>{ state.property.type = e.target.value; });\r\n      Q('propValue').addEventListener('input', (e)=>{\r\n        const formatted = formatCurrencyInput(e.target.value);\r\n        e.target.value = formatted;\r\n        state.property.value = formatted;\r\n      });\r\n      attachFileUploadHandlers(state.files, ID('shared'), renderDetailsProperty);\r\n      Q('btnBack').addEventListener('click', ()=>{ state.step = 2; render(); });\r\n      Q('btnNext').addEventListener('click', ()=>{\r\n        const values = {\r\n          propAddress: Q('propAddress').value.trim(),\r\n          propType: Q('propType').value.trim(),\r\n          propValue: Q('propValue').value.trim()\r\n        };\r\n        let valid = true;\r\n        Object.keys(values).forEach(key=>{\r\n          const box = document.getElementById('field-'+ID(key));\r\n          const errorEl = box.querySelector('.qw-error');\r\n          let errorMsg = '';\r\n          if(!values[key]){\r\n            errorMsg = errorEl.dataset.defaultMsg || errorEl.textContent;\r\n          } else if(key === 'propValue' && !isValidCurrency(values[key])){\r\n            errorMsg = t('Please enter a valid dollar amount (e.g. $250,000).');\r\n          }\r\n          if(errorMsg){\r\n            errorEl.textContent = errorMsg;\r\n            box.classList.add('invalid');\r\n            valid = false;\r\n          } else {\r\n            box.classList.remove('invalid');\r\n          }\r\n        });\r\n        if(!valid) return;\r\n        state.property = {\r\n          address: values.propAddress, type: values.propType, value: values.propValue\r\n        };\r\n        state.step = 4; render();\r\n      });\r\n    }\r\n\r\n    function coverageLabel(){\r\n      const labels = { vehicle:'Vehicle Insurance', business:'Business Insurance', property:'Property Insurance' };\r\n      return labels[state.coverage] ? t(labels[state.coverage]) : '\u2014';\r\n    }\r\n\r\n    \/\/ Devuelve [{ file, name, vehicle, driver }]; `name` es \u00daNICO en toda la solicitud\r\n    function getAllFiles(){\r\n      const out = [];\r\n      const used = Object.create(null);\r\n\r\n      function push(file, prefixLabel, tags){\r\n        tags = tags || {};\r\n        let base = (prefixLabel ? prefixLabel + '-' : '') + stripExt(file.name).replace(\/[^\\w\\-. ]+\/g,'_');\r\n        const ext = getFileExt(file.name);\r\n        let name = base + ext;\r\n        let n = 2;\r\n        while(used[name.toLowerCase()]){ name = base + '-' + n + ext; n++; }\r\n        used[name.toLowerCase()] = true;\r\n        out.push({ file: file, name: name, vehicle: tags.vehicle || null, driver: tags.driver || null });\r\n      }\r\n\r\n      if(state.coverage === 'vehicle'){\r\n        state.vehicles.forEach((v,i)=>{\r\n          (v.files || []).forEach(f=> push(f, 'vehicle' + (i+1), { vehicle: i+1 }));\r\n        });\r\n        state.drivers.forEach((d,i)=>{\r\n          (d.files || []).forEach(f=> push(f, 'driver' + (i+1), { driver: i+1 }));\r\n        });\r\n      } else {\r\n        state.files.forEach(f=> push(f, '', {}));\r\n      }\r\n      return out;\r\n    }\r\n\r\n    \/\/ ---------- Review ----------\r\n    function detailsSummaryHtml(){\r\n      let html = '';\r\n      if(state.coverage === 'vehicle'){\r\n        const vehRows = state.vehicles.map((v,i)=>{\r\n          const parts = [];\r\n          if(v.vin) parts.push('VIN: ' + esc(v.vin));\r\n          if(v.files.length) parts.push(v.files.length + ' ' + t('file(s)'));\r\n          return `<div class=\"qw-rv-value\">${i+1}. ${t('Vehicle')}${parts.length ? ' \u2014 ' + parts.join(' \u2014 ') : ''}<\/div>`;\r\n        }).join('');\r\n        html += reviewBlock(t('VEHICLES') + ' (' + state.vehicles.length + ')', vehRows);\r\n\r\n        const drvRows = state.drivers.map((d,i)=>{\r\n          const parts = [];\r\n          if(d.fullName) parts.push(esc(d.fullName));\r\n          if(d.files && d.files.length) parts.push(t('License uploaded') + ' (' + d.files.length + ' ' + t('file(s)') + ')');\r\n          else if(isDriverManualComplete(d)) parts.push(t('Details provided manually'));\r\n          return `<div class=\"qw-rv-value\">${i+1}. ${parts.length ? parts.join(' \u2014 ') : t('Driver') + ' ' + (i+1)}<\/div>`;\r\n        }).join('');\r\n        html += reviewBlock(t('DRIVERS') + ' (' + state.drivers.length + ')', drvRows);\r\n      } else if(state.coverage === 'business'){\r\n        html += reviewRow(t('BUSINESS'), state.business.name)\r\n              + reviewRow(t('TYPE'), state.business.type)\r\n              + reviewRow(t('ADDRESS'), state.business.address)\r\n              + reviewRow(t('EMPLOYEES'), state.business.employees);\r\n      } else if(state.coverage === 'property'){\r\n        html += reviewRow(t('ADDRESS'), state.property.address)\r\n              + reviewRow(t('TYPE'), state.property.type)\r\n              + reviewRow(t('ESTIMATED VALUE'), state.property.value);\r\n      }\r\n\r\n      const allFiles = getAllFiles();\r\n      if(allFiles.length){\r\n        const totalMb = (totalUploadBytes()\/(1024*1024)).toFixed(1);\r\n        let groupsHtml = '';\r\n        if(state.coverage === 'vehicle'){\r\n          state.vehicles.forEach((v,i)=>{\r\n            const files = allFiles.filter(f=>f.vehicle === i+1);\r\n            if(files.length){\r\n              groupsHtml += `<div class=\"qw-rv-sub\"><span class=\"qw-rv-sublabel\">${t('Vehicle')} ${i+1}<\/span>${files.map(f=>esc(f.name)).join(', ')}<\/div>`;\r\n            }\r\n          });\r\n          state.drivers.forEach((d,i)=>{\r\n            const files = allFiles.filter(f=>f.driver === i+1);\r\n            if(files.length){\r\n              groupsHtml += `<div class=\"qw-rv-sub\"><span class=\"qw-rv-sublabel\">${t('Driver')} ${i+1}<\/span>${files.map(f=>esc(f.name)).join(', ')}<\/div>`;\r\n            }\r\n          });\r\n        } else {\r\n          groupsHtml = `<div class=\"qw-rv-value\">${allFiles.map(f=>esc(f.name)).join(', ')}<\/div>`;\r\n        }\r\n        html += reviewBlock(t('ATTACHED FILES') + ' (' + allFiles.length + ' \u2014 ' + totalMb + ' MB)', groupsHtml);\r\n      }\r\n      return html;\r\n    }\r\n\r\n    function renderReview(){\r\n      card.innerHTML = `\r\n        <h2>${t('Review &amp; Additional Notes')}<\/h2>\r\n        <p class=\"qw-sub\">${t('Review your information and add any additional details.')}<\/p>\r\n        <div class=\"qw-review-box\">\r\n          <h4>${t('Your Information')}<\/h4>\r\n          <div class=\"qw-review-list\">\r\n            ${reviewRow(t('NAME'), `${state.info.firstName} ${state.info.lastName}`.trim())}\r\n            ${reviewRow(t('EMAIL'), state.info.email)}\r\n            ${reviewRow(t('PHONE'), state.info.phone)}\r\n            ${reviewRow(t('COVERAGE TYPE'), coverageLabel())}\r\n            ${reviewRow(t('COVERAGE LEVEL'), coverageLevelLabelFor(state.coverageLevel))}\r\n            ${detailsSummaryHtml()}\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"qw-field\" style=\"margin-bottom:10px;\">\r\n          <label for=\"${ID('notes')}\">${t('Additional Notes (Optional)')}<\/label>\r\n          <textarea id=\"${ID('notes')}\" rows=\"4\" placeholder=\"${t('Tell us anything else we should know...')}\">${esc(state.notes)}<\/textarea>\r\n        <\/div>\r\n        <div class=\"qw-actions\">\r\n          <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"${ID('btnBack')}\">${t('Back')}<\/button>\r\n          <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnSubmit')}\">${t('Request my free quote')}<\/button>\r\n        <\/div>\r\n        <div class=\"qw-submit-error\" id=\"${ID('submitError')}\"><\/div>\r\n      `;\r\n      Q('btnBack').addEventListener('click', ()=>{ state.step = state.step - 1; render(); });\r\n      Q('btnSubmit').addEventListener('click', ()=>{\r\n        state.notes = Q('notes').value;\r\n        submitQuote();\r\n      });\r\n    }\r\n\r\n    async function submitQuote(){\r\n      const attachments = getAllFiles();\r\n\r\n      const payload = {\r\n        language: LANG, \/\/ 'en' o 'es': idioma en el que el cliente llen\u00f3 el formulario\r\n        info: state.info,\r\n        coverage: state.coverage,\r\n        coverageLevel: state.coverageLevel,\r\n        vehicles: state.coverage === 'vehicle'\r\n          ? state.vehicles.map((v,i)=>({\r\n              index: i+1,\r\n              vin: v.vin,\r\n              files: attachments.filter(a=>a.vehicle === i+1).map(a=>a.name)\r\n            }))\r\n          : undefined,\r\n        drivers: state.coverage === 'vehicle'\r\n          ? state.drivers.map((d,i)=>({\r\n              index: i+1,\r\n              dob: d.dob,\r\n              licenseNumber: d.licenseNumber,\r\n              expiration: d.expiration,\r\n              fullName: d.fullName,\r\n              address: d.address,\r\n              files: attachments.filter(a=>a.driver === i+1).map(a=>a.name)\r\n            }))\r\n          : undefined,\r\n        business: state.coverage === 'business' ? state.business : undefined,\r\n        property: state.coverage === 'property' ? state.property : undefined,\r\n        notes: state.notes,\r\n        attachments: attachments.map(a=>({ name:a.name, size:a.file.size, vehicle:a.vehicle, driver:a.driver })),\r\n        attachmentCount: attachments.length\r\n      };\r\n\r\n      const submitBtn = Q('btnSubmit');\r\n      const backBtn = Q('btnBack');\r\n      const errorEl = Q('submitError');\r\n      if(errorEl){ errorEl.classList.remove('show'); errorEl.textContent = ''; }\r\n      if(submitBtn){ submitBtn.disabled = true; submitBtn.textContent = t('Sending...'); }\r\n      if(backBtn){ backBtn.disabled = true; }\r\n\r\n      try {\r\n        \/\/ Mismo endpoint REST de WordPress para los 3 formularios; `coverage` indica el tipo\r\n        const formData = new FormData();\r\n        formData.append('data', JSON.stringify(payload));\r\n        attachments.forEach((item, i)=>{\r\n          formData.append('files[]', item.file, item.name);\r\n          formData.append('file_' + i, item.file, item.name);\r\n        });\r\n        formData.append('file_count', String(attachments.length));\r\n\r\n        const response = await fetch('\/wp-json\/quote-form\/v1\/submit', {\r\n          method: 'POST',\r\n          body: formData\r\n        });\r\n\r\n        let result = {};\r\n        try { result = await response.json(); } catch(e) { \/* ignorar errores de parseo *\/ }\r\n\r\n        if(response.ok && result.success){\r\n          showSuccess();\r\n        } else {\r\n          const detail = result.message || ('HTTP ' + response.status + (response.status === 413 ? ' \u2014 ' + t('upload too large for the server') : ''));\r\n          console.error('Quote form submission failed:', detail, result);\r\n          showError(detail);\r\n        }\r\n      } catch(err){\r\n        console.error('Quote form submission error:', err);\r\n        showError(err && err.message ? err.message : t('Network error'));\r\n      }\r\n    }\r\n\r\n    function resetState(){\r\n      state.step = 1;\r\n      state.info = { firstName:'', lastName:'', email:'', phone:'' };\r\n      state.coverageLevel = null;\r\n      state.vehicles = [ { vin:'', files:[] } ];\r\n      state.drivers = [ driverFactory() ];\r\n      state.business = { name:'', type:'', address:'', employees:'' };\r\n      state.property = { address:'', type:'', value:'' };\r\n      state.notes = '';\r\n      state.files = [];\r\n      \/\/ state.coverage no se toca: es fijo para este formulario\r\n    }\r\n\r\n    const AUTO_RESET_DELAY = 5000;\r\n    const FADE_DURATION = 400;\r\n    let autoResetTimer = null;\r\n\r\n    function scheduleAutoReset(){\r\n      clearTimeout(autoResetTimer);\r\n      autoResetTimer = setTimeout(()=>{\r\n        card.classList.add('qw-fade-out');\r\n        setTimeout(()=>{\r\n          card.classList.remove('qw-fade-out');\r\n          resetState();\r\n          render();\r\n        }, FADE_DURATION);\r\n      }, AUTO_RESET_DELAY);\r\n    }\r\n\r\n    function showSuccess(){\r\n      card.innerHTML = `\r\n        <div class=\"qw-success\">\r\n          <div class=\"qw-success-icon\">\r\n            <svg viewBox=\"0 0 24 24\" width=\"30\" height=\"30\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M20 6L9 17l-5-5\"\/><\/svg>\r\n          <\/div>\r\n          <h2>${t('Request Received!')}<\/h2>\r\n          <p>${t(\"Thanks, {name}! We'll be in touch soon with your quote.\", { name: esc(state.info.firstName) })}<\/p>\r\n          <p class=\"qw-timer-note\">${t('This form will reset automatically in a few seconds...')}<\/p>\r\n          <button type=\"button\" class=\"qw-new-quote-link\" id=\"${ID('btnNewQuote')}\">${t('Start a new quote now')}<\/button>\r\n        <\/div>\r\n      `;\r\n      Q('btnNewQuote').addEventListener('click', ()=>{\r\n        clearTimeout(autoResetTimer);\r\n        resetState();\r\n        render();\r\n      });\r\n      scheduleAutoReset();\r\n    }\r\n\r\n    function showError(detail){\r\n      card.innerHTML = `\r\n        <div class=\"qw-success\">\r\n          <div class=\"qw-success-icon\" style=\"background:#fdecea;color:#c0392b;\">\r\n            <svg viewBox=\"0 0 24 24\" width=\"30\" height=\"30\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M12 8v5\"\/><path d=\"M12 16.5h.01\"\/><circle cx=\"12\" cy=\"12\" r=\"9\"\/><\/svg>\r\n          <\/div>\r\n          <h2>${t('Something Went Wrong')}<\/h2>\r\n          <p>${t(\"We couldn't send your request. Please try again, or call us directly.\")}<\/p>\r\n          ${detail ? `<p class=\"qw-detail\">${esc(detail)}<\/p>` : ''}\r\n          <div class=\"qw-actions qw-actions--center\">\r\n            <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"${ID('btnRetry')}\">${t('Try again')}<\/button>\r\n          <\/div>\r\n        <\/div>\r\n      `;\r\n      Q('btnRetry').addEventListener('click', ()=>{ state.step = reviewStepNumber(); render(); });\r\n    }\r\n\r\n    render();\r\n  } \/\/ fin de createInsuranceQuoteWidget\r\n\r\n  function bootAllWidgets(){\r\n    createInsuranceQuoteWidget('propertyQuote', 'property');\r\n  }\r\n\r\n  if(document.readyState === 'loading'){\r\n    document.addEventListener('DOMContentLoaded', bootAllWidgets);\r\n  } else {\r\n    bootAllWidgets();\r\n  }\r\n\r\n})();\r\n<\/script>\r\n\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Insurance Services Protecting What Matters Most At Transfer Insurance FL, we help individuals, families, and businesses find reliable insurance coverage tailored to their needs. Our goal is to make the insurance process simple, transparent, and stress-free while connecting you with coverage options that provide confidence and financial protection. Whether you&#8217;re looking to protect your home, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":3,"comment_status":"closed","ping_status":"closed","template":"elementor_theme","meta":{"footnotes":""},"class_list":["post-216","page","type-page","status-publish","hentry"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":8}},"_links":{"self":[{"href":"https:\/\/transferinsurancefl.com\/en\/wp-json\/wp\/v2\/pages\/216","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/transferinsurancefl.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/transferinsurancefl.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/transferinsurancefl.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/transferinsurancefl.com\/en\/wp-json\/wp\/v2\/comments?post=216"}],"version-history":[{"count":337,"href":"https:\/\/transferinsurancefl.com\/en\/wp-json\/wp\/v2\/pages\/216\/revisions"}],"predecessor-version":[{"id":5043,"href":"https:\/\/transferinsurancefl.com\/en\/wp-json\/wp\/v2\/pages\/216\/revisions\/5043"}],"wp:attachment":[{"href":"https:\/\/transferinsurancefl.com\/en\/wp-json\/wp\/v2\/media?parent=216"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}