{"id":1047,"date":"2026-04-30T18:48:51","date_gmt":"2026-04-30T16:48:51","guid":{"rendered":"https:\/\/grupaimmobles.com\/ahipoteques\/formulario-hipoteca\/"},"modified":"2026-06-01T09:37:56","modified_gmt":"2026-06-01T07:37:56","slug":"formulario-hipoteca","status":"publish","type":"page","link":"https:\/\/ahipoteques.com\/es\/formulario-hipoteca\/","title":{"rendered":"Formulario hipoteca"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1047\" class=\"elementor elementor-1047 elementor-29\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-da5adac e-flex e-con-boxed e-con e-parent\" data-id=\"da5adac\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-fca76a7 e-con-full e-flex e-con e-child\" data-id=\"fca76a7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e135a74 elementor-widget elementor-widget-heading\" data-id=\"e135a74\" 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\">Inicie su solicitud<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a475868 elementor-widget elementor-widget-heading\" data-id=\"a475868\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\">Rellene sus datos para que podamos iniciar su estudio.<\/p>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b0de821 elementor-widget elementor-widget-shortcode\" data-id=\"b0de821\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><div class=\"ahip-formulari\" id=\"ahip-form-6a6e0968aa98f\">\n\n<style>\n.ahip-formulari {\n  --primary:    #1e608a;\n  --light-blue: #a2dafe;\n  --dark:       #073858;\n  --bg:         #f2f2f2;\n  --accent:     #ffd233;\n  --white:      #ffffff;\n  --text:       #1a1a2e;\n  --muted:      #6b7a8d;\n  --error:      #e05353;\n  --success:    #2dba7a;\n  --radius:     16px;\n  --radius-sm:  10px;\n  --shadow:     0 4px 24px rgba(7,56,88,0.10);\n  --font:       'rig-sans', 'Barlow', 'Helvetica Neue', Arial, sans-serif;\n  --tr:         0.25s ease;\n\n  width: 100%;\n  max-width: 720px;\n  margin: 0 auto;\n  font-family: var(--font);\n  color: var(--text);\n  box-sizing: border-box;\n}\n.ahip-formulari *, .ahip-formulari *::before, .ahip-formulari *::after {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n}\n\n\/* \u2500\u2500\u2500 PROGRESS \u2500\u2500\u2500 *\/\n.ahip-formulari .progress-wrap {\n  background: var(--white);\n  border-radius: var(--radius);\n  box-shadow: var(--shadow);\n  padding: 20px 24px;\n  margin-bottom: 16px;\n}\n.ahip-formulari .progress-steps {\n  display: flex;\n  align-items: center;\n  gap: 0;\n  margin-bottom: 14px;\n}\n.ahip-formulari .step-node {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: 6px;\n  flex: 1;\n  position: relative;\n  cursor: default;\n}\n.ahip-formulari .step-circle {\n  width: 36px;\n  height: 36px;\n  border-radius: 50%;\n  border: 2.5px solid #e2e8f0;\n  background: var(--white);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 13px;\n  font-weight: 600;\n  color: var(--muted);\n  transition: all var(--tr);\n  position: relative;\n  z-index: 1;\n}\n.ahip-formulari .step-circle.done {\n  background: var(--primary);\n  border-color: var(--primary);\n  color: var(--white);\n}\n.ahip-formulari .step-circle.active {\n  background: var(--primary);\n  border-color: var(--primary);\n  color: var(--white);\n  box-shadow: 0 0 0 5px rgba(30,96,138,0.15);\n}\n.ahip-formulari .step-label {\n  font-size: 10px;\n  font-weight: 600;\n  color: var(--muted);\n  letter-spacing: 0.03em;\n  text-align: center;\n  white-space: nowrap;\n  transition: color var(--tr);\n}\n.ahip-formulari .step-label.active { color: var(--primary); font-weight: 700; }\n.ahip-formulari .step-label.done   { color: var(--primary); }\n.ahip-formulari .step-connector {\n  flex: 1;\n  height: 2.5px;\n  background: #e2e8f0;\n  margin-bottom: 22px;\n  transition: background var(--tr);\n  max-width: 48px;\n}\n.ahip-formulari .step-connector.done { background: var(--primary); }\n.ahip-formulari .progress-bar-track {\n  height: 5px;\n  background: #e2e8f0;\n  border-radius: 100px;\n  overflow: hidden;\n}\n.ahip-formulari .progress-bar-fill {\n  height: 100%;\n  background: var(--primary);\n  border-radius: 100px;\n  transition: width 0.5s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n\/* \u2500\u2500\u2500 CARD \u2500\u2500\u2500 *\/\n.ahip-formulari .card {\n  background: var(--white);\n  border-radius: var(--radius);\n  box-shadow: var(--shadow);\n  overflow: hidden;\n}\n.ahip-formulari .card-header {\n  background: var(--dark);\n  padding: 24px 28px;\n  display: flex;\n  align-items: center;\n  gap: 14px;\n}\n.ahip-formulari .card-header-icon {\n  width: 44px;\n  height: 44px;\n  border-radius: 12px;\n  background: rgba(255,255,255,0.12);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-shrink: 0;\n  border: 1px solid rgba(255,255,255,0.18);\n}\n.ahip-formulari .card-header-icon svg { color: var(--accent); }\n.ahip-formulari .card-header-text { flex: 1; }\n.ahip-formulari .card-step-label {\n  font-size: 11px;\n  font-weight: 700;\n  letter-spacing: 0.1em;\n  text-transform: uppercase;\n  color: var(--light-blue);\n  margin-bottom: 3px;\n}\n.ahip-formulari .card-step-title {\n  font-size: 18px;\n  font-weight: 600;\n  color: var(--white);\n  letter-spacing: -0.01em;\n}\n.ahip-formulari .card-step-counter {\n  font-size: 12px;\n  color: rgba(255,255,255,0.5);\n  font-weight: 600;\n}\n.ahip-formulari .card-body { padding: 28px 28px 8px; }\n\n\/* \u2500\u2500\u2500 FORM FIELDS \u2500\u2500\u2500 *\/\n.ahip-formulari .form-grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 18px;\n}\n.ahip-formulari .form-grid.cols-1 { grid-template-columns: 1fr; }\n.ahip-formulari .form-group {\n  display: flex;\n  flex-direction: column;\n  gap: 7px;\n}\n.ahip-formulari .form-group.full { grid-column: 1 \/ -1; }\n.ahip-formulari .form-label {\n  font-size: 12px;\n  font-weight: 700;\n  color: var(--dark);\n  letter-spacing: 0.02em;\n}\n.ahip-formulari .form-label .req { color: var(--primary); margin-left: 2px; }\n.ahip-formulari .form-input,\n.ahip-formulari .form-select {\n  width: 100%;\n  padding: 12px 14px;\n  border: 2px solid #e2e8f0;\n  border-radius: var(--radius-sm);\n  font-family: var(--font);\n  font-size: 15px;\n  font-weight: 500;\n  line-height: 1.4;\n  color: var(--dark);\n  background: #f8fafc;\n  outline: none;\n  transition: border-color var(--tr), box-shadow var(--tr), background var(--tr);\n  box-sizing: border-box;\n  height: auto;\n}\n.ahip-formulari .form-input {\n  -moz-appearance: textfield;\n}\n.ahip-formulari .form-input::-webkit-inner-spin-button,\n.ahip-formulari .form-input::-webkit-outer-spin-button { -webkit-appearance: none; }\n.ahip-formulari .form-select {\n  cursor: pointer;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%236b7a8d' stroke-width='2.5'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C\/polyline%3E%3C\/svg%3E\");\n  background-repeat: no-repeat;\n  background-position: right 12px center;\n  padding-right: 36px;\n  text-overflow: ellipsis;\n}\n.ahip-formulari .form-input:focus,\n.ahip-formulari .form-select:focus {\n  border-color: var(--primary);\n  box-shadow: 0 0 0 3px rgba(30,96,138,0.12);\n  background: var(--white);\n}\n.ahip-formulari .form-input.error,\n.ahip-formulari .form-select.error {\n  border-color: var(--error);\n  box-shadow: 0 0 0 3px rgba(224,83,83,0.10);\n}\n.ahip-formulari .form-error {\n  font-size: 11px;\n  color: var(--error);\n  font-weight: 600;\n  display: none;\n}\n.ahip-formulari .form-error.visible { display: block; }\n\n\/* \u2500\u2500\u2500 RADIO PILLS \u2500\u2500\u2500 *\/\n.ahip-formulari .radio-pills { display: flex; flex-wrap: wrap; gap: 8px; }\n.ahip-formulari .radio-pill {\n  display: flex;\n  align-items: center;\n  gap: 7px;\n  padding: 9px 16px;\n  border: 2px solid #e2e8f0;\n  border-radius: 100px;\n  cursor: pointer;\n  font-size: 13px;\n  font-weight: 600;\n  color: var(--muted);\n  background: #f8fafc;\n  transition: all var(--tr);\n  user-select: none;\n}\n.ahip-formulari .radio-pill:hover  { border-color: var(--primary); color: var(--primary); }\n.ahip-formulari .radio-pill.active { border-color: var(--primary); background: var(--primary); color: var(--white); }\n.ahip-formulari .radio-pill input  { display: none; }\n.ahip-formulari .radio-pill-dot {\n  width: 8px; height: 8px;\n  border-radius: 50%;\n  background: currentColor;\n  opacity: 0;\n  transition: opacity var(--tr);\n  flex-shrink: 0;\n}\n.ahip-formulari .radio-pill.active .radio-pill-dot { opacity: 1; }\n\n\/* \u2500\u2500\u2500 TOGGLE SOL\u00b7LICITANTS \u2500\u2500\u2500 *\/\n.ahip-formulari .toggle-group { display: flex; gap: 10px; }\n.ahip-formulari .toggle-btn {\n  flex: 1;\n  padding: 14px;\n  border: 2.5px solid #e2e8f0;\n  border-radius: var(--radius-sm);\n  background: #f8fafc;\n  font-family: var(--font);\n  font-size: 15px;\n  font-weight: 700;\n  color: var(--muted);\n  cursor: pointer;\n  text-align: center;\n  transition: all var(--tr);\n}\n.ahip-formulari .toggle-btn.active { border-color: var(--primary); background: var(--primary); color: var(--white); }\n.ahip-formulari .toggle-btn span { display: block; font-size: 11px; font-weight: 500; margin-top: 2px; opacity: 0.75; }\n\n\/* \u2500\u2500\u2500 SOLICITANT BLOC \u2500\u2500\u2500 *\/\n.ahip-formulari .solicitant-bloc { border: 2px solid #e2e8f0; border-radius: var(--radius-sm); overflow: hidden; }\n.ahip-formulari .solicitant-bloc-header {\n  background: #f0f6fb;\n  padding: 12px 16px;\n  display: flex;\n  align-items: center;\n  gap: 10px;\n}\n.ahip-formulari .solicitant-num {\n  width: 26px; height: 26px;\n  border-radius: 50%;\n  background: var(--primary);\n  color: var(--white);\n  font-size: 12px;\n  font-weight: 600;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n.ahip-formulari .solicitant-title { font-size: 13px; font-weight: 700; color: var(--dark); }\n.ahip-formulari .solicitant-body  { padding: 16px; }\n\n\/* \u2500\u2500\u2500 ESTALVIS \u2500\u2500\u2500 *\/\n.ahip-formulari .estalvis-container {\n  overflow: hidden;\n  max-height: 0;\n  transition: max-height 0.4s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s ease;\n  opacity: 0;\n}\n.ahip-formulari .estalvis-container.open { max-height: 120px; opacity: 1; }\n\n\/* \u2500\u2500\u2500 RESUM \u2500\u2500\u2500 *\/\n.ahip-formulari .resum-section  { display: flex; flex-direction: column; gap: 16px; }\n.ahip-formulari .resum-bloc     { border: 2px solid #e9f2f9; border-radius: var(--radius-sm); overflow: hidden; }\n.ahip-formulari .resum-bloc-header {\n  background: #f0f6fb;\n  padding: 10px 16px;\n  font-size: 11px;\n  font-weight: 700;\n  color: var(--primary);\n  letter-spacing: 0.07em;\n  text-transform: uppercase;\n}\n.ahip-formulari .resum-bloc-body { padding: 14px 16px; display: flex; flex-direction: column; gap: 10px; }\n.ahip-formulari .resum-row {\n  display: flex;\n  justify-content: space-between;\n  align-items: baseline;\n  gap: 12px;\n  font-size: 13px;\n}\n.ahip-formulari .resum-key { color: var(--muted); font-weight: 500; flex-shrink: 0; }\n.ahip-formulari .resum-val { font-weight: 700; color: var(--dark); text-align: right; }\n\n\/* \u2500\u2500\u2500 CHECKBOXES \u2500\u2500\u2500 *\/\n.ahip-formulari .checks-section { display: flex; flex-direction: column; gap: 12px; padding: 0 0 4px; }\n.ahip-formulari .check-item     { display: flex; align-items: flex-start; gap: 12px; cursor: pointer; }\n.ahip-formulari .check-box {\n  width: 20px; height: 20px;\n  border: 2px solid #d0dce8;\n  border-radius: 5px;\n  flex-shrink: 0;\n  margin-top: 1px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  transition: all var(--tr);\n  background: #f8fafc;\n}\n.ahip-formulari .check-box.checked { background: var(--primary); border-color: var(--primary); }\n.ahip-formulari .check-label { font-size: 13px; color: var(--text); line-height: 1.5; }\n.ahip-formulari .check-label a { color: var(--primary); font-weight: 600; text-decoration: underline; }\n\n\/* \u2500\u2500\u2500 SUCCESS \u2500\u2500\u2500 *\/\n.ahip-formulari .success-screen {\n  padding: 60px 28px;\n  text-align: center;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: 16px;\n}\n.ahip-formulari .success-icon {\n  width: 72px; height: 72px;\n  border-radius: 50%;\n  background: var(--success);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  box-shadow: 0 8px 24px rgba(45,186,122,0.3);\n  animation: ahip-pop-in 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);\n}\n@keyframes ahip-pop-in {\n  from { transform: scale(0); opacity: 0; }\n  to   { transform: scale(1); opacity: 1; }\n}\n.ahip-formulari .success-title {\n  font-size: 22px;\n  font-weight: 600;\n  color: var(--dark);\n  letter-spacing: -0.02em;\n}\n.ahip-formulari .success-text { font-size: 14px; color: var(--muted); line-height: 1.6; max-width: 340px; }\n.ahip-formulari .success-badge {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  background: #f0faf5;\n  border: 2px solid #b3e8d0;\n  border-radius: 100px;\n  padding: 8px 20px;\n  font-size: 13px;\n  font-weight: 700;\n  color: #1e9960;\n}\n\n\/* \u2500\u2500\u2500 NAVIGATION \u2500\u2500\u2500 *\/\n.ahip-formulari .card-footer { padding: 20px 28px 28px; display: flex; gap: 12px; align-items: center; }\n.ahip-formulari .btn-back {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  padding: 13px 20px;\n  border: 2px solid #e2e8f0;\n  border-radius: var(--radius-sm);\n  background: var(--white);\n  font-family: var(--font);\n  font-size: 14px;\n  font-weight: 700;\n  color: var(--muted);\n  cursor: pointer;\n  transition: all var(--tr);\n  white-space: nowrap;\n}\n.ahip-formulari .btn-back:hover   { border-color: var(--primary); color: var(--primary); }\n.ahip-formulari .btn-back:disabled { opacity: 0.4; cursor: default; pointer-events: none; }\n.ahip-formulari .btn-next {\n  flex: 1;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: 8px;\n  padding: 14px 24px;\n  background: var(--primary);\n  color: var(--white);\n  border: none;\n  border-radius: var(--radius-sm);\n  font-family: var(--font);\n  font-size: 15px;\n  font-weight: 700;\n  cursor: pointer;\n  transition: all var(--tr);\n}\n.ahip-formulari .btn-next:hover        { background: var(--dark); box-shadow: 0 6px 20px rgba(7,56,88,0.25); }\n.ahip-formulari .btn-next.accent       { background: var(--accent); color: var(--dark); }\n.ahip-formulari .btn-next.accent:hover { background: #ffc700; }\n\n\/* \u2500\u2500\u2500 DIVIDER \/ LABEL \u2500\u2500\u2500 *\/\n.ahip-formulari .section-divider { height: 1px; background: #f0f4f8; margin: 20px 0; }\n.ahip-formulari .section-label {\n  font-size: 11px;\n  font-weight: 700;\n  color: var(--muted);\n  letter-spacing: 0.07em;\n  text-transform: uppercase;\n  margin-bottom: 14px;\n}\n\n\/* \u2500\u2500\u2500 SLIDE ANIMATIONS \u2500\u2500\u2500 *\/\n@keyframes ahip-slide-in-right {\n  from { opacity: 0; transform: translateX(28px); }\n  to   { opacity: 1; transform: translateX(0); }\n}\n@keyframes ahip-slide-in-left {\n  from { opacity: 0; transform: translateX(-28px); }\n  to   { opacity: 1; transform: translateX(0); }\n}\n.ahip-formulari .card-body.animate-right { animation: ahip-slide-in-right 0.35s ease; }\n.ahip-formulari .card-body.animate-left  { animation: ahip-slide-in-left  0.35s ease; }\n\n\/* \u2500\u2500\u2500 RESPONSIVE \u2500\u2500\u2500 *\/\n@media (max-width: 520px) {\n  .ahip-formulari .form-grid    { grid-template-columns: 1fr; }\n  .ahip-formulari .card-body    { padding: 20px 16px 8px; }\n  .ahip-formulari .card-header  { padding: 18px 20px; }\n  .ahip-formulari .card-footer  { padding: 16px 20px 24px; }\n  .ahip-formulari .btn-back span { display: none; }\n\n  \/* En mobile: ocultar nodes i connectors, mostrar nom\u00e9s la barra gruixuda *\/\n  .ahip-formulari .progress-wrap  { padding: 14px 16px; }\n  .ahip-formulari .progress-steps { display: none; }\n  .ahip-formulari .progress-bar-track { height: 10px; border-radius: 100px; }\n  .ahip-formulari .progress-bar-fill  { height: 10px; }\n\n  \/* Label de pas sota la barra *\/\n  .ahip-formulari .progress-step-label {\n    display: flex !important;\n    justify-content: space-between;\n    align-items: center;\n    margin-top: 8px;\n    font-size: 12px;\n    font-weight: 600;\n    color: var(--muted);\n  }\n  .ahip-formulari .progress-step-label strong { color: var(--primary); }\n}\n\n\/* Label de pas (ocult per defecte, visible en mobile via media query) *\/\n.ahip-formulari .progress-step-label { display: none; }\n<\/style>\n\n  <!-- Progress -->\n  <div class=\"progress-wrap\">\n    <div class=\"progress-steps\" data-form=\"progress-steps\"><\/div>\n    <div class=\"progress-bar-track\">\n      <div class=\"progress-bar-fill\" data-form=\"progress-fill\" style=\"width:20%\"><\/div>\n    <\/div>\n    <div class=\"progress-step-label\" data-form=\"progress-step-label\">\n      <span data-form=\"progress-step-text\"><strong>Pas 1<\/strong> de 5<\/span>\n      <span data-form=\"progress-step-name\">Immoble<\/span>\n    <\/div>\n  <\/div>\n\n  <!-- Card -->\n  <div class=\"card\">\n    <div class=\"card-header\" data-form=\"card-header\">\n      <div class=\"card-header-icon\">\n        <svg data-form=\"header-icon\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\">\n          <path d=\"M3 9l9-7 9 7v11a2 2 0 01-2 2H5a2 2 0 01-2-2z\"><\/path><polyline points=\"9 22 9 12 15 12 15 22\"><\/polyline>\n        <\/svg>\n      <\/div>\n      <div class=\"card-header-text\">\n        <div class=\"card-step-label\"  data-form=\"header-label\">Pas 1 de 5<\/div>\n        <div class=\"card-step-title\"  data-form=\"header-title\">Detalls de l'immoble<\/div>\n      <\/div>\n      <div class=\"card-step-counter\" data-form=\"header-counter\">1\/5<\/div>\n    <\/div>\n\n    <div class=\"card-body\" data-form=\"card-body\"><\/div>\n\n    <div class=\"card-footer\" data-form=\"card-footer\">\n      <button class=\"btn-back\" data-form=\"btn-back\" disabled aria-label=\"Anar al pas anterior\">\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"15 18 9 12 15 6\"><\/polyline><\/svg>\n        <span>Atr\u00e1s<\/span>\n      <\/button>\n      <button class=\"btn-next\" data-form=\"btn-next\" aria-label=\"Anar al pas seg\u00fcent\">\n        Seg\u00fcent\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"9 18 15 12 9 6\"><\/polyline><\/svg>\n      <\/button>\n    <\/div>\n  <\/div>\n\n<\/div><!-- \/.ahip-formulari -->\n\n<script>\n(function() {\n  'use strict';\n\n  var ROOT     = document.getElementById('ahip-form-6a6e0968aa98f');\n  var AJAX_URL = 'https:\/\/ahipoteques.com\/wp-admin\/admin-ajax.php';\n  var NONCE    = 'f5ae8c43e7';\n  var S        = {\"s_eyebrow\":\"Herramienta de c\\u00e1lculo\",\"s_title\":\"Simulador de Hipoteca\",\"s_subtitle\":\"Calcula tu cuota mensual en tiempo real. Sin compromiso. \",\"s_label_import\":\"Importe de la hipoteca\",\"s_label_anys\":\"Duraci\\u00f3n de la hipoteca\",\"s_label_interes\":\"Tipo de inter\\u00e9s (TIN anual)\",\"s_unit_anys\":\"a\\u00f1os\",\"s_slider_min_imp\":\"10.000 \\u20ac\",\"s_slider_mid_imp\":\"500.000 \\u20ac\",\"s_slider_max_imp\":\"1.000.000 \\u20ac\",\"s_slider_min_any\":\"5 a\\u00f1os\",\"s_slider_mid_any\":\"20 a\\u00f1os\",\"s_slider_max_any\":\"40 a\\u00f1os\",\"s_preset_label\":\"R\\u00e1pido\",\"s_preset_low\":\"Fijo bajo\",\"s_preset_mid\":\"Medio\",\"s_preset_var\":\"Variable\",\"s_preset_custom\":\"Personalizado\",\"s_result_label\":\"Cuota mensual estimada\",\"s_result_unit\":\"\\u20ac\\\/mes\",\"s_total_label\":\"Total a pagar\",\"s_inter_label\":\"Total intereses\",\"s_cta_text\":\"Solicita estudio gratuito\",\"s_cta_note\":\"Respuesta en menos de 24h \\u00b7 Sin compromiso\",\"s_disclaimer\":\"* C\\u00e1lculo orientativo basado en la f\\u00f3rmula de renta francesa. No incluye gastos de formalizaci\\u00f3n, seguros ni comisiones. Consulta a un especialista de Hipotecas para informaci\\u00f3n personalizada.  \",\"f_step1_label\":\"Inmueble\",\"f_step2_label\":\"Hipoteca\",\"f_step3_label\":\"Ahorros\",\"f_step4_label\":\"Contacto\",\"f_step5_label\":\"Resumen\",\"f_step1_title\":\"Detalles del inmueble\",\"f_step2_title\":\"Detalles de la hipoteca\",\"f_step3_title\":\"Aportaci\\u00f3n inicial\",\"f_step4_title\":\"Datos de contacto\",\"f_step5_title\":\"Resumen y env\\u00edo\",\"f_provincia\":\"Provincia\",\"f_preu\":\"Precio del inmueble\",\"f_motiu_q\":\"\\u00bfPor qu\\u00e9 necesitas la hipoteca?\",\"f_moment_q\":\"\\u00bfEn qu\\u00e9 momento de la compra est\\u00e1s?\",\"f_select_def\":\"Selecciona\\u2026\",\"f_motiu_1\":\"Primera vivienda\",\"f_motiu_2\":\"Segunda vivienda\",\"f_motiu_3\":\"Quiero cambiar de piso\",\"f_motiu_4\":\"Quiero mejorar mi hipoteca\",\"f_motiu_5\":\"Otros\",\"f_moment_1\":\"Estoy buscando\",\"f_moment_2\":\"He escogido vivienda\",\"f_moment_3\":\"He hecho la reserva-arras\",\"f_err_provincia\":\"Selecciona una provincia\",\"f_err_preu\":\"Introduce un precio v\\u00e1lido\",\"f_err_select\":\"Selecciona una opci\\u00f3n\",\"f_num_sol\":\"N\\u00famero de solicitantes\",\"f_sol_sing\":\"Solicitante\",\"f_sol_plur\":\"Solicitantes\",\"f_sol1_title\":\"Primer solicitante\",\"f_sol2_title\":\"Segundo solicitante\",\"f_situacio\":\"Situaci\\u00f3n laboral\",\"f_edat\":\"Edad\",\"f_ingressos\":\"Ingresos netos mensuales\",\"f_quotes\":\"Cuotas de otros pr\\u00e9stamos\",\"f_opcional\":\"(opcional)\",\"f_sit_1\":\"Contrato indefinido\",\"f_sit_2\":\"Contrato temporal\",\"f_sit_3\":\"Aut\\u00f3nomo\",\"f_sit_4\":\"Funcionario\",\"f_sit_5\":\"Pensionista\",\"f_sit_6\":\"Otros\",\"f_ph_edat\":\"Ex: 35\",\"f_ph_ingr\":\"Ex: 2500\",\"f_ph_quot\":\"0 \\u20ac si no tienes\",\"f_err_required\":\"Campo obligatorio\",\"f_err_edat\":\"Edad entre 18 y 80 a\\u00f1os\",\"f_estalvis_q\":\"\\u00bfTienes ahorros para la entrada?\",\"f_est_no\":\"No tengo ahorros\",\"f_est_si\":\"S\\u00ed, tengo ahorros\",\"f_quant_est\":\"\\u00bfCu\\u00e1ntos ahorros tienes?\",\"f_nom\":\"Nombre y apellidos\",\"f_email\":\"Correo electr\\u00f3nico\",\"f_telefon\":\"Tel\\u00e9fono\",\"f_ph_nom\":\"Tu nombre completo\",\"f_ph_email\":\"correo@ejemplo.com\",\"f_ph_tel\":\"+34 600 000 000\",\"f_err_nom\":\"Introduce tu nombre\",\"f_err_email\":\"Introduce un correo v\\u00e1lido\",\"f_err_tel\":\"Introduce un tel\\u00e9fono v\\u00e1lido (m\\u00ednimo 9 d\\u00edgitos)\",\"f_r_immoble\":\"Inmueble\",\"f_r_sol\":\"Solicitantes\",\"f_r_estalvis\":\"Ahorros\",\"f_r_contacte\":\"Contacto\",\"f_r_provincia\":\"Provincia\",\"f_r_preu\":\"Precio\",\"f_r_motiu\":\"Motivo\",\"f_r_moment\":\"Momento\",\"f_r_sol1\":\"Solicitante 1\",\"f_r_sol2\":\"Solicitante 2\",\"f_r_ingr1\":\"Ingresos S1\",\"f_r_ingr2\":\"Ingresos S2\",\"f_r_total_ingr\":\"Total ingresos\",\"f_r_quotes\":\"Cuotas actuales\",\"f_r_est_key\":\"Ahorros disponibles\",\"f_r_nom\":\"Nombre\",\"f_r_email\":\"Email\",\"f_r_tel\":\"Tel\\u00e9fono\",\"f_check_com\":\"Acepto recibir comunicaciones comerciales de aHipotecas\",\"f_check_priv1\":\"He le\\u00eddo y acepto la\",\"f_check_priv2\":\"pol\\u00edtica de privacidad\",\"f_err_priv\":\"Acepta la pol\\u00edtica de privacidad para continuar\",\"f_btn_back\":\"Atr\\u00e1s\",\"f_btn_next\":\"Siguiente\",\"f_btn_send\":\"Enviar solicitud\",\"f_btn_sending\":\"Enviando\\u2026\",\"f_success_title\":\"\\u00a1Solicitud enviada!\",\"f_success_text\":\"Un especialista de Hipotecas se pondr\\u00e1 en contacto contigo en menos de 24 horas para estudiar tu hipoteca personalizada.\",\"f_success_badge\":\"Te llamamos en menos de 24h\",\"f_err_conn\":\"Error de conexi\\u00f3n. Int\\u00e9ntalo de nuevo.\",\"f_pas\":\"Paso\",\"f_de\":\"de\",\"f_anys\":\"a\\u00f1os\",\"f_mes\":\"\\u20ac\\\/mes\",\"f_si\":\"Si\",\"f_no\":\"No\",\"h_title\":\"Consigue la mejor hipoteca con Hipotecas\",\"h_label_preu\":\"Precio del inmueble\",\"h_label_prov\":\"Provincia\",\"h_cta\":\"Solicita tu estudio ahora\",\"h_select_def\":\"Selecciona\\u2026\",\"h_slider_min\":\"50.000 \\u20ac\",\"h_slider_max\":\"800.000 \\u20ac\",\"provincies\":[\"\\u00c1lava\",\"Albacete\",\"Alicante\",\"Almer\\u00eda\",\"Asturias\",\"\\u00c1vila\",\"Badajoz\",\"Islas Baleares\",\"Barcelona\",\"Vizcaya\",\"Burgos\",\"C\\u00e1ceres\",\"C\\u00e1diz\",\"Cantabria\",\"Castell\\u00f3n\",\"Ceuta\",\"Ciudad Real\",\"C\\u00f3rdoba\",\"Cuenca\",\"Gerona\",\"Granada\",\"Guadalajara\",\"Gipuzkoa\",\"Huelva\",\"Huesca\",\"Ja\\u00e9n\",\"La Coru\\u00f1a\",\"La Rioja\",\"Las Palmas\",\"Lleida\",\"Le\\u00f3n\",\"Lugo\",\"Madrid\",\"M\\u00e1laga\",\"Melilla\",\"Murcia\",\"Navarra\",\"Orense\",\"Palencia\",\"Pontevedra\",\"Salamanca\",\"Santa Cruz de Tenerife\",\"Segovia\",\"Sevilla\",\"Soria\",\"Tarragona\",\"Teruel\",\"Toledo\",\"Valencia\",\"Valladolid\",\"Zamora\",\"Zaragoza\"]};\n  var PROVINCIES = S.provincies;\n\n  if (!ROOT) return;\n\n  function $f(attr) { return ROOT.querySelector('[data-form=\"' + attr + '\"]'); }\n\n  \/* \u2500\u2500\u2500 DATA \u2500\u2500\u2500 *\/\n  var STEPS = [\n    { label: S.f_step1_label, title: S.f_step1_title, icon: '<path d=\"M3 9l9-7 9 7v11a2 2 0 01-2 2H5a2 2 0 01-2-2z\"><\/path><polyline points=\"9 22 9 12 15 12 15 22\"><\/polyline>' },\n    { label: S.f_step2_label, title: S.f_step2_title, icon: '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"><\/rect><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"><\/line><line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"><\/line>' },\n    { label: S.f_step3_label, title: S.f_step3_title, icon: '<line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"23\"><\/line><path d=\"M17 5H9.5a3.5 3.5 0 000 7h5a3.5 3.5 0 010 7H6\"><\/path>' },\n    { label: S.f_step4_label, title: S.f_step4_title, icon: '<path d=\"M20 21v-2a4 4 0 00-4-4H8a4 4 0 00-4 4v2\"><\/path><circle cx=\"12\" cy=\"7\" r=\"4\"><\/circle>' },\n    { label: S.f_step5_label, title: S.f_step5_title, icon: '<polyline points=\"20 6 9 17 4 12\"><\/polyline>' },\n  ];\n\n  var currentStep = 0;\n  var direction   = 1;\n  var formData = {\n    provincia: '',\n    preu:      '',\n    motiu: '', moment: '',\n    numSolicitats: 1,\n    s1: { situacio: '', edat: '', ingressos: '', quotes: '' },\n    s2: { situacio: '', edat: '', ingressos: '', quotes: '' },\n    estalvis: null, quantitatEstalvis: '',\n    nom: '', email: '', telefon: '',\n    acceptaCom: false, acceptaPriv: false,\n  };\n\n  \/* \u2500\u2500\u2500 PROGRESS \u2500\u2500\u2500 *\/\n  function renderProgress() {\n    var stepsEl = $f('progress-steps');\n    stepsEl.innerHTML = '';\n    STEPS.forEach(function(s, i) {\n      var node = document.createElement('div');\n      node.className = 'step-node';\n      var cClass = i < currentStep ? 'done' : i === currentStep ? 'active' : '';\n      var lClass = i < currentStep ? 'done' : i === currentStep ? 'active' : '';\n      var inner  = i < currentStep\n        ? '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg>'\n        : (i + 1);\n      node.innerHTML =\n        '<div class=\"step-circle ' + cClass + '\">' + inner + '<\/div>' +\n        '<div class=\"step-label '  + lClass + '\">' + s.label + '<\/div>';\n      stepsEl.appendChild(node);\n      if (i < STEPS.length - 1) {\n        var conn = document.createElement('div');\n        conn.className = 'step-connector' + (i < currentStep ? ' done' : '');\n        stepsEl.appendChild(conn);\n      }\n    });\n    $f('progress-fill').style.width = ((currentStep + 1) \/ STEPS.length * 100) + '%';\n\n    \/* Label mobile *\/\n    var stepText = $f('progress-step-text');\n    var stepName = $f('progress-step-name');\n    if (stepText) stepText.innerHTML = '<strong>' + S.f_pas + ' ' + (currentStep + 1) + '<\/strong> ' + S.f_de + ' ' + STEPS.length;\n    if (stepName) stepName.textContent = STEPS[currentStep].label;\n  }\n\n  \/* \u2500\u2500\u2500 CARD HEADER \u2500\u2500\u2500 *\/\n  function renderHeader() {\n    var s = STEPS[currentStep];\n    $f('header-label').textContent   = S.f_pas + ' ' + (currentStep + 1) + ' ' + S.f_de + ' ' + STEPS.length;\n    $f('header-title').textContent   = s.title;\n    $f('header-counter').textContent = (currentStep + 1) + '\/' + STEPS.length;\n    $f('header-icon').innerHTML      = s.icon;\n  }\n\n  \/* \u2500\u2500\u2500 STEP HTML BUILDERS \u2500\u2500\u2500 *\/\n  function optionsHtml(list, current) {\n    return list.map(function(o) {\n      return '<option value=\"' + o + '\"' + (current === o ? ' selected' : '') + '>' + o + '<\/option>';\n    }).join('');\n  }\n\n  function renderStep1() {\n    var motius  = [S.f_motiu_1, S.f_motiu_2, S.f_motiu_3, S.f_motiu_4, S.f_motiu_5];\n    var moments = [S.f_moment_1, S.f_moment_2, S.f_moment_3];\n    return '<div class=\"form-grid\">' +\n      '<div class=\"form-group\">' +\n        '<label class=\"form-label\">' + S.f_provincia + '<span class=\"req\">*<\/span><\/label>' +\n        '<select class=\"form-select\" id=\"f-provincia\">' +\n          '<option value=\"\">' + S.f_select_def + '<\/option>' +\n          optionsHtml(PROVINCIES, formData.provincia) +\n        '<\/select>' +\n        '<span class=\"form-error\" id=\"e-provincia\">' + S.f_err_provincia + '<\/span>' +\n      '<\/div>' +\n      '<div class=\"form-group\">' +\n        '<label class=\"form-label\">' + S.f_preu + '<span class=\"req\">*<\/span><\/label>' +\n        '<input class=\"form-input\" type=\"number\" id=\"f-preu\" placeholder=\"Ex: 250000\" value=\"' + formData.preu + '\">' +\n        '<span class=\"form-error\" id=\"e-preu\">' + S.f_err_preu + '<\/span>' +\n      '<\/div>' +\n      '<div class=\"form-group full\">' +\n        '<label class=\"form-label\">' + S.f_motiu_q + '<span class=\"req\">*<\/span><\/label>' +\n        '<select class=\"form-select\" id=\"f-motiu\">' +\n          '<option value=\"\">' + S.f_select_def + '<\/option>' +\n          optionsHtml(motius, formData.motiu) +\n        '<\/select>' +\n        '<span class=\"form-error\" id=\"e-motiu\">' + S.f_err_select + '<\/span>' +\n      '<\/div>' +\n      '<div class=\"form-group full\">' +\n        '<label class=\"form-label\">' + S.f_moment_q + '<span class=\"req\">*<\/span><\/label>' +\n        '<div class=\"radio-pills\" id=\"rp-moment\">' +\n          moments.map(function(o) {\n            return '<label class=\"radio-pill' + (formData.moment === o ? ' active' : '') + '\">' +\n              '<input type=\"radio\" name=\"moment\" value=\"' + o + '\">' +\n              '<div class=\"radio-pill-dot\"><\/div>' + o + '<\/label>';\n          }).join('') +\n        '<\/div>' +\n        '<span class=\"form-error\" id=\"e-moment\">' + S.f_err_select + '<\/span>' +\n      '<\/div>' +\n    '<\/div>';\n  }\n\n  function solicitantFields(idx) {\n    var d = formData['s' + idx];\n    var sits = [S.f_sit_1, S.f_sit_2, S.f_sit_3, S.f_sit_4, S.f_sit_5, S.f_sit_6];\n    return '<div class=\"solicitant-body\">' +\n      '<div class=\"form-grid\">' +\n        '<div class=\"form-group full\">' +\n          '<label class=\"form-label\">' + S.f_situacio + '<span class=\"req\">*<\/span><\/label>' +\n          '<select class=\"form-select s-situacio\" data-idx=\"' + idx + '\">' +\n            '<option value=\"\">' + S.f_select_def + '<\/option>' +\n            optionsHtml(sits, d.situacio) +\n          '<\/select>' +\n          '<span class=\"form-error\" id=\"e-s' + idx + '-situacio\">' + S.f_err_required + '<\/span>' +\n        '<\/div>' +\n        '<div class=\"form-group\">' +\n          '<label class=\"form-label\">' + S.f_edat + '<span class=\"req\">*<\/span><\/label>' +\n          '<input class=\"form-input s-edat\" type=\"number\" data-idx=\"' + idx + '\" placeholder=\"' + S.f_ph_edat + '\" value=\"' + d.edat + '\" min=\"18\" max=\"80\">' +\n          '<span class=\"form-error\" id=\"e-s' + idx + '-edat\">' + S.f_err_edat + '<\/span>' +\n        '<\/div>' +\n        '<div class=\"form-group\">' +\n          '<label class=\"form-label\">' + S.f_ingressos + '<span class=\"req\">*<\/span><\/label>' +\n          '<input class=\"form-input s-ingressos\" type=\"number\" data-idx=\"' + idx + '\" placeholder=\"' + S.f_ph_ingr + '\" value=\"' + d.ingressos + '\">' +\n          '<span class=\"form-error\" id=\"e-s' + idx + '-ingressos\">' + S.f_err_required + '<\/span>' +\n        '<\/div>' +\n        '<div class=\"form-group full\">' +\n          '<label class=\"form-label\">' + S.f_quotes + ' <span style=\"font-weight:500;color:var(--muted)\">' + S.f_opcional + '<\/span><\/label>' +\n          '<input class=\"form-input s-quotes\" type=\"number\" data-idx=\"' + idx + '\" placeholder=\"' + S.f_ph_quot + '\" value=\"' + d.quotes + '\">' +\n        '<\/div>' +\n      '<\/div>' +\n    '<\/div>';\n  }\n\n  function renderStep2() {\n    return '<div class=\"form-group\" style=\"margin-bottom:20px\">' +\n        '<label class=\"form-label\">' + S.f_num_sol + '<span class=\"req\">*<\/span><\/label>' +\n        '<div class=\"toggle-group\" style=\"margin-top:4px\">' +\n          '<button class=\"toggle-btn' + (formData.numSolicitats===1?' active':'') + '\" data-tog=\"1\">1<span>' + S.f_sol_sing + '<\/span><\/button>' +\n          '<button class=\"toggle-btn' + (formData.numSolicitats===2?' active':'') + '\" data-tog=\"2\">2<span>' + S.f_sol_plur + '<\/span><\/button>' +\n        '<\/div>' +\n      '<\/div>' +\n      '<div class=\"solicitant-bloc\">' +\n        '<div class=\"solicitant-bloc-header\"><div class=\"solicitant-num\">1<\/div><div class=\"solicitant-title\">' + S.f_sol1_title + '<\/div><\/div>' +\n        solicitantFields(1) +\n      '<\/div>' +\n      '<div id=\"bloc-s2\" style=\"margin-top:14px;overflow:hidden;transition:max-height 0.45s cubic-bezier(0.4,0,0.2,1),opacity 0.35s ease;max-height:' + (formData.numSolicitats===2?'800px':'0') + ';opacity:' + (formData.numSolicitats===2?'1':'0') + '\">' +\n        '<div class=\"solicitant-bloc\">' +\n          '<div class=\"solicitant-bloc-header\"><div class=\"solicitant-num\">2<\/div><div class=\"solicitant-title\">' + S.f_sol2_title + '<\/div><\/div>' +\n          solicitantFields(2) +\n        '<\/div>' +\n      '<\/div>';\n  }\n\n  function renderStep3() {\n    return '<div class=\"form-group\" style=\"margin-bottom:20px\">' +\n        '<label class=\"form-label\">' + S.f_estalvis_q + '<span class=\"req\">*<\/span><\/label>' +\n        '<div class=\"radio-pills\" id=\"rp-estalvis\" style=\"margin-top:6px\">' +\n          '<label class=\"radio-pill' + (formData.estalvis===false?' active':'') + '\">' +\n            '<input type=\"radio\" name=\"estalvis\" value=\"no\"><div class=\"radio-pill-dot\"><\/div>' + S.f_est_no + '<\/label>' +\n          '<label class=\"radio-pill' + (formData.estalvis===true?' active':'') + '\">' +\n            '<input type=\"radio\" name=\"estalvis\" value=\"si\"><div class=\"radio-pill-dot\"><\/div>' + S.f_est_si + '<\/label>' +\n        '<\/div>' +\n        '<span class=\"form-error\" id=\"e-estalvis\">' + S.f_err_select + '<\/span>' +\n      '<\/div>' +\n      '<div class=\"estalvis-container' + (formData.estalvis===true?' open':'') + '\" id=\"estalvis-container\">' +\n        '<div style=\"padding-bottom:8px\">' +\n          '<div class=\"form-group\">' +\n            '<label class=\"form-label\">' + S.f_quant_est + '<\/label>' +\n            '<input class=\"form-input\" type=\"number\" id=\"f-quantitat-estalvis\" placeholder=\"Ex: 50000\" value=\"' + formData.quantitatEstalvis + '\">' +\n          '<\/div>' +\n        '<\/div>' +\n      '<\/div>';\n  }\n\n  function renderStep4() {\n    return '<div class=\"form-grid cols-1\">' +\n      '<div class=\"form-group\">' +\n        '<label class=\"form-label\">' + S.f_nom + '<span class=\"req\">*<\/span><\/label>' +\n        '<input class=\"form-input\" type=\"text\" id=\"f-nom\" placeholder=\"' + S.f_ph_nom + '\" value=\"' + formData.nom + '\" autocomplete=\"name\">' +\n        '<span class=\"form-error\" id=\"e-nom\">' + S.f_err_nom + '<\/span>' +\n      '<\/div>' +\n      '<div class=\"form-group\">' +\n        '<label class=\"form-label\">' + S.f_email + '<span class=\"req\">*<\/span><\/label>' +\n        '<input class=\"form-input\" type=\"email\" id=\"f-email\" placeholder=\"' + S.f_ph_email + '\" value=\"' + formData.email + '\" autocomplete=\"email\">' +\n        '<span class=\"form-error\" id=\"e-email\">' + S.f_err_email + '<\/span>' +\n      '<\/div>' +\n      '<div class=\"form-group\">' +\n        '<label class=\"form-label\">' + S.f_telefon + '<span class=\"req\">*<\/span><\/label>' +\n        '<input class=\"form-input\" type=\"tel\" id=\"f-telefon\" placeholder=\"' + S.f_ph_tel + '\" value=\"' + formData.telefon + '\" autocomplete=\"tel\">' +\n        '<span class=\"form-error\" id=\"e-telefon\">' + S.f_err_tel + '<\/span>' +\n      '<\/div>' +\n    '<\/div>';\n  }\n\n  function resumRow(key, val) {\n    if (!val && val !== 0) return '';\n    return '<div class=\"resum-row\"><span class=\"resum-key\">' + key + '<\/span><span class=\"resum-val\">' + val + '<\/span><\/div>';\n  }\n\n  function renderStep5() {\n    var totalIngressos = (parseFloat(formData.s1.ingressos)||0) + (formData.numSolicitats===2 ? parseFloat(formData.s2.ingressos)||0 : 0);\n    var totalQuotes    = (parseFloat(formData.s1.quotes)||0)   + (formData.numSolicitats===2 ? parseFloat(formData.s2.quotes)||0   : 0);\n    var checkSvg = '<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" stroke-width=\"3\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg>';\n\n    return '<div class=\"resum-section\">' +\n      '<div class=\"resum-bloc\">' +\n        '<div class=\"resum-bloc-header\">' + S.f_r_immoble + '<\/div>' +\n        '<div class=\"resum-bloc-body\">' +\n          resumRow(S.f_r_provincia, formData.provincia) +\n          resumRow(S.f_r_preu,     formData.preu ? Number(formData.preu).toLocaleString('ca-ES') + ' \u20ac' : '') +\n          resumRow(S.f_r_motiu,    formData.motiu) +\n          resumRow(S.f_r_moment,   formData.moment) +\n        '<\/div>' +\n      '<\/div>' +\n      '<div class=\"resum-bloc\">' +\n        '<div class=\"resum-bloc-header\">' + S.f_r_sol + ' (' + formData.numSolicitats + ')<\/div>' +\n        '<div class=\"resum-bloc-body\">' +\n          resumRow(S.f_r_sol1, formData.s1.situacio + (formData.s1.edat ? ', ' + formData.s1.edat + ' ' + S.f_anys : '')) +\n          (formData.s1.ingressos ? resumRow(S.f_r_ingr1, Number(formData.s1.ingressos).toLocaleString('ca-ES') + ' ' + S.f_mes) : '') +\n          (formData.numSolicitats===2 ? resumRow(S.f_r_sol2, formData.s2.situacio + (formData.s2.edat ? ', ' + formData.s2.edat + ' ' + S.f_anys : '')) : '') +\n          (formData.numSolicitats===2 && formData.s2.ingressos ? resumRow(S.f_r_ingr2, Number(formData.s2.ingressos).toLocaleString('ca-ES') + ' ' + S.f_mes) : '') +\n          (totalIngressos > 0 ? resumRow(S.f_r_total_ingr, Number(totalIngressos).toLocaleString('ca-ES') + ' ' + S.f_mes) : '') +\n          (totalQuotes    > 0 ? resumRow(S.f_r_quotes,     Number(totalQuotes).toLocaleString('ca-ES')    + ' ' + S.f_mes) : '') +\n        '<\/div>' +\n      '<\/div>' +\n      '<div class=\"resum-bloc\">' +\n        '<div class=\"resum-bloc-header\">' + S.f_r_estalvis + '<\/div>' +\n        '<div class=\"resum-bloc-body\">' +\n          resumRow(S.f_r_est_key, formData.estalvis ? (formData.quantitatEstalvis ? Number(formData.quantitatEstalvis).toLocaleString('ca-ES') + ' \u20ac' : S.f_si) : S.f_no) +\n        '<\/div>' +\n      '<\/div>' +\n      '<div class=\"resum-bloc\">' +\n        '<div class=\"resum-bloc-header\">' + S.f_r_contacte + '<\/div>' +\n        '<div class=\"resum-bloc-body\">' +\n          resumRow(S.f_r_nom,   formData.nom) +\n          resumRow(S.f_r_email, formData.email) +\n          resumRow(S.f_r_tel,   formData.telefon) +\n        '<\/div>' +\n      '<\/div>' +\n    '<\/div>' +\n    '<div class=\"section-divider\" style=\"margin:20px 0 16px\"><\/div>' +\n    '<div class=\"checks-section\">' +\n      '<label class=\"check-item\" id=\"check-com-label\">' +\n        '<div class=\"check-box' + (formData.acceptaCom ? ' checked' : '') + '\" id=\"check-com\">' +\n          (formData.acceptaCom ? checkSvg : '') +\n        '<\/div>' +\n        '<span class=\"check-label\">' + S.f_check_com + '<\/span>' +\n      '<\/label>' +\n      '<label class=\"check-item\" id=\"check-priv-label\">' +\n        '<div class=\"check-box' + (formData.acceptaPriv ? ' checked' : '') + '\" id=\"check-priv\">' +\n          (formData.acceptaPriv ? checkSvg : '') +\n        '<\/div>' +\n        '<span class=\"check-label\">' + S.f_check_priv1 + ' <a href=\"#\" onclick=\"return false\">' + S.f_check_priv2 + '<\/a> <span style=\"color:var(--error);font-weight:700\">*<\/span><\/span>' +\n      '<\/label>' +\n      '<span class=\"form-error\" id=\"e-priv\">' + S.f_err_priv + '<\/span>' +\n    '<\/div>';\n  }\n\n  \/* \u2500\u2500\u2500 MAIN RENDER \u2500\u2500\u2500 *\/\n  function render(dir) {\n    direction = dir || 1;\n    renderProgress();\n    renderHeader();\n\n    var body = $f('card-body');\n    body.className = 'card-body';\n    void body.offsetWidth;\n\n    var renderers = [renderStep1, renderStep2, renderStep3, renderStep4, renderStep5];\n    body.innerHTML = renderers[currentStep]();\n    body.className = 'card-body ' + (direction > 0 ? 'animate-right' : 'animate-left');\n\n    var backBtn = $f('btn-back');\n    backBtn.disabled = currentStep === 0;\n\n    var nextBtn = $f('btn-next');\n    if (currentStep === STEPS.length - 1) {\n      nextBtn.innerHTML = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg> ' + S.f_btn_send;\n      nextBtn.className = 'btn-next accent';\n    } else {\n      nextBtn.innerHTML = S.f_btn_next + ' <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"9 18 15 12 9 6\"><\/polyline><\/svg>';\n      nextBtn.className = 'btn-next';\n    }\n\n    bindStepEvents();\n  }\n\n  \/* \u2500\u2500\u2500 BIND STEP EVENTS \u2500\u2500\u2500 *\/\n  function bindStepEvents() {\n    var body = $f('card-body');\n\n    if (currentStep === 0) {\n      body.querySelectorAll('#rp-moment .radio-pill').forEach(function(pill) {\n        pill.addEventListener('click', function() {\n          body.querySelectorAll('#rp-moment .radio-pill').forEach(function(p) { p.classList.remove('active'); });\n          pill.classList.add('active');\n          formData.moment = pill.querySelector('input').value;\n        });\n      });\n    }\n\n    if (currentStep === 1) {\n      body.querySelectorAll('.toggle-btn').forEach(function(btn) {\n        btn.addEventListener('click', function() {\n          var n = parseInt(btn.dataset.tog, 10);\n          formData.numSolicitats = n;\n          body.querySelectorAll('.toggle-btn').forEach(function(b) { b.classList.toggle('active', parseInt(b.dataset.tog,10) === n); });\n          var bloc = body.querySelector('#bloc-s2');\n          if (n === 2) { bloc.style.maxHeight = '800px'; bloc.style.opacity = '1'; }\n          else         { bloc.style.maxHeight = '0';     bloc.style.opacity = '0'; }\n        });\n      });\n      body.querySelectorAll('.s-situacio').forEach(function(el) { el.addEventListener('change', function(e) { formData['s'+e.target.dataset.idx].situacio  = e.target.value; }); });\n      body.querySelectorAll('.s-edat').forEach(function(el)     { el.addEventListener('input',  function(e) { formData['s'+e.target.dataset.idx].edat      = e.target.value; }); });\n      body.querySelectorAll('.s-ingressos').forEach(function(el){ el.addEventListener('input',  function(e) { formData['s'+e.target.dataset.idx].ingressos = e.target.value; }); });\n      body.querySelectorAll('.s-quotes').forEach(function(el)   { el.addEventListener('input',  function(e) { formData['s'+e.target.dataset.idx].quotes    = e.target.value; }); });\n    }\n\n    if (currentStep === 2) {\n      body.querySelectorAll('#rp-estalvis .radio-pill').forEach(function(pill) {\n        pill.addEventListener('click', function() {\n          body.querySelectorAll('#rp-estalvis .radio-pill').forEach(function(p) { p.classList.remove('active'); });\n          pill.classList.add('active');\n          formData.estalvis = pill.querySelector('input').value === 'si';\n          body.querySelector('#estalvis-container').classList.toggle('open', formData.estalvis);\n        });\n      });\n      var qEl = body.querySelector('#f-quantitat-estalvis');\n      if (qEl) qEl.addEventListener('input', function(e) { formData.quantitatEstalvis = e.target.value; });\n    }\n\n    if (currentStep === 4) {\n      var checkSvg = '<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" stroke-width=\"3\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg>';\n      body.querySelector('#check-com-label').addEventListener('click', function() {\n        formData.acceptaCom = !formData.acceptaCom;\n        var box = body.querySelector('#check-com');\n        box.classList.toggle('checked', formData.acceptaCom);\n        box.innerHTML = formData.acceptaCom ? checkSvg : '';\n      });\n      body.querySelector('#check-priv-label').addEventListener('click', function() {\n        formData.acceptaPriv = !formData.acceptaPriv;\n        var box = body.querySelector('#check-priv');\n        box.classList.toggle('checked', formData.acceptaPriv);\n        box.innerHTML = formData.acceptaPriv ? checkSvg : '';\n      });\n    }\n  }\n\n  \/* \u2500\u2500\u2500 VALIDATION \u2500\u2500\u2500 *\/\n  function showError(id, show) {\n    var el = ROOT.querySelector('#' + id);\n    if (el) el.classList.toggle('visible', show);\n    return show;\n  }\n  function markField(id, error) {\n    var el = ROOT.querySelector('#' + id);\n    if (el) el.classList.toggle('error', error);\n    return error;\n  }\n  function markFieldSel(selector, error) {\n    var el = ROOT.querySelector(selector);\n    if (el) el.classList.toggle('error', error);\n    return error;\n  }\n\n  function validate() {\n    var ok = true;\n    var body = $f('card-body');\n\n    if (currentStep === 0) {\n      formData.provincia = body.querySelector('#f-provincia').value;\n      formData.preu      = body.querySelector('#f-preu').value;\n      formData.motiu     = body.querySelector('#f-motiu').value;\n      if (showError('e-provincia', !formData.provincia) | markField('f-provincia', !formData.provincia)) ok = false;\n      var preuInvalid = !formData.preu || Number(formData.preu) <= 0;\n      if (showError('e-preu', preuInvalid) | markField('f-preu', preuInvalid)) ok = false;\n      if (showError('e-motiu',   !formData.motiu)   | markField('f-motiu',   !formData.motiu))   ok = false;\n      if (showError('e-moment',  !formData.moment))  ok = false;\n    }\n\n    if (currentStep === 1) {\n      function valSol(idx) {\n        if (idx === 2 && formData.numSolicitats === 1) return true;\n        var d  = formData['s' + idx];\n        var ok = true;\n        if (showError('e-s' + idx + '-situacio', !d.situacio) | markFieldSel('.s-situacio[data-idx=\"'+idx+'\"]', !d.situacio)) ok = false;\n        var edatOk = d.edat && Number(d.edat) >= 18 && Number(d.edat) <= 80;\n        if (showError('e-s' + idx + '-edat', !edatOk))                     ok = false;\n        if (showError('e-s' + idx + '-ingressos', !d.ingressos || Number(d.ingressos) <= 0)) ok = false;\n        return ok;\n      }\n      if (!valSol(1) || !valSol(2)) ok = false;\n    }\n\n    if (currentStep === 2) {\n      if (showError('e-estalvis', formData.estalvis === null)) ok = false;\n    }\n\n    if (currentStep === 3) {\n      formData.nom     = body.querySelector('#f-nom').value.trim();\n      formData.email   = body.querySelector('#f-email').value.trim();\n      formData.telefon = body.querySelector('#f-telefon').value.trim();\n      var emailOk = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(formData.email);\n      var telOk   = formData.telefon.replace(\/\\s\/g,'').length >= 9;\n      if (showError('e-nom',     !formData.nom)  | markField('f-nom',     !formData.nom))  ok = false;\n      if (showError('e-email',   !emailOk)        | markField('f-email',   !emailOk))        ok = false;\n      if (showError('e-telefon', !telOk)          | markField('f-telefon', !telOk))          ok = false;\n    }\n\n    if (currentStep === 4) {\n      if (showError('e-priv', !formData.acceptaPriv)) ok = false;\n    }\n\n    return ok;\n  }\n\n  \/* \u2500\u2500\u2500 SUBMIT \u2500\u2500\u2500 *\/\n  function submitForm() {\n    var nextBtn = $f('btn-next');\n    nextBtn.disabled   = true;\n    nextBtn.textContent = S.f_btn_sending;\n\n    var payload = new FormData();\n    payload.append('action', 'ahipoteques_submit_form');\n    payload.append('nonce',  NONCE);\n    payload.append('dades',  JSON.stringify(formData));\n\n    fetch(AJAX_URL, { method: 'POST', body: payload })\n      .then(function(r) { return r.json(); })\n      .then(function(res) {\n        if (res.success) showSuccess();\n        else             showSubmitError(res.data && res.data.message ? res.data.message : S.f_err_conn);\n      })\n      .catch(function() { showSubmitError(S.f_err_conn); });\n  }\n\n  function showSuccess() {\n    $f('card-footer').style.display = 'none';\n    $f('card-header').style.display = 'none';\n    ROOT.querySelector('.progress-wrap').style.opacity = '0.4';\n\n    $f('card-body').innerHTML =\n      '<div class=\"success-screen\">' +\n        '<div class=\"success-icon\">' +\n          '<svg width=\"36\" height=\"36\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" stroke-width=\"2.5\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg>' +\n        '<\/div>' +\n        '<div class=\"success-title\">' + S.f_success_title + '<\/div>' +\n        '<div class=\"success-text\">' + S.f_success_text + '<\/div>' +\n        '<div class=\"success-badge\">' +\n          '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M22 16.92v3a2 2 0 01-2.18 2 19.79 19.79 0 01-8.63-3.07A19.5 19.5 0 013.93 9.11a19.79 19.79 0 01-3.07-8.67A2 2 0 012.84 2h3a2 2 0 012 1.72c.12.96.36 1.9.7 2.81a2 2 0 01-.45 2.11L6.91 9.91a16 16 0 006.18 6.18l1.27-1.27a2 2 0 012.11-.45c.91.34 1.85.58 2.81.7A2 2 0 0122 16.92z\"><\/path><\/svg>' +\n          S.f_success_badge +\n        '<\/div>' +\n      '<\/div>';\n  }\n\n  function showSubmitError(msg) {\n    var nextBtn = $f('btn-next');\n    nextBtn.disabled   = false;\n    nextBtn.innerHTML  = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg> ' + S.f_btn_send;\n    nextBtn.className  = 'btn-next accent';\n\n    var body = $f('card-body');\n    var existing = body.querySelector('.ahip-submit-error');\n    if (existing) existing.remove();\n    var errEl = document.createElement('div');\n    errEl.className = 'ahip-submit-error';\n    errEl.style.cssText = 'color:#e05353;font-size:13px;font-weight:600;margin-top:12px;text-align:center;padding:10px;background:#fff5f5;border-radius:8px;border:1px solid #fca5a5;';\n    errEl.textContent = msg;\n    body.appendChild(errEl);\n  }\n\n  \/* \u2500\u2500\u2500 NAVIGATION \u2500\u2500\u2500 *\/\n  $f('btn-next').addEventListener('click', function() {\n    if (!validate()) return;\n    if (currentStep === STEPS.length - 1) { submitForm(); return; }\n    currentStep++;\n    render(1);\n    ROOT.scrollIntoView({ behavior: 'smooth', block: 'start' });\n  });\n\n  $f('btn-back').addEventListener('click', function() {\n    if (currentStep === 0) return;\n    currentStep--;\n    render(-1);\n    ROOT.scrollIntoView({ behavior: 'smooth', block: 'start' });\n  });\n\n  \/* \u2500\u2500\u2500 INIT \u2500\u2500\u2500 *\/\n  render(1);\n})();\n<\/script>\n<\/div>\n\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\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Inicie su solicitud Rellene sus datos para que podamos iniciar su estudio.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-1047","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ahipoteques.com\/es\/wp-json\/wp\/v2\/pages\/1047","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ahipoteques.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ahipoteques.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ahipoteques.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ahipoteques.com\/es\/wp-json\/wp\/v2\/comments?post=1047"}],"version-history":[{"count":1,"href":"https:\/\/ahipoteques.com\/es\/wp-json\/wp\/v2\/pages\/1047\/revisions"}],"predecessor-version":[{"id":1048,"href":"https:\/\/ahipoteques.com\/es\/wp-json\/wp\/v2\/pages\/1047\/revisions\/1048"}],"wp:attachment":[{"href":"https:\/\/ahipoteques.com\/es\/wp-json\/wp\/v2\/media?parent=1047"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}