{"id":38,"date":"2026-07-16T00:49:30","date_gmt":"2026-07-16T00:49:30","guid":{"rendered":"https:\/\/transferinsurancefl.com\/?page_id=38"},"modified":"2026-10-13T09:14:42","modified_gmt":"2026-10-13T14:14:42","slug":"request-a-quote","status":"publish","type":"page","link":"https:\/\/transferinsurancefl.com\/en\/request-a-quote\/","title":{"rendered":"Request a Quote"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"38\" class=\"elementor elementor-38\" data-elementor-settings=\"{&quot;ha_cmc_init_switcher&quot;:&quot;no&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b3747c5 e-flex e-con-boxed e-con e-parent\" data-id=\"b3747c5\" 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<div class=\"elementor-element elementor-element-0c86800 e-con-full e-flex e-con e-child\" data-id=\"0c86800\" 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<div class=\"elementor-element elementor-element-dd1ede7 e-flex e-con-boxed e-con e-child\" data-id=\"dd1ede7\" 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-6f07aa3 elementor-widget elementor-widget-elementskit-heading\" data-id=\"6f07aa3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementskit-heading.default\">\n\t\t\t\t\t<div class=\"ekit-wid-con\" ><div class=\"ekit-heading elementskit-section-title-wraper text_left   ekit_heading_tablet-   ekit_heading_mobile-\"><h2 class=\"ekit-heading--title elementskit-section-title \">Get a Free Quote<\/h2><h3 class=\"ekit-heading--subtitle elementskit-section-subtitle  \">\n\t\t\t\t\t\tRequest Your Free Insurance Quote\n\t\t\t\t\t<\/h3>\t\t\t\t<div class='ekit-heading__description'>\n\t\t\t\t\t<p>Complete the form below to receive a personalized insurance quote. It only takes a few minutes \u2014 no obligation required.<\/p>\n\t\t\t\t<\/div>\n\t\t\t<\/div><\/div>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-655e837 e-flex e-con-boxed e-con e-parent\" data-id=\"655e837\" 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<div class=\"elementor-element elementor-element-0e45a68 e-flex e-con-boxed e-con e-child\" data-id=\"0e45a68\" 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-e1f623a sticky-heading-prefixstyle elementor-widget elementor-widget-heading\" data-id=\"e1f623a\" 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\">Let\u2019s Find the Right Coverage for You<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0a1d470 elementor-widget elementor-widget-text-editor\" data-id=\"0a1d470\" 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>Tell us a little about what you need to protect. It only takes a few minutes to get started.<\/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<div class=\"elementor-element elementor-element-6077f66 e-flex e-con-boxed e-con e-child\" data-id=\"6077f66\" 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-1344b91 elementor-widget elementor-widget-html\" data-id=\"1344b91\" 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>Insurance Quote Form<\/title>\r\n<style>\r\n\/* =====================================================================\r\n   Quote wizard 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-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:32px 16px 60px;\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:24px 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\r\n<\/style>\r\n<\/head>\r\n<body>\r\n\r\n<!-- data-no-translation: evita que TranslatePress toque este bloque; el formulario\r\n     se traduce solo con el diccionario del script (seg\u00fan el idioma de la p\u00e1gina). -->\r\n<div class=\"qw-wrap\" data-no-translation>\r\n  <div class=\"qw-steps\" id=\"qwSteps\"><\/div>\r\n  <div class=\"qw-card\" id=\"qwCard\"><\/div>\r\n<\/div>\r\n\r\n<script>\r\nfunction initQuoteWizard(){\r\n  const QW_VERSION = 'v7-2026-10-13-i18n';\r\n\r\n  const card = document.getElementById('qwCard');\r\n  if(!card) return; \/\/ el HTML del formulario a\u00fan no est\u00e1 en la p\u00e1gina\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    'Insurance Type': 'Tipo de seguro',\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    'Details': 'Detalles',\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    \/\/ Paso 2\r\n    'Select Insurance Type': 'Seleccione el tipo de seguro',\r\n    'What type of coverage are you looking for?': '\u00bfQu\u00e9 tipo de cobertura est\u00e1 buscando?',\r\n    'Vehicle Insurance': 'Seguro de Veh\u00edculo',\r\n    'Business Insurance': 'Seguro de Negocio',\r\n    'Property Insurance': 'Seguro de Propiedad',\r\n    'Auto, motorcycle &amp; commercial vehicles': 'Auto, motocicleta y veh\u00edculos comerciales',\r\n    'Liability, property &amp; protection': 'Responsabilidad civil, propiedad y protecci\u00f3n',\r\n    'Home, rental &amp; property protection': 'Hogar, alquiler y protecci\u00f3n de propiedades',\r\n    'Please select a coverage type.': 'Seleccione un tipo de cobertura.',\r\n\r\n    \/\/ Paso 3\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    \/\/ 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 & 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 (por veh\u00edculo\/conductor, o zona compartida)\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  \/\/ Marcador de versi\u00f3n: comprueba qu\u00e9 c\u00f3digo est\u00e1 cargando la p\u00e1gina.\r\n  \/\/ Agrega ?qwdebug=1 a la URL para ver una barra amarilla con la versi\u00f3n y el ancho del viewport.\r\n  card.setAttribute('data-qw-version', QW_VERSION);\r\n  console.log('[quote-form] ' + QW_VERSION + ' \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 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 = document.getElementById('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: null,       \/\/ vehicle | business | property\r\n    coverageLevel: null,  \/\/ basic | liability | full | other \u2014 opcional\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: [] \/\/ lista compartida para negocio \/ propiedad\r\n  };\r\n\r\n  \/\/ ---- \u00cdconos del indicador de pasos ----\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    type: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 2l8 3v6c0 5-3.5 8.5-8 11-4.5-2.5-8-6-8-11V5l8-3z\"\/><\/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    detailsDefault: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"8\" width=\"18\" height=\"10\" rx=\"2\"\/><path d=\"M7 8V6a2 2 0 012-2h6a2 2 0 012 2v2\"\/><\/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  \/\/ 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 detailsStepLabel(){\r\n    if(state.coverage === 'vehicle') return t('Vehicle Details');\r\n    if(state.coverage === 'business') return t('Business Details');\r\n    if(state.coverage === 'property') return t('Property Details');\r\n    return t('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    if(state.coverage === 'property') return ICONS.property;\r\n    return ICONS.detailsDefault;\r\n  }\r\n\r\n  \/\/ La secuencia es din\u00e1mica: Vehicle inserta el paso \"Drivers\" antes de Review\r\n  function getStepDefs(){\r\n    const defs = [\r\n      { key:'info', label:t('Your Info'), icon: ICONS.person },\r\n      { key:'type', label:t('Insurance Type'), icon: ICONS.type },\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\r\n  function reviewStepNumber(){\r\n    return getStepDefs().findIndex(d=>d.key === 'review') + 1;\r\n  }\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 = document.getElementById('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 = document.getElementById('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') renderStep1();\r\n    else if(key === 'type') renderStep2();\r\n    else if(key === 'level') renderStep3();\r\n    else if(key === 'details') renderStep4();\r\n    else if(key === 'drivers') renderStepDrivers();\r\n    else if(key === 'review') renderStep5();\r\n    if(hasRendered) scrollToFormTop(); \/\/ no en la primera carga de la p\u00e1gina\r\n    hasRendered = true;\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 isValidEmail(v){ return \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(v); }\r\n\r\n  function isValidPhone(v){\r\n    \/\/ solo d\u00edgitos, espacios, +, -, ( ) \u2014 rechaza letras como \"asd\"\r\n    if(!\/^[0-9+\\-()\\s]+$\/.test(v)) return false;\r\n    return v.replace(\/\\D\/g,'').length >= 7;\r\n  }\r\n\r\n  \/\/ ================= Subida de archivos =================\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\r\n  \/\/ filesArray: el array que lee\/escribe este widget.\r\n  \/\/ idSuffix: texto \u00fanico para que varios widgets convivan ('veh-0', 'drv-1', 'shared'\u2026).\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 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\r\n    function handleFiles(fileList){\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        \/\/ Se protege la solicitud completa: si supera post_max_size, PHP la rechaza\r\n        \/\/ y los adjuntos desaparecen sin aviso.\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        filesArray.splice(parseInt(btn.dataset.idx,10),1);\r\n        afterChangeCallback();\r\n      });\r\n    });\r\n  }\r\n\r\n  \/\/ ================= Pasos =================\r\n\r\n  function renderStep1(){\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('firstName', t('First Name'), 'John', state.info.firstName)}\r\n        ${fieldTemplate('lastName', t('Last Name'), 'Doe', state.info.lastName)}\r\n      <\/div>\r\n      <div class=\"qw-row\">\r\n        ${fieldTemplate('email', t('Email'), 'john@example.com', state.info.email, 'email')}\r\n        ${fieldTemplate('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=\"btnNext\">${t('Continue')}<\/button>\r\n      <\/div>\r\n    `;\r\n    document.getElementById('btnNext').addEventListener('click', ()=>{\r\n      const f = {\r\n        firstName: document.getElementById('firstName').value.trim(),\r\n        lastName: document.getElementById('lastName').value.trim(),\r\n        email: document.getElementById('email').value.trim(),\r\n        phone: document.getElementById('phone').value.trim()\r\n      };\r\n      let valid = true;\r\n      Object.keys(f).forEach(k=>{\r\n        const box = document.getElementById('field-'+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  function coverageCardHtml(key,title,desc,iconSvg){\r\n    const selected = state.coverage === key ? 'selected' : '';\r\n    return `<div class=\"qw-coverage-card ${selected}\" data-key=\"${key}\">\r\n      <div class=\"qw-coverage-icon\">${iconSvg}<\/div>\r\n      <h3>${title}<\/h3>\r\n      <p>${desc}<\/p>\r\n    <\/div>`;\r\n  }\r\n\r\n  function renderStep2(){\r\n    card.innerHTML = `\r\n      <h2>${t('Select Insurance Type')}<\/h2>\r\n      <p class=\"qw-sub\">${t('What type of coverage are you looking for?')}<\/p>\r\n      <div class=\"qw-coverage-grid\" id=\"coverageGrid\">\r\n        ${coverageCardHtml('vehicle', t('Vehicle Insurance'), t('Auto, motorcycle &amp; commercial vehicles'), '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" width=\"20\" height=\"20\"><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        ${coverageCardHtml('business', t('Business Insurance'), t('Liability, property &amp; protection'), '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" width=\"20\" height=\"20\"><rect x=\"4\" y=\"3\" width=\"16\" height=\"18\"\/><path d=\"M9 7h1M14 7h1M9 11h1M14 11h1M9 15h1M14 15h1\"\/><\/svg>')}\r\n        ${coverageCardHtml('property', t('Property Insurance'), t('Home, rental &amp; property protection'), '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" width=\"20\" height=\"20\"><path d=\"M3 11l9-7 9 7\"\/><path d=\"M5 10v10h14V10\"\/><\/svg>')}\r\n      <\/div>\r\n      <div class=\"qw-actions\">\r\n        <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"btnBack\">${t('Back')}<\/button>\r\n        <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"btnNext\">${t('Continue')}<\/button>\r\n      <\/div>\r\n    `;\r\n    document.getElementById('coverageGrid').querySelectorAll('.qw-coverage-card').forEach(el=>{\r\n      el.addEventListener('click', ()=>{\r\n        state.coverage = el.dataset.key;\r\n        renderStep2();\r\n      });\r\n    });\r\n    document.getElementById('btnBack').addEventListener('click', ()=>{ state.step = 1; render(); });\r\n    document.getElementById('btnNext').addEventListener('click', ()=>{\r\n      if(!state.coverage){ alert(t('Please select a coverage type.')); return; }\r\n      state.step = 3;\r\n      render();\r\n    });\r\n  }\r\n\r\n  \/\/ ---- Paso 3: nivel de cobertura (opcional) ----\r\n  \/\/ Selecci\u00f3n \"escalonada\": Basic -> Liability -> Full se iluminan hacia abajo.\r\n  \/\/ \"Others\" va aparte y solo se ilumina a s\u00ed mismo.\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  function coverageLevelLabel(){\r\n    const found = COVERAGE_LEVELS.find(l=>l.key === state.coverageLevel);\r\n    return found ? t(found.title) : '';\r\n  }\r\n\r\n  function isLevelVisuallySelected(level){\r\n    if(!state.coverageLevel) return false;\r\n    if(state.coverageLevel === 'other') return level.key === 'other';\r\n    if(level.key === 'other') return false;\r\n    const selectedLevel = COVERAGE_LEVELS.find(l=>l.key === state.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){\r\n    const selected = isLevelVisuallySelected(level) ? '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 renderStep3(){\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=\"coverageLevelGrid\">\r\n        ${COVERAGE_LEVELS.map(coverageLevelCardHtml).join('')}\r\n      <\/div>\r\n      <div class=\"qw-actions\">\r\n        <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"btnBack\">${t('Back')}<\/button>\r\n        <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"btnNext\">${t('Continue')}<\/button>\r\n      <\/div>\r\n    `;\r\n    document.getElementById('coverageLevelGrid').querySelectorAll('.qw-coverage-card').forEach(el=>{\r\n      el.addEventListener('click', ()=>{\r\n        \/\/ clic en la tarjeta ya elegida = deseleccionar (el paso es opcional)\r\n        state.coverageLevel = (state.coverageLevel === el.dataset.key) ? null : el.dataset.key;\r\n        renderStep3();\r\n      });\r\n    });\r\n    document.getElementById('btnBack').addEventListener('click', ()=>{ state.step = 2; render(); });\r\n    document.getElementById('btnNext').addEventListener('click', ()=>{ state.step = 4; render(); });\r\n  }\r\n\r\n  function renderStep4(){\r\n    if(state.coverage === 'vehicle') renderStep4Vehicle();\r\n    else if(state.coverage === 'business') renderStep4Business();\r\n    else renderStep4Property();\r\n  }\r\n\r\n  function renderStep4Vehicle(){\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, '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=\"vehMinus\" ${state.vehicles.length <= 1 ? 'disabled' : ''}>&minus;<\/button>\r\n        <span id=\"vehCount\" style=\"min-width:16px;text-align:center;font-weight:700;\">${state.vehicles.length}<\/span>\r\n        <button type=\"button\" 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=\"btnBack\">${t('Back')}<\/button>\r\n        <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"btnNext\">${t('Continue')}<\/button>\r\n      <\/div>\r\n    `;\r\n\r\n    document.getElementById('vehPlus').addEventListener('click', ()=>{\r\n      if(state.vehicles.length >= MAX_VEHICLES) return;\r\n      state.vehicles.push({vin:'',files:[]});\r\n      renderStep4Vehicle();\r\n    });\r\n    document.getElementById('vehMinus').addEventListener('click', ()=>{\r\n      if(state.vehicles.length > 1){ state.vehicles.pop(); renderStep4Vehicle(); }\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        renderStep4Vehicle();\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, 'veh-'+i, renderStep4Vehicle);\r\n    });\r\n    document.getElementById('btnBack').addEventListener('click', ()=>{ state.step = 3; render(); });\r\n    document.getElementById('btnNext').addEventListener('click', ()=>{ state.step = state.step + 1; render(); });\r\n  }\r\n\r\n  \/\/ ================= Paso: Drivers (solo Vehicle) =================\r\n  \/\/ Por conductor: basta con subir la licencia O completar los 5 campos a mano.\r\n\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, '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=\"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=\"drvMinus\" ${state.drivers.length <= 1 ? 'disabled' : ''}>&minus;<\/button>\r\n        <span id=\"drvCount\" style=\"min-width:16px;text-align:center;font-weight:700;\">${state.drivers.length}<\/span>\r\n        <button type=\"button\" 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=\"btnBack\">${t('Back')}<\/button>\r\n        <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"btnNext\">${t('Continue')}<\/button>\r\n      <\/div>\r\n    `;\r\n\r\n    document.getElementById('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    document.getElementById('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, 'drv-'+i, renderStepDrivers);\r\n    });\r\n    document.getElementById('btnBack').addEventListener('click', ()=>{ state.step = state.step - 1; render(); });\r\n    document.getElementById('btnNext').addEventListener('click', ()=>{\r\n      let valid = true;\r\n      state.drivers.forEach((d,i)=>{\r\n        const errEl = document.getElementById('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  function renderStep4Business(){\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-bizName\"><label>${t('Business Name')}<\/label><input type=\"text\" 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-bizType\"><label>${t('Business Type')}<\/label><input type=\"text\" 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-bizAddress\"><label>${t('Address')}<\/label><input type=\"text\" 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-bizEmployees\"><label>${t('Number of Employees')}<\/label><input type=\"text\" 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, 'shared')}\r\n      <div class=\"qw-actions\">\r\n        <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"btnBack\">${t('Back')}<\/button>\r\n        <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"btnNext\">${t('Continue')}<\/button>\r\n      <\/div>\r\n    `;\r\n    \/\/ Se guarda cada tecla en `state`: si no, subir un archivo (que re-renderiza)\r\n    \/\/ borrar\u00eda lo que el usuario ya escribi\u00f3.\r\n    document.getElementById('bizName').addEventListener('input', (e)=>{ state.business.name = e.target.value; });\r\n    document.getElementById('bizType').addEventListener('input', (e)=>{ state.business.type = e.target.value; });\r\n    document.getElementById('bizAddress').addEventListener('input', (e)=>{ state.business.address = e.target.value; });\r\n    document.getElementById('bizEmployees').addEventListener('input', (e)=>{ state.business.employees = e.target.value; });\r\n    attachFileUploadHandlers(state.files, 'shared', renderStep4Business);\r\n    document.getElementById('btnBack').addEventListener('click', ()=>{ state.step = 3; render(); });\r\n    document.getElementById('btnNext').addEventListener('click', ()=>{\r\n      const values = {\r\n        bizName: document.getElementById('bizName').value.trim(),\r\n        bizType: document.getElementById('bizType').value.trim(),\r\n        bizAddress: document.getElementById('bizAddress').value.trim(),\r\n        bizEmployees: document.getElementById('bizEmployees').value.trim()\r\n      };\r\n      let valid = true;\r\n      Object.keys(values).forEach(key=>{\r\n        const box = document.getElementById('field-'+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 = 5; render();\r\n    });\r\n  }\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\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 renderStep4Property(){\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-propAddress\"><label>${t('Property Address')}<\/label><input type=\"text\" 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-propType\"><label>${t('Property Type')}<\/label><input type=\"text\" 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-propValue\"><label>${t('Estimated Value')}<\/label><input type=\"text\" inputmode=\"decimal\" 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, 'shared')}\r\n      <div class=\"qw-actions\">\r\n        <button type=\"button\" class=\"qw-btn qw-btn-secondary\" id=\"btnBack\">${t('Back')}<\/button>\r\n        <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"btnNext\">${t('Continue')}<\/button>\r\n      <\/div>\r\n    `;\r\n    document.getElementById('propAddress').addEventListener('input', (e)=>{ state.property.address = e.target.value; });\r\n    document.getElementById('propType').addEventListener('input', (e)=>{ state.property.type = e.target.value; });\r\n    document.getElementById('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, 'shared', renderStep4Property);\r\n    document.getElementById('btnBack').addEventListener('click', ()=>{ state.step = 3; render(); });\r\n    document.getElementById('btnNext').addEventListener('click', ()=>{\r\n      const values = {\r\n        propAddress: document.getElementById('propAddress').value.trim(),\r\n        propType: document.getElementById('propType').value.trim(),\r\n        propValue: document.getElementById('propValue').value.trim()\r\n      };\r\n      let valid = true;\r\n      Object.keys(values).forEach(key=>{\r\n        const box = document.getElementById('field-'+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 = 5; 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  \/\/ Dos veh\u00edculos que suben \"registration.pdf\" ya no chocan en el servidor, y el\r\n  \/\/ prefijo le dice al agente a qu\u00e9 veh\u00edculo\/conductor pertenece cada archivo.\r\n  function getAllFiles(){\r\n    const out = [];\r\n    const used = Object.create(null);\r\n\r\n    function push(file, prefix, tags){\r\n      tags = tags || {};\r\n      let base = (prefix ? prefix + '-' : '') + 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  \/\/ Fila (etiqueta | valor). Si el campo opcional est\u00e1 vac\u00edo, 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  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 renderStep5(){\r\n    card.innerHTML = `\r\n      <h2>${t('Review & Additional Notes').replace(\/&\/g,'&amp;')}<\/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'), coverageLevelLabel())}\r\n          ${detailsSummaryHtml()}\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"qw-field\" style=\"margin-bottom:10px;\">\r\n        <label for=\"notes\">${t('Additional Notes (Optional)')}<\/label>\r\n        <textarea 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=\"btnBack\">${t('Back')}<\/button>\r\n        <button type=\"button\" class=\"qw-btn qw-btn-primary\" id=\"btnSubmit\">${t('Request my free quote')}<\/button>\r\n      <\/div>\r\n      <div class=\"qw-submit-error\" id=\"submitError\"><\/div>\r\n    `;\r\n    document.getElementById('btnBack').addEventListener('click', ()=>{ state.step = state.step - 1; render(); });\r\n    document.getElementById('btnSubmit').addEventListener('click', ()=>{\r\n      state.notes = document.getElementById('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 = document.getElementById('btnSubmit');\r\n    const backBtn = document.getElementById('btnBack');\r\n    const errorEl = document.getElementById('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      \/\/ Endpoint REST de WordPress (snippet wp-quote-form-mailer.php de WPCode).\r\n      \/\/ multipart\/form-data para llevar los archivos. NO fijar Content-Type a mano:\r\n      \/\/ el navegador agrega el boundary de FormData autom\u00e1ticamente.\r\n      const formData = new FormData();\r\n      formData.append('data', JSON.stringify(payload));\r\n      attachments.forEach((item, i)=>{\r\n        \/\/ El 3er argumento renombra el archivo: dos \"registration.pdf\" llegan como\r\n        \/\/ vehicle1-registration.pdf y vehicle2-registration.pdf\r\n        formData.append('files[]', item.file, item.name);\r\n        \/\/ clave indexada redundante: algunos helpers de correo leen $_FILES['file_0']\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      \/\/ Ruta absoluta desde la ra\u00edz del sitio: funciona igual en \/es\/ y en ingl\u00e9s.\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.coverage = null;\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  }\r\n\r\n  const AUTO_RESET_DELAY = 5000; \/\/ ms que se muestra la confirmaci\u00f3n\r\n  const FADE_DURATION = 400;     \/\/ ms de la transici\u00f3n\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=\"btnNewQuote\">${t('Start a new quote now')}<\/button>\r\n      <\/div>\r\n    `;\r\n    document.getElementById('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=\"btnRetry\">${t('Try again')}<\/button>\r\n        <\/div>\r\n      <\/div>\r\n    `;\r\n    document.getElementById('btnRetry').addEventListener('click', ()=>{ state.step = reviewStepNumber(); render(); });\r\n  }\r\n\r\n  render();\r\n} \/\/ fin de initQuoteWizard\r\n\r\n\/\/ Inicia el widget cuando el DOM est\u00e9 listo (funciona si el script va en <head> o en el footer).\r\nif(document.readyState === 'loading'){\r\n  document.addEventListener('DOMContentLoaded', initQuoteWizard);\r\n} else {\r\n  initQuoteWizard();\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\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","protected":false},"excerpt":{"rendered":"<p>Get a Free Quote Request Your Free Insurance Quote Complete the form below to receive a personalized insurance quote. It only takes a few minutes \u2014 no obligation required. Let\u2019s Find the Right Coverage for You Tell us a little about what you need to protect. It only takes a few minutes to get started. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":8,"comment_status":"closed","ping_status":"closed","template":"elementor_theme","meta":{"footnotes":""},"class_list":["post-38","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\/38","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=38"}],"version-history":[{"count":348,"href":"https:\/\/transferinsurancefl.com\/en\/wp-json\/wp\/v2\/pages\/38\/revisions"}],"predecessor-version":[{"id":5037,"href":"https:\/\/transferinsurancefl.com\/en\/wp-json\/wp\/v2\/pages\/38\/revisions\/5037"}],"wp:attachment":[{"href":"https:\/\/transferinsurancefl.com\/en\/wp-json\/wp\/v2\/media?parent=38"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}