{"id":94423,"date":"2026-08-02T16:59:59","date_gmt":"2026-08-02T14:59:59","guid":{"rendered":"https:\/\/bno-travel.com\/overnatting-pa-mallorca\/"},"modified":"2026-08-10T16:12:35","modified_gmt":"2026-08-10T14:12:35","slug":"overnatting-pa-mallorca","status":"publish","type":"page","link":"https:\/\/bno-travel.com\/da\/overnatting-pa-mallorca\/","title":{"rendered":"Mallorca"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"94423\" class=\"elementor elementor-94423 elementor-93433\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-694ef4e6 e-flex e-con-boxed e-con e-parent\" data-id=\"694ef4e6\" 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-6f73118 elementor-widget elementor-widget-html\" data-id=\"6f73118\" 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-image: linear-gradient(rgba(10, 18, 28, 0.42), rgba(10, 18, 28, 0.56)), url('https:\/\/bno-api-staging.onrender.com\/api\/img\/bno-images\/emerald-stay\/mallorca\/rooms\/villa-can-tranquilo-mallorca-pollenca\/001.jpg');\">\r\n  <div class=\"bno-shell\">\r\n    <div class=\"bno-area-hero__content\">\r\n\r\n      <span class=\"bno-eyebrow\">\r\n        Mallorca \u00b7 Pollen\u00e7a og Alc\u00fadia\r\n      <\/span>\r\n\r\n      <h1>\r\n        Overnatning p\u00e5 Mallorca \u2013 find den feriebolig, der passer til din rejse\r\n      <\/h1>\r\n\r\n      <p class=\"bno-lead\">\r\n        Udforsk h\u00e5ndplukkede villaer, feriehuse og townhouses i\r\n        Pollen\u00e7a og Alc\u00fadia. Find en feriebolig der passer til familien,\r\n        vennegruppen eller det st\u00f8rre rejseselskab, og kontroll\u00e9r\r\n        opdateret pris og tilg\u00e6ngelighed direkte hos BNO Travel.\r\n      <\/p>\r\n\r\n      <div class=\"bno-actions\">\r\n        <a href=\"#enheter\" class=\"bno-btn bno-btn--primary\">\r\n          Se ferieboligerne\r\n        <\/a>\r\n\r\n        <a href=\"#kart\" class=\"bno-btn bno-btn--secondary\">\r\n          Se kort\r\n        <\/a>\r\n      <\/div>\r\n\r\n    <\/div>\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-520cd34e e-flex e-con-boxed e-con e-parent\" data-id=\"520cd34e\" 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-5e375803 elementor-widget elementor-widget-html\" data-id=\"5e375803\" 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        Bo i din egen feriebolig p\u00e5 det nordlige Mallorca\r\n      <\/h2>\r\n\r\n      <p>\r\n        Mallorca er et godt valg for rejsende som \u00f8nsker at kombinere\r\n        strandliv, historiske bymilj\u00f8er, lokale restauranter,\r\n        naturoplevelser og afslappende dage i egen feriebolig.\r\n        Med en villa eller et townhouse f\u00e5r rejseselskabet mere plads,\r\n        st\u00f8rre fleksibilitet og en privat base gennem hele opholdet.\r\n      <\/p>\r\n\r\n      <p>\r\n        BNO Travels ferieboliger ligger hovedsageligt i og omkring\r\n        Pollen\u00e7a og Alc\u00fadia. Omr\u00e5derne passer godt til familier,\r\n        vennegrupper og st\u00f8rre rejseselskaber som \u00f8nsker n\u00e6rhed til b\u00e5de\r\n        kysten, landsbyerne og oplevelserne p\u00e5 det nordlige Mallorca.\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-324f373a e-flex e-con-boxed e-con e-parent\" data-id=\"324f373a\" 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-3b63030f elementor-widget elementor-widget-html\" data-id=\"3b63030f\" 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_MALLORCA\" data-booking-partner-key=\"EMERALD_MALLORCA\" data-service-id=\"b40b3c57-a945-4998-8d9f-ae8500e281fd\" data-area-key=\"mallorca\" data-destination-label=\"Mallorca\" data-location-label=\"Mallorca \u00b7 Spanien\" data-booking-open-until=\"2027-05-01\" data-minimum-stay-nights=\"1\" data-initial-count=\"12\" data-allowed-unit-ids=\"a93e9456-c676-4d7e-97ac-b2b900a4b2eb,6a13456f-e0be-4024-aab5-b3750101de2c,f2fb09ad-07b5-4a92-a604-b37000f98044,3fdb9a55-e215-4707-a84e-b37000f2f3f1,17730ecf-48b3-4f01-8962-b42b0086eafd,20142026-acd0-4727-8f94-b37000efe2ea,859fbab5-66b7-4f21-b623-ae9b00f57ac3,4c7f1089-9be2-4190-be31-aea10080c1a2,48c0c4ce-e644-4a58-ab76-b25900a71c2f,586ba218-5a66-49af-bccb-aea000ae1cac,325751bc-8450-4b4f-bc9e-aea000add6d4,6ad3c0f2-c4d4-49fe-9717-b17200b63ee9,76b64106-673f-492d-9cf0-b37000f5a1cd\" lang=\"da\" data-lang=\"da\">\r\n  <div class=\"bno-shell\">\r\n\r\n    <div class=\"bno-section-heading\">\r\n      <span class=\"bno-eyebrow\">\r\n        Villaer og ferieboliger p\u00e5 Mallorca\r\n      <\/span>\r\n\r\n      <h2>\r\n        Find den feriebolig, der passer til dit ophold p\u00e5 Mallorca\r\n      <\/h2>\r\n\r\n      <p>\r\n        Udforsk h\u00e5ndplukkede villaer, feriehuse og townhouses blandt andet Pollen\u00e7a og Alc\u00fadia. Se billeder, kapacitet og beskrivelser\r\n        f\u00f8r du kontrollerer opdateret pris og tilg\u00e6ngelighed.\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      Indl\u00e6ser ferieboliger \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        Vis flere ferieboliger\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-e3361c0 e-flex e-con-boxed e-con e-parent\" data-id=\"e3361c0\" 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-aa3066f elementor-widget elementor-widget-html\" data-id=\"aa3066f\" 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 \"da\";\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        \"da-DK\",\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        \"da-DK\",\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        \"Feriebolig\"\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            \"maxGuests\",\r\n            \"MaxGuests\"\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            : \"Foresp\u00f8rgslen kunne ikke gennemf\u00f8res.\"\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      \"Feriebolig i \" +\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=\"Luk\"><\/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=\"Luk\">\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=\"Forrige billede\">\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\u00e6ste billede\">\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                Tjek dit ophold\r\n              <\/span>\r\n\r\n              <h4>\r\n                Tjek om ferieboligen er ledig\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>Indtjekning<\/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>Udtjekning<\/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\u00e6ster<\/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                Tjek tilg\u00e6ngelighed\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                  Samlet pris for opholdet\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                  Betales nu til BNO Travel\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                  Resterende bel\u00f8b til overnatningsstedet\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                Forts\u00e6t til booking\r\n              <\/button>\r\n\r\n              <p>\r\n                G\u00e6steoplysninger, vilk\u00e5r og betaling gennemf\u00f8res\r\n                i BNO Travels sikre bookingflow.\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              \"Op til \" +\r\n              unit.capacity +\r\n              \" g\u00e6ster\"\r\n            )\r\n          : \"Se detaljer og billeder\";\r\n\r\n      const descriptionText =\r\n        unit.description ||\r\n        \"Se billeder, kapacitet og tilg\u00e6ngelighed for denne feriebolig.\";\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} billeder\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                Se ferieboligen \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        \"Viser \" +\r\n          visibleUnits.length +\r\n          \" av \" +\r\n          units.length +\r\n          \" enheter i \" +\r\n          destination +\r\n          \".\",\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 billede \" +\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              \"Op til \" +\r\n              unit.capacity +\r\n              \" g\u00e6ster\"\r\n            )\r\n          : \"\";\r\n\r\n      modalDescription.textContent =\r\n        unit.description ||\r\n        \"Se tilg\u00e6ngelighed og pris for denne feriebolig.\";\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            \"Ingen publicerede enheder kunne indl\u00e6ses lige nu.\",\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                \"Ferieboligerne kunne ikke indl\u00e6ses: \" +\r\n                error.message\r\n              )\r\n            : \"Ferieboligerne kunne ikke indl\u00e6ses. Pr\u00f8v at opdatere siden.\",\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            \"V\u00e6lg gyldige datoer. Udtjekning skal v\u00e6re efter indtjekning.\",\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            \"Minimumsopholdet er \" +\r\n              minimumStay +\r\n              (\r\n                minimumStay === 1\r\n                  ? \" nat.\"\r\n                  : \" n\u00e6tter.\"\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            \"V\u00e6lg et gyldigt antal g\u00e6ster.\",\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            \"Denne feriebolig har kapacitet til op til \" +\r\n              currentUnit.capacity +\r\n              \" g\u00e6ster.\",\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          \"Kontrollerer \u2026\";\r\n\r\n        setMessage(\r\n          \"Kontrollerer tilg\u00e6ngelighed og pris \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              \"Totalprisen kunne ikke hentes.\"\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            \"Ferieboligen er tilg\u00e6ngelig fra \" +\r\n              formatDate(from) +\r\n              \" til \" +\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              : \"Tilg\u00e6ngeligheden kunne ikke kontrolleres. Pr\u00f8v igen.\";\r\n\r\n          if (\r\n            error &&\r\n            error.code ===\r\n            \"booking_not_open\"\r\n          ) {\r\n            message =\r\n              \"Booking er endnu ikke \u00e5ben for denne destination.\";\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              \"Ferieboligen er ikke tilg\u00e6ngelig i den valgte periode.\";\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            \"Tjek tilg\u00e6ngelighed\";\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-194251a7 e-flex e-con-boxed e-con e-parent\" data-id=\"194251a7\" 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-6c829150 elementor-widget elementor-widget-html\" data-id=\"6c829150\" 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        Kort\r\n      <\/span>\r\n\r\n      <h2>\r\n        Se Pollen\u00e7a og Alc\u00fadia p\u00e5 Mallorca\r\n      <\/h2>\r\n\r\n      <p>\r\n        Kortet giver en oversigt over det nordlige Mallorca,\r\n        hvor ferieboligerne ligger. Pollen\u00e7a og Alc\u00fadia giver et godt\r\n        udgangspunkt for at udforske strande, bugter, landsbyer,\r\n        restauranter og naturoplevelser i omr\u00e5det.\r\n      <\/p>\r\n\r\n    <\/div>\r\n\r\n    <div class=\"bno-map-card\">\r\n      <iframe\r\n        title=\"Kort over Pollen\u00e7a og Alc\u00fadia p\u00e5 Mallorca\"\r\n        src=\"https:\/\/www.google.com\/maps?q=Pollen%C3%A7a%20Alc%C3%BAdia%20Mallorca&z=10&output=embed\"\r\n        width=\"100%\"\r\n        height=\"520\"\r\n        style=\"border:0;\"\r\n        loading=\"lazy\"\r\n        allowfullscreen\r\n        referrerpolicy=\"no-referrer-when-downgrade\"\r\n      ><\/iframe>\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-35a23d00 e-flex e-con-boxed e-con e-parent\" data-id=\"35a23d00\" 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-33906fc elementor-widget elementor-widget-html\" data-id=\"33906fc\" 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          Oplevelser p\u00e5 Mallorca\r\n        <\/span>\r\n\r\n        <h2>\r\n          En feriebolig giver frihed til at opleve Mallorca i eget tempo\r\n        <\/h2>\r\n\r\n        <p>\r\n          Med en privat feriebolig kan rejseselskabet planl\u00e6gge dagene\r\n          som det passer bedst. Start dagen med morgenmad hjemme, rejs\r\n          videre til stranden, udforsk Pollen\u00e7as historiske centrum\r\n          eller brug dagen langs kysten og i bugterne omkring Alc\u00fadia.\r\n        <\/p>\r\n\r\n        <p>\r\n          Ferieboligerne giver ogs\u00e5 en komfortabel base for rolige dage.\r\n          Her kan familien eller vennegruppen samles, lave egne\r\n          m\u00e5ltider og nyde mere privatliv end ved et traditionelt\r\n          hotelophold.\r\n        <\/p>\r\n\r\n        <div class=\"bno-actions\">\r\n          <a href=\"#fakta\" class=\"bno-btn bno-btn--primary\">\r\n            Se praktisk information\r\n          <\/a>\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n      <div class=\"bno-editorial-split__media\">\r\n        <img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/bno-api-staging.onrender.com\/api\/img\/bno-images\/emerald-stay\/mallorca\/rooms\/villa-ca-na-rieres-mallorca-pollenca\/001.jpg?w=800&#038;ssl=1\" alt=\"Feriebolig p\u00e5 Mallorca\" loading=\"lazy\">\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-662d9f81 e-flex e-con-boxed e-con e-parent\" data-id=\"662d9f81\" 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-2a3d793d elementor-widget elementor-widget-html\" data-id=\"2a3d793d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section id=\"fakta\" 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        Praktisk information\r\n      <\/span>\r\n\r\n      <h2>\r\n        Omr\u00e5der, aktiviteter og nyttig information for opholdet\r\n      <\/h2>\r\n\r\n      <p>\r\n        Her finder du en oversigt over det som g\u00f8r Pollen\u00e7a og\r\n        Alc\u00fadia til attraktive udgangspunkter for en ferie p\u00e5 Mallorca.\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        <h3>Pollen\u00e7a<\/h3>\r\n\r\n        <p>\r\n          Pollen\u00e7a er kendt for sit historiske centrum, lokale\r\n          restauranter, markeder og karakteristiske gader. Omr\u00e5det\r\n          giver samtidig god adgang til b\u00e5de kysten og bjergomr\u00e5derne\r\n          nordvest p\u00e5 Mallorca.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"bno-value-card\">\r\n        <h3>Alc\u00fadia<\/h3>\r\n\r\n        <p>\r\n          Alc\u00fadia kombinerer en historisk bykerne med n\u00e6rhed til\r\n          Alc\u00fadiabukten, strande, restauranter og forskellige aktiviteter\r\n          langs den nord\u00f8stlige del af \u00f8en.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"bno-value-card\">\r\n        <h3>Strande og kyst<\/h3>\r\n\r\n        <p>\r\n          Nord-Mallorca har et varieret udvalg af lange sandstrande,\r\n          mindre bugter og kystomr\u00e5der der passer til b\u00e5de rolige\r\n          dage og aktiviteter p\u00e5 vandet.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"bno-value-card\">\r\n        <h3>Aktiviteter og natur<\/h3>\r\n\r\n        <p>\r\n          Omr\u00e5det passer godt til cykling, vandreture, b\u00e5dture,\r\n          vandsport og udflugter. Serra de Tramuntana og Cap de\r\n          Formentor er blandt omr\u00e5derne som kan n\u00e5s fra nord.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"bno-value-card\">\r\n        <h3>Restauranter og lokale oplevelser<\/h3>\r\n\r\n        <p>\r\n          Pollen\u00e7a og Alc\u00fadia har restauranter, caf\u00e9er og lokale\r\n          markeder, hvor rejsende kan opleve mallorkinsk madkultur\r\n          og regionale r\u00e5varer.\r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"bno-value-card\">\r\n        <h3>Lejebil og transport<\/h3>\r\n\r\n        <p>\r\n          Lejebil giver st\u00f8rst fleksibilitet n\u00e5r du bor i en privat\r\n          feriebolig. Det g\u00f8r det nemmere at komme til strande, butikker,\r\n          landsbyer og oplevelser i forskellige dele af \u00f8en.\r\n        <\/p>\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-5f7c9568 elementor-widget elementor-widget-html\" data-id=\"5f7c9568\" 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>\r\n\r\n        <span class=\"bno-eyebrow\">\r\n          N\u00e6ste skridt\r\n        <\/span>\r\n\r\n        <h2>\r\n          Find den feriebolig, der passer til din rejse til Mallorca\r\n        <\/h2>\r\n\r\n        <p>\r\n          Udforsk villaerne og townhouse-enhederne i Pollen\u00e7a og\r\n          Alc\u00fadia. Se billeder og kapacitet, v\u00e6lg datoer og kontroll\u00e9r\r\n          opdateret tilg\u00e6ngelighed og pris.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n      <div class=\"bno-actions\">\r\n        <a href=\"#enheter\" class=\"bno-btn bno-btn--primary\">\r\n          Se ferieboligerne\r\n        <\/a>\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-362ef99f e-flex e-con-boxed e-con e-parent\" data-id=\"362ef99f\" 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>Mallorca \u00b7 Pollen\u00e7a og Alc\u00fadia Overnatning p\u00e5 Mallorca \u2013 find den feriebolig, der passer til din rejse Udforsk h\u00e5ndplukkede villaer, feriehuse og townhouses i Pollen\u00e7a og Alc\u00fadia. Find en feriebolig der passer til familien, vennegruppen eller det st\u00f8rre rejseselskab, og kontroll\u00e9r opdateret pris og tilg\u00e6ngelighed direkte hos BNO Travel. Se ferieboligerne Se kort Bo i [&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-94423","page","type-page","status-publish","hentry"],"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/PgDuwj-oyX","jetpack-related-posts":[{"id":94420,"url":"https:\/\/bno-travel.com\/da\/spanske-kysten\/","url_meta":{"origin":94423,"position":0},"title":"Den spanske kyst","author":"Jan Terje \u00c5s","date":"2. august 2026","format":false,"excerpt":"Destinationer \u00b7 Den spanske kyst Overnatning langs den spanske kyst \u2013 find den destination, der passer til din rejse Udforsk h\u00e5ndplukkede ferieboliger p\u00e5 Costa Brava og Mallorca. Sammenlign to forskellige kystdestinationer med villaer, lejligheder, strande, landsbyer og oplevelser hele \u00e5ret. Se destinationerne Oplev den spanske kyst Find den rette kystdestination\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":93444,"url":"https:\/\/bno-travel.com\/spanske-kysten\/","url_meta":{"origin":94423,"position":1},"title":"Spanske kysten","author":"Jan Terje \u00c5s","date":"2. august 2026","format":false,"excerpt":"Destinasjoner \u00b7 Den spanske kysten Overnatting langs den spanske kysten \u2013 finn destinasjonen som passer reisen din Utforsk h\u00e5ndplukkede ferieboliger p\u00e5 Costa Brava og Mallorca. Sammenlign to ulike kystdestinasjoner med villaer, leiligheter, strender, landsbyer og opplevelser gjennom hele \u00e5ret. Se destinasjonene Oppdag den spanske kysten Finn riktig kystdestinasjon Overnatting langs\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":93433,"url":"https:\/\/bno-travel.com\/overnatting-pa-mallorca\/","url_meta":{"origin":94423,"position":2},"title":"Mallorca","author":"Jan Terje \u00c5s","date":"2. august 2026","format":false,"excerpt":"Mallorca \u00b7 Pollen\u00e7a og Alc\u00fadia Overnatting p\u00e5 Mallorca \u2013 finn ferieboligen som passer reisen din Utforsk h\u00e5ndplukkede villaer, feriehus og townhouses i Pollen\u00e7a og Alc\u00fadia. Finn en feriebolig som passer familien, vennegjengen eller det st\u00f8rre reisef\u00f8lget, og kontroller oppdatert pris og tilgjengelighet direkte hos BNO Travel. Se ferieboligene Se kart\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":94564,"url":"https:\/\/bno-travel.com\/sv\/spanske-kysten\/","url_meta":{"origin":94423,"position":3},"title":"Spanska kusten","author":"Jan Terje \u00c5s","date":"2. august 2026","format":false,"excerpt":"Destinationer \u00b7 Den spanska kusten Boende l\u00e4ngs den spanska kusten \u2013 hitta destinationen som passar din resa Utforska handplockade semesterboenden p\u00e5 Costa Brava och Mallorca. J\u00e4mf\u00f6r tv\u00e5 olika kustdestinationer med villor, l\u00e4genheter, str\u00e4nder, byar och upplevelser \u00e5ret runt. Se destinationerna Uppt\u00e4ck den spanska kusten Hitta r\u00e4tt kustdestination Boende l\u00e4ngs den\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2095,"url":"https:\/\/bno-travel.com\/overnatting\/","url_meta":{"origin":94423,"position":4},"title":"Overnatting i Trysil &amp; S\u00e4len","author":"Jan Terje \u00c5s","date":"11. juli 2025","format":false,"excerpt":"Overnatting i Norden, Alpene og ved Middelhavet Finn oppholdet som passer reisen din \u2013 fra skandinaviske fjell til Alpene og den spanske kysten BNO Travel samler hytter, leiligheter, hoteller og andre overnattingssteder i Norge, Sverige, Frankrike, \u00d8sterrike, Sveits og Spania. Utforsk fjelldestinasjoner, alpelandsbyer, fjordlandskap og kystomr\u00e5der \u2013 og finn et\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":94567,"url":"https:\/\/bno-travel.com\/sv\/overnatting-pa-mallorca\/","url_meta":{"origin":94423,"position":5},"title":"Mallorca","author":"Jan Terje \u00c5s","date":"2. august 2026","format":false,"excerpt":"Mallorca \u00b7 Pollen\u00e7a och Alc\u00fadia Boende p\u00e5 Mallorca \u2013 hitta semesterboendet som passar din resa Utforska handplockade villor, semesterhus och townhouses i Pollen\u00e7a och Alc\u00fadia. Hitta ett semesterboende som passar familjen, kompisg\u00e4nget eller det st\u00f6rre reses\u00e4llskapet, och kontrollera uppdaterat pris och tillg\u00e4nglighet direkt hos BNO Travel. Se semesterboendena Se karta\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/bno-travel.com\/da\/wp-json\/wp\/v2\/pages\/94423","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bno-travel.com\/da\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bno-travel.com\/da\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bno-travel.com\/da\/wp-json\/wp\/v2\/users\/260013438"}],"replies":[{"embeddable":true,"href":"https:\/\/bno-travel.com\/da\/wp-json\/wp\/v2\/comments?post=94423"}],"version-history":[{"count":1,"href":"https:\/\/bno-travel.com\/da\/wp-json\/wp\/v2\/pages\/94423\/revisions"}],"predecessor-version":[{"id":94424,"href":"https:\/\/bno-travel.com\/da\/wp-json\/wp\/v2\/pages\/94423\/revisions\/94424"}],"wp:attachment":[{"href":"https:\/\/bno-travel.com\/da\/wp-json\/wp\/v2\/media?parent=94423"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}