{"id":95473,"date":"2026-08-01T19:10:03","date_gmt":"2026-08-01T17:10:03","guid":{"rendered":"https:\/\/bno-travel.com\/overnatting-i-tignes-val-disere\/"},"modified":"2026-08-11T12:22:10","modified_gmt":"2026-08-11T10:22:10","slug":"overnatting-i-tignes-val-disere","status":"publish","type":"page","link":"https:\/\/bno-travel.com\/pl\/overnatting-i-tignes-val-disere\/","title":{"rendered":"Tignes\u2013Val d\u2019Is\u00e8re"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"95473\" class=\"elementor elementor-95473 elementor-93223\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4bb04347 e-flex e-con-boxed e-con e-parent\" data-id=\"4bb04347\" 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-589bdb4 elementor-widget elementor-widget-html\" data-id=\"589bdb4\" 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, 0.42), rgba(10, 18, 28, 0.58) ), url('https:\/\/bno-travel.com\/wp-content\/uploads\/2026\/05\/valdisere.jpg'); background-position: center; background-size: cover; background-repeat: no-repeat; \">\r\n<div class=\"bno-shell\">\r\n<div class=\"bno-area-hero__content\">\r\n<span class=\"bno-eyebrow\">\r\n        Tignes\u2013Val d\u2019Is\u00e8re \u00b7 Francja\r\n      <\/span>\r\n<h1>\r\n        Zakwaterowanie w Tignes\u2013Val d\u2019Is\u00e8re: znajd\u017a odpowiedni obiekt wakacyjny na swoj\u0105 podr\u00f3\u017c\r\n      <\/h1>\r\n<p class=\"bno-lead\">\r\n        Odkryj wybrane apartamenty w Val d\u2019Is\u00e8re i Tignes\u2013Val d\u2019Is\u00e8re. Znajd\u017a obiekt wakacyjny, kt\u00f3ry zapewni wygodn\u0105 baz\u0119 do jazdy na nartach, korzystania z g\u00f3r i aktywnego wypoczynku przez ca\u0142y rok.\r\n      <\/p>\r\n<div class=\"bno-actions\">\r\n<a class=\"bno-btn bno-btn--primary\" href=\"#enheter\">\r\n          Zobacz obiekty\r\n        <\/a>\r\n<a class=\"bno-btn bno-btn--secondary\" href=\"#kart\">\r\n          Zobacz map\u0119\r\n        <\/a>\r\n<\/div>\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-29eb97b8 e-flex e-con-boxed e-con e-parent\" data-id=\"29eb97b8\" 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-dbcbab1 elementor-widget elementor-widget-html\" data-id=\"dbcbab1\" 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<div class=\"bno-section-heading\">\r\n<h2>\r\n        Znajd\u017a zakwaterowanie w Tignes\u2013Val d\u2019Is\u00e8re\r\n      <\/h2>\r\n<p>\r\n        Tignes\u2013Val d\u2019Is\u00e8re to \u015bwietny wyb\u00f3r dla rodzin, grup znajomych i par szukaj\u0105cych wygodnej bazy do jazdy na nartach, w\u0119dr\u00f3wek, jazdy na rowerze i innych aktywno\u015bci we francuskich Alpach. Kierunek \u0142\u0105czy wysokie g\u00f3ry, alpejskie miejscowo\u015bci oraz szeroki wyb\u00f3r restauracji, sklep\u00f3w i praktycznych us\u0142ug.\r\n      <\/p>\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-2d62caa7 e-flex e-con-boxed e-con e-parent\" data-id=\"2d62caa7\" 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-2df30e9b elementor-widget elementor-widget-html\" data-id=\"2df30e9b\" 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--soft bno-direct-catalog\" data-api-base=\"https:\/\/bno-api-staging.onrender.com\" data-area-key=\"tignes-val-disere\" data-bno-direct-catalog=\"\" data-booking-base=\"https:\/\/booking.bno-travel.com\/booking\/complete\" data-booking-open-until=\"2027-05-01\" data-booking-partner-key=\"EMERALD_TIGNES_VAL_D_ISERE\" data-catalog-creds-key=\"EMERALD_TIGNES_VAL_D_ISERE\" data-destination-label=\"Tignes\u2013Val d\u2019Is\u00e8re\" data-initial-count=\"12\" data-location-label=\"Tignes\u2013Val d\u2019Is\u00e8re \u00b7 De franske Alpene\" data-minimum-stay-nights=\"2\" data-service-id=\"e7a52fec-74b4-4f75-af18-b36800c3d81c\" id=\"enheter\">\r\n<div class=\"bno-shell\">\r\n<div class=\"bno-section-heading\">\r\n<span class=\"bno-eyebrow\">\r\n        Obiekty wakacyjne w Tignes\u2013Val d\u2019Is\u00e8re\r\n      <\/span>\r\n<h2>\r\n        Znajd\u017a odpowiedni obiekt wakacyjny na pobyt w Tignes\u2013Val d\u2019Is\u00e8re\r\n      <\/h2>\r\n<p>\r\n        Odkryj wybrane obiekty wakacyjne w Val d\u2019Is\u00e8re. Sprawd\u017a zdj\u0119cia, liczb\u0119 miejsc i opisy, a nast\u0119pnie ceny oraz dost\u0119pno\u015b\u0107.\r\n      <\/p>\r\n<\/div>\r\n<div aria-live=\"polite\" class=\"bno-direct-catalog__status\" data-bno-status=\"\" role=\"status\">\r\n      \u0141adowanie obiekt\u00f3w\u2026\r\n    <\/div>\r\n<div aria-busy=\"true\" aria-live=\"polite\" class=\"bno-direct-catalog__grid\" data-bno-grid=\"\"><\/div>\r\n<div class=\"bno-direct-more-wrap\" data-bno-more-wrap=\"\" hidden=\"\">\r\n<button class=\"bno-direct-more\" data-bno-more=\"\" type=\"button\">\r\n        Poka\u017c wi\u0119cej obiekt\u00f3w\r\n      <\/button>\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-de4b359 e-flex e-con-boxed e-con e-parent\" data-id=\"de4b359\" 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-55b52b9 elementor-widget elementor-widget-html\" data-id=\"55b52b9\" 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<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() { return \"pl\"; }\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        \"pl-PL\",\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        \"pl-PL\",\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        \"Zakwaterowanie\"\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            : \"Nie uda\u0142o si\u0119 zrealizowa\u0107 \u017c\u0105dania.\"\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      \"Zakwaterowanie w \" +\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=\"Zamknij\"><\/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=\"Zamknij\">\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=\"Poprzednie zdj\u0119cie\">\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=\"Nast\u0119pne zdj\u0119cie\">\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                Sprawd\u017a sw\u00f3j pobyt\r\n              <\/span>\r\n\r\n              <h4>\r\n                Sprawd\u017a, czy obiekt jest dost\u0119pny\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>Przyjazd<\/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>Wyjazd<\/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>Go\u015bcie<\/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                Sprawd\u017a dost\u0119pno\u015b\u0107\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                  \u0141\u0105czna cena pobytu\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                  Do zap\u0142aty teraz na rzecz 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                  Pozosta\u0142a kwota do zap\u0142aty obiektowi\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                Przejd\u017a do rezerwacji\r\n              <\/button>\r\n\r\n              <p>\r\n                Dane go\u015bci, warunki i p\u0142atno\u015b\u0107 s\u0105 finalizowane\r\n                w bezpiecznym systemie rezerwacyjnym BNO Travel.\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        \"destino\"\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        \"Brakuje wymaganej konfiguracji dla Bulk 3.\";\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              \"Do \" +\r\n              unit.capacity +\r\n              \" go\u015bci\"\r\n            )\r\n          : \"Zobacz szczeg\u00f3\u0142y i zdj\u0119cia\";\r\n\r\n      const descriptionText =\r\n        unit.description ||\r\n        \"Zobacz zdj\u0119cia, pojemno\u015b\u0107 i dost\u0119pno\u015b\u0107 tego obiektu.\";\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} bilder\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                Zobacz obiekt \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        \"Widoczne obiekty: \" +\r\n          visibleUnits.length +\r\n          \" z \" +\r\n          units.length +\r\n          \" \u2014 \" +\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 zdj\u0119cie \" +\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              \"Do \" +\r\n              unit.capacity +\r\n              \" go\u015bci\"\r\n            )\r\n          : \"\";\r\n\r\n      modalDescription.textContent =\r\n        unit.description ||\r\n        \"Sprawd\u017a dost\u0119pno\u015b\u0107 i cen\u0119 tego obiektu.\";\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            \"Nie uda\u0142o si\u0119 teraz wczyta\u0107 \u017cadnego opublikowanego obiektu.\",\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                \"Nie mo\u017cna wczyta\u0107 obiekt\u00f3w: \" +\r\n                error.message\r\n              )\r\n            : \"Nie mo\u017cna wczyta\u0107 obiekt\u00f3w. Od\u015bwie\u017c stron\u0119.\",\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            \"Wybierz prawid\u0142owe daty. Data wyjazdu musi przypada\u0107 po dacie przyjazdu.\",\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            \"Minimalna d\u0142ugo\u015b\u0107 pobytu to \" +\r\n              minimumStay +\r\n              (minimumStay === 1 ? \" noc.\" : (((minimumStay % 10 >= 2 && minimumStay % 10 <= 4 && !(minimumStay % 100 >= 12 && minimumStay % 100 <= 14))) ? \" noce.\" : \" nocy.\")),\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            \"Wybierz prawid\u0142ow\u0105 liczb\u0119 go\u015bci.\",\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            \"Ten obiekt mo\u017ce pomie\u015bci\u0107 maksymalnie \" +\r\n              currentUnit.capacity +\r\n              \" go\u015bci.\",\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          \"Sprawdzanie\u2026\";\r\n\r\n        setMessage(\r\n          \"Sprawdzanie dost\u0119pno\u015bci i ceny\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              \"Nie uda\u0142o si\u0119 pobra\u0107 ceny ca\u0142kowitej.\"\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            \"Obiekt jest dost\u0119pny od \" +\r\n              formatDate(from) +\r\n              \" do \" +\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              : \"Nie uda\u0142o si\u0119 sprawdzi\u0107 dost\u0119pno\u015bci. Spr\u00f3buj ponownie.\";\r\n\r\n          if (\r\n            error &&\r\n            error.code ===\r\n            \"booking_not_open\"\r\n          ) {\r\n            message =\r\n              \"Rezerwacje dla tej destynacji nie s\u0105 jeszcze otwarte.\";\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              \"Obiekt nie jest dost\u0119pny w wybranym terminie.\";\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            \"Sprawd\u017a dost\u0119pno\u015b\u0107\";\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-5c8a94d e-flex e-con-boxed e-con e-parent\" data-id=\"5c8a94d\" 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-b03ec5a elementor-widget elementor-widget-html\" data-id=\"b03ec5a\" 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\" id=\"kart\">\r\n<div class=\"bno-shell\">\r\n<div class=\"bno-section-heading\">\r\n<span class=\"bno-eyebrow\">\r\n        Mapa\r\n      <\/span>\r\n<h2>\r\n        Zobacz po\u0142o\u017cenie Tignes\u2013Val d\u2019Is\u00e8re\r\n      <\/h2>\r\n<p>\r\n        Mapa przedstawia region i pomaga zorientowa\u0107 si\u0119 mi\u0119dzy Tignes, Val d\u2019Is\u00e8re, obszarami g\u00f3rskimi i alpejskimi miejscowo\u015bciami przed sprawdzeniem obiekt\u00f3w.\r\n      <\/p>\r\n<\/div>\r\n<div class=\"bno-map-card\">\r\n<iframe allowfullscreen=\"\" height=\"520\" loading=\"lazy\" referrerpolicy=\"no-referrer-when-downgrade\" src=\"https:\/\/www.google.com\/maps?q=Tignes%20Val%20d%27Isere%2C%20France&amp;output=embed\" style=\"\r\n          display: block;\r\n          border: 0;\r\n        \" title=\"Mapa de Tignes y Val d\u2019Is\u00e8re en Francia\" width=\"100%\"><\/iframe>\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-355ce5ca e-flex e-con-boxed e-con e-parent\" data-id=\"355ce5ca\" 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-463eb0ca elementor-widget elementor-widget-html\" data-id=\"463eb0ca\" 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<div class=\"bno-editorial-split\">\r\n<div class=\"bno-editorial-split__content\">\r\n<span class=\"bno-eyebrow\">\r\n          Atrakcje w regionie\r\n        <\/span>\r\n<h2>\r\n          Narty, wysokie g\u00f3ry i alpejskie do\u015bwiadczenia przez ca\u0142y rok\r\n        <\/h2>\r\n<p>\r\n          Tignes\u2013Val d\u2019Is\u00e8re to naturalny punkt wyj\u015bcia do po\u0142\u0105czenia komfortowego pobytu z jazd\u0105 na nartach, w\u0119dr\u00f3wkami, jazd\u0105 na rowerze i aktywno\u015bciami we francuskich Alpach.\r\n        <\/p>\r\n<p>\r\n          Zim\u0105 na pierwszy plan wysuwaj\u0105 si\u0119 narty, snowboard i inne aktywno\u015bci na \u015bniegu. Latem g\u00f3rski krajobraz doskonale nadaje si\u0119 do w\u0119dr\u00f3wek, jazdy na rowerze i wycieczek na wi\u0119kszej wysoko\u015bci. Miejscowo\u015bci oferuj\u0105 r\u00f3wnie\u017c restauracje, sklepy i przytulne miejsca.\r\n        <\/p>\r\n<div class=\"bno-actions\">\r\n<a class=\"bno-btn bno-btn--primary\" href=\"#fakta\">\r\n            Zobacz informacje praktyczne\r\n          <\/a>\r\n<\/div>\r\n<\/div>\r\n<div class=\"bno-editorial-split__media\">\r\n<img data-recalc-dims=\"1\" decoding=\"async\" alt=\"Estancias y experiencias de monta\u00f1a en Tignes\u2013Val d\u2019Is\u00e8re\" loading=\"lazy\" src=\"https:\/\/i0.wp.com\/bno-travel.com\/wp-content\/uploads\/2026\/08\/apartment-kumo-079.jpg?w=800&#038;ssl=1\" style=\" display: block; width: 100%; height: 100%; min-height: 420px; object-fit: cover; \"\/>\r\n<\/div>\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-566f345b e-flex e-con-boxed e-con e-parent\" data-id=\"566f345b\" 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-3e7651d7 elementor-widget elementor-widget-html\" data-id=\"3e7651d7\" 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--soft\" id=\"fakta\">\r\n<div class=\"bno-shell\">\r\n<div class=\"bno-section-heading\">\r\n<span class=\"bno-eyebrow\">\r\n        Informacje praktyczne\r\n      <\/span>\r\n<h2>\r\n        Aktywno\u015bci, transport i przydatne informacje w Tignes\u2013Val d\u2019Is\u00e8re\r\n      <\/h2>\r\n<p>\r\n        Poni\u017cej znajdziesz podsumowanie tego, co sprawia, \u017ce Tignes\u2013Val d\u2019Is\u00e8re jest atrakcyjne zar\u00f3wno na kr\u00f3tki wypad, jak i d\u0142u\u017csze wakacje.\r\n      <\/p>\r\n<\/div>\r\n<div class=\"bno-info-grid\">\r\n<div class=\"bno-value-card\">\r\n<h3>\r\n          Aktywno\u015bci zimowe\r\n        <\/h3>\r\n<p>\r\n          Region oferuje narciarstwo alpejskie, snowboard i inne aktywno\u015bci zimowe dla rodzin, pocz\u0105tkuj\u0105cych oraz do\u015bwiadczonych narciarzy.\r\n        <\/p>\r\n<\/div>\r\n<div class=\"bno-value-card\">\r\n<h3>\r\n          Aktywno\u015bci letnie\r\n        <\/h3>\r\n<p>\r\n          Latem g\u00f3ry najlepiej odkrywa\u0107 pieszo lub na rowerze. Szlaki i aktywno\u015bci na wysoko\u015bci sprawiaj\u0105, \u017ce region jest atrakcyjny tak\u017ce poza sezonem zimowym.\r\n        <\/p>\r\n<\/div>\r\n<div class=\"bno-value-card\">\r\n<h3>\r\n          Transport i dojazd\r\n        <\/h3>\r\n<p>\r\n          Mo\u017cliwo\u015bci transportu r\u00f3\u017cni\u0105 si\u0119 w zale\u017cno\u015bci od sezonu i miejsca zakwaterowania. Zorganizowany transfer lub wynaj\u0119ty samoch\u00f3d mog\u0105 by\u0107 praktyczne w zale\u017cno\u015bci od miejsca przyjazdu i planowanej trasy.\r\n        <\/p>\r\n<\/div>\r\n<div class=\"bno-value-card\">\r\n<h3>\r\n          Sklepy i us\u0142ugi\r\n        <\/h3>\r\n<p>\r\n          W miejscowo\u015bciach znajdziesz sklepy spo\u017cywcze, sklepy sportowe, wypo\u017cyczalnie sprz\u0119tu narciarskiego i inne praktyczne us\u0142ugi na czas pobytu.\r\n        <\/p>\r\n<\/div>\r\n<div class=\"bno-value-card\">\r\n<h3>\r\n          Restauracje i gastronomia\r\n        <\/h3>\r\n<p>\r\n          Region oferuje zr\u00f3\u017cnicowany wyb\u00f3r restauracji, kawiarni i lokali serwuj\u0105cych lokalne specja\u0142y oraz kuchni\u0119 mi\u0119dzynarodow\u0105.\r\n        <\/p>\r\n<\/div>\r\n<div class=\"bno-value-card\">\r\n<h3>\r\n          Apr\u00e8s-ski i \u017cycie miejscowo\u015bci\r\n        <\/h3>\r\n<p>\r\n          Po aktywnym dniu w g\u00f3rach znajdziesz restauracje, bary i przytulne miejsca. Oferta zmienia si\u0119 w zale\u017cno\u015bci od miejscowo\u015bci i sezonu.\r\n        <\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4b04e3e7 elementor-widget elementor-widget-html\" data-id=\"4b04e3e7\" 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<div class=\"bno-cta-box\">\r\n<div class=\"bno-cta-box__content\">\r\n<span class=\"bno-eyebrow\">\r\n          Nast\u0119pny krok\r\n        <\/span>\r\n<h2>\r\n          Znajd\u017a idealny obiekt wakacyjny w Tignes\u2013Val d\u2019Is\u00e8re\r\n        <\/h2>\r\n<p>\r\n          Odkryj nasz wyb\u00f3r apartament\u00f3w, sprawd\u017a zdj\u0119cia i opisy oraz znajd\u017a obiekt wakacyjny najlepiej dopasowany do pobytu w Tignes\u2013Val d\u2019Is\u00e8re.\r\n        <\/p>\r\n<\/div>\r\n<div class=\"bno-cta-box__action\">\r\n<a class=\"bno-btn bno-btn--primary bno-cta-button\" href=\"#enheter\">\r\n<span>\r\n            Zobacz obiekty\r\n          <\/span>\r\n<span aria-hidden=\"true\">\r\n            \u2192\r\n          <\/span>\r\n<\/a>\r\n<\/div>\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-7939c9ff e-flex e-con-boxed e-con e-parent\" data-id=\"7939c9ff\" 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>Tignes\u2013Val d\u2019Is\u00e8re \u00b7 Francja Zakwaterowanie w Tignes\u2013Val d\u2019Is\u00e8re: znajd\u017a odpowiedni obiekt wakacyjny na swoj\u0105 podr\u00f3\u017c Odkryj wybrane apartamenty w Val d\u2019Is\u00e8re i Tignes\u2013Val d\u2019Is\u00e8re. Znajd\u017a obiekt wakacyjny, kt\u00f3ry zapewni wygodn\u0105 baz\u0119 do jazdy na nartach, korzystania z g\u00f3r i aktywnego wypoczynku przez ca\u0142y rok. Zobacz obiekty Zobacz map\u0119 Znajd\u017a zakwaterowanie w Tignes\u2013Val d\u2019Is\u00e8re Tignes\u2013Val d\u2019Is\u00e8re [&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-95473","page","type-page","status-publish","hentry"],"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/PgDuwj-oPT","jetpack-related-posts":[{"id":94029,"url":"https:\/\/bno-travel.com\/fi\/overnatting-i-salen\/","url_meta":{"origin":95473,"position":0},"title":"Majoitus S\u00e4leniss\u00e4","author":"Jan Terje \u00c5s","date":"2026-04-04","format":false,"excerpt":"Kohde \u00b7 S\u00e4len Majoitusta S\u00e4leniss\u00e4 ja p\u00e4\u00e4sy alueille, jotka sopivat parhaiten lomaasi Tutustu S\u00e4lenin alueisiin Lindvallen, Tand\u00e5dalen, H\u00f6gfj\u00e4llet ja Hundfj\u00e4llet \u2013 ja l\u00f6yd\u00e4 majoitus, jossa sijainti, luonto ja aktiviteetit ovat sopivassa tasapainossa. Katso S\u00e4lenin alueet Tutustu S\u00e4len L\u00f6yd\u00e4 oikea alue majoitukselle S\u00e4leniss\u00e4 S\u00e4len on yksi Ruotsin tunnetuimmista vuoristokohteista, ja siell\u00e4\u2026","rel":"","context":"Podobny wpis","block_context":{"text":"Podobny wpis","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":94031,"url":"https:\/\/bno-travel.com\/fi\/elementor-28637\/","url_meta":{"origin":95473,"position":1},"title":"Elementor #28637","author":"Jan Terje \u00c5s","date":"2026-04-04","format":false,"excerpt":"Kohde \u00b7 S\u00e4len Majoitusta S\u00e4leniss\u00e4 ja p\u00e4\u00e4sy alueille, jotka sopivat parhaiten lomaasi Tutustu S\u00e4lenin alueisiin Lindvallen, Tand\u00e5dalen, H\u00f6gfj\u00e4llet ja Hundfj\u00e4llet \u2013 ja l\u00f6yd\u00e4 majoitus, jossa sijainti, luonto ja aktiviteetit ovat sopivassa tasapainossa. Katso S\u00e4lenin alueet Tutustu S\u00e4len L\u00f6yd\u00e4 oikea alue majoitukselle S\u00e4leniss\u00e4 S\u00e4len on yksi Ruotsin tunnetuimmista vuoristokohteista, ja siell\u00e4\u2026","rel":"","context":"Podobny wpis","block_context":{"text":"Podobny wpis","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":94027,"url":"https:\/\/bno-travel.com\/fi\/overnatting-i-sunnmorsalpene\/","url_meta":{"origin":95473,"position":2},"title":"Majoitus Sunnm\u00f8rsalpene-alueella","author":"Jan Terje \u00c5s","date":"2026-04-04","format":false,"excerpt":"Kohde \u00b7 Sunnm\u00f8rsalpene Majoitusta Sunnm\u00f8rsalpene-alueella l\u00e4hell\u00e4 vuonoja, vuoria ja alueita, jotka muovaavat lomakokemustasi Tutustu Sunnm\u00f8rsalpene-alueeseen kohteiden Stranda, Strandafjellet, Hornindal ja Fjells\u00e6tra kautta \u2013 ja l\u00f6yd\u00e4 majoitus, joka sopii sinulle, etsitp\u00e4 luontoel\u00e4myksi\u00e4, aktiivista lomaa tai rauhallisempia p\u00e4ivi\u00e4 upeissa maisemissa. Katso Sunnm\u00f8rsalpene-alueen kohteet Tutustu Sunnm\u00f8rsalpene L\u00f6yd\u00e4 oikea alue majoitukselle Sunnm\u00f8rsalpene-alueella Sunnm\u00f8rsalpene on\u2026","rel":"","context":"Podobny wpis","block_context":{"text":"Podobny wpis","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":94606,"url":"https:\/\/bno-travel.com\/fi\/overnatting-i-ontario-canada\/","url_meta":{"origin":95473,"position":3},"title":"Majoitus Ontariossa, Kanadassa","author":"Jan Terje \u00c5s","date":"2026-08-04","format":false,"excerpt":"Kohteet \u00b7 Ontario, Kanada Majoitus Ontariossa \u2013 yhdist\u00e4 Rice Lake ja Toronto Tutustu Ontarioon rauhallisten j\u00e4rvenrantamajoitusten ja kaupunkiel\u00e4mysten kautta. Valitse Rice Lake, kun kaipaat luontoa, m\u00f6kkej\u00e4 ja p\u00e4ivi\u00e4 veden \u00e4\u00e4rell\u00e4, tai seuraa Toronton lis\u00e4\u00e4mist\u00e4 omaksi kohteekseen. N\u00e4yt\u00e4 kohteet Tutustu Ontarioon L\u00f6yd\u00e4 sopiva kohde Ontariossa J\u00e4rviel\u00e4m\u00e4\u00e4 Rice Lakella ja kaupunkiel\u00e4myksi\u00e4 Torontossa\u2026","rel":"","context":"Podobny wpis","block_context":{"text":"Podobny wpis","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":94641,"url":"https:\/\/bno-travel.com\/fi\/overnatting-i-de-sveitsiske-alper\/","url_meta":{"origin":95473,"position":4},"title":"Sveitsin Alpit","author":"Jan Terje \u00c5s","date":"2026-07-29","format":false,"excerpt":"Kohteet \u00b7 Sveitsin Alpit Majoitus Sveitsin Alpeilla \u2013 l\u00f6yd\u00e4 matkallesi sopiva kohde Tutustu Verbieriin ja Sveitsin houkutteleviin vuoristoalueisiin. L\u00f6yd\u00e4 majoitus l\u00e4hell\u00e4 perinteisi\u00e4 alppikyli\u00e4, korkeita vuoria, laskettelualueita ja upeita luontoel\u00e4myksi\u00e4 ymp\u00e4ri vuoden. N\u00e4yt\u00e4 kohteet Tutustu Sveitsin Alppeihin L\u00f6yd\u00e4 sopiva vuoristokohde L\u00f6yd\u00e4 majoitus Sveitsin Alpeilta Sveitsin Alpit koostuvat luonteeltaan, sijainniltaan ja tunnelmaltaan\u2026","rel":"","context":"Podobny wpis","block_context":{"text":"Podobny wpis","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":94048,"url":"https:\/\/bno-travel.com\/fi\/overnatting-i-trysil\/","url_meta":{"origin":95473,"position":5},"title":"majoitus-trysilissa","author":"Jan Terje \u00c5s","date":"2026-04-04","format":false,"excerpt":"Kohde \u00b7 Trysil Majoitus Trysiliss\u00e4 \u2013 valitse matkallesi parhaiten sopiva alue Tutustu Trysilin alueisiin, kuten Trysil Turistsenter, Trysil Sentrum, Trysilfjell Hytteomr\u00e5de ja Fager\u00e5sen \/ Trysil H\u00f8yfjellssenter, ja l\u00f6yd\u00e4 matkallesi sopiva majoitus. Katso Trysilin alueet Tutustu kohteeseen Trysil L\u00f6yd\u00e4 oikea alue majoitukselle Trysiliss\u00e4 Trysil on yksi Skandinavian suosituimmista vuoristokohteista, ja siell\u00e4\u2026","rel":"","context":"Podobny wpis","block_context":{"text":"Podobny wpis","link":""},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/bno-travel.com\/pl\/wp-json\/wp\/v2\/pages\/95473","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bno-travel.com\/pl\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bno-travel.com\/pl\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bno-travel.com\/pl\/wp-json\/wp\/v2\/users\/260013438"}],"replies":[{"embeddable":true,"href":"https:\/\/bno-travel.com\/pl\/wp-json\/wp\/v2\/comments?post=95473"}],"version-history":[{"count":1,"href":"https:\/\/bno-travel.com\/pl\/wp-json\/wp\/v2\/pages\/95473\/revisions"}],"predecessor-version":[{"id":95474,"href":"https:\/\/bno-travel.com\/pl\/wp-json\/wp\/v2\/pages\/95473\/revisions\/95474"}],"wp:attachment":[{"href":"https:\/\/bno-travel.com\/pl\/wp-json\/wp\/v2\/media?parent=95473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}