{"id":94473,"date":"2026-08-02T13:47:35","date_gmt":"2026-08-02T11:47:35","guid":{"rendered":"https:\/\/bno-travel.com\/costa-brava\/"},"modified":"2026-08-10T17:19:32","modified_gmt":"2026-08-10T15:19:32","slug":"costa-brava","status":"publish","type":"page","link":"https:\/\/bno-travel.com\/de\/costa-brava\/","title":{"rendered":"Costa Brava"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"94473\" class=\"elementor elementor-94473 elementor-93376\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4ea3dee9 e-flex e-con-boxed e-con e-parent\" data-id=\"4ea3dee9\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4623f398 elementor-widget elementor-widget-html\" data-id=\"4623f398\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section class=\"bno-area-hero bno-area-hero--premium\" style=\" background-color:#0c1a38; background-image: linear-gradient( rgba(10,18,28,.40), rgba(10,18,28,.60) ), url('https:\/\/bno-travel.com\/wp-content\/uploads\/2026\/08\/overnatting_i_costa_brava.jpeg'); background-position:center; background-size:cover; background-repeat:no-repeat; \">\r\n  <div class=\"bno-shell\">\r\n\r\n    <div class=\"bno-area-hero__content\">\r\n\r\n      <span class=\"bno-eyebrow\">\r\n        Costa Brava \u00b7 Katalonien \u00b7 Spanien\r\n      <\/span>\r\n\r\n      <h1>\r\n        Unterk\u00fcnfte an der Costa Brava \u2013 die passende Ferienunterkunft f\u00fcr Ihre Reise finden\r\n      <\/h1>\r\n\r\n      <p class=\"bno-lead\">\r\n        Entdecken Sie handverlesene Villen, Ferienunterk\u00fcnfte und Ferienwohnungen an der Costa Brava. Finden Sie eine komfortable Basis f\u00fcr Strandtage, kleine K\u00fcstenorte, Gastronomie und Erlebnisse in Katalonien.\r\n      <\/p>\r\n\r\n      <div class=\"bno-actions\">\r\n\r\n        <a href=\"#enheter\" class=\"bno-btn bno-btn--primary\">\r\n          Ferienunterk\u00fcnfte ansehen\r\n        <\/a>\r\n\r\n        <a href=\"#kart\" class=\"bno-btn bno-btn--secondary\">\r\n          Karte ansehen\r\n        <\/a>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-69df61ac e-flex e-con-boxed e-con e-parent\" data-id=\"69df61ac\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6e8316c7 elementor-widget elementor-widget-html\" data-id=\"6e8316c7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section class=\"bno-section bno-section--light bno-area-intro\">\r\n  <div class=\"bno-shell bno-narrow\">\r\n\r\n    <div class=\"bno-section-heading\">\r\n\r\n      <h2>\r\n        Unterk\u00fcnfte an der Costa Brava finden\r\n      <\/h2>\r\n\r\n      <p>\r\n        Eine Unterkunft an der Costa Brava bietet eine hervorragende Basis f\u00fcr entspannte Tage am Mittelmeer, katalanische Genusserlebnisse und Ausfl\u00fcge in historische Orte und traditionelle K\u00fcstend\u00f6rfer.\r\n      <\/p>\r\n\r\n      <p>\r\n        Unsere Ferienunterk\u00fcnfte befinden sich unter anderem in Begur, Calella de Palafrugell, Palam\u00f3s, Mont-Ras und Girona. Die Auswahl reicht von modernen Ferienwohnungen f\u00fcr kleinere Reisegruppen bis zu gro\u00dfz\u00fcgigen Villen und Ferienh\u00e4usern f\u00fcr Familien und gr\u00f6\u00dfere Gruppen.\r\n      <\/p>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-738b80d7 e-flex e-con-boxed e-con e-parent\" data-id=\"738b80d7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7d2f76c elementor-widget elementor-widget-html\" data-id=\"7d2f76c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section id=\"enheter\" class=\"bno-section bno-section--soft bno-direct-catalog\" data-bno-direct-catalog data-api-base=\"https:\/\/bno-api-staging.onrender.com\" data-booking-base=\"https:\/\/booking.bno-travel.com\/booking\/complete\" data-catalog-creds-key=\"EMERALD_COSTA_BRAVA\" data-booking-partner-key=\"EMERALD_COSTA_BRAVA\" data-service-id=\"7cb1382d-ec46-4719-9919-ad3400c91cea\" data-area-key=\"costa-brava\" data-destination-label=\"Costa Brava\" data-location-label=\"Costa Brava \u00b7 Spanien\" data-booking-open-until=\"2027-05-01\" data-minimum-stay-nights=\"1\" data-initial-count=\"12\" data-allowed-unit-ids=\"fe977011-fdbc-4bec-8071-b30d00bc33cc,a8b76e64-fda3-44af-bd5c-afe2010efd34,4e5d1f5a-f010-4919-a9a6-afd300830ea3,43c637b2-360b-4dc0-9bef-b0b500a499d3,7e974ac8-f569-43a3-9e85-af5f00f9ac0d,871faafe-ccaa-4782-819f-af7900bca28f,f7fce13e-7c2a-4b6a-b20a-b30d00ba6b30,05c12999-1319-4849-b707-b30d00b84976,0c0df774-82db-4252-a4fd-b3a900a7508c,e90a49b4-4bc9-4568-8dec-b48a00abbac2,b5cadae4-722b-4adf-bbff-b036007f87df,6b6ff7eb-535d-4620-b09a-b00300a44a34\" lang=\"de\" data-lang=\"de\">\r\n  <div class=\"bno-shell\">\r\n\r\n    <div class=\"bno-section-heading\">\r\n      <span class=\"bno-eyebrow\">\r\n        Ferienunterk\u00fcnfte an der Costa Brava\r\n      <\/span>\r\n\r\n      <h2>\r\n        Die passende Ferienunterkunft f\u00fcr Ihren Aufenthalt an der Costa Brava finden\r\n      <\/h2>\r\n\r\n      <p>\r\n        Entdecken Sie Villen, Ferienunterk\u00fcnfte und Ferienwohnungen unter anderem in Begur, Calella de Palafrugell, Palam\u00f3s, Mont-Ras und Girona. Sehen Sie Fotos, Kapazit\u00e4ten und Beschreibungen an, bevor Sie Preis und Verf\u00fcgbarkeit pr\u00fcfen.\r\n      <\/p>\r\n    <\/div>\r\n\r\n    <div class=\"bno-direct-catalog__status\" data-bno-status role=\"status\" aria-live=\"polite\">\r\n      Ferienunterk\u00fcnfte werden geladen \u2026\r\n    <\/div>\r\n\r\n    <div class=\"bno-direct-catalog__grid\" data-bno-grid aria-live=\"polite\" aria-busy=\"true\"><\/div>\r\n\r\n    <div class=\"bno-direct-more-wrap\" data-bno-more-wrap hidden>\r\n      <button type=\"button\" class=\"bno-direct-more\" data-bno-more>\r\n        Weitere Ferienunterk\u00fcnfte anzeigen\r\n      <\/button>\r\n    <\/div>\r\n\r\n  <\/div>\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-347ea0d e-flex e-con-boxed e-con e-parent\" data-id=\"347ea0d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-723d89a elementor-widget elementor-widget-html\" data-id=\"723d89a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\r\n.bno-direct-catalog,\r\n.bno-direct-modal {\r\n  --bno-navy: #0c1a38;\r\n  --bno-navy-hover: #162b55;\r\n  --bno-text: #3f4a5e;\r\n  --bno-muted: #536078;\r\n  --bno-border: rgba(12, 26, 56, 0.14);\r\n  --bno-soft: #eef3f8;\r\n  --bno-success-bg: #edf8f1;\r\n  --bno-success: #176b35;\r\n  --bno-error-bg: #fff1f1;\r\n  --bno-error: #8f1d1d;\r\n}\r\n\r\n.bno-direct-catalog,\r\n.bno-direct-catalog *,\r\n.bno-direct-modal,\r\n.bno-direct-modal * {\r\n  box-sizing: border-box;\r\n}\r\n\r\nhtml.bno-direct-modal-open,\r\nbody.bno-direct-modal-open {\r\n  overflow: hidden !important;\r\n}\r\n\r\n.bno-direct-catalog__status {\r\n  width: 100%;\r\n  margin: 28px 0 0;\r\n  padding: 16px 18px;\r\n  border: 1px solid var(--bno-border);\r\n  border-radius: 14px;\r\n  background: #ffffff !important;\r\n  color: var(--bno-navy) !important;\r\n  font-size: 15px;\r\n  line-height: 1.5;\r\n}\r\n\r\n.bno-direct-catalog__status.is-error {\r\n  border-color: rgba(143, 29, 29, 0.24);\r\n  background: var(--bno-error-bg) !important;\r\n  color: var(--bno-error) !important;\r\n}\r\n\r\n.bno-direct-catalog__grid {\r\n  display: grid !important;\r\n  grid-template-columns: repeat(3, minmax(0, 1fr)) !important;\r\n  gap: 24px !important;\r\n  align-items: stretch;\r\n  width: 100%;\r\n  margin-top: 28px;\r\n}\r\n\r\n.bno-direct-card {\r\n  display: flex;\r\n  min-width: 0;\r\n  max-width: 100%;\r\n  height: 100%;\r\n  overflow: hidden;\r\n  border: 1px solid var(--bno-border);\r\n  border-radius: 20px;\r\n  background: #ffffff !important;\r\n  color: var(--bno-navy) !important;\r\n  box-shadow: 0 12px 34px rgba(12, 26, 56, 0.08);\r\n  transition:\r\n    transform 0.2s ease,\r\n    box-shadow 0.2s ease;\r\n}\r\n\r\n.bno-direct-card:hover {\r\n  transform: translateY(-4px);\r\n  box-shadow: 0 18px 42px rgba(12, 26, 56, 0.14);\r\n}\r\n\r\n.bno-direct-card__button,\r\n.bno-direct-card__button:hover,\r\n.bno-direct-card__button:focus,\r\n.bno-direct-card__button:focus-visible,\r\n.bno-direct-card__button:active {\r\n  display: flex !important;\r\n  flex: 1 1 auto;\r\n  flex-direction: column !important;\r\n  width: 100% !important;\r\n  min-width: 0 !important;\r\n  max-width: 100% !important;\r\n  height: 100% !important;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n  overflow: hidden !important;\r\n  border: 0 !important;\r\n  border-radius: inherit !important;\r\n  background: transparent !important;\r\n  background-color: transparent !important;\r\n  background-image: none !important;\r\n  color: inherit !important;\r\n  box-shadow: none !important;\r\n  text-align: left !important;\r\n  text-decoration: none !important;\r\n  cursor: pointer;\r\n  appearance: none !important;\r\n  -webkit-appearance: none !important;\r\n}\r\n\r\n.bno-direct-card__media {\r\n  position: relative;\r\n  flex: 0 0 auto;\r\n  width: 100%;\r\n  min-width: 0;\r\n  aspect-ratio: 4 \/ 3;\r\n  overflow: hidden;\r\n  background: var(--bno-navy);\r\n}\r\n\r\n.bno-direct-card__media img {\r\n  display: block;\r\n  width: 100% !important;\r\n  height: 100% !important;\r\n  max-width: none !important;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n  object-fit: cover;\r\n  object-position: center;\r\n  border: 0;\r\n  border-radius: 0;\r\n  background: var(--bno-navy);\r\n  box-shadow: none;\r\n  transition: transform 0.35s ease;\r\n}\r\n\r\n.bno-direct-card:hover .bno-direct-card__media img {\r\n  transform: scale(1.035);\r\n}\r\n\r\n.bno-direct-card__count {\r\n  position: absolute;\r\n  right: 12px;\r\n  bottom: 12px;\r\n  z-index: 2;\r\n  padding: 7px 10px;\r\n  border: 1px solid rgba(255, 255, 255, 0.2);\r\n  border-radius: 999px;\r\n  background: rgba(12, 26, 56, 0.92) !important;\r\n  color: #ffffff !important;\r\n  font-size: 12px;\r\n  font-weight: 800;\r\n  line-height: 1;\r\n  white-space: nowrap;\r\n}\r\n\r\n.bno-direct-card__body {\r\n  display: flex !important;\r\n  flex: 1 1 auto;\r\n  flex-direction: column;\r\n  width: 100%;\r\n  min-width: 0;\r\n  max-width: 100%;\r\n  min-height: 238px;\r\n  padding: 20px;\r\n  overflow: hidden;\r\n  background: #ffffff !important;\r\n  color: var(--bno-navy) !important;\r\n}\r\n\r\n.bno-direct-card__body h3 {\r\n  display: -webkit-box;\r\n  width: 100%;\r\n  min-width: 0;\r\n  max-width: 100%;\r\n  margin: 0;\r\n  overflow: hidden;\r\n  color: var(--bno-navy) !important;\r\n  font-size: clamp(18px, 1.45vw, 22px);\r\n  font-weight: 800;\r\n  line-height: 1.2;\r\n  white-space: normal !important;\r\n  overflow-wrap: anywhere;\r\n  word-break: normal;\r\n  hyphens: auto;\r\n  -webkit-box-orient: vertical;\r\n  -webkit-line-clamp: 3;\r\n}\r\n\r\n.bno-direct-card__meta {\r\n  width: 100%;\r\n  margin: 8px 0 0;\r\n  color: var(--bno-muted) !important;\r\n  font-size: 13px;\r\n  font-weight: 800;\r\n  line-height: 1.4;\r\n}\r\n\r\n.bno-direct-card__description {\r\n  display: -webkit-box;\r\n  width: 100%;\r\n  min-width: 0;\r\n  max-width: 100%;\r\n  margin: 14px 0 0;\r\n  overflow: hidden;\r\n  color: var(--bno-text) !important;\r\n  font-size: 14px;\r\n  line-height: 1.6;\r\n  white-space: normal !important;\r\n  overflow-wrap: anywhere;\r\n  word-break: normal;\r\n  -webkit-box-orient: vertical;\r\n  -webkit-line-clamp: 4;\r\n}\r\n\r\n.bno-direct-card__link {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  align-self: flex-start;\r\n  margin-top: auto;\r\n  padding-top: 18px;\r\n  color: var(--bno-navy) !important;\r\n  font-size: 14px;\r\n  font-weight: 800;\r\n}\r\n\r\n.bno-direct-more-wrap {\r\n  display: flex;\r\n  justify-content: center;\r\n  margin-top: 34px;\r\n}\r\n\r\n.bno-direct-more-wrap[hidden],\r\n.bno-direct-modal[hidden],\r\n.bno-direct-message[hidden],\r\n.bno-direct-price[hidden],\r\n.bno-direct-continue[hidden] {\r\n  display: none !important;\r\n}\r\n\r\n.bno-direct-more,\r\n.bno-direct-check-button,\r\n.bno-direct-book-button,\r\n.bno-direct-more:hover,\r\n.bno-direct-check-button:hover,\r\n.bno-direct-book-button:hover,\r\n.bno-direct-more:focus,\r\n.bno-direct-check-button:focus,\r\n.bno-direct-book-button:focus,\r\n.bno-direct-more:active,\r\n.bno-direct-check-button:active,\r\n.bno-direct-book-button:active {\r\n  display: inline-flex !important;\r\n  align-items: center !important;\r\n  justify-content: center !important;\r\n  min-height: 50px !important;\r\n  margin: 0 !important;\r\n  padding: 12px 20px !important;\r\n  border: 1px solid var(--bno-navy) !important;\r\n  border-radius: 11px !important;\r\n  background: var(--bno-navy) !important;\r\n  background-color: var(--bno-navy) !important;\r\n  background-image: none !important;\r\n  color: #ffffff !important;\r\n  box-shadow: none !important;\r\n  font: inherit;\r\n  font-size: 14px !important;\r\n  font-weight: 800 !important;\r\n  line-height: 1.3 !important;\r\n  text-align: center !important;\r\n  text-decoration: none !important;\r\n  white-space: normal !important;\r\n  cursor: pointer;\r\n  appearance: none !important;\r\n  -webkit-appearance: none !important;\r\n}\r\n\r\n.bno-direct-more:hover,\r\n.bno-direct-check-button:hover,\r\n.bno-direct-book-button:hover {\r\n  background: var(--bno-navy-hover) !important;\r\n}\r\n\r\n.bno-direct-check-button:disabled {\r\n  border-color: #778195 !important;\r\n  background: #778195 !important;\r\n  cursor: wait;\r\n}\r\n\r\n.bno-direct-modal {\r\n  position: fixed;\r\n  z-index: 999999;\r\n  inset: 0;\r\n  display: grid;\r\n  place-items: center;\r\n  width: 100%;\r\n  max-width: 100%;\r\n  padding: 24px;\r\n  overflow: hidden;\r\n  -webkit-text-size-adjust: 100%;\r\n  text-size-adjust: 100%;\r\n}\r\n\r\n.bno-direct-modal__backdrop,\r\n.bno-direct-modal__backdrop:hover,\r\n.bno-direct-modal__backdrop:focus,\r\n.bno-direct-modal__backdrop:active {\r\n  position: absolute;\r\n  z-index: 0;\r\n  inset: 0;\r\n  width: 100%;\r\n  height: 100%;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n  border: 0 !important;\r\n  border-radius: 0 !important;\r\n  background: rgba(4, 12, 28, 0.82) !important;\r\n  background-image: none !important;\r\n  box-shadow: none !important;\r\n  cursor: zoom-out;\r\n  backdrop-filter: blur(3px);\r\n  appearance: none !important;\r\n  -webkit-appearance: none !important;\r\n}\r\n\r\n.bno-direct-modal__dialog {\r\n  position: relative;\r\n  z-index: 1;\r\n  display: grid;\r\n  grid-template-columns:\r\n    minmax(0, 1.16fr)\r\n    minmax(390px, 0.84fr);\r\n  width: min(1180px, calc(100vw - 48px));\r\n  max-width: 100%;\r\n  height: min(760px, calc(100dvh - 48px));\r\n  max-height: calc(100dvh - 48px);\r\n  overflow: hidden;\r\n  border: 1px solid rgba(255, 255, 255, 0.18);\r\n  border-radius: 22px;\r\n  background: #ffffff;\r\n  box-shadow: 0 30px 90px rgba(0, 0, 0, 0.4);\r\n}\r\n\r\n.bno-direct-modal__gallery {\r\n  position: relative;\r\n  width: 100%;\r\n  height: 100%;\r\n  min-width: 0;\r\n  min-height: 0;\r\n  overflow: hidden;\r\n  background: var(--bno-navy);\r\n}\r\n\r\n.bno-direct-modal__image {\r\n  position: absolute;\r\n  inset: 0;\r\n  display: block;\r\n  width: 100% !important;\r\n  height: 100% !important;\r\n  min-width: 100% !important;\r\n  min-height: 100% !important;\r\n  max-width: none !important;\r\n  max-height: none !important;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n  object-fit: cover;\r\n  object-position: center;\r\n  border: 0;\r\n  border-radius: 0;\r\n  background: var(--bno-navy);\r\n}\r\n\r\n.bno-direct-modal__content {\r\n  width: 100%;\r\n  height: 100%;\r\n  min-width: 0;\r\n  min-height: 0;\r\n  padding: 40px 34px 36px;\r\n  overflow-x: hidden;\r\n  overflow-y: auto;\r\n  background: #ffffff !important;\r\n  color: var(--bno-text) !important;\r\n  scrollbar-color: rgba(12, 26, 56, 0.32) transparent;\r\n  scrollbar-width: thin;\r\n}\r\n\r\n.bno-direct-modal__content * {\r\n  min-width: 0;\r\n}\r\n\r\n.bno-direct-eyebrow {\r\n  display: inline-block;\r\n  max-width: 100%;\r\n  color: var(--bno-muted) !important;\r\n  font-size: 12px;\r\n  font-weight: 800;\r\n  letter-spacing: 0.04em;\r\n  line-height: 1.4;\r\n  text-transform: uppercase;\r\n  white-space: normal;\r\n  overflow-wrap: anywhere;\r\n}\r\n\r\n.bno-direct-modal__content h3 {\r\n  width: 100%;\r\n  max-width: 100%;\r\n  margin: 10px 0 0;\r\n  color: var(--bno-navy) !important;\r\n  font-size: clamp(28px, 3vw, 40px);\r\n  font-weight: 800;\r\n  line-height: 1.08;\r\n  white-space: normal !important;\r\n  overflow-wrap: anywhere;\r\n  hyphens: auto;\r\n}\r\n\r\n.bno-direct-modal__capacity {\r\n  width: 100%;\r\n  margin: 12px 0 0;\r\n  color: var(--bno-muted) !important;\r\n  font-size: 14px;\r\n  font-weight: 800;\r\n}\r\n\r\n.bno-direct-modal__description {\r\n  width: 100%;\r\n  max-width: 100%;\r\n  max-height: 245px;\r\n  margin-top: 20px;\r\n  padding-right: 8px;\r\n  overflow-x: hidden;\r\n  overflow-y: auto;\r\n  color: var(--bno-text) !important;\r\n  font-size: 15px;\r\n  line-height: 1.72;\r\n  white-space: pre-line;\r\n  overflow-wrap: anywhere;\r\n}\r\n\r\n.bno-direct-modal__close,\r\n.bno-direct-modal__arrow,\r\n.bno-direct-modal__close:hover,\r\n.bno-direct-modal__arrow:hover,\r\n.bno-direct-modal__close:focus,\r\n.bno-direct-modal__arrow:focus,\r\n.bno-direct-modal__close:active,\r\n.bno-direct-modal__arrow:active {\r\n  display: grid !important;\r\n  place-items: center !important;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n  border: 1px solid rgba(255, 255, 255, 0.25) !important;\r\n  border-radius: 999px !important;\r\n  background: rgba(12, 26, 56, 0.94) !important;\r\n  background-image: none !important;\r\n  color: #ffffff !important;\r\n  box-shadow: 0 7px 22px rgba(0, 0, 0, 0.24) !important;\r\n  font-family: Arial, sans-serif !important;\r\n  font-weight: 400 !important;\r\n  line-height: 1 !important;\r\n  cursor: pointer;\r\n  appearance: none !important;\r\n  -webkit-appearance: none !important;\r\n}\r\n\r\n.bno-direct-modal__close {\r\n  position: absolute;\r\n  z-index: 12;\r\n  top: 14px;\r\n  right: 14px;\r\n  width: 44px !important;\r\n  min-width: 44px !important;\r\n  height: 44px !important;\r\n  min-height: 44px !important;\r\n  font-size: 28px !important;\r\n}\r\n\r\n.bno-direct-modal__arrow {\r\n  position: absolute;\r\n  z-index: 8;\r\n  top: 50%;\r\n  width: 48px !important;\r\n  min-width: 48px !important;\r\n  height: 48px !important;\r\n  min-height: 48px !important;\r\n  font-size: 35px !important;\r\n  transform: translateY(-50%);\r\n}\r\n\r\n.bno-direct-modal__arrow--prev {\r\n  left: 18px;\r\n}\r\n\r\n.bno-direct-modal__arrow--next {\r\n  right: 18px;\r\n}\r\n\r\n.bno-direct-modal__arrow[hidden] {\r\n  display: none !important;\r\n}\r\n\r\n.bno-direct-modal__counter {\r\n  position: absolute;\r\n  z-index: 8;\r\n  right: 18px;\r\n  bottom: 18px;\r\n  padding: 8px 12px;\r\n  border: 1px solid rgba(255, 255, 255, 0.2);\r\n  border-radius: 999px;\r\n  background: rgba(12, 26, 56, 0.92) !important;\r\n  color: #ffffff !important;\r\n  font-size: 13px;\r\n  font-weight: 800;\r\n  line-height: 1;\r\n}\r\n\r\n.bno-direct-booking {\r\n  width: 100%;\r\n  margin-top: 30px;\r\n  padding-top: 28px;\r\n  border-top: 1px solid var(--bno-border);\r\n}\r\n\r\n.bno-direct-booking__heading h4 {\r\n  width: 100%;\r\n  margin: 6px 0 0;\r\n  color: var(--bno-navy) !important;\r\n  font-size: 22px;\r\n  font-weight: 800;\r\n  line-height: 1.25;\r\n  overflow-wrap: anywhere;\r\n}\r\n\r\n.bno-direct-form {\r\n  display: grid;\r\n  grid-template-columns: repeat(2, minmax(0, 1fr));\r\n  gap: 14px;\r\n  width: 100%;\r\n  margin-top: 20px;\r\n}\r\n\r\n.bno-direct-form label {\r\n  display: grid;\r\n  gap: 7px;\r\n  width: 100%;\r\n  min-width: 0;\r\n  color: var(--bno-navy) !important;\r\n  font-size: 13px;\r\n  font-weight: 800;\r\n}\r\n\r\n.bno-direct-form input {\r\n  display: block;\r\n  width: 100% !important;\r\n  max-width: 100% !important;\r\n  min-width: 0 !important;\r\n  min-height: 48px;\r\n  margin: 0 !important;\r\n  padding: 10px 12px !important;\r\n  border: 1px solid rgba(12, 26, 56, 0.22) !important;\r\n  border-radius: 10px !important;\r\n  background: #ffffff !important;\r\n  color: var(--bno-navy) !important;\r\n  box-shadow: none !important;\r\n  font: inherit;\r\n  font-size: 16px !important;\r\n}\r\n\r\n.bno-direct-check-button {\r\n  grid-column: 1 \/ -1;\r\n  width: 100% !important;\r\n}\r\n\r\n.bno-direct-message {\r\n  width: 100%;\r\n  max-width: 100%;\r\n  margin-top: 15px;\r\n  padding: 14px 15px;\r\n  border-radius: 11px;\r\n  background: var(--bno-soft) !important;\r\n  color: var(--bno-navy) !important;\r\n  font-size: 14px;\r\n  line-height: 1.5;\r\n  white-space: normal !important;\r\n  overflow-wrap: anywhere;\r\n}\r\n\r\n.bno-direct-message.is-success {\r\n  background: var(--bno-success-bg) !important;\r\n  color: var(--bno-success) !important;\r\n}\r\n\r\n.bno-direct-message.is-error {\r\n  background: var(--bno-error-bg) !important;\r\n  color: var(--bno-error) !important;\r\n}\r\n\r\n.bno-direct-price {\r\n  width: 100%;\r\n  max-width: 100%;\r\n  margin-top: 18px;\r\n  overflow: hidden;\r\n  border: 1px solid var(--bno-border);\r\n  border-radius: 14px;\r\n  background: #ffffff !important;\r\n}\r\n\r\n.bno-direct-price__row {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  gap: 20px;\r\n  width: 100%;\r\n  min-width: 0;\r\n  padding: 13px 15px;\r\n  border-top: 1px solid rgba(12, 26, 56, 0.1);\r\n  background: #ffffff !important;\r\n  color: var(--bno-navy) !important;\r\n}\r\n\r\n.bno-direct-price__row:first-child {\r\n  border-top: 0;\r\n}\r\n\r\n.bno-direct-price__row span,\r\n.bno-direct-price__row strong {\r\n  min-width: 0;\r\n  max-width: 100%;\r\n  color: inherit !important;\r\n  white-space: normal !important;\r\n  overflow-wrap: anywhere;\r\n}\r\n\r\n.bno-direct-price__row strong {\r\n  flex: 0 0 auto;\r\n  text-align: right;\r\n}\r\n\r\n.bno-direct-price__row--total {\r\n  background: var(--bno-navy) !important;\r\n  color: #ffffff !important;\r\n}\r\n\r\n.bno-direct-continue {\r\n  width: 100%;\r\n  margin-top: 18px;\r\n}\r\n\r\n.bno-direct-book-button {\r\n  width: 100% !important;\r\n  min-height: 54px !important;\r\n  font-size: 15px !important;\r\n}\r\n\r\n.bno-direct-continue p {\r\n  width: 100%;\r\n  margin: 10px 0 0;\r\n  color: var(--bno-muted) !important;\r\n  font-size: 12px;\r\n  line-height: 1.5;\r\n  text-align: center;\r\n  overflow-wrap: anywhere;\r\n}\r\n\r\n@media (max-width: 980px) {\r\n  .bno-direct-catalog__grid {\r\n    grid-template-columns:\r\n      repeat(2, minmax(0, 1fr)) !important;\r\n  }\r\n}\r\n\r\n@media (max-width: 900px) {\r\n  .bno-direct-modal {\r\n    display: block !important;\r\n    width: 100% !important;\r\n    max-width: 100% !important;\r\n    padding: 0 !important;\r\n    overflow-x: hidden !important;\r\n    overflow-y: auto !important;\r\n    background: #ffffff !important;\r\n    overscroll-behavior: contain;\r\n    -webkit-overflow-scrolling: touch;\r\n  }\r\n\r\n  .bno-direct-modal__backdrop {\r\n    position: fixed !important;\r\n  }\r\n\r\n  .bno-direct-modal__dialog {\r\n    display: block !important;\r\n    width: 100% !important;\r\n    max-width: 100% !important;\r\n    min-width: 0 !important;\r\n    height: auto !important;\r\n    min-height: 100vh !important;\r\n    min-height: 100dvh !important;\r\n    max-height: none !important;\r\n    margin: 0 !important;\r\n    padding: 0 !important;\r\n    overflow: visible !important;\r\n    border: 0 !important;\r\n    border-radius: 0 !important;\r\n    background: #ffffff !important;\r\n    box-shadow: none !important;\r\n  }\r\n\r\n  .bno-direct-modal__gallery {\r\n    width: 100% !important;\r\n    max-width: 100% !important;\r\n    height: clamp(320px, 60vw, 520px) !important;\r\n    min-height: 320px !important;\r\n  }\r\n\r\n  .bno-direct-modal__content {\r\n    width: 100% !important;\r\n    max-width: 100% !important;\r\n    min-width: 0 !important;\r\n    height: auto !important;\r\n    max-height: none !important;\r\n    margin: 0 !important;\r\n    padding:\r\n      34px\r\n      clamp(20px, 5vw, 44px)\r\n      52px !important;\r\n    overflow: visible !important;\r\n  }\r\n\r\n  .bno-direct-modal__description {\r\n    max-height: none !important;\r\n    padding-right: 0 !important;\r\n    overflow: visible !important;\r\n  }\r\n\r\n  .bno-direct-modal__close {\r\n    position: fixed !important;\r\n    top: max(12px, env(safe-area-inset-top)) !important;\r\n    right: max(12px, env(safe-area-inset-right)) !important;\r\n  }\r\n\r\n  .bno-direct-price__row {\r\n    display: grid !important;\r\n    grid-template-columns: minmax(0, 1fr) !important;\r\n    align-items: start !important;\r\n    gap: 7px !important;\r\n    padding: 17px 18px !important;\r\n  }\r\n\r\n  .bno-direct-price__row strong {\r\n    width: 100%;\r\n    text-align: left !important;\r\n    font-size: 20px;\r\n  }\r\n}\r\n\r\n@media (max-width: 620px) {\r\n  .bno-direct-catalog__grid {\r\n    grid-template-columns: 1fr !important;\r\n  }\r\n\r\n  .bno-direct-card__body {\r\n    min-height: 220px;\r\n  }\r\n\r\n  .bno-direct-modal__gallery {\r\n    height: 66vw !important;\r\n    min-height: 270px !important;\r\n    max-height: 370px !important;\r\n  }\r\n\r\n  .bno-direct-modal__content {\r\n    padding:\r\n      28px\r\n      max(18px, env(safe-area-inset-right))\r\n      calc(48px + env(safe-area-inset-bottom))\r\n      max(18px, env(safe-area-inset-left)) !important;\r\n  }\r\n\r\n  .bno-direct-modal__content h3 {\r\n    font-size: 28px !important;\r\n    line-height: 1.12 !important;\r\n  }\r\n\r\n  .bno-direct-booking__heading h4 {\r\n    font-size: 24px !important;\r\n    line-height: 1.18 !important;\r\n  }\r\n\r\n  .bno-direct-form {\r\n    grid-template-columns: minmax(0, 1fr) !important;\r\n  }\r\n\r\n  .bno-direct-check-button {\r\n    grid-column: 1 !important;\r\n  }\r\n\r\n  .bno-direct-modal__arrow {\r\n    width: 44px !important;\r\n    min-width: 44px !important;\r\n    height: 44px !important;\r\n    min-height: 44px !important;\r\n  }\r\n\r\n  .bno-direct-modal__arrow--prev {\r\n    left: 12px;\r\n  }\r\n\r\n  .bno-direct-modal__arrow--next {\r\n    right: 12px;\r\n  }\r\n\r\n  .bno-direct-modal__counter {\r\n    right: 12px;\r\n    bottom: 12px;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function () {\r\n  \"use strict\";\r\n\r\n  const ROOT_SELECTOR = \"[data-bno-direct-catalog]\";\r\n\r\n  function clean(value) {\r\n    return String(value || \"\").trim();\r\n  }\r\n\r\n  function cleanBase(value) {\r\n    return clean(value).replace(\/\\\/+$\/, \"\");\r\n  }\r\n\r\n  function endpoint(base, path) {\r\n    const apiBase = cleanBase(base);\r\n    const route = String(path || \"\");\r\n\r\n    if (\r\n      apiBase.endsWith(\"\/api\") &&\r\n      route.startsWith(\"\/api\/\")\r\n    ) {\r\n      return apiBase + route.slice(4);\r\n    }\r\n\r\n    return apiBase + route;\r\n  }\r\n\r\n  function escapeHtml(value) {\r\n    return String(\r\n      value == null ? \"\" : value\r\n    )\r\n      .replace(\/&\/g, \"&amp;\")\r\n      .replace(\/<\/g, \"&lt;\")\r\n      .replace(\/>\/g, \"&gt;\")\r\n      .replace(\/\"\/g, \"&quot;\")\r\n      .replace(\/'\/g, \"&#039;\");\r\n  }\r\n\r\n  function stripHtml(value) {\r\n    const element =\r\n      document.createElement(\"div\");\r\n\r\n    element.innerHTML =\r\n      String(value || \"\");\r\n\r\n    return String(\r\n      element.textContent ||\r\n      element.innerText ||\r\n      \"\"\r\n    )\r\n      .replace(\/\\s+\/g, \" \")\r\n      .trim();\r\n  }\r\n\r\n  function firstValue(object, keys) {\r\n    for (const key of keys) {\r\n      if (\r\n        object &&\r\n        object[key] != null &&\r\n        object[key] !== \"\"\r\n      ) {\r\n        return object[key];\r\n      }\r\n    }\r\n\r\n    return \"\";\r\n  }\r\n\r\n  function parseIdSet(value) {\r\n    return new Set(\r\n      clean(value)\r\n        .split(\",\")\r\n        .map(function (item) {\r\n          return item.trim();\r\n        })\r\n        .filter(Boolean)\r\n    );\r\n  }\r\n\r\n  function currentLanguage() {\r\n    return \"de\";\r\n  }\r\n\r\n  function localDate(date) {\r\n    return (\r\n      date.getFullYear() +\r\n      \"-\" +\r\n      String(\r\n        date.getMonth() + 1\r\n      ).padStart(2, \"0\") +\r\n      \"-\" +\r\n      String(\r\n        date.getDate()\r\n      ).padStart(2, \"0\")\r\n    );\r\n  }\r\n\r\n  function addDays(date, days) {\r\n    const result =\r\n      new Date(date.getTime());\r\n\r\n    result.setDate(\r\n      result.getDate() +\r\n      Number(days || 0)\r\n    );\r\n\r\n    return result;\r\n  }\r\n\r\n  function numberOfNights(from, to) {\r\n    return Math.round(\r\n      (\r\n        new Date(\r\n          to + \"T12:00:00\"\r\n        ).getTime() -\r\n        new Date(\r\n          from + \"T12:00:00\"\r\n        ).getTime()\r\n      ) \/\r\n      86400000\r\n    );\r\n  }\r\n\r\n  function formatDate(value) {\r\n    try {\r\n      return new Intl.DateTimeFormat(\r\n        \"de-DE\",\r\n        {\r\n          day: \"numeric\",\r\n          month: \"short\",\r\n          year: \"numeric\"\r\n        }\r\n      ).format(\r\n        new Date(\r\n          value + \"T12:00:00\"\r\n        )\r\n      );\r\n    } catch (_error) {\r\n      return value;\r\n    }\r\n  }\r\n\r\n  function formatMoney(\r\n    amount,\r\n    currency\r\n  ) {\r\n    try {\r\n      return new Intl.NumberFormat(\r\n        \"de-DE\",\r\n        {\r\n          style: \"currency\",\r\n          currency: clean(\r\n            currency || \"EUR\"\r\n          ).toUpperCase(),\r\n          minimumFractionDigits: 2,\r\n          maximumFractionDigits: 2\r\n        }\r\n      ).format(\r\n        Number(amount || 0)\r\n      );\r\n    } catch (_error) {\r\n      return (\r\n        Number(amount || 0).toFixed(2) +\r\n        \" \" +\r\n        clean(currency || \"EUR\")\r\n      );\r\n    }\r\n  }\r\n\r\n  function getImages(row) {\r\n    const result = [];\r\n\r\n    function addImage(value) {\r\n      if (!value) {\r\n        return;\r\n      }\r\n\r\n      if (typeof value === \"string\") {\r\n        const url = value.trim();\r\n\r\n        if (\/^https?:\\\/\\\/\/i.test(url)) {\r\n          result.push(url);\r\n        }\r\n\r\n        return;\r\n      }\r\n\r\n      if (typeof value === \"object\") {\r\n        addImage(\r\n          value.url ||\r\n          value.Url ||\r\n          value.imageUrl ||\r\n          value.ImageUrl ||\r\n          value.source ||\r\n          value.Source ||\r\n          value.original ||\r\n          value.Original\r\n        );\r\n      }\r\n    }\r\n\r\n    [\r\n      row.images,\r\n      row.Images,\r\n      row.gallery,\r\n      row.Gallery,\r\n      row.imageUrls,\r\n      row.ImageUrls,\r\n      row.photos,\r\n      row.Photos\r\n    ].forEach(function (items) {\r\n      if (Array.isArray(items)) {\r\n        items.forEach(addImage);\r\n      }\r\n    });\r\n\r\n    [\r\n      row.image,\r\n      row.Image,\r\n      row.coverImageUrl,\r\n      row.CoverImageUrl,\r\n      row.imageUrl,\r\n      row.ImageUrl,\r\n      row.thumbnailUrl,\r\n      row.ThumbnailUrl\r\n    ].forEach(addImage);\r\n\r\n    return Array.from(\r\n      new Set(result)\r\n    );\r\n  }\r\n\r\n  function extractRows(payload) {\r\n    const candidates = [\r\n      payload &&\r\n      payload.data &&\r\n      payload.data.resourceCategories,\r\n\r\n      payload &&\r\n      payload.data &&\r\n      payload.data.categories,\r\n\r\n      payload &&\r\n      payload.data &&\r\n      payload.data.items,\r\n\r\n      payload && payload.data,\r\n      payload && payload.resourceCategories,\r\n      payload && payload.categories,\r\n      payload && payload.items\r\n    ];\r\n\r\n    for (const candidate of candidates) {\r\n      if (Array.isArray(candidate)) {\r\n        return candidate;\r\n      }\r\n    }\r\n\r\n    return [];\r\n  }\r\n\r\n  function normaliseUnit(row) {\r\n    return {\r\n      id: clean(\r\n        firstValue(row, [\r\n          \"resourceCategoryId\",\r\n          \"ResourceCategoryId\",\r\n          \"categoryId\",\r\n          \"CategoryId\",\r\n          \"id\",\r\n          \"Id\"\r\n        ])\r\n      ),\r\n\r\n      name: clean(\r\n        firstValue(row, [\r\n          \"localizedName\",\r\n          \"LocalizedName\",\r\n          \"categoryName\",\r\n          \"CategoryName\",\r\n          \"name\",\r\n          \"Name\",\r\n          \"title\",\r\n          \"Title\"\r\n        ]) ||\r\n        \"Ferienunterkunft\"\r\n      ),\r\n\r\n      description: stripHtml(\r\n        firstValue(row, [\r\n          \"localizedDescription\",\r\n          \"LocalizedDescription\",\r\n          \"description\",\r\n          \"Description\",\r\n          \"longDescription\",\r\n          \"LongDescription\",\r\n          \"shortDescription\",\r\n          \"ShortDescription\"\r\n        ])\r\n      ),\r\n\r\n      capacity:\r\n        Number(\r\n          firstValue(row, [\r\n            \"capacity\",\r\n            \"Capacity\",\r\n            \"maxOccupancy\",\r\n            \"MaxOccupancy\",\r\n            \"maximumOccupancy\",\r\n            \"MaximumOccupancy\",\r\n            \"maxPersons\",\r\n            \"MaxPersons\",\r\n            \"maxG\u00e4ste\",\r\n            \"MaxG\u00e4ste\"\r\n          ])\r\n        ) || 0,\r\n\r\n      images:\r\n        getImages(row),\r\n\r\n      published:\r\n        firstValue(row, [\r\n          \"isPublished\",\r\n          \"IsPublished\",\r\n          \"is_published\",\r\n          \"publishStatus\",\r\n          \"PublishStatus\",\r\n          \"publish_status\"\r\n        ])\r\n    };\r\n  }\r\n\r\n  function isPublished(\r\n    unit,\r\n    hasPublicationFields\r\n  ) {\r\n    if (!hasPublicationFields) {\r\n      return true;\r\n    }\r\n\r\n    if (\r\n      typeof unit.published ===\r\n      \"boolean\"\r\n    ) {\r\n      return unit.published;\r\n    }\r\n\r\n    return [\r\n      \"published\",\r\n      \"approved\",\r\n      \"reviewed\",\r\n      \"active\",\r\n      \"true\",\r\n      \"1\"\r\n    ].includes(\r\n      clean(\r\n        unit.published\r\n      ).toLowerCase()\r\n    );\r\n  }\r\n\r\n  async function fetchJson(\r\n    url,\r\n    options\r\n  ) {\r\n    const controller =\r\n      new AbortController();\r\n\r\n    const timeout =\r\n      window.setTimeout(\r\n        function () {\r\n          controller.abort();\r\n        },\r\n        60000\r\n      );\r\n\r\n    try {\r\n      const response = await fetch(\r\n        url,\r\n        Object.assign(\r\n          {\r\n            cache: \"no-store\",\r\n            signal: controller.signal,\r\n            headers: {\r\n              Accept: \"application\/json\"\r\n            }\r\n          },\r\n          options || {}\r\n        )\r\n      );\r\n\r\n      const payload =\r\n        await response\r\n          .json()\r\n          .catch(function () {\r\n            return null;\r\n          });\r\n\r\n      if (\r\n        !response.ok ||\r\n        !payload ||\r\n        payload.ok === false\r\n      ) {\r\n        const error = new Error(\r\n          payload &&\r\n          (\r\n            payload.detail ||\r\n            payload.message ||\r\n            payload.error\r\n          )\r\n            ? (\r\n                payload.detail ||\r\n                payload.message ||\r\n                payload.error\r\n              )\r\n            : \"Die Anfrage konnte nicht abgeschlossen werden.\"\r\n        );\r\n\r\n        error.code =\r\n          payload &&\r\n          payload.error\r\n            ? String(payload.error)\r\n            : \"\";\r\n\r\n        throw error;\r\n      }\r\n\r\n      return payload;\r\n    } finally {\r\n      window.clearTimeout(timeout);\r\n    }\r\n  }\r\n\r\n  function createModal(\r\n    destination,\r\n    location\r\n  ) {\r\n    const modal =\r\n      document.createElement(\"div\");\r\n\r\n    modal.className =\r\n      \"bno-direct-modal\";\r\n\r\n    modal.hidden = true;\r\n\r\n    modal.setAttribute(\r\n      \"role\",\r\n      \"dialog\"\r\n    );\r\n\r\n    modal.setAttribute(\r\n      \"aria-modal\",\r\n      \"true\"\r\n    );\r\n\r\n    modal.setAttribute(\r\n      \"aria-label\",\r\n      \"Ferienunterkunft in \" +\r\n      destination\r\n    );\r\n\r\n    modal.innerHTML = `\r\n      <button type=\"button\" class=\"bno-direct-modal__backdrop\" data-bno-close aria-label=\"Schlie\u00dfen\"><\/button>\r\n\r\n      <div class=\"bno-direct-modal__dialog\">\r\n\r\n        <button type=\"button\" class=\"bno-direct-modal__close\" data-bno-close aria-label=\"Schlie\u00dfen\">\r\n          \u00d7\r\n        <\/button>\r\n\r\n        <div class=\"bno-direct-modal__gallery\">\r\n\r\n          <button type=\"button\" class=\"bno-direct-modal__arrow bno-direct-modal__arrow--prev\" data-bno-prev aria-label=\"Vorheriges Bild\">\r\n            \u2039\r\n          <\/button>\r\n\r\n          <img decoding=\"async\" class=\"bno-direct-modal__image\" data-bno-image src=\"\" alt=\"\" \/>\r\n\r\n          <button type=\"button\" class=\"bno-direct-modal__arrow bno-direct-modal__arrow--next\" data-bno-next aria-label=\"N\u00e4chstes Bild\">\r\n            \u203a\r\n          <\/button>\r\n\r\n          <span class=\"bno-direct-modal__counter\" data-bno-counter><\/span>\r\n\r\n        <\/div>\r\n\r\n        <div class=\"bno-direct-modal__content\">\r\n\r\n          <span class=\"bno-direct-eyebrow\">\r\n            ${escapeHtml(\r\n              location ||\r\n              destination\r\n            )}\r\n          <\/span>\r\n\r\n          <h3 data-bno-title><\/h3>\r\n\r\n          <p class=\"bno-direct-modal__capacity\" data-bno-capacity><\/p>\r\n\r\n          <div class=\"bno-direct-modal__description\" data-bno-description><\/div>\r\n\r\n          <div class=\"bno-direct-booking\">\r\n\r\n            <div class=\"bno-direct-booking__heading\">\r\n              <span class=\"bno-direct-eyebrow\">\r\n                Aufenthalt pr\u00fcfen\r\n              <\/span>\r\n\r\n              <h4>\r\n                Verf\u00fcgbarkeit dieser Ferienunterkunft pr\u00fcfen\r\n              <\/h4>\r\n            <\/div>\r\n\r\n            <form\r\n              class=\"bno-direct-form\"\r\n              data-bno-form\r\n              novalidate\r\n            >\r\n              <label>\r\n                <span>Anreise<\/span>\r\n\r\n                <input\r\n                  type=\"date\"\r\n                  data-bno-checkin\r\n                  required\r\n                \/>\r\n              <\/label>\r\n\r\n              <label>\r\n                <span>Abreise<\/span>\r\n\r\n                <input\r\n                  type=\"date\"\r\n                  data-bno-checkout\r\n                  required\r\n                \/>\r\n              <\/label>\r\n\r\n              <label>\r\n                <span>G\u00e4ste<\/span>\r\n\r\n                <input\r\n                  type=\"number\"\r\n                  data-bno-guests\r\n                  min=\"1\"\r\n                  step=\"1\"\r\n                  value=\"2\"\r\n                  required\r\n                \/>\r\n              <\/label>\r\n\r\n              <button type=\"submit\" class=\"bno-direct-check-button\" data-bno-check>\r\n                Verf\u00fcgbarkeit pr\u00fcfen\r\n              <\/button>\r\n            <\/form>\r\n\r\n            <div class=\"bno-direct-message\" data-bno-message role=\"status\" aria-live=\"polite\" hidden><\/div>\r\n\r\n            <div class=\"bno-direct-price\" data-bno-price hidden>\r\n              <div class=\"bno-direct-price__row bno-direct-price__row--total\">\r\n                <span>\r\n                  Gesamtpreis f\u00fcr den Aufenthalt\r\n                <\/span>\r\n\r\n                <strong data-bno-total><\/strong>\r\n              <\/div>\r\n\r\n              <div class=\"bno-direct-price__row\">\r\n                <span>\r\n                  Jetzt an BNO Travel zu zahlen\r\n                <\/span>\r\n\r\n                <strong data-bno-now><\/strong>\r\n              <\/div>\r\n\r\n              <div class=\"bno-direct-price__row\">\r\n                <span>\r\n                  Restbetrag an den Unterkunftsanbieter\r\n                <\/span>\r\n\r\n                <strong data-bno-later><\/strong>\r\n              <\/div>\r\n            <\/div>\r\n\r\n            <div class=\"bno-direct-continue\" data-bno-continue-wrap hidden>\r\n              <button type=\"button\" class=\"bno-direct-book-button\" data-bno-continue>\r\n                Weiter zur Buchung\r\n              <\/button>\r\n\r\n              <p>\r\n                G\u00e4stedaten, Bedingungen und Zahlung werden in der sicheren Buchungsstrecke von BNO Travel abgeschlossen.\r\n              <\/p>\r\n            <\/div>\r\n\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n    `;\r\n\r\n    document.body.appendChild(modal);\r\n\r\n    return modal;\r\n  }\r\n\r\n  function initialiseCatalog(root) {\r\n    if (\r\n      !root ||\r\n      root.dataset.bnoReady === \"1\"\r\n    ) {\r\n      return;\r\n    }\r\n\r\n    root.dataset.bnoReady = \"1\";\r\n\r\n    const status =\r\n      root.querySelector(\r\n        \"[data-bno-status]\"\r\n      );\r\n\r\n    const grid =\r\n      root.querySelector(\r\n        \"[data-bno-grid]\"\r\n      );\r\n\r\n    const moreWrap =\r\n      root.querySelector(\r\n        \"[data-bno-more-wrap]\"\r\n      );\r\n\r\n    const moreButton =\r\n      root.querySelector(\r\n        \"[data-bno-more]\"\r\n      );\r\n\r\n    if (\r\n      !status ||\r\n      !grid ||\r\n      !moreWrap ||\r\n      !moreButton\r\n    ) {\r\n      return;\r\n    }\r\n\r\n    const apiBase =\r\n      cleanBase(\r\n        root.dataset.apiBase\r\n      );\r\n\r\n    const bookingBase =\r\n      clean(\r\n        root.dataset.bookingBase ||\r\n        \"https:\/\/booking.bno-travel.com\/booking\/complete\"\r\n      );\r\n\r\n    const catalogKey =\r\n      clean(\r\n        root.dataset.catalogCredsKey\r\n      );\r\n\r\n    const partnerKey =\r\n      clean(\r\n        root.dataset.bookingPartnerKey ||\r\n        catalogKey\r\n      );\r\n\r\n    const serviceId =\r\n      clean(\r\n        root.dataset.serviceId\r\n      );\r\n\r\n    const areaKey =\r\n      clean(\r\n        root.dataset.areaKey\r\n      );\r\n\r\n    const destination =\r\n      clean(\r\n        root.dataset.destinationLabel ||\r\n        \"destinasjonen\"\r\n      );\r\n\r\n    const location =\r\n      clean(\r\n        root.dataset.locationLabel ||\r\n        destination\r\n      );\r\n\r\n    const bookingOpenUntil =\r\n      clean(\r\n        root.dataset.bookingOpenUntil ||\r\n        \"2027-05-01\"\r\n      );\r\n\r\n    const minimumStay =\r\n      Math.max(\r\n        1,\r\n        Number(\r\n          root.dataset.minimumStayNights ||\r\n          1\r\n        ) || 1\r\n      );\r\n\r\n    const pageSize =\r\n      Math.max(\r\n        1,\r\n        Number(\r\n          root.dataset.initialCount ||\r\n          12\r\n        ) || 12\r\n      );\r\n\r\n    const allowedIds =\r\n      parseIdSet(\r\n        root.dataset.allowedUnitIds\r\n      );\r\n\r\n    const excludedIds =\r\n      parseIdSet(\r\n        root.dataset.excludedUnitIds\r\n      );\r\n\r\n    if (\r\n      !apiBase ||\r\n      !catalogKey ||\r\n      !serviceId ||\r\n      !areaKey\r\n    ) {\r\n      status.textContent =\r\n        \"Bulk 3 mangler n\u00f8dvendig konfigurasjon.\";\r\n\r\n      status.classList.add(\r\n        \"is-error\"\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    const modal =\r\n      createModal(\r\n        destination,\r\n        location\r\n      );\r\n\r\n    const modalImage =\r\n      modal.querySelector(\r\n        \"[data-bno-image]\"\r\n      );\r\n\r\n    const modalTitle =\r\n      modal.querySelector(\r\n        \"[data-bno-title]\"\r\n      );\r\n\r\n    const modalCapacity =\r\n      modal.querySelector(\r\n        \"[data-bno-capacity]\"\r\n      );\r\n\r\n    const modalDescription =\r\n      modal.querySelector(\r\n        \"[data-bno-description]\"\r\n      );\r\n\r\n    const modalCounter =\r\n      modal.querySelector(\r\n        \"[data-bno-counter]\"\r\n      );\r\n\r\n    const previousButton =\r\n      modal.querySelector(\r\n        \"[data-bno-prev]\"\r\n      );\r\n\r\n    const nextButton =\r\n      modal.querySelector(\r\n        \"[data-bno-next]\"\r\n      );\r\n\r\n    const availabilityForm =\r\n      modal.querySelector(\r\n        \"[data-bno-form]\"\r\n      );\r\n\r\n    const checkinInput =\r\n      modal.querySelector(\r\n        \"[data-bno-checkin]\"\r\n      );\r\n\r\n    const checkoutInput =\r\n      modal.querySelector(\r\n        \"[data-bno-checkout]\"\r\n      );\r\n\r\n    const guestsInput =\r\n      modal.querySelector(\r\n        \"[data-bno-guests]\"\r\n      );\r\n\r\n    const checkButton =\r\n      modal.querySelector(\r\n        \"[data-bno-check]\"\r\n      );\r\n\r\n    const messageNode =\r\n      modal.querySelector(\r\n        \"[data-bno-message]\"\r\n      );\r\n\r\n    const priceBox =\r\n      modal.querySelector(\r\n        \"[data-bno-price]\"\r\n      );\r\n\r\n    const totalNode =\r\n      modal.querySelector(\r\n        \"[data-bno-total]\"\r\n      );\r\n\r\n    const payNowNode =\r\n      modal.querySelector(\r\n        \"[data-bno-now]\"\r\n      );\r\n\r\n    const payLaterNode =\r\n      modal.querySelector(\r\n        \"[data-bno-later]\"\r\n      );\r\n\r\n    const continueWrap =\r\n      modal.querySelector(\r\n        \"[data-bno-continue-wrap]\"\r\n      );\r\n\r\n    const continueButton =\r\n      modal.querySelector(\r\n        \"[data-bno-continue]\"\r\n      );\r\n\r\n    let units = [];\r\n    let visibleCount = pageSize;\r\n    let currentUnit = null;\r\n    let currentImageIndex = 0;\r\n    let currentQuote = null;\r\n\r\n    function setStatus(\r\n      text,\r\n      isError\r\n    ) {\r\n      status.textContent =\r\n        text || \"\";\r\n\r\n      status.hidden =\r\n        !text;\r\n\r\n      status.classList.toggle(\r\n        \"is-error\",\r\n        Boolean(isError)\r\n      );\r\n    }\r\n\r\n    function setMessage(\r\n      text,\r\n      type\r\n    ) {\r\n      messageNode.textContent =\r\n        text || \"\";\r\n\r\n      messageNode.hidden =\r\n        !text;\r\n\r\n      messageNode.classList.remove(\r\n        \"is-error\",\r\n        \"is-success\"\r\n      );\r\n\r\n      if (type) {\r\n        messageNode.classList.add(\r\n          \"is-\" + type\r\n        );\r\n      }\r\n    }\r\n\r\n    function resetQuote() {\r\n      currentQuote = null;\r\n      priceBox.hidden = true;\r\n      continueWrap.hidden = true;\r\n      setMessage(\"\", \"\");\r\n    }\r\n\r\n    function createCard(\r\n      unit,\r\n      index\r\n    ) {\r\n      const capacityText =\r\n        unit.capacity > 0\r\n          ? (\r\n              \"Bis zu \" +\r\n              unit.capacity +\r\n              \" G\u00e4ste\"\r\n            )\r\n          : \"Details und Fotos ansehen\";\r\n\r\n      const descriptionText =\r\n        unit.description ||\r\n        \"Fotos, Kapazit\u00e4t und Verf\u00fcgbarkeit dieser Ferienunterkunft ansehen.\";\r\n\r\n      return `\r\n        <article class=\"bno-direct-card\">\r\n          <button type=\"button\" class=\"bno-direct-card__button\" data-bno-index=\"${index}\">\r\n            <div class=\"bno-direct-card__media\">\r\n              <img decoding=\"async\" src=\"${escapeHtml(unit.images[0])}\" alt=\"${escapeHtml(unit.name)}\" loading=\"lazy\" \/>\r\n\r\n              <span class=\"bno-direct-card__count\">\r\n                ${unit.images.length} images\r\n              <\/span>\r\n            <\/div>\r\n\r\n            <div class=\"bno-direct-card__body\">\r\n              <h3>${escapeHtml(unit.name)}<\/h3>\r\n\r\n              <p class=\"bno-direct-card__meta\">\r\n                ${escapeHtml(capacityText)}\r\n              <\/p>\r\n\r\n              <p class=\"bno-direct-card__description\">\r\n                ${escapeHtml(descriptionText)}\r\n              <\/p>\r\n\r\n              <span class=\"bno-direct-card__link\">\r\n                Ferienunterkunft ansehen \u2192\r\n              <\/span>\r\n            <\/div>\r\n          <\/button>\r\n        <\/article>\r\n      `;\r\n    }\r\n\r\n    function renderUnits() {\r\n      const visibleUnits =\r\n        units.slice(\r\n          0,\r\n          visibleCount\r\n        );\r\n\r\n      grid.innerHTML =\r\n        visibleUnits\r\n          .map(createCard)\r\n          .join(\"\");\r\n\r\n      grid.setAttribute(\r\n        \"aria-busy\",\r\n        \"false\"\r\n      );\r\n\r\n      grid\r\n        .querySelectorAll(\r\n          \"[data-bno-index]\"\r\n        )\r\n        .forEach(\r\n          function (button) {\r\n            button.addEventListener(\r\n              \"click\",\r\n              function () {\r\n                openModal(\r\n                  units[\r\n                    Number(\r\n                      button.dataset.bnoIndex\r\n                    )\r\n                  ]\r\n                );\r\n              }\r\n            );\r\n          }\r\n        );\r\n\r\n      moreWrap.hidden =\r\n        visibleCount >=\r\n        units.length;\r\n\r\n      setStatus(\r\n        \"Es werden \" + visibleUnits.length + \" von \" + units.length + \" Unterk\u00fcnften in \" + destination + \" angezeigt.\",\r\n        false\r\n      );\r\n    }\r\n\r\n    function updateModalImage() {\r\n      if (\r\n        !currentUnit ||\r\n        !currentUnit.images.length\r\n      ) {\r\n        return;\r\n      }\r\n\r\n      currentImageIndex =\r\n        (\r\n          currentImageIndex +\r\n          currentUnit.images.length\r\n        ) %\r\n        currentUnit.images.length;\r\n\r\n      modalImage.src =\r\n        currentUnit.images[\r\n          currentImageIndex\r\n        ];\r\n\r\n      modalImage.alt =\r\n        currentUnit.name +\r\n        \" \u2013 Bild \" +\r\n        (\r\n          currentImageIndex +\r\n          1\r\n        );\r\n\r\n      modalCounter.textContent =\r\n        (\r\n          currentImageIndex +\r\n          1\r\n        ) +\r\n        \" \/ \" +\r\n        currentUnit.images.length;\r\n\r\n      previousButton.hidden =\r\n        currentUnit.images.length < 2;\r\n\r\n      nextButton.hidden =\r\n        currentUnit.images.length < 2;\r\n    }\r\n\r\n    function openModal(unit) {\r\n      if (!unit) {\r\n        return;\r\n      }\r\n\r\n      currentUnit = unit;\r\n      currentImageIndex = 0;\r\n\r\n      modalTitle.textContent =\r\n        unit.name;\r\n\r\n      modalCapacity.textContent =\r\n        unit.capacity > 0\r\n          ? (\r\n              \"Bis zu \" +\r\n              unit.capacity +\r\n              \" G\u00e4ste\"\r\n            )\r\n          : \"\";\r\n\r\n      modalDescription.textContent =\r\n        unit.description ||\r\n        \"Verf\u00fcgbarkeit und Preis dieser Ferienunterkunft ansehen.\";\r\n\r\n      const today =\r\n        new Date();\r\n\r\n      const defaultCheckin =\r\n        addDays(\r\n          today,\r\n          1\r\n        );\r\n\r\n      const defaultCheckout =\r\n        addDays(\r\n          defaultCheckin,\r\n          Math.max(\r\n            7,\r\n            minimumStay\r\n          )\r\n        );\r\n\r\n      checkinInput.min =\r\n        localDate(today);\r\n\r\n      checkinInput.value =\r\n        localDate(\r\n          defaultCheckin\r\n        );\r\n\r\n      checkoutInput.min =\r\n        localDate(\r\n          addDays(\r\n            defaultCheckin,\r\n            minimumStay\r\n          )\r\n        );\r\n\r\n      checkoutInput.value =\r\n        localDate(\r\n          defaultCheckout\r\n        );\r\n\r\n      if (bookingOpenUntil) {\r\n        checkinInput.max =\r\n          bookingOpenUntil;\r\n\r\n        checkoutInput.max =\r\n          bookingOpenUntil;\r\n      }\r\n\r\n      guestsInput.max =\r\n        String(\r\n          unit.capacity > 0\r\n            ? unit.capacity\r\n            : 20\r\n        );\r\n\r\n      guestsInput.value =\r\n        String(\r\n          Math.min(\r\n            2,\r\n            unit.capacity > 0\r\n              ? unit.capacity\r\n              : 2\r\n          )\r\n        );\r\n\r\n      resetQuote();\r\n      updateModalImage();\r\n\r\n      modal.hidden = false;\r\n      modal.scrollTop = 0;\r\n\r\n      document\r\n        .documentElement\r\n        .classList\r\n        .add(\r\n          \"bno-direct-modal-open\"\r\n        );\r\n\r\n      document\r\n        .body\r\n        .classList\r\n        .add(\r\n          \"bno-direct-modal-open\"\r\n        );\r\n    }\r\n\r\n    function closeModal() {\r\n      modal.hidden = true;\r\n\r\n      document\r\n        .documentElement\r\n        .classList\r\n        .remove(\r\n          \"bno-direct-modal-open\"\r\n        );\r\n\r\n      document\r\n        .body\r\n        .classList\r\n        .remove(\r\n          \"bno-direct-modal-open\"\r\n        );\r\n\r\n      currentUnit = null;\r\n      currentQuote = null;\r\n    }\r\n\r\n    async function loadCatalog() {\r\n      try {\r\n        const query =\r\n          new URLSearchParams({\r\n            serviceId:\r\n              serviceId,\r\n\r\n            credsKey:\r\n              catalogKey,\r\n\r\n            lang:\r\n              currentLanguage()\r\n          });\r\n\r\n        const payload =\r\n          await fetchJson(\r\n            endpoint(\r\n              apiBase,\r\n              \"\/api\/mews\/catalog?\"\r\n            ) +\r\n            query.toString()\r\n          );\r\n\r\n        const rows =\r\n          extractRows(payload);\r\n\r\n        const publicationKeys = [\r\n          \"isPublished\",\r\n          \"IsPublished\",\r\n          \"is_published\",\r\n          \"publishStatus\",\r\n          \"PublishStatus\",\r\n          \"publish_status\"\r\n        ];\r\n\r\n        const hasPublicationFields =\r\n          rows.some(\r\n            function (row) {\r\n              return publicationKeys\r\n                .some(\r\n                  function (key) {\r\n                    return Object\r\n                      .prototype\r\n                      .hasOwnProperty\r\n                      .call(\r\n                        row || {},\r\n                        key\r\n                      );\r\n                  }\r\n                );\r\n            }\r\n          );\r\n\r\n        const seen =\r\n          new Set();\r\n\r\n        units =\r\n          rows\r\n            .map(normaliseUnit)\r\n            .filter(\r\n              function (unit) {\r\n                if (\r\n                  !unit.id ||\r\n                  seen.has(unit.id)\r\n                ) {\r\n                  return false;\r\n                }\r\n\r\n                seen.add(unit.id);\r\n\r\n                if (\r\n                  allowedIds.size &&\r\n                  !allowedIds.has(\r\n                    unit.id\r\n                  )\r\n                ) {\r\n                  return false;\r\n                }\r\n\r\n                if (\r\n                  excludedIds.has(\r\n                    unit.id\r\n                  )\r\n                ) {\r\n                  return false;\r\n                }\r\n\r\n                if (\r\n                  !isPublished(\r\n                    unit,\r\n                    hasPublicationFields\r\n                  )\r\n                ) {\r\n                  return false;\r\n                }\r\n\r\n                return (\r\n                  unit.images.length > 0\r\n                );\r\n              }\r\n            )\r\n            .sort(\r\n              function (\r\n                first,\r\n                second\r\n              ) {\r\n                return first.name.localeCompare(\r\n                  second.name,\r\n                  currentLanguage(),\r\n                  {\r\n                    sensitivity:\r\n                      \"base\"\r\n                  }\r\n                );\r\n              }\r\n            );\r\n\r\n        if (!units.length) {\r\n          grid.innerHTML = \"\";\r\n\r\n          grid.setAttribute(\r\n            \"aria-busy\",\r\n            \"false\"\r\n          );\r\n\r\n          moreWrap.hidden = true;\r\n\r\n          setStatus(\r\n            \"Derzeit konnten keine ver\u00f6ffentlichten Unterk\u00fcnfte geladen werden.\",\r\n            true\r\n          );\r\n\r\n          return;\r\n        }\r\n\r\n        renderUnits();\r\n      } catch (error) {\r\n        console.error(\r\n          \"BNO catalog error:\",\r\n          error\r\n        );\r\n\r\n        grid.innerHTML = \"\";\r\n\r\n        grid.setAttribute(\r\n          \"aria-busy\",\r\n          \"false\"\r\n        );\r\n\r\n        moreWrap.hidden = true;\r\n\r\n        setStatus(\r\n          error &&\r\n          error.message\r\n            ? (\r\n                \"Die Ferienunterk\u00fcnfte konnten nicht geladen werden: \" +\r\n                error.message\r\n              )\r\n            : \"Die Ferienunterk\u00fcnfte konnten nicht geladen werden. Bitte aktualisieren Sie die Seite und versuchen Sie es erneut.\",\r\n          true\r\n        );\r\n      }\r\n    }\r\n\r\n    availabilityForm.addEventListener(\r\n      \"submit\",\r\n      async function (event) {\r\n        event.preventDefault();\r\n\r\n        if (!currentUnit) {\r\n          return;\r\n        }\r\n\r\n        const from =\r\n          clean(\r\n            checkinInput.value\r\n          );\r\n\r\n        const to =\r\n          clean(\r\n            checkoutInput.value\r\n          );\r\n\r\n        const adults =\r\n          Number(\r\n            guestsInput.value ||\r\n            0\r\n          );\r\n\r\n        resetQuote();\r\n\r\n        if (\r\n          !from ||\r\n          !to ||\r\n          to <= from\r\n        ) {\r\n          setMessage(\r\n            \"Bitte w\u00e4hlen Sie g\u00fcltige Daten. Die Abreise muss nach der Anreise liegen.\",\r\n            \"error\"\r\n          );\r\n\r\n          return;\r\n        }\r\n\r\n        if (\r\n          numberOfNights(\r\n            from,\r\n            to\r\n          ) <\r\n          minimumStay\r\n        ) {\r\n          setMessage(\r\n            \"Der Mindestaufenthalt betr\u00e4gt \" +\r\n              minimumStay +\r\n              (\r\n                minimumStay === 1\r\n                  ? \" Nacht.\"\r\n                  : \" N\u00e4chte.\"\r\n              ),\r\n            \"error\"\r\n          );\r\n\r\n          return;\r\n        }\r\n\r\n        if (\r\n          !Number.isInteger(adults) ||\r\n          adults < 1\r\n        ) {\r\n          setMessage(\r\n            \"Bitte geben Sie eine g\u00fcltige Anzahl von G\u00e4sten an.\",\r\n            \"error\"\r\n          );\r\n\r\n          return;\r\n        }\r\n\r\n        if (\r\n          currentUnit.capacity > 0 &&\r\n          adults >\r\n          currentUnit.capacity\r\n        ) {\r\n          setMessage(\r\n            \"Diese Ferienunterkunft bietet Platz f\u00fcr bis zu \" +\r\n              currentUnit.capacity +\r\n              \" guests.\",\r\n            \"error\"\r\n          );\r\n\r\n          return;\r\n        }\r\n\r\n        checkButton.disabled = true;\r\n\r\n        checkButton.textContent =\r\n          \"Pr\u00fcfung l\u00e4uft \u2026\";\r\n\r\n        setMessage(\r\n          \"Verf\u00fcgbarkeit und Preis werden gepr\u00fcft \u2026\",\r\n          \"\"\r\n        );\r\n\r\n        try {\r\n          const payload =\r\n            await fetchJson(\r\n              endpoint(\r\n                apiBase,\r\n                \"\/api\/bno-direct\/quote\"\r\n              ),\r\n              {\r\n                method: \"POST\",\r\n\r\n                headers: {\r\n                  Accept:\r\n                    \"application\/json\",\r\n\r\n                  \"Content-Type\":\r\n                    \"application\/json\"\r\n                },\r\n\r\n                body:\r\n                  JSON.stringify({\r\n                    partnerKey:\r\n                      partnerKey,\r\n\r\n                    areaKey:\r\n                      areaKey,\r\n\r\n                    resourceCategoryId:\r\n                      currentUnit.id,\r\n\r\n                    from:\r\n                      from,\r\n\r\n                    to:\r\n                      to,\r\n\r\n                    adults:\r\n                      adults\r\n                  })\r\n              }\r\n            );\r\n\r\n          const quoteResult =\r\n            payload.data ||\r\n            payload;\r\n\r\n          const pricing =\r\n            quoteResult.pricing ||\r\n            {};\r\n\r\n          const currency =\r\n            clean(\r\n              quoteResult.currency ||\r\n              \"EUR\"\r\n            ).toUpperCase();\r\n\r\n          const guestTotal =\r\n            Number(\r\n              pricing.guestTotalGross\r\n            );\r\n\r\n          const payNow =\r\n            Number(\r\n              pricing.bnoPrepaidGross\r\n            );\r\n\r\n          const payLater =\r\n            Number(\r\n              pricing.remainingGross\r\n            );\r\n\r\n          if (\r\n            !Number.isFinite(\r\n              guestTotal\r\n            ) ||\r\n            guestTotal <= 0\r\n          ) {\r\n            throw new Error(\r\n              \"Der Gesamtpreis konnte nicht abgerufen werden.\"\r\n            );\r\n          }\r\n\r\n          currentQuote = {\r\n            from:\r\n              from,\r\n\r\n            to:\r\n              to,\r\n\r\n            adults:\r\n              adults,\r\n\r\n            total:\r\n              guestTotal,\r\n\r\n            payNow:\r\n              Number.isFinite(\r\n                payNow\r\n              )\r\n                ? payNow\r\n                : 0,\r\n\r\n            payLater:\r\n              Number.isFinite(\r\n                payLater\r\n              )\r\n                ? payLater\r\n                : Math.max(\r\n                    0,\r\n                    guestTotal -\r\n                    (\r\n                      Number.isFinite(\r\n                        payNow\r\n                      )\r\n                        ? payNow\r\n                        : 0\r\n                    )\r\n                  )\r\n          };\r\n\r\n          totalNode.textContent =\r\n            formatMoney(\r\n              currentQuote.total,\r\n              currency\r\n            );\r\n\r\n          payNowNode.textContent =\r\n            formatMoney(\r\n              currentQuote.payNow,\r\n              currency\r\n            );\r\n\r\n          payLaterNode.textContent =\r\n            formatMoney(\r\n              currentQuote.payLater,\r\n              currency\r\n            );\r\n\r\n          priceBox.hidden = false;\r\n          continueWrap.hidden = false;\r\n\r\n          setMessage(\r\n            \"Die Ferienunterkunft ist verf\u00fcgbar vom \" +\r\n              formatDate(from) +\r\n              \" bis \" +\r\n              formatDate(to) +\r\n              \".\",\r\n            \"success\"\r\n          );\r\n        } catch (error) {\r\n          console.error(\r\n            \"BNO quote error:\",\r\n            error\r\n          );\r\n\r\n          let message =\r\n            error &&\r\n            error.message\r\n              ? error.message\r\n              : \"Die Verf\u00fcgbarkeit konnte nicht gepr\u00fcft werden. Bitte versuchen Sie es erneut.\";\r\n\r\n          if (\r\n            error &&\r\n            error.code ===\r\n            \"booking_not_open\"\r\n          ) {\r\n            message =\r\n              \"Buchungen sind f\u00fcr dieses Reiseziel noch nicht freigeschaltet.\";\r\n          }\r\n\r\n          if (\r\n            error &&\r\n            error.code ===\r\n            \"not_available\"\r\n          ) {\r\n            message =\r\n              \"Die Ferienunterkunft ist f\u00fcr die ausgew\u00e4hlten Daten nicht verf\u00fcgbar.\";\r\n          }\r\n\r\n          setMessage(\r\n            message,\r\n            \"error\"\r\n          );\r\n        } finally {\r\n          checkButton.disabled =\r\n            false;\r\n\r\n          checkButton.textContent =\r\n            \"Verf\u00fcgbarkeit pr\u00fcfen\";\r\n        }\r\n      }\r\n    );\r\n\r\n    checkinInput.addEventListener(\r\n      \"change\",\r\n      function () {\r\n        if (\r\n          checkinInput.value\r\n        ) {\r\n          const minimumCheckout =\r\n            localDate(\r\n              addDays(\r\n                new Date(\r\n                  checkinInput.value +\r\n                  \"T12:00:00\"\r\n                ),\r\n                minimumStay\r\n              )\r\n            );\r\n\r\n          checkoutInput.min =\r\n            minimumCheckout;\r\n\r\n          if (\r\n            !checkoutInput.value ||\r\n            checkoutInput.value <\r\n            minimumCheckout\r\n          ) {\r\n            checkoutInput.value =\r\n              minimumCheckout;\r\n          }\r\n        }\r\n\r\n        resetQuote();\r\n      }\r\n    );\r\n\r\n    checkoutInput.addEventListener(\r\n      \"change\",\r\n      resetQuote\r\n    );\r\n\r\n    guestsInput.addEventListener(\r\n      \"change\",\r\n      resetQuote\r\n    );\r\n\r\n    continueButton.addEventListener(\r\n      \"click\",\r\n      function () {\r\n        if (\r\n          !currentUnit ||\r\n          !currentQuote\r\n        ) {\r\n          return;\r\n        }\r\n\r\n        const bookingUrl =\r\n          new URL(\r\n            bookingBase,\r\n            window.location.origin\r\n          );\r\n\r\n        bookingUrl.searchParams.set(\r\n          \"partnerKey\",\r\n          partnerKey\r\n        );\r\n\r\n        bookingUrl.searchParams.set(\r\n          \"areaKey\",\r\n          areaKey\r\n        );\r\n\r\n        bookingUrl.searchParams.set(\r\n          \"resourceCategoryId\",\r\n          currentUnit.id\r\n        );\r\n\r\n        bookingUrl.searchParams.set(\r\n          \"from\",\r\n          currentQuote.from\r\n        );\r\n\r\n        bookingUrl.searchParams.set(\r\n          \"to\",\r\n          currentQuote.to\r\n        );\r\n\r\n        bookingUrl.searchParams.set(\r\n          \"adults\",\r\n          String(\r\n            currentQuote.adults\r\n          )\r\n        );\r\n\r\n        bookingUrl.searchParams.set(\r\n          \"propertyName\",\r\n          currentUnit.name\r\n        );\r\n\r\n        bookingUrl.searchParams.set(\r\n          \"lang\",\r\n          currentLanguage()\r\n        );\r\n\r\n        if (\r\n          currentUnit.images[0]\r\n        ) {\r\n          bookingUrl.searchParams.set(\r\n            \"imageUrl\",\r\n            currentUnit.images[0]\r\n          );\r\n        }\r\n\r\n        window.location.assign(\r\n          bookingUrl.toString()\r\n        );\r\n      }\r\n    );\r\n\r\n    previousButton.addEventListener(\r\n      \"click\",\r\n      function () {\r\n        currentImageIndex -= 1;\r\n        updateModalImage();\r\n      }\r\n    );\r\n\r\n    nextButton.addEventListener(\r\n      \"click\",\r\n      function () {\r\n        currentImageIndex += 1;\r\n        updateModalImage();\r\n      }\r\n    );\r\n\r\n    modal\r\n      .querySelectorAll(\r\n        \"[data-bno-close]\"\r\n      )\r\n      .forEach(\r\n        function (button) {\r\n          button.addEventListener(\r\n            \"click\",\r\n            closeModal\r\n          );\r\n        }\r\n      );\r\n\r\n    document.addEventListener(\r\n      \"keydown\",\r\n      function (event) {\r\n        if (modal.hidden) {\r\n          return;\r\n        }\r\n\r\n        if (\r\n          event.key ===\r\n          \"Escape\"\r\n        ) {\r\n          closeModal();\r\n        }\r\n\r\n        if (\r\n          event.key ===\r\n          \"ArrowLeft\"\r\n        ) {\r\n          currentImageIndex -= 1;\r\n          updateModalImage();\r\n        }\r\n\r\n        if (\r\n          event.key ===\r\n          \"ArrowRight\"\r\n        ) {\r\n          currentImageIndex += 1;\r\n          updateModalImage();\r\n        }\r\n      }\r\n    );\r\n\r\n    moreButton.addEventListener(\r\n      \"click\",\r\n      function () {\r\n        visibleCount =\r\n          Math.min(\r\n            visibleCount +\r\n            pageSize,\r\n            units.length\r\n          );\r\n\r\n        renderUnits();\r\n      }\r\n    );\r\n\r\n    loadCatalog();\r\n  }\r\n\r\n  function mountCatalogs(scope) {\r\n    const context =\r\n      scope &&\r\n      scope.querySelectorAll\r\n        ? scope\r\n        : document;\r\n\r\n    context\r\n      .querySelectorAll(\r\n        ROOT_SELECTOR\r\n      )\r\n      .forEach(\r\n        initialiseCatalog\r\n      );\r\n  }\r\n\r\n  function startCatalogs() {\r\n    mountCatalogs(document);\r\n\r\n    window.setTimeout(\r\n      function () {\r\n        mountCatalogs(document);\r\n      },\r\n      500\r\n    );\r\n\r\n    window.setTimeout(\r\n      function () {\r\n        mountCatalogs(document);\r\n      },\r\n      1500\r\n    );\r\n  }\r\n\r\n  if (\r\n    document.readyState ===\r\n    \"loading\"\r\n  ) {\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      startCatalogs,\r\n      {\r\n        once: true\r\n      }\r\n    );\r\n  } else {\r\n    startCatalogs();\r\n  }\r\n\r\n  new MutationObserver(\r\n    function (mutations) {\r\n      mutations.forEach(\r\n        function (mutation) {\r\n          mutation.addedNodes.forEach(\r\n            function (node) {\r\n              if (\r\n                !node ||\r\n                node.nodeType !== 1\r\n              ) {\r\n                return;\r\n              }\r\n\r\n              if (\r\n                node.matches &&\r\n                node.matches(\r\n                  ROOT_SELECTOR\r\n                )\r\n              ) {\r\n                initialiseCatalog(node);\r\n              }\r\n\r\n              if (\r\n                node.querySelectorAll\r\n              ) {\r\n                mountCatalogs(node);\r\n              }\r\n            }\r\n          );\r\n        }\r\n      );\r\n    }\r\n  ).observe(\r\n    document.documentElement,\r\n    {\r\n      childList: true,\r\n      subtree: true\r\n    }\r\n  );\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3a8ed197 e-flex e-con-boxed e-con e-parent\" data-id=\"3a8ed197\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6383e76 elementor-widget elementor-widget-html\" data-id=\"6383e76\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section id=\"kart\" class=\"bno-section bno-section--light\">\r\n  <div class=\"bno-shell\">\r\n\r\n    <div class=\"bno-section-heading\">\r\n\r\n      <span class=\"bno-eyebrow\">\r\n        Karte\r\n      <\/span>\r\n\r\n      <h2>\r\n        Lage der Ferienunterk\u00fcnfte an der Costa Brava ansehen\r\n      <\/h2>\r\n\r\n      <p>\r\n        Die Ferienunterk\u00fcnfte verteilen sich auf verschiedene Teile der Costa-Brava- und Girona-Region, darunter Begur, Calella de Palafrugell, Palam\u00f3s, Mont-Ras und Girona.\r\n      <\/p>\r\n\r\n    <\/div>\r\n\r\n    <div class=\"bno-map-card\">\r\n\r\n      <iframe\r\n        src=\"https:\/\/www.google.com\/maps?q=Costa%20Brava%2C%20Girona%2C%20Spain&output=embed\"\r\n        title=\"Karte der Costa Brava in Spanien\"\r\n        width=\"100%\"\r\n        height=\"520\"\r\n        style=\"\r\n          display:block;\r\n          width:100%;\r\n          border:0;\r\n        \"\r\n        loading=\"lazy\"\r\n        referrerpolicy=\"no-referrer-when-downgrade\"\r\n        allowfullscreen\r\n      ><\/iframe>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-169c9afc e-flex e-con-boxed e-con e-parent\" data-id=\"169c9afc\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-68d173d6 elementor-widget elementor-widget-html\" data-id=\"68d173d6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section class=\"bno-section bno-section--light\">\r\n  <div class=\"bno-shell\">\r\n\r\n    <div class=\"bno-editorial-split\">\r\n\r\n      <div class=\"bno-editorial-split__content\">\r\n\r\n        <span class=\"bno-eyebrow\">\r\n          Erlebnisse an der Costa Brava\r\n        <\/span>\r\n\r\n        <h2>\r\n          K\u00fcste, D\u00f6rfer und Katalonien erleben\r\n        <\/h2>\r\n\r\n        <p>\r\n          Die Costa Brava verbindet mediterrane Str\u00e4nde, kleine Buchten und charaktervolle K\u00fcstenorte mit Restaurants, M\u00e4rkten, kulturellen Erlebnissen und abwechslungsreichen Landschaften.\r\n        <\/p>\r\n\r\n        <p>\r\n          Von Ihrer Ferienunterkunft aus k\u00f6nnen Sie die Regionen rund um Begur, Palam\u00f3s und Calella de Palafrugell erkunden, Girona besuchen oder Ihre Tage mit Schwimmen, Bootsausfl\u00fcgen, Wandern und entspannten Mahlzeiten an der K\u00fcste verbringen.\r\n        <\/p>\r\n\r\n        <div class=\"bno-actions\">\r\n\r\n          <a href=\"#praktisk\" class=\"bno-btn bno-btn--primary\">\r\n            Praktische Informationen ansehen\r\n          <\/a>\r\n\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n      <div class=\"bno-editorial-split__media\">\r\n\r\n        <img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/05\/Costa_Brava.jpg?w=800&#038;ssl=1\" alt=\"Unterk\u00fcnfte an der Costa Brava am Mittelmeer\" loading=\"lazy\" style=\" display:block; width:100%; height:100%; min-height:420px; object-fit:cover; \" \/>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-60ea3d0 e-flex e-con-boxed e-con e-parent\" data-id=\"60ea3d0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-635b24bc elementor-widget elementor-widget-html\" data-id=\"635b24bc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section id=\"praktisk\" class=\"bno-section bno-section--soft\">\r\n  <div class=\"bno-shell\">\r\n\r\n    <div class=\"bno-section-heading\">\r\n\r\n      <span class=\"bno-eyebrow\">\r\n        Praktische Informationen\r\n      <\/span>\r\n\r\n      <h2>\r\n        Str\u00e4nde, Mobilit\u00e4t und Erlebnisse an der Costa Brava\r\n      <\/h2>\r\n\r\n      <p>\r\n        Hier finden Sie n\u00fctzliche Informationen f\u00fcr die Planung Ihres Aufenthalts an der Costa Brava.\r\n      <\/p>\r\n\r\n    <\/div>\r\n\r\n    <div class=\"bno-info-grid\">\r\n\r\n      <div class=\"bno-value-card\">\r\n\r\n        <h3>\r\n          Str\u00e4nde und Buchten\r\n        <\/h3>\r\n\r\n        <p>\r\n          Entlang der Costa Brava finden Sie sowohl gr\u00f6\u00dfere Str\u00e4nde als auch kleinere Buchten. Damit eignet sich die Region f\u00fcr entspannte Strandtage ebenso wie f\u00fcr aktive Tage am Meer.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n      <div class=\"bno-value-card\">\r\n\r\n        <h3>\r\n          K\u00fcstenorte und D\u00f6rfer\r\n        <\/h3>\r\n\r\n        <p>\r\n          Begur, Calella de Palafrugell und Palam\u00f3s bieten Restaurants, kleine Gesch\u00e4fte, Hafenatmosph\u00e4re und traditionelles katalanisches Flair.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n      <div class=\"bno-value-card\">\r\n\r\n        <h3>\r\n          Girona\r\n        <\/h3>\r\n\r\n        <p>\r\n          Girona bietet sich mit historischen Gassen, Restaurants, Gesch\u00e4ften und kulturellen Erlebnissen ideal f\u00fcr einen Tagesausflug an.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n      <div class=\"bno-value-card\">\r\n\r\n        <h3>\r\n          Kulinarik und Restaurants\r\n        <\/h3>\r\n\r\n        <p>\r\n          Die Region ist bekannt f\u00fcr mediterrane K\u00fcche, Meeresfr\u00fcchte, lokale Produkte und eine gro\u00dfe Auswahl an Restaurants \u2013 von entspannten Lokalen an der K\u00fcste bis zu anspruchsvolleren gastronomischen Adressen.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n      <div class=\"bno-value-card\">\r\n\r\n        <h3>\r\n          Verkehr und Mobilit\u00e4t\r\n        <\/h3>\r\n\r\n        <p>\r\n          Ein Mietwagen ist praktisch, wenn Sie w\u00e4hrend desselben Aufenthalts mehrere Str\u00e4nde, Orte und K\u00fcstend\u00f6rfer erkunden m\u00f6chten.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n      <div class=\"bno-value-card\">\r\n\r\n        <h3>\r\n          Aktivit\u00e4ten\r\n        <\/h3>\r\n\r\n        <p>\r\n          Die Region eignet sich hervorragend zum Schwimmen, f\u00fcr Bootsausfl\u00fcge, Schnorcheln, Radfahren, Wandern, Golf und Ausfl\u00fcge entlang der K\u00fcste und ins Landesinnere.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5c90381a elementor-widget elementor-widget-html\" data-id=\"5c90381a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section class=\"bno-section bno-destination-cta\">\r\n  <div class=\"bno-shell\">\r\n\r\n    <div class=\"bno-cta-box\">\r\n\r\n      <div class=\"bno-cta-box__content\">\r\n\r\n        <span class=\"bno-eyebrow\">\r\n          Aufenthalt planen\r\n        <\/span>\r\n\r\n        <h2>\r\n          Die passende Ferienunterkunft an der Costa Brava finden\r\n        <\/h2>\r\n\r\n        <p>\r\n          Entdecken Sie verf\u00fcgbare Villen, Ferienunterk\u00fcnfte und Ferienwohnungen, sehen Sie Fotos und Beschreibungen an und pr\u00fcfen Sie Preis und Verf\u00fcgbarkeit f\u00fcr Ihren Aufenthalt an der Costa Brava.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n      <div class=\"bno-cta-box__action\">\r\n\r\n        <a href=\"#enheter\" class=\"bno-btn bno-btn--primary bno-cta-button\">\r\n          <span>\r\n            Ferienunterk\u00fcnfte ansehen\r\n          <\/span>\r\n\r\n          <span aria-hidden=\"true\">\r\n            \u2192\r\n          <\/span>\r\n        <\/a>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/div>\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3c162c1d e-flex e-con-boxed e-con e-parent\" data-id=\"3c162c1d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\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>Costa Brava \u00b7 Katalonien \u00b7 Spanien Unterk\u00fcnfte an der Costa Brava \u2013 die passende Ferienunterkunft f\u00fcr Ihre Reise finden Entdecken Sie handverlesene Villen, Ferienunterk\u00fcnfte und Ferienwohnungen an der Costa Brava. Finden Sie eine komfortable Basis f\u00fcr Strandtage, kleine K\u00fcstenorte, Gastronomie und Erlebnisse in Katalonien. Ferienunterk\u00fcnfte ansehen Karte ansehen Unterk\u00fcnfte an der Costa Brava finden Eine [&hellip;]<\/p>\n","protected":false},"author":260013438,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_wpcom_ai_launchpad_about_page":false,"_wpcom_ai_launchpad_gallery_page":false,"_wpcom_ai_launchpad_contact_page":false,"_wpcom_ai_launchpad_events_page":false,"_wpcom_ai_launchpad_video_page":false,"_wpcom_ai_launchpad_portfolio_piece":false,"footnotes":""},"class_list":["post-94473","page","type-page","status-publish","hentry"],"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/PgDuwj-ozL","jetpack-related-posts":[{"id":94612,"url":"https:\/\/bno-travel.com\/fi\/spanske-kysten\/","url_meta":{"origin":94473,"position":0},"title":"Espanjan rannikko","author":"Jan Terje \u00c5s","date":"2. August 2026","format":false,"excerpt":"Kohteet \u00b7 Espanjan rannikko Majoitus Espanjan rannikolla \u2013 l\u00f6yd\u00e4 matkallesi sopiva kohde Tutustu k\u00e4sin valittuihin loma-asuntoihin Costa Bravalla ja Mallorcalla. Vertaile kahta omaleimaista rannikkokohdetta, joissa on huviloita, huoneistoja, rantoja, kyli\u00e4 ja el\u00e4myksi\u00e4 ymp\u00e4ri vuoden. N\u00e4yt\u00e4 kohteet Tutustu Espanjan rannikkoon L\u00f6yd\u00e4 sopiva rannikkokohde Majoitus Espanjan rannikolla Espanjan V\u00e4limeren-rannikolla on erilaisia kohteita,\u2026","rel":"","context":"\u00c4hnlicher Beitrag","block_context":{"text":"\u00c4hnlicher Beitrag","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":94617,"url":"https:\/\/bno-travel.com\/fi\/costa-brava\/","url_meta":{"origin":94473,"position":1},"title":"Costa Brava","author":"Jan Terje \u00c5s","date":"2. August 2026","format":false,"excerpt":"Costa Brava \u00b7 Katalonia \u00b7 Espanja Majoitus Costa Bravalla \u2013 l\u00f6yd\u00e4 matkallesi sopiva loma-asunto Tutustu k\u00e4sin valittuihin huviloihin, loma-asuntoihin ja huoneistoihin Costa Bravalla. L\u00f6yd\u00e4 mukava tukikohta rantael\u00e4m\u00e4lle, pienille rannikkokaupungeille, gastronomialle ja Katalonian el\u00e4myksille. N\u00e4yt\u00e4 loma-asunnot N\u00e4yt\u00e4 kartta L\u00f6yd\u00e4 majoitus Costa Bravalta Majoitus Costa Bravalla tarjoaa erinomaisen tukikohdan rentoihin p\u00e4iviin V\u00e4limeren\u2026","rel":"","context":"\u00c4hnlicher Beitrag","block_context":{"text":"\u00c4hnlicher Beitrag","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":94322,"url":"https:\/\/bno-travel.com\/fi\/overnatting\/","url_meta":{"origin":94473,"position":2},"title":"Majoitus Trysiliss\u00e4 &#038; S\u00e4leniss\u00e4","author":"Jan Terje \u00c5s","date":"11. Juli 2025","format":false,"excerpt":"Majoitus Trysiliss\u00e4, S\u00e4leniss\u00e4 ja Sunnm\u00f8re-alueella L\u00f6yd\u00e4 matkallesi sopiva majoitus \u2013 tunturilomasta vuonojen l\u00e4heisiin luontoel\u00e4myksiin BNO Travel tarjoaa laadukkaasti valittua majoitusta kohteissa Trysil, S\u00e4len, Stranda, Strandafjellet, Hornindal ja Fjells\u00e6tra. Valikoimasta l\u00f6yd\u00e4t m\u00f6kkej\u00e4, huoneistoja ja majoituksia, joiden avulla mukavuus, aktiviteetit ja ymp\u00e4rivuotiset el\u00e4mykset on helppo yhdist\u00e4\u00e4 joissakin Skandinavian houkuttelevimmista tunturi- ja luontokohteista.\u2026","rel":"","context":"\u00c4hnlicher Beitrag","block_context":{"text":"\u00c4hnlicher Beitrag","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":94235,"url":"https:\/\/bno-travel.com\/fi\/leiebil\/","url_meta":{"origin":94473,"position":3},"title":"Autonvuokraus","author":"Jan Terje \u00c5s","date":"29. August 2025","format":false,"excerpt":"Autonvuokraus L\u00f6yd\u00e4 vuokra-auto, joka antaa matkalle vapauden jatkua Lentokent\u00e4lt\u00e4 vuoristoteille, suurkaupunkiin tai loma-asunnolle \u2013 BNO Travel tekee vuokra-auton l\u00f6yt\u00e4misest\u00e4 helppoa ja tarjoaa saman rauhallisen, inspiroivan ja selke\u00e4n kokemuksen kuin muunkin matkan suunnittelussa. Aloita vuokra-autohaku Katso suosittuja kohteita Enemm\u00e4n vapautta ensimm\u00e4isest\u00e4 kilometrist\u00e4 alkaen Kun jatkokuljetus on selvill\u00e4, koko matka on helpompi\u2026","rel":"","context":"\u00c4hnlicher Beitrag","block_context":{"text":"\u00c4hnlicher Beitrag","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":93991,"url":"https:\/\/bno-travel.com\/fi\/opplev-sunnmorsalpene\/","url_meta":{"origin":94473,"position":4},"title":"Tutustu Strandaan: ymp\u00e4ri vuoden aktiivisille lomailijoille","author":"Jan Terje \u00c5s","date":"9. April 2026","format":false,"excerpt":"Tutustu Strandaan Ymp\u00e4rivuotinen kohde vuonojen, vuorten ja luontoon liittyvien muistojen \u00e4\u00e4rell\u00e4 Strandassa alppimaiset vuoret, syv\u00e4t vuonot ja rauhalliset hetket kohtaavat samassa matkakohteessa. BNO Travel tarjoaa inspiroivan ja selke\u00e4n reitin majoituksiin, aktiviteetteihin ja el\u00e4myksiin ymp\u00e4ri vuoden. Tutustu Strandaan Katso aktiviteetit Stranda ymp\u00e4ri vuoden Laskettelusta ja huippuvaelluksista vuonojen rauhaan ja kes\u00e4p\u00e4iviin vuorilla\u2026","rel":"","context":"\u00c4hnlicher Beitrag","block_context":{"text":"\u00c4hnlicher Beitrag","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":93953,"url":"https:\/\/bno-travel.com\/fi\/partner-bno-travel\/","url_meta":{"origin":94473,"position":5},"title":"BNO Partner","author":"Jan Terje \u00c5s","date":"13. April 2026","format":false,"excerpt":"BNO Travelin kumppani Jakelu- ja varauskumppani ammattimaisille Mewsi\u00e4 k\u00e4ytt\u00e4ville majoitusalan toimijoille BNO Travel on kehitetty hotelleille, huoneistohotelleille, lomakeskuksille, m\u00f6kkitoimijoille, kohdeyhti\u00f6ille ja muille ammattimaisille toimijoille, jotka etsiv\u00e4t kohdennetumpaa ja joustavampaa tapaa digitaaliseen jakeluun. Kun Mews on osa ty\u00f6nkulkua, kapasiteetin tuominen n\u00e4kyviin, l\u00e4sn\u00e4olon vahvistaminen ja sujuvamman varauskokemuksen luominen sek\u00e4 kumppaneille ett\u00e4 vieraille\u2026","rel":"","context":"\u00c4hnlicher Beitrag","block_context":{"text":"\u00c4hnlicher Beitrag","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/bno-travel.com\/de\/wp-json\/wp\/v2\/pages\/94473","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bno-travel.com\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bno-travel.com\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bno-travel.com\/de\/wp-json\/wp\/v2\/users\/260013438"}],"replies":[{"embeddable":true,"href":"https:\/\/bno-travel.com\/de\/wp-json\/wp\/v2\/comments?post=94473"}],"version-history":[{"count":1,"href":"https:\/\/bno-travel.com\/de\/wp-json\/wp\/v2\/pages\/94473\/revisions"}],"predecessor-version":[{"id":94474,"href":"https:\/\/bno-travel.com\/de\/wp-json\/wp\/v2\/pages\/94473\/revisions\/94474"}],"wp:attachment":[{"href":"https:\/\/bno-travel.com\/de\/wp-json\/wp\/v2\/media?parent=94473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}