{"id":43498,"date":"2025-10-06T16:55:23","date_gmt":"2025-10-06T14:55:23","guid":{"rendered":"https:\/\/staging.europe-hotels.org\/?post_type=e-floating-buttons&#038;p=43498"},"modified":"2025-11-05T14:35:04","modified_gmt":"2025-11-05T13:35:04","slug":"booking-desktop-de","status":"publish","type":"e-floating-buttons","link":"https:\/\/www.europe-hotels.org\/de\/e-floating-buttons\/booking-desktop-de\/","title":{"rendered":"Booking Desktop DE"},"content":{"rendered":"\t\t<div data-elementor-type=\"floating-buttons\" data-elementor-id=\"43498\" class=\"elementor elementor-43498\" data-elementor-post-type=\"e-floating-buttons\">\n\t\t\t<div class=\"elementor-element elementor-element-7e6649eb e-flex e-con-boxed e-con e-parent\" data-id=\"7e6649eb\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;jet_parallax_layout_list&quot;:[]}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-495870fb elementor-hidden-tablet elementor-hidden-mobile elementor-widget elementor-widget-html\" data-id=\"495870fb\" data-element_type=\"widget\" data-e-type=\"widget\" data-no-translation=\"\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\n    \/* reset seguro para los botones del widget *\/\n    #beWidgetDE .be-cta,\n    #beWidgetDE .be-btn,\n    #beWidgetDE .occ-head,\n    #beWidgetDE .cal-arrow,\n    #beWidgetDE .occ-ok,\n    #beWidgetDE .st-btn,\n    #beWidgetDE .be-x {\n      all: unset;\n      box-sizing: border-box;\n      font: inherit;\n      cursor: pointer;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n    }\n\n    #beWidgetDE svg {\n      fill: #001D7E;\n    }\n\n    \/* ===== Encapsulado \/ mini reset (solo dentro de #beWidgetDE) ===== *\/\n    #beWidgetDE,\n    #beWidgetDE * {\n      box-sizing: border-box;\n    }\n\n    #beWidgetDE button,\n    #beWidgetDE input,\n    #beWidgetDE select {\n      font: inherit;\n    }\n\n    #beWidgetDE button {\n      appearance: none;\n      -webkit-appearance: none;\n    }\n\n    #beWidgetDE svg {\n      vertical-align: middle;\n    }\n\n    \/* Variables *\/\n    #beWidgetDE {\n      --brand: #001D7E;\n      --brand-600: #2b3b6a;\n      --text: #646464;\n      --border: #e6e6e7;\n      --shadow: 0 10px 35px rgba(0, 0, 0, .12);\n      --muted: #f5f6f8;\n      --ring: #eaf0ff;\n    }\n\n    \/* ===== Barra flotante ===== *\/\n    #beWidgetDE .be-floating-bar {\n      position: fixed !important;\n      left: 50%;\n      transform: translateX(-50%);\n      bottom: 120px;\n      z-index: 99990 !important;\n      width: min(1200px, 92vw);\n      background: #fff;\n      border-radius: 14px;\n      box-shadow: var(--shadow);\n      display: grid !important;\n      grid-template-columns: 1fr 1.2fr 1fr .9fr .9fr;\n      font-family: inherit;\n      color: var(--text);\n    }\n\n    #beWidgetDE .be-seg {\n      display: flex !important;\n      align-items: center;\n      gap: .6rem;\n      background: #fff;\n      border: 1px solid #fff;\n      border-radius: 12px;\n      padding: 5px 10px;\n      cursor: pointer;\n    }\n\n    #beWidgetDE .be-value {\n      font-weight: 500;\n      line-height: 1.15;\n      color: var(--brand)\n    }\n\n    #beWidgetDE .be-cta {\n      background: var(--brand) !important;\n      color: #fff !important;\n      border: none;\n      border-radius: 0 12px 12px 0;\n      font-weight: 700;\n      cursor: pointer;\n      text-align: center;\n      padding: 1rem;\n      min-height: 52px;\n      line-height: 1;\n    }\n\n    #beWidgetDE .be-cta:hover {\n      filter: brightness(.96)\n    }\n\n    #beWidgetDE .be-promo {\n      width: 100%;\n      border: none;\n      outline: none;\n      font-weight: 600;\n      color: var(--brand);\n    }\n\n    #beWidgetDE .be-icon {\n      width: 22px;\n      height: 22px;\n      flex: 0 0 22px;\n      opacity: .9;\n      fill: var(--brand)\n    }\n\n    #beWidgetDE .be-mono {\n      display: flex;\n      flex-direction: column;\n      gap: .25rem\n    }\n\n    \/* ===== Modales ===== *\/\n\n    #beWidgetDE #beModalHotel {\n      min-width: 350px;\n    }\n\n    #beWidgetDE .be-modal-backdrop {\n      position: fixed;\n      inset: 0;\n      background: rgba(22, 22, 22, .52);\n      z-index: 100000 !important;\n      opacity: 0;\n      visibility: hidden;\n      transition: opacity .22s ease;\n    }\n\n    \/* Modal base: se adapta al contenido *\/\n    #beWidgetDE .be-modal {\n      position: fixed;\n      left: 50%;\n      top: 50%;\n      transform: translate(-50%, -48%);\n      \/* \ud83d\udc47 Ajuste clave *\/\n      width: auto;\n      \/* deje que el contenido marque el ancho *\/\n      max-width: 96vw;\n      \/* no m\u00e1s ancho que la ventana *\/\n      display: inline-block;\n      \/* shrink-to-fit real *\/\n      background: #fff;\n      border-radius: 14px;\n      box-shadow: 0 30px 80px rgba(0, 0, 0, .22);\n      z-index: 100001 !important;\n      color: var(--text);\n      opacity: 0;\n      visibility: hidden;\n      transition: opacity .22s ease, transform .22s ease;\n      overflow: hidden;\n      \/* evita que algo sobresalga del borde redondeado *\/\n    }\n\n    \/* El body del modal puede crecer y hacer scroll vertical si hace falta *\/\n    #beWidgetDE .be-modal .be-body {\n      max-height: 70vh;\n      \/* evita que el modal se pase de alto *\/\n      overflow: auto;\n    }\n\n    #beWidgetDE .be-modal-backdrop.open {\n      opacity: 1;\n      visibility: visible;\n    }\n\n    #beWidgetDE .be-modal.open {\n      opacity: 1;\n      visibility: visible;\n      transform: translate(-50%, -50%);\n    }\n\n    #beWidgetDE .be-hd {\n      display: flex;\n      align-items: center;\n      justify-content: flex-end;\n      padding: 18px 20px;\n    }\n\n    #beWidgetDE .be-title {\n      font-weight: 800;\n      letter-spacing: .2px;\n      color: var(--brand)\n    }\n\n    #beWidgetDE .be-x {\n      background: #f4f4f5;\n      border: none;\n      border-radius: 10px;\n      width: 36px;\n      height: 36px;\n      cursor: pointer\n    }\n\n    #beWidgetDE .be-body {\n      padding: 18px 20px\n    }\n\n    #beWidgetDE .be-ft {\n      padding: 16px 20px;\n      \/* border-top: 1px solid #efefef; *\/\n      display: flex;\n      justify-content: flex-end;\n      gap: 10px\n    }\n\n    #beWidgetDE .be-btn {\n      border: 1px solid var(--border) !important;\n      background: #fff !important;\n      border-radius: 10px !important;\n      padding: .65rem 1rem !important;\n      cursor: pointer;\n      color: var(--text) !important\n    }\n\n    #beWidgetDE .be-btn-primary {\n      background: var(--brand) !important;\n      color: #fff !important;\n      border-color: var(--brand) !important\n    }\n\n    #beWidgetDE .be-btn-primary:hover {\n      filter: brightness(.96)\n    }\n\n    #beWidgetDE .be-list {\n      max-height: 380px;\n      overflow: auto\n    }\n\n    #beWidgetDE .be-group {\n      padding: 8px 0 4px;\n      font-size: 1rem;\n      font-weight: 800;\n      color: var(--brand)\n    }\n\n    #beWidgetDE .be-item {\n      display: flex;\n      align-items: center;\n      gap: .6rem;\n      padding: 10px 8px;\n      border-radius: 10px;\n      cursor: pointer;\n      color: var(--brand)\n    }\n\n    #beWidgetDE .be-item:hover {\n      background: #f7faff\n    }\n\n    #beWidgetDE .be-row {\n      display: flex;\n      gap: 12px;\n      flex-wrap: wrap;\n      align-items: center\n    }\n\n    #beWidgetDE .be-col {\n      flex: 1 1 160px\n    }\n\n    #beWidgetDE .be-mini {\n      font-size: .82rem;\n      color: var(--text)\n    }\n\n    \/* ===== Calendario (sin cambios respecto a tu \u00faltima versi\u00f3n) ===== *\/\n    #beWidgetDE .cal-wrap {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 22px;\n      align-items: start;\n    }\n\n    #beWidgetDE .cal-nav {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 14px;\n    }\n\n    #beWidgetDE .cal-arrow {\n      width: 36px;\n      height: 36px;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      border: 1px solid white;\n      background: #fff;\n      border-radius: 100px;\n      cursor: pointer;\n    }\n\n    #beWidgetDE .cal-arrow:hover {\n      width: 36px;\n      background-color: var(--border);\n    }\n\n    #beWidgetDE .cal-month {\n      \/* border: 1px solid var(--border); *\/\n      border-radius: 12px;\n      padding: 12px;\n    }\n\n    #beWidgetDE .cal-title {\n      font-weight: 800;\n      color: var(--brand);\n      text-align: center;\n      margin: 6px 0 10px;\n    }\n\n    #beWidgetDE .cal-grid {\n      display: grid;\n      grid-template-columns: repeat(7, 1fr);\n      gap: 6px;\n    }\n\n    #beWidgetDE .cal-dow {\n      font-size: .8rem;\n      text-transform: lowercase;\n      text-align: center;\n      color: #7a7f86;\n      padding: 6px 0;\n    }\n\n    #beWidgetDE .cal-day {\n      text-align: center;\n      padding: 10px;\n      border: 1px solid white;\n      border-radius: 5px;\n      cursor: pointer;\n      background: #fff;\n    }\n\n    #beWidgetDE .cal-day:hover {\n      background-color: #001D7E;\n      color: white;\n    }\n\n    #beWidgetDE .cal-day.muted {\n      color: #b9bfc8;\n      background: #fafafa;\n      cursor: default;\n    }\n\n    #beWidgetDE .cal-day.disabled {\n      opacity: .45;\n      cursor: not-allowed;\n    }\n\n    #beWidgetDE .cal-day.start,\n    #beWidgetDE .cal-day.end {\n      background: var(--brand);\n      color: #fff;\n      border-color: var(--brand);\n      font-weight: 800;\n    }\n\n    #beWidgetDE .cal-day.in-range {\n      background: var(--ring);\n      border-color: #dfe7ff;\n    }\n\n    #beWidgetDE .cal-legend {\n      margin-top: 6px;\n      font-size: .82rem;\n      color: #7a7f86;\n      display: flex;\n      gap: 12px;\n      align-items: center;\n      justify-content: center;\n    }\n\n    \/* ===== Ocupaci\u00f3n - estilo \u201cHoposa-like\u201d con vuestros azules ===== *\/\n    #beWidgetDE .occ-room {\n      \/* border: 1px solid #eee; *\/\n      border-radius: 12px;\n      margin: 14px 0;\n      overflow: hidden;\n    }\n\n    #beWidgetDE .occ-head {\n      display: flex;\n      align-items: center;\n      gap: 10px;\n      width: 100%;\n      background: #fff;\n      padding: 16px 14px;\n      border: none;\n      cursor: pointer;\n    }\n\n    #beWidgetDE .occ-head:hover {\n      background: #f9fbff;\n    }\n\n    #beWidgetDE .occ-title {\n      font-weight: 700;\n      color: var(--brand);\n      font-size: 1.05rem;\n    }\n\n    #beWidgetDE .occ-bed {\n      width: 22px;\n      height: 22px;\n      fill: var(--brand);\n    }\n\n    #beWidgetDE .occ-chevron {\n      margin-left: auto;\n      width: 18px;\n      height: 18px;\n      fill: var(--brand);\n      transition: transform .18s ease;\n    }\n\n    #beWidgetDE .occ-room.open .occ-chevron {\n      transform: rotate(180deg);\n    }\n\n    #beWidgetDE .occ-sep {\n      height: 1px;\n      background: #eee;\n    }\n\n    #beWidgetDE .occ-body {\n      padding: 18px 16px;\n      background: #fff;\n      display: none;\n    }\n\n    #beWidgetDE .occ-room.open .occ-body {\n      display: block;\n    }\n\n    #beWidgetDE .occ-row {\n      display: grid;\n      grid-template-columns: 1fr auto;\n      align-items: center;\n      padding: 14px 0;\n    }\n\n    #beWidgetDE .occ-label {\n      font-weight: 800;\n      color: var(--brand);\n      letter-spacing: .5px;\n      text-transform: uppercase;\n    }\n\n    #beWidgetDE .stepper {\n      display: inline-grid;\n      grid-template-columns: 36px 48px 36px;\n      align-items: center;\n      border: 1px solid var(--brand);\n      border-radius: 8px;\n      overflow: hidden;\n    }\n\n    #beWidgetDE .st-btn {\n      width: 36px;\n      height: 40px;\n      border: none;\n      background: var(--brand);\n      color: white;\n      font-weight: 700;\n      cursor: pointer;\n    }\n\n    #beWidgetDE .st-value {\n      width: 48px;\n      height: 40px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-weight: 700;\n      background: #fff;\n      color: #333;\n      border-left: 1px solid #e2e2e6;\n      border-right: 1px solid #e2e2e6;\n    }\n\n    #beWidgetDE .st-btn:disabled {\n      opacity: .45;\n      cursor: not-allowed;\n    }\n\n    \/* P\u00edldora Alter kind *\/\n    #beWidgetDE .age-pill {\n      display: inline-block;\n      border: 2px solid #0a5adf;\n      color: #0a5adf;\n      border-radius: 999px;\n      padding: 10px 16px;\n      min-width: 110px;\n      text-align: center;\n      font-weight: 600;\n    }\n\n    #beWidgetDE .age-select {\n      appearance: none;\n      border: none;\n      background: transparent;\n      color: inherit;\n      font: inherit;\n      cursor: pointer;\n      outline: none;\n    }\n\n    \/* L\u00f6schen Zimmer *\/\n    #beWidgetDE .occ-del {\n      display: inline-flex;\n      align-items: center;\n      gap: 8px;\n      color: var(--brand);\n      cursor: pointer;\n      margin-top: 6px;\n    }\n\n    #beWidgetDE .occ-del:hover {\n      color: #6d7179;\n    }\n\n    #beWidgetDE .trash {\n      width: 18px;\n      height: 18px;\n      fill: currentColor;\n    }\n\n    \/* Bot\u00f3n Zimmer hinzuf\u00fcgen (full width) *\/\n    #beWidgetDE #beAddRoom {\n      width: 100%;\n      background: #fff !important;\n      border: 2px solid #cfd6e5 !important;\n      color: var(--brand) !important;\n      font-weight: 700;\n      padding: 14px 16px !important;\n      border-radius: 12px !important;\n    }\n\n    #beWidgetDE #beAddRoom:hover {\n      background: #f7fbff !important;\n      border-color: #b9c6ea !important;\n    }\n\n    \/* Nota modo Adults Only *\/\n    #beWidgetDE .be-note {\n      font-size: .88rem;\n      color: #9aa0a6;\n      margin-top: 8px;\n    }\n\n    \/* Bot\u00f3n OK redondeado grande *\/\n    #beWidgetDE .occ-ok {\n      background: var(--brand);\n      color: #fff;\n      border: none;\n      border-radius: 12px;\n      padding: 14px 28px;\n      font-weight: 700;\n      min-width: 140px;\n      cursor: pointer;\n    }\n\n    #beWidgetDE .occ-ok:hover {\n      filter: brightness(.96);\n    }\n\n    \/* Responsive *\/\n    @media (max-width:980px) {\n      #beWidgetDE .be-floating-bar {\n        grid-template-columns: 1fr 1fr;\n        row-gap: 8px\n      }\n\n      @media (max-width:720px) {\n        #beWidgetDE .be-floating-bar {\n          grid-template-columns: 1fr;\n          row-gap: 8px\n        }\n\n        #beWidgetDE .be-cta {\n          grid-column: 1\/-1;\n          justify-self: stretch\n        }\n      }\n\n      @media (max-width:720px) {\n        #beWidgetDE .cal-wrap {\n          grid-template-columns: 1fr;\n        }\n\n        #beWidgetDE .occ-row {\n          grid-template-columns: 1fr auto;\n        }\n      }\n\n      \/* Scroll en el modal de Ocupaci\u00f3n para muchas habitaciones *\/\n      #beWidgetDE #beModalPax .be-body {\n        max-height: min(62vh, 540px);\n        \/* ajusta a tu gusto *\/\n        overflow: auto;\n        padding-right: 14px;\n        \/* deja hueco para scroll sin comer contenido *\/\n      }\n\n      \/* Cuando el bot\u00f3n + est\u00e1 inhabilitado, mu\u00e9stralo como tal *\/\n      #beWidgetDE #beAddRoom:disabled {\n        opacity: .5;\n        cursor: not-allowed;\n      }\n\n      \/* El modal de Fechas necesita un m\u00ednimo para que quepan 2 meses c\u00f3modos *\/\n      #beWidgetDE #beModalFechas {\n        \/* no fijamos width, s\u00f3lo marcamos un m\u00ednimo razonable *\/\n        min-width: 640px;\n        \/* ajusta a tu gusto (600\u2013760px) *\/\n      }\n\n      \/* Cada mes deber\u00eda tener un ancho m\u00ednimo para que no colapse el layout *\/\n      #beWidgetDE #beModalFechas .cal-month {\n        min-width: 300px;\n        \/* 2 * 300 + gap ~ 622px *\/\n      }\n\n      \/* En m\u00f3viles, ya tienes tu media query que apila 1 columna.\n   Aseg\u00farate de que se aplique s\u00f3lo en el modal de Fechas (opcional) *\/\n      @media (max-width: 720px) {\n\n        \/* 1) El wrap en una sola columna *\/\n        #beWidgetDE #beModalFechas .cal-wrap {\n          grid-template-columns: 1fr;\n          gap: 12px;\n        }\n\n        \/* 2) Oculta el 2\u00ba mes (solo visible el primero) *\/\n        #beWidgetDE #beModalFechas .cal-month:nth-of-type(2) {\n          display: none;\n        }\n\n        \/* 3) Evita desbordes: quita m\u00ednimos en m\u00f3vil *\/\n        #beWidgetDE #beModalFechas {\n          min-width: auto;\n          max-width: 96vw;\n        }\n\n        #beWidgetDE #beModalFechas .cal-month {\n          min-width: auto;\n        }\n\n        #beWidgetDE #beModalHotel {\n          min-width: 320px;\n        }\n\n        \/* deja que se adapte *\/\n      }\n    }\n\n    \/* --- FIX Elementor vs stepper --- *\/\n    #beWidgetDE .stepper,\n    #beWidgetDE .stepper * {\n      box-sizing: border-box;\n    }\n\n    \/* fuerza las 3 columnas exactas *\/\n    #beWidgetDE .stepper {\n      display: grid;\n      grid-template-columns: 40px 56px 40px;\n      \/* ancho fijo para evitar saltos *\/\n      align-items: stretch;\n      border: 1px solid var(--brand);\n      border-radius: 10px;\n      overflow: hidden;\n    }\n\n    \/* resetea por completo lo que Elementor mete a <button> *\/\n    #beWidgetDE .st-btn {\n      all: unset;\n      \/* quita padding\/min-height\/border-radius globales *\/\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      width: 40px !important;\n      height: 44px !important;\n      background: var(--brand);\n      color: #fff;\n      font-weight: 700;\n      line-height: 1;\n      \/* evita que el texto empuje la caja *\/\n      cursor: pointer;\n    }\n\n    \/* valor centrado, sin herencias raras *\/\n    #beWidgetDE .st-value {\n      all: unset;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      width: 56px !important;\n      height: 44px !important;\n      background: #fff;\n      color: #333;\n      font-weight: 700;\n      border-left: 1px solid rgba(0, 0, 0, .08);\n      border-right: 1px solid rgba(0, 0, 0, .08);\n      font-variant-numeric: tabular-nums;\n      \/* n\u00fameros no \u201cbailan\u201d *\/\n    }\n\n    \/* estados\/deshabilitado *\/\n    #beWidgetDE .st-btn:disabled {\n      opacity: .45;\n      cursor: not-allowed;\n    }\n\n    \/* por si Elementor aplica border-radius\/padding a TODOS los button *\/\n    #beWidgetDE .occ-body button.st-btn {\n      padding: 0 !important;\n      border-radius: 0 !important;\n    }\n\n    #beWidgetDE .age-pill {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      min-width: 120px;\n      \/* un pel\u00edn m\u00e1s ancha *\/\n      padding: 10px 18px;\n      border: 2px solid var(--brand);\n      color: var(--brand);\n      border-radius: 999px;\n      background: #fff;\n    }\n\n    #beWidgetDE .age-select {\n      appearance: none;\n      border: none;\n      background: transparent;\n      color: inherit;\n      font: inherit;\n      cursor: pointer;\n      outline: none;\n      padding: 0;\n      \/* evita que el select \u201cempuje\u201d la p\u00edldora *\/\n      text-align: center;\n    }\n\n    \/* Animaci\u00f3n de aparici\u00f3n\/desaparici\u00f3n *\/\n    #beWidgetDE .be-floating-bar {\n      transition: transform .24s ease, opacity .24s ease, visibility .24s;\n      will-change: transform, opacity;\n    }\n\n    \/* Oculta al hacer scroll hacia abajo (con fade + leve translate) *\/\n    #beWidgetDE .be-floating-bar.is-hidden {\n      transform: translate(-50%, 20px);\n      opacity: 0;\n      visibility: hidden;\n      pointer-events: none;\n    }\n\n    \/* Oculta totalmente cuando el footer entra en pantalla *\/\n    #beWidgetDE .be-floating-bar.at-footer {\n      transform: translate(-50%, 40px);\n      opacity: 0;\n      visibility: hidden;\n      pointer-events: none;\n    }\n\n\n    \/* ===== Modal de Fechas \u2013 tama\u00f1o fijo para evitar \u201csaltos\u201d visuales ===== *\/\n    #beWidgetDE #beModalFechas {\n      width: 850px;\n      \/* Ancho fijo (ajustable: 640\u2013760px seg\u00fan gusto) *\/\n      height: 600px;\n      \/* Alto fijo para evitar variaciones por n\u00famero de semanas *\/\n      min-width: unset;\n      \/* Anula restricciones previas *\/\n      max-width: 96vw;\n      \/* Previene overflow en pantallas peque\u00f1as *\/\n      display: flex;\n      flex-direction: column;\n      justify-content: space-between;\n    }\n\n    #beWidgetDE #beModalFechas .be-body {\n      flex: 1 1 auto;\n      overflow: hidden;\n      \/* Elimina el salto de scroll interno *\/\n      display: flex;\n      flex-direction: column;\n    }\n\n    #beWidgetDE #beModalFechas .cal-wrap {\n      flex: 1;\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 22px;\n      align-items: start;\n      overflow: hidden;\n      \/* Evita movimientos del grid *\/\n    }\n\n    #beWidgetDE #beModalFechas .cal-month {\n      min-width: 300px;\n      height: 360px;\n      \/* Alto fijo del calendario (ajustable) *\/\n      display: flex;\n      flex-direction: column;\n      justify-content: flex-start;\n    }\n\n    #beWidgetDE #beModalFechas .cal-grid {\n      flex: 1;\n      display: grid;\n      grid-template-columns: repeat(7, 1fr);\n      gap: 6px;\n      align-content: start;\n    }\n\n    \/* Adaptaci\u00f3n m\u00f3vil *\/\n    @media (max-width: 720px) {\n      #beWidgetDE #beModalFechas {\n        width: 94vw;\n        height: auto;\n        max-height: 90vh;\n      }\n\n      #beWidgetDE #beModalFechas .cal-wrap {\n        grid-template-columns: 1fr;\n        gap: 12px;\n      }\n\n      #beWidgetDE #beModalFechas .cal-month {\n        height: auto;\n        min-width: auto;\n      }\n    }\n  <\/style>\n\n  <form id=\"beWidgetDE\" method=\"POST\" target=\"_self\" action=\"https:\/\/booking.europe-hotels.org\/BookingEngine\/Landing\" style=\"display: block;\">\n\n    <div id=\"beBar\" class=\"be-floating-bar\" data-endpoint=\"https:\/\/booking.europe-hotels.org\/BookingEngine\/Landing\"\n      data-portal=\"1501\" data-language=\"3\" data-footer=\"footer.elementor-location-footer\">\n\n      <!-- Hotel -->\n      <button class=\"be-seg\" id=\"segHotel\" type=\"button\" aria-haspopup=\"dialog\">\n        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"15.75\" height=\"20.945\" viewBox=\"0 0 15.75 20.945\">\n          <path\n            d=\"M11.156-10.5A3.28,3.28,0,0,1,7.875-7.219,3.28,3.28,0,0,1,4.594-10.5a3.28,3.28,0,0,1,3.281-3.281A3.28,3.28,0,0,1,11.156-10.5ZM7.875-8.531A1.969,1.969,0,0,0,9.844-10.5a1.969,1.969,0,0,0-1.969-1.969A1.969,1.969,0,0,0,5.906-10.5,1.969,1.969,0,0,0,7.875-8.531ZM15.75-10.5c0,3.585-4.8,9.967-6.9,12.6A1.239,1.239,0,0,1,6.9,2.1C4.762-.533,0-6.915,0-10.5a7.875,7.875,0,0,1,7.875-7.875A7.876,7.876,0,0,1,15.75-10.5ZM7.875-17.062A6.561,6.561,0,0,0,1.312-10.5a7.2,7.2,0,0,0,.679,2.6A25.408,25.408,0,0,0,3.779-4.532a61.342,61.342,0,0,0,4.1,5.746,61.622,61.622,0,0,0,4.1-5.746A25.513,25.513,0,0,0,13.757-7.9a7.148,7.148,0,0,0,.681-2.6A6.561,6.561,0,0,0,7.875-17.062Z\"\n            transform=\"translate(0 18.375)\" \/>\n        <\/svg>\n        <div class=\"be-mono\"><span id=\"beHotelLabel\" class=\"be-value\">Europe Hotels<\/span><\/div>\n      <\/button>\n\n      <!-- Fechas -->\n      <button class=\"be-seg\" id=\"segFechas\" type=\"button\" aria-haspopup=\"dialog\">\n        <svg version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 32 32\">\n          <path\n            d=\"M29.333 8c0-2.208-1.792-4-4-4h-18.667c-2.208 0-4 1.792-4 4v18.667c0 2.208 1.792 4 4 4h18.667c2.208 0 4-1.792 4-4v-18.667zM26.667 8v18.667c0 0.736-0.597 1.333-1.333 1.333 0 0-18.667 0-18.667 0-0.736 0-1.333-0.597-1.333-1.333 0 0 0-18.667 0-18.667 0-0.736 0.597-1.333 1.333-1.333 0 0 18.667 0 18.667 0 0.736 0 1.333 0.597 1.333 1.333z\" \/>\n          <path\n            d=\"M20 2.667v5.333c0 0.736 0.597 1.333 1.333 1.333s1.333-0.597 1.333-1.333v-5.333c0-0.736-0.597-1.333-1.333-1.333s-1.333 0.597-1.333 1.333z\" \/>\n          <path\n            d=\"M9.333 2.667v5.333c0 0.736 0.597 1.333 1.333 1.333s1.333-0.597 1.333-1.333v-5.333c0-0.736-0.597-1.333-1.333-1.333s-1.333 0.597-1.333 1.333z\" \/>\n          <path\n            d=\"M4 14.667h24c0.736 0 1.333-0.597 1.333-1.333s-0.597-1.333-1.333-1.333h-24c-0.736 0-1.333 0.597-1.333 1.333s0.597 1.333 1.333 1.333z\" \/>\n        <\/svg>\n        <div class=\"be-mono\"><span id=\"beDatesLabel\" class=\"be-value\">Daten ausw\u00e4hlen<\/span><\/div>\n      <\/button>\n\n      <!-- Ocupaci\u00f3n -->\n      <button class=\"be-seg\" id=\"segPax\" type=\"button\" aria-haspopup=\"dialog\">\n        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"16.063\" height=\"20\" viewBox=\"0 0 16.063 20\">\n          <path\n            d=\"M144.491,45.373a4.455,4.455,0,0,1-.036.557c.011-.074.021-.151.03-.225a4.35,4.35,0,0,1-.29,1.07c.028-.068.057-.136.085-.2a4.233,4.233,0,0,1-.547.937l.134-.172a4.31,4.31,0,0,1-.761.761l.172-.134a4.317,4.317,0,0,1-.937.547l.2-.085a4.351,4.351,0,0,1-1.07.29c.074-.011.15-.021.225-.03a4.268,4.268,0,0,1-1.115,0c.074.011.151.021.225.03a4.353,4.353,0,0,1-1.07-.29l.2.085a4.232,4.232,0,0,1-.937-.547l.172.134a4.31,4.31,0,0,1-.761-.761l.134.172a4.315,4.315,0,0,1-.547-.937c.028.068.057.136.085.2a4.354,4.354,0,0,1-.29-1.07c.011.074.021.15.03.225a4.266,4.266,0,0,1,0-1.115c-.011.074-.021.15-.03.225a4.353,4.353,0,0,1,.29-1.07c-.028.068-.057.136-.085.2a4.23,4.23,0,0,1,.547-.937l-.134.172a4.31,4.31,0,0,1,.761-.761l-.172.134a4.317,4.317,0,0,1,.937-.547l-.2.085a4.352,4.352,0,0,1,1.07-.29c-.074.011-.151.021-.225.03a4.268,4.268,0,0,1,1.115,0c-.074-.011-.15-.021-.225-.03a4.351,4.351,0,0,1,1.07.29l-.2-.085a4.233,4.233,0,0,1,.937.547l-.172-.134a4.311,4.311,0,0,1,.761.761l-.134-.172a4.317,4.317,0,0,1,.547.937c-.028-.068-.057-.136-.085-.2a4.35,4.35,0,0,1,.29,1.07c-.011-.074-.021-.151-.03-.225a4.895,4.895,0,0,1,.036.557.848.848,0,0,0,1.7,0,5,5,0,0,0-.907-2.881,5.814,5.814,0,0,0-.524-.638,5.4,5.4,0,0,0-.625-.538,4.988,4.988,0,0,0-1.323-.7,5.058,5.058,0,0,0-5.518,1.5,5.571,5.571,0,0,0-.492.683,5.217,5.217,0,0,0-.36.753,5.033,5.033,0,0,0,2.542,6.387,4.716,4.716,0,0,0,1.658.46,5.023,5.023,0,0,0,5.467-4.146,5.683,5.683,0,0,0,.078-.869.846.846,0,0,0-1.692-.006ZM147.3,58.628H136.427c-.481,0-.962,0-1.444,0a1.273,1.273,0,0,1-.157-.011c.074.011.151.021.225.03a1.067,1.067,0,0,1-.244-.068l.2.085a1.074,1.074,0,0,1-.237-.14l.172.134a1.226,1.226,0,0,1-.174-.174l.134.172a1.165,1.165,0,0,1-.14-.237c.028.068.057.136.085.2a1.224,1.224,0,0,1-.068-.244c.011.074.021.15.03.225a6.083,6.083,0,0,1-.011-.786v-.907a5.154,5.154,0,0,1,.042-.676c-.011.074-.021.151-.03.225a4.958,4.958,0,0,1,.345-1.265c-.028.068-.057.136-.085.2a4.986,4.986,0,0,1,.634-1.081l-.134.172a5.032,5.032,0,0,1,.882-.882l-.172.134a4.984,4.984,0,0,1,1.081-.634l-.2.085a5.022,5.022,0,0,1,1.265-.346c-.074.011-.15.021-.225.03a7.344,7.344,0,0,1,.941-.042h3.879a8.239,8.239,0,0,1,1.047.042c-.074-.011-.15-.021-.225-.03a4.958,4.958,0,0,1,1.265.346l-.2-.085a4.984,4.984,0,0,1,1.081.634l-.172-.134a5.031,5.031,0,0,1,.882.882l-.134-.172A4.983,4.983,0,0,1,147.2,55.4c-.028-.068-.057-.136-.085-.2a5.024,5.024,0,0,1,.346,1.265c-.011-.074-.021-.15-.03-.225a7.642,7.642,0,0,1,.042.96v1.049a2.919,2.919,0,0,1-.011.36c.011-.074.021-.151.03-.225a1.067,1.067,0,0,1-.068.244c.028-.068.057-.136.085-.2a1.077,1.077,0,0,1-.14.237l.134-.172a1.226,1.226,0,0,1-.174.174l.172-.134a1.165,1.165,0,0,1-.237.14l.2-.085a1.225,1.225,0,0,1-.244.068c.074-.011.15-.021.225-.03-.047.006-.1.008-.144.011a.884.884,0,0,0-.6.248.848.848,0,0,0,.6,1.448,1.9,1.9,0,0,0,1.791-1.342,3.333,3.333,0,0,0,.074-.973,12.728,12.728,0,0,0-.1-2.2,5.74,5.74,0,0,0-4.242-4.5A7.533,7.533,0,0,0,143,51.139h-3.76a7.19,7.19,0,0,0-1.867.193,5.742,5.742,0,0,0-4.172,4.549,13.826,13.826,0,0,0-.091,2.177,2.816,2.816,0,0,0,.1,1,1.984,1.984,0,0,0,.774.979,1.871,1.871,0,0,0,.988.284c.165,0,.331,0,.5,0h11.837a.849.849,0,1,0,0-1.7Z\"\n            transform=\"translate(-133.108 -40.327)\" \/>\n        <\/svg>\n        <div class=\"be-mono\"><span id=\"bePaxLabel\" class=\"be-value\">2 Erwachsene<\/span><\/div>\n      <\/button>\n\n      <!-- Promo -->\n      <div class=\"be-seg input promo\">\n        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"25.015\" height=\"25\" viewBox=\"0 0 25.015 25\">\n          <g id=\"icon-promo-group\" data-name=\"Grupo 545\" transform=\"translate(-31 -2393.627)\">\n            <path id=\"icon-promo-1\" data-name=\"icon-promo-1\"\n              d=\"M-58.362-346a2.828,2.828,0,0,1-2.019-.831l-7.9-7.9a2.832,2.832,0,0,1,0-4.038l10.57-10.57A6.3,6.3,0,0,1-53.73-371h6.77a2.89,2.89,0,0,1,2.85,2.85v6.77a6.3,6.3,0,0,1-1.663,3.979l-10.57,10.57a2.828,2.828,0,0,1-2.019.831Zm4.632-23.219a4.673,4.673,0,0,0-2.732,1.128l-10.57,10.57a1.039,1.039,0,0,0,0,1.485l7.9,7.9a1.039,1.039,0,0,0,1.485,0l10.57-10.57a4.52,4.52,0,0,0,1.128-2.732v-6.77a1.064,1.064,0,0,0-1.069-1.069h-6.71Z\"\n              transform=\"translate(100.125 2764.627)\"><\/path>\n            <path id=\"icon-promo-2\" data-name=\"icon-promo-2\"\n              d=\"M-41.574-358.248a3.332,3.332,0,0,1-3.326-3.326,3.332,3.332,0,0,1,3.326-3.326,3.332,3.332,0,0,1,3.326,3.326,3.332,3.332,0,0,1-3.326,3.326Zm0-5.073a1.756,1.756,0,0,0-1.748,1.747,1.756,1.756,0,0,0,1.748,1.748,1.756,1.756,0,0,0,1.748-1.748,1.756,1.756,0,0,0-1.748-1.747Z\"\n              transform=\"translate(89.647 2763.144)\"><\/path>\n          <\/g>\n        <\/svg>\n        <div class=\"be-mono\" style=\"width:100%\">\n          <input id=\"bePromo\" type=\"text\" class=\"be-promo\" placeholder=\"Promo code\">\n        <\/div>\n      <\/div>\n      <!-- Reservar -->\n      <button id=\"beReservar\" class=\"be-cta\" type=\"button\">BUCHEN<\/button>\n    <\/div>\n\n    <!-- ===== Modales ===== -->\n    <div id=\"beBackdrop\" class=\"be-modal-backdrop\"><\/div>\n\n    <!-- Hoteles -->\n    <div id=\"beModalHotel\" class=\"be-modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"beHotelTitle\">\n      <div class=\"be-body\">\n        <div class=\"be-list\" id=\"beHotelList\">\n          <div class=\"be-group\">TENERIFE | SPANIEN<\/div>\n          <div class=\"be-item\" data-id=\"76\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20.244\" height=\"18\"\n              viewBox=\"0 0 20.244 18\">\n              <path\n                d=\"M20.06-7.172a.536.536,0,0,1,.018.795.5.5,0,0,1-.763.018L18-7.52V-.562A2.812,2.812,0,0,1,15.188,2.25H5.063A2.812,2.812,0,0,1,2.25-.562V-7.52L.935-6.36a.537.537,0,0,1-.794-.018.561.561,0,0,1,.05-.795l9.562-8.437a.564.564,0,0,1,.745,0Zm-15,8.3h2.25V-4.5A1.124,1.124,0,0,1,8.438-5.625h3.375A1.124,1.124,0,0,1,12.938-4.5V1.125h2.25A1.688,1.688,0,0,0,16.875-.562V-8.483l-6.75-5.954L3.375-8.483V-.562A1.688,1.688,0,0,0,5.063,1.125Zm3.375,0h3.375V-4.5H8.438Z\"\n                transform=\"translate(0 15.75)\" \/>\n            <\/svg><span>Villa Cort\u00e9s*****<\/span><\/div>\n          <div class=\"be-item\" data-id=\"75\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20.244\" height=\"18\"\n              viewBox=\"0 0 20.244 18\">\n              <path\n                d=\"M20.06-7.172a.536.536,0,0,1,.018.795.5.5,0,0,1-.763.018L18-7.52V-.562A2.812,2.812,0,0,1,15.188,2.25H5.063A2.812,2.812,0,0,1,2.25-.562V-7.52L.935-6.36a.537.537,0,0,1-.794-.018.561.561,0,0,1,.05-.795l9.562-8.437a.564.564,0,0,1,.745,0Zm-15,8.3h2.25V-4.5A1.124,1.124,0,0,1,8.438-5.625h3.375A1.124,1.124,0,0,1,12.938-4.5V1.125h2.25A1.688,1.688,0,0,0,16.875-.562V-8.483l-6.75-5.954L3.375-8.483V-.562A1.688,1.688,0,0,0,5.063,1.125Zm3.375,0h3.375V-4.5H8.438Z\"\n                transform=\"translate(0 15.75)\" \/>\n            <\/svg><span>Park Club Europe***<\/span><\/div>\n          <div class=\"be-item\" data-id=\"481\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20.244\" height=\"18\"\n              viewBox=\"0 0 20.244 18\">\n              <path\n                d=\"M20.06-7.172a.536.536,0,0,1,.018.795.5.5,0,0,1-.763.018L18-7.52V-.562A2.812,2.812,0,0,1,15.188,2.25H5.063A2.812,2.812,0,0,1,2.25-.562V-7.52L.935-6.36a.537.537,0,0,1-.794-.018.561.561,0,0,1,.05-.795l9.562-8.437a.564.564,0,0,1,.745,0Zm-15,8.3h2.25V-4.5A1.124,1.124,0,0,1,8.438-5.625h3.375A1.124,1.124,0,0,1,12.938-4.5V1.125h2.25A1.688,1.688,0,0,0,16.875-.562V-8.483l-6.75-5.954L3.375-8.483V-.562A1.688,1.688,0,0,0,5.063,1.125Zm3.375,0h3.375V-4.5H8.438Z\"\n                transform=\"translate(0 15.75)\" \/>\n            <\/svg><span>Apartamentos Arcade<\/span><\/div>\n\n          <div class=\"be-group\">MALLORCA | SPANIEN<\/div>\n          <div class=\"be-item\" data-id=\"74\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20.244\" height=\"18\"\n              viewBox=\"0 0 20.244 18\">\n              <path\n                d=\"M20.06-7.172a.536.536,0,0,1,.018.795.5.5,0,0,1-.763.018L18-7.52V-.562A2.812,2.812,0,0,1,15.188,2.25H5.063A2.812,2.812,0,0,1,2.25-.562V-7.52L.935-6.36a.537.537,0,0,1-.794-.018.561.561,0,0,1,.05-.795l9.562-8.437a.564.564,0,0,1,.745,0Zm-15,8.3h2.25V-4.5A1.124,1.124,0,0,1,8.438-5.625h3.375A1.124,1.124,0,0,1,12.938-4.5V1.125h2.25A1.688,1.688,0,0,0,16.875-.562V-8.483l-6.75-5.954L3.375-8.483V-.562A1.688,1.688,0,0,0,5.063,1.125Zm3.375,0h3.375V-4.5H8.438Z\"\n                transform=\"translate(0 15.75)\" \/>\n            <\/svg><span>Playa Marina****<\/span><\/div>\n\n          <div class=\"be-group\">LISSABON | PORTUGAL<\/div>\n          <div class=\"be-item\" data-id=\"452\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20.244\" height=\"18\"\n              viewBox=\"0 0 20.244 18\">\n              <path\n                d=\"M20.06-7.172a.536.536,0,0,1,.018.795.5.5,0,0,1-.763.018L18-7.52V-.562A2.812,2.812,0,0,1,15.188,2.25H5.063A2.812,2.812,0,0,1,2.25-.562V-7.52L.935-6.36a.537.537,0,0,1-.794-.018.561.561,0,0,1,.05-.795l9.562-8.437a.564.564,0,0,1,.745,0Zm-15,8.3h2.25V-4.5A1.124,1.124,0,0,1,8.438-5.625h3.375A1.124,1.124,0,0,1,12.938-4.5V1.125h2.25A1.688,1.688,0,0,0,16.875-.562V-8.483l-6.75-5.954L3.375-8.483V-.562A1.688,1.688,0,0,0,5.063,1.125Zm3.375,0h3.375V-4.5H8.438Z\"\n                transform=\"translate(0 15.75)\" \/>\n            <\/svg><span>O\u2019Artista Suites<\/span><\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- Fechas -->\n    <div id=\"beModalFechas\" class=\"be-modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"beDatesTitle\">\n      <!-- <div class=\"be-hd\">\n        <div class=\"be-title\" id=\"beDatesTitle\">Daten ausw\u00e4hlen<\/div>\n        <button class=\"be-x\" data-close=\"beModalFechas\" type=\"button\">\u2715<\/button>\n      <\/div> -->\n      <div class=\"be-body\">\n        <div class=\"cal-nav\">\n          <button id=\"calPrev\" class=\"cal-arrow\" type=\"button\" aria-label=\"Mes anterior\">\u2039<\/button>\n          <!-- <div class=\"be-mini\">Navega con las flechas y elige entrada y salida<\/div> -->\n          <button id=\"calNext\" class=\"cal-arrow\" type=\"button\" aria-label=\"Mes siguiente\">\u203a<\/button>\n        <\/div>\n        <div id=\"calWrap\" class=\"cal-wrap\"><\/div>\n        <!-- <div class=\"cal-legend\"><span>Primer clic: entrada<\/span> \u00b7 <span>Segundo clic: salida<\/span><\/div> -->\n        <input id=\"beCheckin\" type=\"hidden\" \/><input id=\"beCheckout\" type=\"hidden\" \/>\n      <\/div>\n      <div class=\"be-ft\">\n        <button id=\"calClear\" class=\"be-btn\" type=\"button\">Feld l\u00f6schen<\/button>\n        <button class=\"be-btn be-btn-primary\" data-close=\"beModalFechas\" type=\"button\">OK<\/button>\n      <\/div>\n    <\/div>\n\n    <!-- Ocupaci\u00f3n -->\n    <div id=\"beModalPax\" class=\"be-modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"bePaxTitle\">\n      <!-- <div class=\"be-hd\">\n        <div class=\"be-title\" id=\"bePaxTitle\">Habitaciones y ocupaci\u00f3n<\/div>\n        <button class=\"be-x\" data-close=\"beModalPax\" type=\"button\">\u2715<\/button>\n      <\/div> -->\n      <div class=\"be-body\" id=\"beRoomsWrap\"><\/div>\n      <div class=\"be-ft\">\n        <button id=\"beAddRoom\" class=\"be-btn\" type=\"button\">+ Zimmer hinzuf\u00fcgen<\/button>\n        <button class=\"occ-ok\" data-close=\"beModalPax\" type=\"button\">OK<\/button>\n      <\/div>\n    <\/div>\n\n  <\/form>\n\n  <script>\n    document.addEventListener('DOMContentLoaded', function () {\n      (function () {\n        const $ = (s, ctx = document) => ctx.querySelector(s);\n        const $$ = (s, ctx = document) => Array.from(ctx.querySelectorAll(s));\n\n        const bar = $('#beBar');\n        const endpoint = bar.dataset.endpoint;\n        const portal = bar.dataset.portal || '1501';\n        const language = bar.dataset.language || '3';\n\n        const labels = {\n          hotel: $('#beHotelLabel'),\n          dates: $('#beDatesLabel'),\n          pax: $('#bePaxLabel')\n        };\n\n        let onlyAdults = false;\n        function setOnlyAdultsMode(on) {\n          onlyAdults = !!on;\n          rooms.forEach(r => { r.children = 0; r.ages = []; });\n          renderRooms();\n        }\n        let selectedHotel = \"\";\n        \/* ===== Autoselecci\u00f3n de hotel por URL (robusto) ===== *\/\n        const HOTEL_MAP = [\n          { id: \"76\", label: \"Villa Cort\u00e9s*****\", patterns: [\"\/villa-cortes\", \"\/hoteles\/villa-cortes\"] },\n          { id: \"74\", label: \"Playa Marina****\", patterns: [\"\/playa-marina\", \"\/hoteles\/playa-marina\"] },\n          { id: \"75\", label: \"Park Club Europe***\", patterns: [\"\/park-club\", \"\/hoteles\/park-club\"] },\n          { id: \"452\", label: \"O\u2019Artista Suites\", patterns: [\"\/oartista-suites\"] },\n          { id: \"481\", label: \"Apartamentos Arcade\", patterns: [\"\/apartamentos\"] },\n        ];\n\n        function autoSelectHotelFromURL() {\n          try {\n            const path = (location.pathname || \"\").toLowerCase();\n\n            \/\/ Coincidencia flexible: exacto, empieza por patr\u00f3n o contiene patr\u00f3n seguido de \"\/\"\n            const match = HOTEL_MAP.find(h =>\n              h.patterns.some(p =>\n                path === p || path.startsWith(p + \"\/\") || path.includes(p + \"\/\")\n              )\n            );\n\n            if (!match) return; \/\/ no estamos en p\u00e1gina de hotel\n\n            \/\/ Asigna hotel\n            selectedHotel = match.id;\n\n            \/\/ Actualiza etiqueta si existe\n            if (labels && labels.hotel) labels.hotel.textContent = match.label;\n\n            \/\/ Solo adultos (ajusta si cambia la pol\u00edtica)\n            if (typeof setOnlyAdultsMode === \"function\") {\n              setOnlyAdultsMode(selectedHotel === \"74\");\n            }\n          } catch (err) {\n            console.error(\"AutoSelectHotel error:\", err);\n          }\n        }\n\n        \/\/ Ejecuta al cargar\n        autoSelectHotelFromURL();\n\n        \/* ===== Mostrar\/Ocultar barra con scroll + ocultar en footer ===== *\/\n        const barEl = document.getElementById('beBar');\n\n\n        \/* 2.1 \u2013 Visible solo al inicio; abajo solo con el bot\u00f3n *\/\n        let userPinned = false;              \/\/ si el usuario \u201cancla\u201d la barra con el bot\u00f3n\n        const TOP_ZONE = 120;                 \/\/ margen alto donde la barra es siempre visible\n\n        function showBar() { barEl.classList.remove('is-hidden'); }\n        function hideBar() { if (!userPinned) barEl.classList.add('is-hidden'); }\n\n        let raf = null;\n\n        function handleScroll() {\n          const y = window.pageYOffset || document.documentElement.scrollTop;\n\n          \/\/ si hay un modal abierto, mantenla visible\n          if (document.body.classList.contains('be-modal-open')) {\n            showBar();\n            raf = null; return;\n          }\n\n          if (y <= TOP_ZONE) {\n            \/\/ Volvemos a la parte alta: barra visible y se \u201cdesancla\u201d\n            userPinned = false;\n            showBar();\n          } else {\n            \/\/ Estamos por debajo de la zona alta:\n            \/\/ - si est\u00e1 anclada por el usuario -> visible\n            \/\/ - si NO est\u00e1 anclada -> oculta (y NO reaparece al subir)\n            if (userPinned) showBar();\n            else barEl.classList.add('is-hidden');\n          }\n\n          raf = null;\n        }\n\n        window.addEventListener('scroll', () => {\n          if (!raf) raf = requestAnimationFrame(handleScroll);\n        }, { passive: true });\n\n        \/* Toggle manual desde el bot\u00f3n del header con rel=\"be-toggle\" *\/\n        document.addEventListener('click', function (ev) {\n          const btn = ev.target.closest('a[rel~=\"be-toggle\"], button[rel~=\"be-toggle\"]');\n          if (!btn) return;\n\n          \/\/ Evita navegaci\u00f3n o scroll al top\n          ev.preventDefault();\n          ev.stopPropagation();\n          ev.stopImmediatePropagation();\n\n          const y = window.pageYOffset || document.documentElement.scrollTop;\n\n          userPinned = !userPinned;\n\n          if (y <= TOP_ZONE) {\n            \/\/ Arriba del todo: siempre visible y sin anclar\n            userPinned = false;\n            barEl.classList.remove('is-hidden');\n          } else {\n            \/\/ Abajo: el toggle manda\n            if (userPinned) barEl.classList.remove('is-hidden');\n            else barEl.classList.add('is-hidden');\n          }\n\n          btn.classList.toggle('is-active', userPinned);\n        }, true);\n        \/\/ --- NORMALIZAR ENLACES DEL TOGGLE PARA QUE NUNCA HAGAN SCROLL ---\n        function sanitizeToggleLinks() {\n          document.querySelectorAll('a[rel~=\"be-toggle\"]').forEach(a => {\n            \/\/ Evita \/en\/# y el salto al top:\n            a.setAttribute('href', '#!');\n            \/\/ Accesibilidad + estados:\n            a.setAttribute('role', 'button');\n            a.setAttribute('aria-controls', 'beBar');\n            a.setAttribute('aria-expanded', (typeof userPinned !== 'undefined' && userPinned) ? 'true' : 'false');\n          });\n        }\n\n        \/\/ Llamada inicial\n        sanitizeToggleLinks();\n\n        \/\/ Si Astra\/TranslatePress reinyecta la cabecera (sticky, cambio de idioma, etc.),\n        \/\/ volvemos a \u201csanear\u201d esos enlaces.\n        const headerRoot = document.getElementById('masthead') || document.body;\n        new MutationObserver(() => sanitizeToggleLinks())\n          .observe(headerRoot, { childList: true, subtree: true });\n\n        \/\/ Extra: por si alg\u00fan script externo fuerza un hash \"#\", lo limpiamos sin movernos.\n        window.addEventListener('hashchange', function () {\n          if (location.hash === '#') {\n            history.replaceState(null, '', location.pathname + location.search);\n          }\n        }, false);\n        \/\/ \/\/ 2.2 \u2013 Ocultar cuando el footer entra en el viewport\n        \/\/ const footerSelector = barEl.getAttribute('data-footer') || 'footer';\n        \/\/ let footerEl = null;\n        \/\/ const candidatas = document.querySelectorAll(footerSelector);\n        \/\/ \/\/ si hubiese varios footers, usa el \u00faltimo\n        \/\/ if (candidatas.length) footerEl = candidatas[candidatas.length - 1];\n\n        \/\/ if (footerEl) {\n        \/\/   const io = new IntersectionObserver((entries) => {\n        \/\/     const e = entries[0];\n        \/\/     if (e && e.isIntersecting) {\n        \/\/       barEl.classList.add('at-footer');\n        \/\/     } else {\n        \/\/       barEl.classList.remove('at-footer');\n        \/\/     }\n        \/\/   }, {\n        \/\/     root: null,\n        \/\/     threshold: 0,\n        \/\/     \/\/ dispara un poco antes de tocar el footer (ajusta 80px a la altura de tu barra)\n        \/\/     rootMargin: '0px 0px 80px 0px'\n        \/\/   });\n        \/\/   io.observe(footerEl);\n        \/\/ }\n\n        \/\/ --- INTERCEPTOR GLOBAL DEL TOGGLE (CAPTURA) ---\n        (function hardenBeToggle() {\n          \/\/ 1) Marca y \u201cdesactiva\u201d la navegaci\u00f3n de los <a> del toggle\n          function neutralizeLinks(ctx = document) {\n            ctx.querySelectorAll('a[rel~=\"be-toggle\"]').forEach(a => {\n              \/\/ Quitamos href para impedir navegaci\u00f3n (evita \/en\/#)\n              if (a.hasAttribute('href')) a.removeAttribute('href');\n              a.setAttribute('role', 'button');\n              a.setAttribute('tabindex', '0');\n              a.classList.add('be-toggle-link');\n            });\n          }\n          neutralizeLinks();\n\n          \/\/ 2) Handler \u00fanico para click\/teclado en CAPTURA: nadie navega antes que nosotros\n          function handleToggleIntent(e) {\n            const btn = e.target.closest('[rel~=\"be-toggle\"]');\n            if (!btn) return;\n            \/\/ Mata cualquier navegaci\u00f3n o listener de terceros\n            e.preventDefault();\n            e.stopImmediatePropagation();\n            e.stopPropagation();\n\n            \/\/ Limpia hashes accidentales (#, #!) si alg\u00fan script los mete\n            if (location.hash === '#' || location.hash === '#!') {\n              history.replaceState(null, '', location.pathname + location.search);\n            }\n\n            \/\/ Tu l\u00f3gica de toggle (respetando la zona top)\n            userPinned = !userPinned;\n            const y = window.pageYOffset || document.documentElement.scrollTop;\n\n            if (y <= TOP_ZONE) {\n              \/\/ Arriba del todo: siempre visible y sin \u201canclado\u201d\n              userPinned = false;\n              showBar();\n            } else {\n              if (userPinned) showBar();\n              else barEl.classList.add('is-hidden');\n            }\n\n            \/\/ Estado visual (si lo usas)\n            document.querySelectorAll('[rel~=\"be-toggle\"]').forEach(b => {\n              b.classList.toggle('is-active', userPinned);\n              b.setAttribute('aria-expanded', userPinned ? 'true' : 'false');\n            });\n          }\n\n          \/\/ Captura: nos ejecutamos antes que otros scripts\n          document.addEventListener('click', handleToggleIntent, true);\n          document.addEventListener('keydown', (e) => {\n            if ((e.key === 'Enter' || e.key === ' ') && e.target.closest('[rel~=\"be-toggle\"]')) {\n              handleToggleIntent(e);\n            }\n          }, true);\n\n          \/\/ 3) Si Astra\/TranslatePress reinyectan la cabecera, re-neutralizamos\n          const headerRoot = document.getElementById('masthead') || document.body;\n          new MutationObserver((muts) => {\n            for (const m of muts) {\n              if (m.addedNodes && m.addedNodes.length) {\n                m.addedNodes.forEach(n => {\n                  if (n.nodeType === 1) neutralizeLinks(n);\n                });\n              }\n            }\n          }).observe(headerRoot, { childList: true, subtree: true });\n        })();\n\n\n        \/* ===== Utilidades fecha (UTC) ===== *\/\n        const toISO = (y, m, d) => new Date(Date.UTC(y, m, d)).toISOString().slice(0, 10);\n        const fromISO = (iso) => { const [y, m, d] = iso.split('-').map(Number); return new Date(Date.UTC(y, m - 1, d)); };\n        const todayISO = () => { const n = new Date(); return toISO(n.getUTCFullYear(), n.getUTCMonth(), n.getUTCDate()); };\n        const addDaysISO = (iso, n) => { const d = fromISO(iso); d.setUTCDate(d.getUTCDate() + n); return toISO(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()); };\n        const toDDMMYYYY = (iso) => { const [y, m, d] = iso.split('-'); return `${d}-${m}-${y}`; };\n        const monthLabelDE = (y, m) =>\n          ['januar', 'februar', 'm\u00e4rz', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'dezember'][m] + ' ' + y;\n        const dowDE = ['mo', 'di', 'mi', 'do', 'fr', 'sa', 'so'];\n        \/* === Reglas de calendario por hotel ===\n           452 (O\u2019Artista): inactivo desde 2025-11-01 en adelante (bloquea >= 2025-11-01)\n           74 (Playa Marina): bloqueado 2025-10-19 .. 2026-05-13 (ambos inclusive)\n        *\/\n        const CAL_RULES = {\n          '452': { \/\/ O\u2019Artista Suites\n            maxBookable: '2025-10-31' \/\/ \u00faltimo d\u00eda permitido; todo >= 2025-11-01 queda deshabilitado\n          },\n          '74': {  \/\/ Playa Marina\n            blackout: [\n              { start: '2025-10-19', end: '2026-05-13' }\n            ]\n          }\n        };\n\n        \/\/ Comparadores ISO (YYYY-MM-DD) en UTC\n        function cmpISO(a, b) { return fromISO(a) - fromISO(b); }\n        function ltISO(a, b) { return cmpISO(a, b) < 0; }\n        function lteISO(a, b) { return cmpISO(a, b) <= 0; }\n        function gtISO(a, b) { return cmpISO(a, b) > 0; }\n        function gteISO(a, b) { return cmpISO(a, b) >= 0; }\n        function inRangeISO(x, a, b) { return (gteISO(x, a) && lteISO(x, b)); }\n\n        \/\/ \u00bfDebe estar deshabilitado el d\u00eda 'iso' para el hotel actual?\n        function shouldDisableDate(iso) {\n          \/\/ 1) Nunca permitir fechas pasadas\n          if (ltISO(iso, todayISO())) return true;\n\n          const rules = CAL_RULES[selectedHotel];\n          if (!rules) return false;\n\n          \/\/ 2) maxBookable: si existe, bloquea todo lo posterior\n          if (rules.maxBookable && gtISO(iso, rules.maxBookable)) return true;\n\n          \/\/ 3) rangos de blackout\n          if (Array.isArray(rules.blackout)) {\n            for (const r of rules.blackout) {\n              if (inRangeISO(iso, r.start, r.end)) return true;\n            }\n          }\n\n          return false;\n        }\n        \/* ===== Fechas ===== *\/\n        const ciInput = $('#beCheckin'); const coInput = $('#beCheckout');\n        ciInput.value = todayISO(); coInput.value = addDaysISO(ciInput.value, 1);\n\n        function setCheckin(iso) { ciInput.value = iso; }\n        function setCheckout(iso) { coInput.value = iso; }\n        function clearRange() { ciInput.value = ''; coInput.value = ''; }\n\n        function updateDatesLabel() {\n          if (ciInput.value && coInput.value) {\n            labels.dates.textContent = `${ciInput.value.split('-').reverse().join('\/')} - ${coInput.value.split('-').reverse().join('\/')}`;\n          } else if (ciInput.value) {\n            labels.dates.textContent = `${ciInput.value.split('-').reverse().join('\/')} - \u2014`;\n          } else {\n            labels.dates.textContent = 'Daten ausw\u00e4hlen';\n          }\n        }\n\n        \/* ===== Modal gen\u00e9rico ===== *\/\n        const backdrop = $('#beBackdrop');\n        const modals = $$('.be-modal');\n        const anyOpen = () => modals.some(m => m.classList.contains('open'));\n        function openModal(id) { document.body.classList.add('be-modal-open'); backdrop.classList.add('open'); $('#' + id).classList.add('open'); }\n        function closeModal(id) { const m = $('#' + id); if (!m) return; m.classList.remove('open'); if (!anyOpen()) { backdrop.classList.remove('open'); document.body.classList.remove('be-modal-open'); } }\n        backdrop.addEventListener('click', () => { modals.forEach(m => m.classList.remove('open')); backdrop.classList.remove('open'); document.body.classList.remove('be-modal-open'); });\n        $$('[data-close]').forEach(b => b.addEventListener('click', e => closeModal(e.currentTarget.getAttribute('data-close'))));\n        $('#segHotel').addEventListener('click', () => openModal('beModalHotel'));\n        $('#segFechas').addEventListener('click', () => {\n          \/\/ centrar en check-in si existe\n          const targetISO = ciInput.value || todayISO();\n          const d = fromISO(targetISO); baseYear = d.getUTCFullYear(); baseMonth = d.getUTCMonth();\n          openModal('beModalFechas'); renderCalendar();\n        });\n        $('#segPax').addEventListener('click', () => openModal('beModalPax'));\n        document.addEventListener('keydown', e => { if (e.key === 'Escape') { backdrop.click(); } });\n\n        \/* ===== Hotel selector ===== *\/\n        $('#beHotelList').addEventListener('click', (e) => {\n          const item = e.target.closest('.be-item'); if (!item) return;\n          selectedHotel = item.dataset.id || '';\n          labels.hotel.textContent = item.textContent.trim();\n          setOnlyAdultsMode(selectedHotel === '74'); \/\/ Adults Only\n          closeModal('beModalHotel');\n        });\n\n        \/* ===== Ocupaci\u00f3n (Hoposa-like) ===== *\/\n        const roomsWrap = $('#beRoomsWrap');\n        let rooms = [];\n        const MAX_ROOMS = 5;\n\n        function addRoom(ad = 2, ch = 0) {\n          if (rooms.length >= MAX_ROOMS) {\n            \/\/ Opcional: peque\u00f1o aviso; puedes quitarlo si no lo quieres\n            console.warn('L\u00edmite de habitaciones alcanzado');\n            return;\n          }\n          rooms.push({ adults: ad, children: ch, ages: Array.from({ length: ch }, () => 8), open: true });\n          renderRooms();\n        }\n        function removeRoom(idx) {\n          rooms.splice(idx, 1);\n          if (rooms.length === 0) addRoom();\n          else renderRooms();\n        }\n\n        function updatePaxLabel() {\n          const ta = rooms.reduce((a, r) => a + r.adults, 0);\n          const tc = rooms.reduce((a, r) => a + r.children, 0);\n          labels.pax.textContent = `${ta} Erwachsene${ta !== 1 ? '' : ''}${tc ? ` \u00b7 ${tc} Kinder${tc !== 1 ? 's' : ''}` : ''}`;\n        }\n\n        function buildOccupation() {\n          return rooms.map(r => {\n            const ages = [];\n            for (let i = 0; i < r.adults; i++) ages.push(30);\n            for (let k = 0; k < r.children; k++) { let v = r.ages[k] ?? 0; if (v < 0) v = 0; if (v > 17) v = 17; ages.push(v); }\n            return ages.join(',');\n          }).join(';');\n        }\n\n        function roomHeaderHTML(idx) {\n          return `\n      <button class=\"occ-head\" type=\"button\" data-toggle=\"${idx}\">\n        <svg class=\"occ-bed\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M21 10V7a2 2 0 0 0-2-2H5C3.9 5 3 5.9 3 7v3h18zm0 2H3v7h2v-3h14v3h2v-7zM5 7h14v1H5V7z\"\/><\/svg>\n        <div class=\"occ-title\">Zimmer ${idx + 1}<\/div>\n        <svg class=\"occ-chevron\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M7.41 8.59 12 13.17l4.59-4.58L18 10l-6 6-6-6z\"\/><\/svg>\n      <\/button>\n      <div class=\"occ-sep\"><\/div>\n    `;\n        }\n\n        function agesRowHTML(r, idx) {\n          if (r.children === 0) return '';\n\n          let rows = '';\n          for (let i = 0; i < r.children; i++) {\n            const current = r.ages[i] ?? 8;\n\n            \/\/ opciones 0\u201311 a\u00f1os\n            let options = '';\n            for (let a = 0; a <= 11; a++) {\n              const label = a === 1 ? `${a} jahr` : `${a} jahre`;\n              options += `<option value=\"${a}\" ${a === current ? 'selected' : ''}>${label}<\/option>`;\n            }\n\n            rows += `\n      <div class=\"occ-row\">\n        <div class=\"occ-label\">Alter kind ${i + 1}<\/div>\n        <label class=\"age-pill\">\n          <select class=\"age-select\" data-age=\"${idx}\" data-k=\"${i}\">\n            ${options}\n          <\/select>\n        <\/label>\n      <\/div>\n    `;\n          }\n\n          return rows;\n        }\n\n\n        function renderRooms() {\n          roomsWrap.innerHTML = '';\n          rooms.forEach((r, idx) => {\n            const card = document.createElement('div');\n            card.className = 'occ-room' + (r.open ? ' open' : '');\n            card.innerHTML = `\n        ${roomHeaderHTML(idx)}\n        <div class=\"occ-body\">\n          <div class=\"occ-row\">\n            <div class=\"occ-label\">Erwachsene<\/div>\n            <div class=\"stepper\">\n              <button class=\"st-btn\" data-ad=\"-1\" data-i=\"${idx}\" type=\"button\">-<\/button>\n              <div class=\"st-value\" id=\"ad-${idx}\">${r.adults}<\/div>\n              <button class=\"st-btn\" data-ad=\"+1\" data-i=\"${idx}\" type=\"button\">+<\/button>\n            <\/div>\n          <\/div>\n\n          <div class=\"occ-row\">\n            <div class=\"occ-label\">Kinder ${onlyAdults ? '' : ''}<\/div>\n            <div class=\"stepper\">\n              <button class=\"st-btn\" data-ch=\"-1\" data-i=\"${idx}\" type=\"button\" ${onlyAdults ? 'disabled' : ''}>-<\/button>\n              <div class=\"st-value\" id=\"ch-${idx}\">${onlyAdults ? 0 : r.children}<\/div>\n              <button class=\"st-btn\" data-ch=\"+1\" data-i=\"${idx}\" type=\"button\" ${onlyAdults ? 'disabled' : ''}>+<\/button>\n            <\/div>\n          <\/div>\n\n          ${onlyAdults ? '<div class=\"be-note\">Nur f\u00fcr Erwachsene<\/div>' : ''}\n\n          ${agesRowHTML(r, idx)}\n\n          <div class=\"occ-del\" data-del=\"${idx}\">\n            <svg class=\"trash\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path d=\"M9 3h6v2h5v2H4V5h5V3zm1 6h2v9h-2V9zm4 0h2v9h-2V9z\"\/><\/svg>\n            <span>L\u00f6schen<\/span>\n          <\/div>\n        <\/div>\n      `;\n            roomsWrap.appendChild(card);\n          });\n\n          \/\/ Listeners din\u00e1micos\n          roomsWrap.querySelectorAll('[data-toggle]').forEach(btn => {\n            btn.addEventListener('click', () => {\n              const i = +btn.getAttribute('data-toggle');\n              rooms[i].open = !rooms[i].open;\n              renderRooms();\n            });\n          });\n\n          roomsWrap.querySelectorAll('[data-del]').forEach(b => {\n            b.addEventListener('click', () => removeRoom(+b.getAttribute('data-del')));\n          });\n\n          roomsWrap.querySelectorAll('[data-ad]').forEach(b => {\n            b.addEventListener('click', () => {\n              const i = +b.dataset.i; const delta = b.dataset.ad === '+1' ? 1 : -1;\n              rooms[i].adults = Math.max(1, Math.min(4, rooms[i].adults + delta));\n              renderRooms(); \/\/ repinta valores\n            });\n          });\n\n          roomsWrap.querySelectorAll('[data-ch]').forEach(b => {\n            b.addEventListener('click', () => {\n              if (onlyAdults) return;\n              const i = +b.dataset.i; const delta = b.dataset.ch === '+1' ? 1 : -1;\n              rooms[i].children = Math.max(0, Math.min(3, rooms[i].children + delta));\n              rooms[i].ages = rooms[i].ages.slice(0, rooms[i].children);\n              while (rooms[i].ages.length < rooms[i].children) rooms[i].ages.push(8);\n              renderRooms();\n            });\n          });\n\n          roomsWrap.querySelectorAll('.age-select').forEach(sel => {\n            sel.addEventListener('change', (e) => {\n              const i = +e.target.getAttribute('data-age');\n              const k = +e.target.getAttribute('data-k');\n              rooms[i].ages[k] = parseInt(e.target.value, 10);\n            });\n          });\n\n          updatePaxLabel();\n          \/\/ Habilita\/deshabilita el bot\u00f3n + Zimmer hinzuf\u00fcgen seg\u00fan el tope\n          const addBtn = document.getElementById('beAddRoom');\n          if (addBtn) {\n            addBtn.disabled = rooms.length >= MAX_ROOMS;\n            addBtn.textContent = rooms.length >= MAX_ROOMS ? 'Maximal 5 Zimmer' : '+ Zimmer hinzuf\u00fcgen';\n          }\n        }\n\n        $('#beAddRoom').addEventListener('click', () => addRoom(2, 0));\n        addRoom(2, 0); \/\/ inicial\n        autoSelectHotelFromURL();\n        \/* ===== Calendario (dos meses) ===== *\/\n        const calWrap = $('#calWrap'); const calPrev = $('#calPrev'); const calNext = $('#calNext');\n        let baseYear, baseMonth;\n        (function initBase() { const t = fromISO(todayISO()); baseYear = t.getUTCFullYear(); baseMonth = t.getUTCMonth(); })();\n        const monthStart = (y, m) => new Date(Date.UTC(y, m, 1));\n        const daysInMonth = (y, m) => new Date(Date.UTC(y, m + 1, 0)).getUTCDate();\n        const isBefore = (a, b) => fromISO(a) < fromISO(b);\n        const isSame = (a, b) => a === b;\n\n        function paintCell(cell) {\n          const iso = cell.dataset.iso, ci = ciInput.value, co = coInput.value;\n          if (!ci && !co) return;\n          if (ci && !co) { if (isSame(iso, ci)) cell.classList.add('start'); return; }\n          if (ci && co) {\n            if (isSame(iso, ci)) cell.classList.add('start');\n            else if (isSame(iso, co)) cell.classList.add('end');\n            else if (isBefore(ci, iso) && isBefore(iso, co)) cell.classList.add('in-range');\n          }\n        }\n\n        function renderCalendar() {\n          calWrap.innerHTML = '';\n          const months = [{ y: baseYear, m: baseMonth }, (baseMonth === 11 ? { y: baseYear + 1, m: 0 } : { y: baseYear, m: baseMonth + 1 })];\n          months.forEach(({ y, m }) => {\n            const box = document.createElement('div'); box.className = 'cal-month';\n            const title = document.createElement('div'); title.className = 'cal-title'; title.textContent = monthLabelDE(y, m).toUpperCase();\n            const grid = document.createElement('div'); grid.className = 'cal-grid';\n            dowDE.forEach(d => { const el = document.createElement('div'); el.className = 'cal-dow'; el.textContent = d; grid.appendChild(el); });\n            let start = monthStart(y, m).getUTCDay(); if (start === 0) start = 7; const lead = start - 1;\n            for (let i = 0; i < lead; i++) { const dummy = document.createElement('div'); dummy.className = 'cal-day muted'; grid.appendChild(dummy); }\n            const total = daysInMonth(y, m);\n            for (let d = 1; d <= total; d++) {\n              const cell = document.createElement('button'); cell.type = 'button'; cell.className = 'cal-day'; cell.textContent = d;\n              const iso = toISO(y, m, d); cell.dataset.iso = iso;\n              if (shouldDisableDate(iso)) {\n                cell.classList.add('disabled');\n                cell.disabled = true;\n              }\n              paintCell(cell);\n              cell.addEventListener('click', () => {\n                if (!ciInput.value || (ciInput.value && coInput.value)) { setCheckin(iso); setCheckout(''); }\n                else {\n                  if (!isBefore(ciInput.value, iso)) { setCheckin(iso); }\n                  else { setCheckout(iso); }\n                }\n                updateDatesLabel(); renderCalendar();\n              });\n              grid.appendChild(cell);\n            }\n            box.appendChild(title); box.appendChild(grid); calWrap.appendChild(box);\n          });\n        }\n        calPrev.addEventListener('click', () => { if (baseMonth === 0) { baseMonth = 11; baseYear--; } else baseMonth--; renderCalendar(); });\n        calNext.addEventListener('click', () => { if (baseMonth === 11) { baseMonth = 0; baseYear++; } else baseMonth++; renderCalendar(); });\n        renderCalendar(); updateDatesLabel();\n        const calClearBtn = $('#calClear'); if (calClearBtn) { calClearBtn.addEventListener('click', () => { clearRange(); updateDatesLabel(); renderCalendar(); }); }\n\n       \/* ===== Reservar ===== *\/\n          \/* ===== Reservar (form submit real para GA\/Meta) ===== *\/\n          $('#beReservar').addEventListener('click', (ev) => {\n            ev.preventDefault();\n\n            const ci = ciInput.value, co = coInput.value;\n\n            \/\/ Validaciones b\u00e1sicas (las mismas que ya ten\u00edas)\n            if (ci && shouldDisableDate(ci)) { openModal('beModalFechas'); return; }\n            if (co && shouldDisableDate(co)) { openModal('beModalFechas'); return; }\n            if (!ciInput.value || !coInput.value || !isBefore(ciInput.value, coInput.value)) {\n              openModal('beModalFechas');\n              return;\n            }\n\n            \/\/ 1) (YA NO SE NECESITA) Construimos el mapa de par\u00e1metros del motor\n            \/\/ const engineParams = new Map([\n            \/\/   ['Request.Language', language],\n            \/\/   ['Request.PortalCodeOPR', portal],\n            \/\/   ['Request.HotelCodeOPR', selectedHotel],\n            \/\/   ['Request.CheckinDate', toDDMMYYYY(ciInput.value)],\n            \/\/   ['Request.CheckoutDate', toDDMMYYYY(coInput.value)],\n            \/\/   ['Request.Occupation', buildOccupation()],\n            \/\/   ['Request.PromotionalCode', ($('#bePromo').value || '').trim()]\n            \/\/ ]);\n\n            \/\/ 2) Localizamos el <form> oculto\n            const form = document.querySelector('#beWidgetDE');\n            if (!form) {\n              console.error('No se encontr\u00f3 el formulario con id \"submitBEForm\"');\n              return;\n            }\n\n            \/\/ 3) Configuramos destino\n            \/\/ let queryString = \"?Request.PortalCodeOPR=\"+portal\n            \/\/ + \"&Request.HotelCodeOPR=\" + selectedHotel\n            \/\/ + \"&Request.Language=\" + language\n            \/\/ + \"&Request.CheckinDate=\" + toDDMMYYYY(ciInput.value)\n            \/\/ + \"&Request.CheckoutDate=\" + toDDMMYYYY(coInput.value)\n            \/\/ + \"&Request.Occupation=\" + encodeURIComponent(buildOccupation())\n            \/\/ + \"&Request.PromotionalCode=\" + encodeURIComponent(($('#bePromo').value || '').trim())\n            \n            \/\/ Formato sin \"Request.\" Versi\u00f3n moderna aceptada por el motor. Igual de v\u00e1lido pero m\u00e1s simplificado.\n            let queryString = \"?PortalCodeOPR=\"+portal\n            + \"&HotelCodeOPR=\" + selectedHotel\n            + \"&Language=\" + language\n            + \"&CheckinDate=\" + toDDMMYYYY(ciInput.value)\n            + \"&CheckoutDate=\" + toDDMMYYYY(coInput.value)\n            + \"&Occupation=\" + encodeURIComponent(buildOccupation())\n            + \"&PromotionalCode=\" + encodeURIComponent(($('#bePromo').value || '').trim())\n\n\n            \/\/ 4) Modificamos el destino en el action del form\n            form.setAttribute('action', endpoint + queryString);\n            \/\/ 6) Enviamos (esto dispara el submit que GA\/Meta pueden \u201cdecorar\u201d)\n            form.submit();\n          });\n\n        })(); \/\/ IIFE\n      }); \/\/ DOMContentLoaded\n  <\/script>\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":"","protected":false},"author":12,"featured_media":0,"menu_order":0,"comment_status":"open","ping_status":"open","template":"","format":"standard","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":"","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","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":""}},"_jet_sm_ready_style":"","_jet_sm_style":"","_jet_sm_controls_values":"","_jet_sm_fonts_collection":"","_jet_sm_fonts_links":"","footnotes":""},"class_list":["post-43498","e-floating-buttons","type-e-floating-buttons","status-publish","format-standard","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Booking Desktop DE - Europe-Hotels<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.europe-hotels.org\/de\/e-floating-buttons\/booking-desktop-de\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Booking Desktop DE - Europe-Hotels\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.europe-hotels.org\/de\/e-floating-buttons\/booking-desktop-de\/\" \/>\n<meta property=\"og:site_name\" content=\"Europe-Hotels\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-05T13:35:04+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.europe-hotels.org\\\/e-floating-buttons\\\/booking-desktop-de\\\/\",\"url\":\"https:\\\/\\\/www.europe-hotels.org\\\/e-floating-buttons\\\/booking-desktop-de\\\/\",\"name\":\"Booking Desktop DE - Europe-Hotels\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.europe-hotels.org\\\/#website\"},\"datePublished\":\"2025-10-06T14:55:23+00:00\",\"dateModified\":\"2025-11-05T13:35:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.europe-hotels.org\\\/e-floating-buttons\\\/booking-desktop-de\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.europe-hotels.org\\\/e-floating-buttons\\\/booking-desktop-de\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.europe-hotels.org\\\/e-floating-buttons\\\/booking-desktop-de\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/www.europe-hotels.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Booking Desktop DE\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.europe-hotels.org\\\/#website\",\"url\":\"https:\\\/\\\/www.europe-hotels.org\\\/\",\"name\":\"Europe-Hotels\",\"description\":\"Europe Hotels\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.europe-hotels.org\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.europe-hotels.org\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.europe-hotels.org\\\/#organization\",\"name\":\"Europe-Hotels\",\"url\":\"https:\\\/\\\/www.europe-hotels.org\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.europe-hotels.org\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.europe-hotels.org\\\/wp-content\\\/uploads\\\/2023\\\/11\\\/LOGO_EUROPE_CORPORATE-300x65-1.png\",\"contentUrl\":\"https:\\\/\\\/www.europe-hotels.org\\\/wp-content\\\/uploads\\\/2023\\\/11\\\/LOGO_EUROPE_CORPORATE-300x65-1.png\",\"width\":300,\"height\":65,\"caption\":\"Europe-Hotels\"},\"image\":{\"@id\":\"https:\\\/\\\/www.europe-hotels.org\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Booking Desktop DE - Europe-Hotels","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.europe-hotels.org\/de\/e-floating-buttons\/booking-desktop-de\/","og_locale":"de_DE","og_type":"article","og_title":"Booking Desktop DE - Europe-Hotels","og_url":"https:\/\/www.europe-hotels.org\/de\/e-floating-buttons\/booking-desktop-de\/","og_site_name":"Europe-Hotels","article_modified_time":"2025-11-05T13:35:04+00:00","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.europe-hotels.org\/e-floating-buttons\/booking-desktop-de\/","url":"https:\/\/www.europe-hotels.org\/e-floating-buttons\/booking-desktop-de\/","name":"Booking Desktop DE - Europe-Hotels","isPartOf":{"@id":"https:\/\/www.europe-hotels.org\/#website"},"datePublished":"2025-10-06T14:55:23+00:00","dateModified":"2025-11-05T13:35:04+00:00","breadcrumb":{"@id":"https:\/\/www.europe-hotels.org\/e-floating-buttons\/booking-desktop-de\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.europe-hotels.org\/e-floating-buttons\/booking-desktop-de\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.europe-hotels.org\/e-floating-buttons\/booking-desktop-de\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/www.europe-hotels.org\/"},{"@type":"ListItem","position":2,"name":"Booking Desktop DE"}]},{"@type":"WebSite","@id":"https:\/\/www.europe-hotels.org\/#website","url":"https:\/\/www.europe-hotels.org\/","name":"Europe-Hotels","description":"Europe Hotels","publisher":{"@id":"https:\/\/www.europe-hotels.org\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.europe-hotels.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.europe-hotels.org\/#organization","name":"Europe-Hotels","url":"https:\/\/www.europe-hotels.org\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.europe-hotels.org\/#\/schema\/logo\/image\/","url":"https:\/\/www.europe-hotels.org\/wp-content\/uploads\/2023\/11\/LOGO_EUROPE_CORPORATE-300x65-1.png","contentUrl":"https:\/\/www.europe-hotels.org\/wp-content\/uploads\/2023\/11\/LOGO_EUROPE_CORPORATE-300x65-1.png","width":300,"height":65,"caption":"Europe-Hotels"},"image":{"@id":"https:\/\/www.europe-hotels.org\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.europe-hotels.org\/de\/wp-json\/wp\/v2\/e-floating-buttons\/43498","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.europe-hotels.org\/de\/wp-json\/wp\/v2\/e-floating-buttons"}],"about":[{"href":"https:\/\/www.europe-hotels.org\/de\/wp-json\/wp\/v2\/types\/e-floating-buttons"}],"author":[{"embeddable":true,"href":"https:\/\/www.europe-hotels.org\/de\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/www.europe-hotels.org\/de\/wp-json\/wp\/v2\/comments?post=43498"}],"version-history":[{"count":2,"href":"https:\/\/www.europe-hotels.org\/de\/wp-json\/wp\/v2\/e-floating-buttons\/43498\/revisions"}],"predecessor-version":[{"id":44491,"href":"https:\/\/www.europe-hotels.org\/de\/wp-json\/wp\/v2\/e-floating-buttons\/43498\/revisions\/44491"}],"wp:attachment":[{"href":"https:\/\/www.europe-hotels.org\/de\/wp-json\/wp\/v2\/media?parent=43498"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}