{"id":4976,"date":"2026-03-19T14:31:28","date_gmt":"2026-03-19T14:31:28","guid":{"rendered":"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/?page_id=4976"},"modified":"2026-03-23T10:52:33","modified_gmt":"2026-03-23T10:52:33","slug":"plan-osiedla-wersja-svg-1","status":"publish","type":"page","link":"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/plan-osiedla-wersja-svg-1\/","title":{"rendered":"Plan osiedla &#8211; wersja SVG &#8211; 1"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"4976\" class=\"elementor elementor-4976\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b88bfea e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"b88bfea\" 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-9cd8418 elementor-widget elementor-widget-html\" data-id=\"9cd8418\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<script>\n\/\/ function handleRedirect() {\n\/\/   if (window.innerWidth > 768) {\n\/\/     window.location.href = \"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/plan-osiedla-wersja-svg\";\n\/\/   }\n\/\/ }\n\n\/\/ handleRedirect();\n<\/script>\n\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Rosario:wght@300;400;600;700&family=Cormorant:wght@400;600;700&display=swap');\n\nbody {\n  padding: 0;\n  margin: 0;\n  font-variant-numeric: lining-nums;\n  font-feature-settings: \"lnum\";\n}\n\n.wrap{\n  height:auto;\n  width:100%;\n  display:flex;\n  flex-direction:column;\n  align-items:center;\n  justify-content:flex-start;\n  box-sizing:border-box;\n  background:#FFFCF8;\n  font-family:'Rosario', system-ui,\"Segoe UI\", Roboto, Helvetica, Arial;\n}\n\n.controls-row{\n  width:90vw;\n  display:flex;\n  justify-content:center;\n  align-items:center;\n  gap:12px;\n  margin:22px 0 6px;\n  position:relative;\n  color:#636C4D;\n  padding:12px 0 0;\n  box-sizing:border-box;\n}\n\n.controls-row h2{\n  position:relative;\n  left:auto;\n  transform:none;\n  margin:0 0 15px;\n  padding:0 12px;\n  font-size:clamp(24px, 7.2vw, 36px);\n  font-weight:700;\n  color:#111;\n  line-height:1.1;\n  white-space:nowrap;\n  overflow:hidden;\n  text-overflow:ellipsis;\n  pointer-events:none;\n  text-align:center;\n}\n\n.legend-row{\n  width:90vw;\n  display:flex;\n  justify-content:center;\n  align-items:flex-start;\n  gap:10px;\n  flex-wrap:wrap;\n  margin:0 0 8px;\n  box-sizing:border-box;\n  color:#6E665E;\n}\n\n.legend-item{\n  display:flex;\n  flex-direction:column;\n  align-items:center;\n  justify-content:flex-start;\n  gap:4px;\n  min-width:64px;\n  text-align:center;\n  line-height:1.05;\n}\n\n.legend-item .legend-label{\n  font-size:13px;\n  font-weight:600;\n  color:#6E665E;\n  white-space:nowrap;\n}\n\n.legend-item svg.dot{\n  width:50px;\n  height:auto;\n  display:block;\n  object-fit:contain;\n  background:transparent;\n  border-radius:4px;\n  position:static !important;\n  top:auto !important;\n  left:auto !important;\n}\n\n.legend-item svg.dot path{\n  stroke-width:5;\n}\n\n.switch input[type=\"checkbox\"]{\n  accent-color:#636C4D;\n  transform:scale(1.2);\n}\n\n.switch{\n  display:inline-flex;\n  align-items:center;\n  gap:8px;\n  font-size:14px;\n  margin-bottom:-10px;\n  color:#111;\n  user-select:none;\n}\n\n.switch .label{\n  font-weight:400;\n  text-transform:lowercase;\n  letter-spacing:0.2px;\n}\n\n.switch .toggle,\n.switch .knob{\n  display:none;\n}\n\n.switch input{\n  position:static;\n  opacity:1;\n  width:auto;\n  height:auto;\n  margin-left:0;\n}\n\n.viewer .switch-overlay{\n  position:absolute;\n  left:2%;\n  top:2%;\n  z-index:95;\n  background:#FFFCF8;\n  color:#111;\n  padding:6px 8px;\n  box-shadow:0 10px 30px rgba(0,0,0,0.08);\n  border:1px solid rgba(0,0,0,0.06);\n  display:inline-flex;\n  align-items:center;\n  gap:6px;\n  font-size:12px;\n  width:auto;\n  min-width:132px;\n  pointer-events:auto;\n  user-select:none;\n  font-family:'Rosario', system-ui, \"Segoe UI\", Roboto, Helvetica, Arial;\n  margin-bottom:0;\n}\n\n.viewer .switch-overlay .label{\n  font-weight:600;\n  color:#6E665E;\n  text-transform:none;\n  font-size:inherit;\n  letter-spacing:0.2px;\n  font-family:Cormorant, 'Rosario', system-ui;\n}\n\n.viewer .switch-overlay input[type=\"checkbox\"]{\n  transform:scale(0.95);\n  accent-color:#636C4D;\n  width:15px;\n  height:15px;\n  margin-left:0;\n}\n\n.viewer{\n  width:100vw;\n  max-height:80vw;\n  aspect-ratio:8064 \/ 4536;\n  position:relative;\n  overflow:hidden;\n  background:#000;\n  cursor:grab;\n  touch-action:none;\n  user-select:none;\n  -webkit-user-select:none;\n}\n\n.viewer.dragging{\n  cursor:grabbing;\n}\n\n.content{\n  position:absolute;\n  top:0;\n  left:0;\n  width:100%;\n  height:100%;\n  transform-origin:0 0;\n  will-change:transform;\n  transition:transform 180ms cubic-bezier(.2,.8,.2,1);\n  background:#000;\n  backface-visibility:hidden;\n  transform-style:preserve-3d;\n  transform:translateZ(0);\n  -webkit-backface-visibility:hidden;\n  -webkit-transform:translateZ(0);\n  background-size:contain;\n  background-position:center;\n  background-repeat:no-repeat;\n}\n\n.content svg{\n  width:100%;\n  height:100%;\n  object-fit:cover;\n  position:absolute;\n  top:0;\n  left:0;\n  user-select:none;\n  -webkit-user-drag:none;\n  pointer-events:auto;\n  display:block;\n  z-index:30;\n}\n\n.viewer img.layer{\n  width:100%;\n  height:100%;\n  object-fit:cover;\n  position:absolute;\n  top:0;\n  left:0;\n  user-select:none;\n  -webkit-user-drag:none;\n  pointer-events:none;\n  display:block;\n  transition:opacity 180ms ease;\n  opacity:1;\n  background:transparent;\n  will-change:opacity;\n}\n\n.status{\n  color:#fff;\n  font-size:14px;\n  z-index:20;\n  min-width:26px;\n  min-height:30px;\n  background:rgba(0,0,0,0.4);\n  padding:6px 10px;\n  border-radius:6px;\n  display:inline-block;\n  font-weight:400;\n  -webkit-user-select:none;\n  user-select:none;\n  text-align:center;\n  vertical-align:middle;\n  line-height:1.2;\n}\n\n.status-wrap{\n  width:min(90vw, 760px);\n  display:flex;\n  justify-content:center;\n  align-items:center;\n  gap:12px;\n  margin:14px auto 0;\n  box-sizing:border-box;\n  color:#636C4D;\n  position:relative;\n  z-index:200;\n}\n\n.status-wrap.hidden{\n  display:none !important;\n}\n\n.nav-button{\n  background:rgba(0,0,0,0.4);\n  color:#fff;\n  border-radius:8px;\n  padding:10px 18px;\n  font-size:15px;\n  border:none;\n  cursor:pointer;\n  min-width:58px;\n  min-height:38px;\n  display:inline-flex;\n  align-items:center;\n  justify-content:center;\n  box-shadow:0 6px 18px rgba(0,0,0,0.08);\n  user-select:none;\n  flex:0 0 auto;\n}\n\n.nav-button:active{\n  transform:translateY(1px);\n}\n\n.nav-button:focus{\n  outline:3px solid rgba(255,255,255,0.12);\n  outline-offset:2px;\n}\n\n.nav-button[aria-hidden=\"true\"]{\n  display:none !important;\n}\n\n.nav-button .vis{\n  font-weight:700;\n  font-family:system-ui, \"Segoe UI\", Roboto, Arial;\n  font-size:20px;\n  line-height:1;\n}\n\n.viewer > .status{\n  position:static !important;\n  left:auto !important;\n  transform:none !important;\n}\n\n.hidden{\n  display:none;\n}\n\n.tooltip{\n  position:absolute;\n  background:white;\n  color:#FFFCF8;\n  padding:10px 12px;\n  font-size:13px;\n  pointer-events:none;\n  z-index:100;\n  transform:translate(-50%,-110%);\n  border:1px solid rgba(0,0,0,0.06);\n  max-width:320px;\n  text-align:left;\n  white-space:normal;\n  border-radius:10px;\n}\n\n.tooltip.hidden{\n  display:none;\n}\n\n.tooltip strong{\n  display:block;\n  font-size:14px;\n  margin:0;\n  color:#000;\n  font-weight:700;\n  font-family:system-ui,\"Segoe UI\",Roboto,Helvetica,Arial;\n}\n\n.tooltip .state{\n  display:block;\n  margin-top:6px;\n  font-size:13px;\n  font-weight:600;\n}\n\n.viewer svg g path{\n  transition:fill .25s ease, stroke .25s ease, opacity .25s ease;\n}\n\n.viewer svg g.hovered path{\n  fill:#F9F0D7 !important;\n  stroke:#E2D1BE !important;\n  opacity:1 !important;\n}\n\n@keyframes housePulse{\n  0%{fill:#F9F0D7;stroke:#E2D1BE;opacity:0.8}\n  50%{fill:rgba(180,255,0,0.5);stroke:#B2C486;opacity:1}\n  100%{fill:#F9F0D7;stroke:#E2D1BE;opacity:0.8}\n}\n\n@keyframes housePulseReserved{\n  0%{fill:#F9F0D7;stroke:#E2D1BE;opacity:0.85}\n  50%{fill:rgba(160,145,100,0.55);stroke:#8b7841;opacity:1}\n  100%{fill:#F9F0D7;stroke:#E2D1BE;opacity:0.85}\n}\n\n.viewer svg g.pulsing:not(.reserved) path{\n  animation: housePulse 1800ms ease-in-out infinite;\n  animation-fill-mode:both;\n}\n\n.viewer svg g.pulsing.reserved path{\n  animation: housePulseReserved 1800ms ease-in-out infinite;\n  animation-fill-mode:both;\n}\n\n\n.house-panel{\n  position:relative;\n  width:100%;\n  max-width:none;\n  min-width:0;\n  margin:16px 0 0;\n  background:#ffffff;\n  box-shadow:0 20px 60px rgba(0,0,0,0.18);\n  z-index:5000;\n  display:flex;\n  flex-direction:column;\n  padding:20px;\n  box-sizing:border-box;\n  overflow:visible;\n  border:1px solid rgba(0,0,0,0.06);\n  pointer-events:auto;\n  opacity:0;\n  transform:translateY(-14px);\n  transition:transform 320ms cubic-bezier(.2,.8,.2,1), opacity 220ms ease;\n  border-radius:0;\n  align-self:stretch;\n}\n\n.house-panel.open{\n  transform:translateY(0);\n  opacity:1;\n}\n\n.house-panel.closing-right{\n  transform:translateY(-14px);\n  opacity:0 !important;\n}\n\n.house-panel h1{\n  margin:0 0 10px 0;\n  font-size:20px;\n  font-weight:800;\n  color:#111;\n}\n\n.house-panel .close{\n  position:absolute;\n  left:16px;\n  top:16px;\n  border:none;\n  background:transparent;\n  color:#000;\n  font-weight:800;\n  font-size:36px;\n  cursor:pointer;\n  padding:2px 6px;\n  width:auto;\n  height:auto;\n  border-radius:0;\n  box-shadow:none;\n  z-index:300;\n  line-height:1;\n}\n\n.house-panel .close:hover{\n  transform:scale(1.04);\n  box-shadow:0 12px 22px rgba(0,0,0,0.34);\n}\n\n.house-panel .close:focus{\n  outline:3px solid rgba(17,24,39,0.12);\n  outline-offset:2px;\n}\n\n.house-panel .meta{\n  font-size:14px;\n  color:#444;\n  margin-top:8px;\n}\n\n.house-panel .inner{\n  display:flex;\n  flex-direction:column;\n  align-items:stretch;\n  gap:8px;\n  flex:1;\n  min-height:0;\n  overflow:visible;\n}\n\n.shortcode-frame{\n  margin-top:12px;\n  border-radius:8px;\n  overflow:hidden;\n  border:1px solid rgba(0,0,0,0.06);\n}\n\n.shortcode-frame iframe{\n  display:block;\n  width:100%;\n  height:360px;\n  border:0;\n}\n\n.shortcode-fallback{\n  padding:10px 12px;\n  text-align:center;\n  font-size:13px;\n}\n\n.panel-open-plan-btn{\n  color:#fff;\n  border:none;\n  padding:10px 12px;\n  border-radius:8px;\n  cursor:pointer;\n  font-weight:700;\n  font-size:14px;\n  box-shadow:0 6px 18px rgba(0,0,0,0.12);\n  display:inline-block;\n  font-family:'Cormorant', serif;\n  width:45%;\n}\n\n.panel-open-plan-btn:active{\n  transform:translateY(1px);\n}\n\n.panel-open-plan-btn:focus{\n  outline:3px solid rgba(139,122,105,0.22);\n  outline-offset:2px;\n}\n\n.panel-open-plan-btn:hover{\n  transform:translateY(-1px);\n  box-shadow:0 10px 22px rgba(0,0,0,0.18);\n  background:#cdb397 !important;\n}\n\n.house-panel .panel-image-row{\n  display: grid;\n  grid-template-columns: 36px auto 36px;\n  justify-content: center;\n  align-items: center;\n  gap: 8px;\n  width: 100%;\n  overflow: hidden;\n}\n\n.house-panel .panel-image-row .panel-image{\n  grid-column: 2;\n  min-width: 0;\n  justify-self: center;\n  max-width: 100%;\n}\n\n.house-panel .panel-image-row .panel-image img{\n  display: block;\n  width: 100%;\n  max-width: 520px;\n  height: auto;\n}\n\n#panel-image-toggle-left,\n#panel-image-toggle-right{\n  width: 36px;\n  min-width: 36px;\n  flex: 0 0 36px;\n}\n\n#panel-image-toggle-left,\n#panel-image-toggle-right{\n  align-self:center;\n  justify-self:center;\n  display:flex;\n  align-items:center;\n  justify-content:center;\n  font-size:26px;\n  font-weight:700;\n  color:#6E665E;\n  cursor:pointer;\n  user-select:none;\n}\n\n#panel-image-toggle-left{\n  grid-column:1;\n  grid-row:1;\n}\n\n#panel-image-toggle-right{\n  grid-column:3;\n  grid-row:1;\n}\n\n#panel-image-description{\n  grid-column:1 \/ span 2;\n  grid-row:2;\n  font-size:14px;\n  color:#6E665E;\n  font-weight:600;\n  margin-top:2px;\n}\n\n.house-panel .panel-image-row .panel-image-extra{\n  grid-column:1 \/ -1;\n  grid-row:3;\n  display:flex;\n  flex-direction:column;\n  gap:6px;\n  flex:0 0 100%;\n  justify-content:center;\n  align-items:center;\n}\n\n.house-panel .panel-open-plan-btn{\n  background:#E2D1BE;\n  color:#6E665E;\n  border:none;\n  padding:7px 10px;\n  border-radius:8px;\n  cursor:pointer;\n  font-weight:700;\n  font-size:18px;\n  width:100%;\n  min-height:32px;\n  font-family:'Cormorant', serif;\n  box-shadow:0 6px 18px rgba(0,0,0,0.12);\n}\n\n#panel-ask:hover{\n  background:#5a544d !important;\n}\n\n#panel-ask-local:hover{\n  background:#cdb397 !important;\n}\n\n.overlay{\n  overflow:hidden;\n}\n\n.rzut-modal{\n  position:fixed;\n  top:0;\n  left:0;\n  right:0;\n  bottom:0;\n  z-index:99999;\n  display:flex;\n  align-items:center;\n  justify-content:center;\n  padding:20px;\n  background:rgba(0,0,0,0.6);\n  overflow:hidden;\n  -webkit-backface-visibility:hidden;\n  backface-visibility:hidden;\n  -webkit-overflow-scrolling:touch;\n}\n\n.rzut-modal-inner{\n  width:80vw;\n  max-width:1500px;\n  height:90vh;\n  max-height:95vh;\n  box-sizing:border-box;\n  background:#fff;\n  border-radius:8px;\n  overflow:hidden;\n  position:relative;\n  display:flex;\n  flex-direction:column;\n  box-shadow:0 30px 80px rgba(0,0,0,0.5);\n}\n\n.rzut-modal-close{\n  position:absolute;\n  right:14px;\n  top:10px;\n  z-index:10100;\n  background:transparent;\n  border:none;\n  font-size:36px;\n  cursor:pointer;\n  line-height:1;\n  color:#444;\n  padding:6px 10px;\n}\n\n.rzut-modal-content{\n  flex:1 1 auto;\n  display:flex;\n  align-items:center;\n  justify-content:center;\n  padding:12px;\n  box-sizing:border-box;\n  overflow:hidden;\n}\n\n.rzut-modal-content .plan-wrap{\n  width:100%;\n  height:100%;\n  display:grid;\n  grid-template-columns:1fr 320px;\n  gap:12px;\n  align-items:start;\n  justify-content:stretch;\n  align-content:start;\n  box-sizing:border-box;\n}\n\n.rzut-modal-content .plan-stage{\n  width:100%;\n  height:100%;\n  overflow:auto;\n  max-height:calc(85vh - 60px);\n}\n\n#panel-ask-local{\n  margin-top:auto;\n}\n\n.rzut-modal-content .plan-stage svg{\n  width:100%;\n  height:auto;\n  display:block;\n  max-width:100%;\n}\n\n.rzut-modal-content .plan-panel{\n  padding-top:10px;\n  overflow:auto;\n  max-height:calc(85vh - 60px);\n}\n\n.rzut-scale-wrap{\n  width:100%;\n  height:100%;\n  display:flex;\n  align-items:center;\n  justify-content:center;\n}\n\n.rzut-scale-wrap svg{\n  width:100%;\n  height:100%;\n  max-width:100%;\n  max-height:100%;\n  object-fit:contain;\n}\n\n.rzut-scale-wrap iframe{\n  width:100%;\n  height:100%;\n  border:0;\n}\n\n.big-loader{\n  position:absolute;\n  inset:0;\n  display:flex;\n  align-items:center;\n  justify-content:center;\n  background:#000;\n  z-index:9999;\n  pointer-events:none;\n}\n\n.big-loader-text{\n  color:#fff;\n  font-size:clamp(35px, 5vw, 80px);\n  font-weight:700;\n  letter-spacing:5px;\n  font-family:system-ui, \"Segoe UI\", Roboto, Arial;\n  animation:pulseLoader 1.2s ease-in-out infinite;\n}\n\n.house-panel .inner{\n  display:flex;\n  flex-direction:column;\n  align-items:stretch;\n  gap:8px;\n  flex:1;\n  min-height:0;\n  overflow:visible;\n}\n<\/style>\n\n<script src=\"https:\/\/challenges.cloudflare.com\/turnstile\/v0\/api.js\" async defer><\/script>\n\n<div class=\"wrap\">\n  <div style=\"display:flex;flex-direction:column;margin-bottom:25px;\" class=\"controls-row\">\n    <h2 style=\"font-family:Cormorant; color:#6E665E; font-weight:400\">Plan Osiedla<\/h2>\n    <button style=\"background:#E2D1BE;color:#6E665E;font-family:Cormorant;border:none;padding:4px 8px;\" class=\"btn\" onclick=\"window.location.href='https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/plan-osiedla-wersja-svg-mobilna\/'\">Wr\u00f3\u0107 do wyboru etapu<\/button>\n  <\/div>\n\n  <div class=\"legend-row\" aria-hidden=\"true\">\n    <div class=\"legend-item available\">\n      <svg class=\"dot available\" viewBox=\"0 0 173 136\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" focusable=\"false\" aria-hidden=\"true\">\n        <path d=\"M28.3305 131.897V76.5866C28.3305 75.4821 27.435 74.5866 26.3305 74.5866H3.50707C1.63116 74.5866 0.78742 72.2366 2.23493 71.0434L86.0454 1.95677C86.7899 1.34302 87.8665 1.34837 88.6049 1.96948L170.739 71.0561C172.167 72.2573 171.318 74.5866 169.452 74.5866H146.543C145.438 74.5866 144.543 75.4821 144.543 76.5866V131.897C144.543 133.002 143.647 133.897 142.543 133.897H30.3305C29.2259 133.897 28.3305 133.002 28.3305 131.897Z\"\/>\n      <\/svg>\n      <span class=\"legend-label\">Dost\u0119pny<\/span>\n    <\/div>\n\n    <div class=\"legend-item reserved\">\n      <svg class=\"dot reserved\" viewBox=\"0 0 173 136\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" focusable=\"false\" aria-hidden=\"true\">\n        <path d=\"M28.3305 131.897V76.5866C28.3305 75.4821 27.435 74.5866 26.3305 74.5866H3.50707C1.63116 74.5866 0.78742 72.2366 2.23493 71.0434L86.0454 1.95677C86.7899 1.34302 87.8665 1.34837 88.6049 1.96948L170.739 71.0561C172.167 72.2573 171.318 74.5866 169.452 74.5866H146.543C145.438 74.5866 144.543 75.4821 144.543 76.5866V131.897C144.543 133.002 143.647 133.897 142.543 133.897H30.3305C29.2259 133.897 28.3305 133.002 28.3305 131.897Z\"\/>\n      <\/svg>\n      <span class=\"legend-label\">Zarezerwowany<\/span>\n    <\/div>\n\n    <div class=\"legend-item sold\">\n      <svg class=\"dot sold\" viewBox=\"0 0 173 136\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" focusable=\"false\" aria-hidden=\"true\">\n        <path d=\"M28.3305 131.897V76.5866C28.3305 75.4821 27.435 74.5866 26.3305 74.5866H3.50707C1.63116 74.5866 0.78742 72.2366 2.23493 71.0434L86.0454 1.95677C86.7899 1.34302 87.8665 1.34837 88.6049 1.96948L170.739 71.0561C172.167 72.2573 171.318 74.5866 169.452 74.5866H146.543C145.438 74.5866 144.543 75.4821 144.543 76.5866V131.897C144.543 133.002 143.647 133.897 142.543 133.897H30.3305C29.2259 133.897 28.3305 133.002 28.3305 131.897Z\"\/>\n      <\/svg>\n      <span class=\"legend-label\">Sprzedany<\/span>\n    <\/div>\n\n    <div class=\"legend-item next\">\n      <svg class=\"dot next\" viewBox=\"0 0 173 136\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" focusable=\"false\" aria-hidden=\"true\">\n        <path d=\"M28.3305 131.897V76.5866C28.3305 75.4821 27.435 74.5866 26.3305 74.5866H3.50707C1.63116 74.5866 0.78742 72.2366 2.23493 71.0434L86.0454 1.95677C86.7899 1.34302 87.8665 1.34837 88.6049 1.96948L170.739 71.0561C172.167 72.2573 171.318 74.5866 169.452 74.5866H146.543C145.438 74.5866 144.543 75.4821 144.543 76.5866V131.897C144.543 133.002 143.647 133.897 142.543 133.897H30.3305C29.2259 133.897 28.3305 133.002 28.3305 131.897Z\"\/>\n      <\/svg>\n      <span class=\"legend-label\">Nast\u0119pny etap<\/span>\n    <\/div>\n  <\/div>\n\n  <div class=\"viewer\" id=\"viewer\" aria-hidden=\"false\" tabindex=\"0\">\n    <div class=\"big-loader\" id=\"bigLoader\">\n      <div class=\"big-loader-text\">\u0142adowanie...<\/div>\n    <\/div>\n\n    <label class=\"switch switch-overlay\" for=\"toggleSwitch\">\n      <span class=\"label\">poka\u017c dost\u0119pno\u015b\u0107 lokali<\/span>\n      <input id=\"toggleSwitch\" type=\"checkbox\" checked aria-checked=\"true\" \/>\n    <\/label>\n\n    <div class=\"content\" id=\"content\">\n      <img decoding=\"async\" class=\"layer\" id=\"current\" src=\"\" draggable=\"false\" alt=\"\">\n    <\/div>\n\n    <div class=\"tooltip hidden\" id=\"tooltip\"><\/div>\n  <\/div>\n\n  <div class=\"status-wrap\" role=\"navigation\" aria-label=\"Image navigation\">\n    <button style=\"  background:rgba(0,0,0,0.4);\n  color:#fff;\n  border-radius:8px;\n  padding:10px 18px;\n  font-size:15px;\n  border:none;\n  cursor:pointer;\n  min-width:58px;\n  min-height:38px;\n  display:inline-flex;\n  align-items:center;\n  justify-content:center;\n  box-shadow:0 6px 18px rgba(0,0,0,0.08);\n  user-select:none;\n  flex:0 0 auto;\"class=\"nav-button\" id=\"prevBtn\" aria-label=\"Poprzedni obraz\" title=\"Poprzedni\">\n      <span class=\"vis\" aria-hidden=\"true\">\u2039<\/span>\n    <\/button>\n\n    <div class=\"status\" id=\"status\">loading\u2026<\/div>\n\n    <button style=\"  background:rgba(0,0,0,0.4);\n  color:#fff;\n  border-radius:8px;\n  padding:10px 18px;\n  font-size:15px;\n  border:none;\n  cursor:pointer;\n  min-width:58px;\n  min-height:38px;\n  display:inline-flex;\n  align-items:center;\n  justify-content:center;\n  box-shadow:0 6px 18px rgba(0,0,0,0.08);\n  user-select:none;\n  flex:0 0 auto;\"class=\"nav-button\" id=\"nextBtn\" aria-label=\"Nast\u0119pny obraz\" title=\"Nast\u0119pny\">\n      <span class=\"vis\" aria-hidden=\"true\">\u203a<\/span>\n    <\/button>\n  <\/div>\n<\/div>\n\n\t\t<script>\n\t\t\twindow.domkiData = [{\"id\":\"1\",\"name\":\"1A\",\"cena\":\"0.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"750.00\",\"plot_area_m2\":\"911.00\",\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"2\",\"name\":\"1B\",\"cena\":\"999000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"164.00\",\"plot_area_m2\":\"325.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"3\",\"name\":\"2A\",\"cena\":\"999500.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"237.00\",\"plot_area_m2\":\"398.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"4\",\"name\":\"2B\",\"cena\":\"1015000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"334.00\",\"plot_area_m2\":\"495.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"5\",\"name\":\"3A\",\"cena\":\"999000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"164.00\",\"plot_area_m2\":\"325.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"6\",\"name\":\"3B\",\"cena\":\"999000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"164.00\",\"plot_area_m2\":\"325.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"7\",\"name\":\"4A\",\"cena\":\"980000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"8\",\"name\":\"4B\",\"cena\":\"980000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"9\",\"name\":\"5A\",\"cena\":\"999000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"164.00\",\"plot_area_m2\":\"325.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"10\",\"name\":\"5B\",\"cena\":\"999000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"163.00\",\"plot_area_m2\":\"324.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"11\",\"name\":\"6A\",\"cena\":\"980000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"12\",\"name\":\"6B\",\"cena\":\"980000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"13\",\"name\":\"7A\",\"cena\":\"999000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"163.00\",\"plot_area_m2\":\"324.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"14\",\"name\":\"7B\",\"cena\":\"999000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"162.00\",\"plot_area_m2\":\"323.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"15\",\"name\":\"8A\",\"cena\":\"980000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"16\",\"name\":\"8B\",\"cena\":\"980000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"17\",\"name\":\"9A\",\"cena\":\"999000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"162.00\",\"plot_area_m2\":\"323.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"18\",\"name\":\"9B\",\"cena\":\"999000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"162.00\",\"plot_area_m2\":\"323.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"19\",\"name\":\"10A\",\"cena\":\"980000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"20\",\"name\":\"10B\",\"cena\":\"980000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"21\",\"name\":\"11A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"161.00\",\"plot_area_m2\":\"322.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"22\",\"name\":\"11B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"161.00\",\"plot_area_m2\":\"322.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"23\",\"name\":\"12A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"24\",\"name\":\"12B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"25\",\"name\":\"13A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"161.00\",\"plot_area_m2\":\"322.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"26\",\"name\":\"13B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"160.00\",\"plot_area_m2\":\"321.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"27\",\"name\":\"14A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"28\",\"name\":\"14B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"29\",\"name\":\"15A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"160.00\",\"plot_area_m2\":\"321.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"30\",\"name\":\"15B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"159.00\",\"plot_area_m2\":\"320.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"31\",\"name\":\"16A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"32\",\"name\":\"16B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"33\",\"name\":\"17A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"159.00\",\"plot_area_m2\":\"320.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"34\",\"name\":\"17B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"159.00\",\"plot_area_m2\":\"320.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"35\",\"name\":\"18A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"36\",\"name\":\"18B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"37\",\"name\":\"19A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"158.00\",\"plot_area_m2\":\"319.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"38\",\"name\":\"19B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"142.00\",\"plot_area_m2\":\"303.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"39\",\"name\":\"20A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"103.00\",\"plot_area_m2\":\"264.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"40\",\"name\":\"20B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"41\",\"name\":\"21A\",\"cena\":\"969700.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"42\",\"name\":\"21B\",\"cena\":\"871100.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"43\",\"name\":\"22A\",\"cena\":\"446500.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"44\",\"name\":\"22B\",\"cena\":\"319300.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"45\",\"name\":\"23A\",\"cena\":\"956900.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"46\",\"name\":\"23B\",\"cena\":\"276700.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"47\",\"name\":\"24A\",\"cena\":\"912700.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"48\",\"name\":\"24B\",\"cena\":\"183500.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"49\",\"name\":\"25A\",\"cena\":\"579400.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"50\",\"name\":\"25B\",\"cena\":\"496500.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"51\",\"name\":\"26A\",\"cena\":\"594400.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"52\",\"name\":\"26B\",\"cena\":\"482600.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"53\",\"name\":\"27A\",\"cena\":\"479800.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"54\",\"name\":\"27B\",\"cena\":\"198765.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"4.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"55\",\"name\":\"28A\",\"cena\":\"716200.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"56\",\"name\":\"28B\",\"cena\":\"178000.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"57\",\"name\":\"29A\",\"cena\":\"291100.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"58\",\"name\":\"29B\",\"cena\":\"771700.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"59\",\"name\":\"30A\",\"cena\":\"285200.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"60\",\"name\":\"30B\",\"cena\":\"660800.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"61\",\"name\":\"31A\",\"cena\":\"598700.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"62\",\"name\":\"31B\",\"cena\":\"861000.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"63\",\"name\":\"32A\",\"cena\":\"659000.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"64\",\"name\":\"32B\",\"cena\":\"562000.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"}];\n\t\t\twindow.domkiLabels = {\"plotArea\":\"Powierzchnia dzia\\u0142ki\",\"gardenArea\":\"Powierzchnia ogr\\u00f3dka\"};\n\t\t\twindow.historyData = [{\"id\":\"41\",\"id_dom\":\"1\",\"new_price\":\"92345641.00\",\"change_date\":\"2027-03-04\"},{\"id\":\"82\",\"id_dom\":\"1\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"83\",\"id_dom\":\"2\",\"new_price\":\"999000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"84\",\"id_dom\":\"5\",\"new_price\":\"999000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"85\",\"id_dom\":\"6\",\"new_price\":\"999000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"86\",\"id_dom\":\"9\",\"new_price\":\"999000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"87\",\"id_dom\":\"10\",\"new_price\":\"999000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"88\",\"id_dom\":\"13\",\"new_price\":\"999000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"89\",\"id_dom\":\"14\",\"new_price\":\"999000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"90\",\"id_dom\":\"17\",\"new_price\":\"999000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"91\",\"id_dom\":\"18\",\"new_price\":\"999000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"93\",\"id_dom\":\"4\",\"new_price\":\"1015000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"94\",\"id_dom\":\"7\",\"new_price\":\"980000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"95\",\"id_dom\":\"8\",\"new_price\":\"980000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"96\",\"id_dom\":\"11\",\"new_price\":\"980000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"97\",\"id_dom\":\"12\",\"new_price\":\"980000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"98\",\"id_dom\":\"15\",\"new_price\":\"980000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"99\",\"id_dom\":\"16\",\"new_price\":\"980000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"100\",\"id_dom\":\"19\",\"new_price\":\"980000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"101\",\"id_dom\":\"20\",\"new_price\":\"980000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"102\",\"id_dom\":\"21\",\"new_price\":null,\"change_date\":\"2026-10-02\"},{\"id\":\"103\",\"id_dom\":\"22\",\"new_price\":null,\"change_date\":\"2026-10-02\"},{\"id\":\"104\",\"id_dom\":\"25\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"105\",\"id_dom\":\"26\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"106\",\"id_dom\":\"29\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"107\",\"id_dom\":\"30\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"108\",\"id_dom\":\"33\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"109\",\"id_dom\":\"34\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"110\",\"id_dom\":\"37\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"111\",\"id_dom\":\"38\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"112\",\"id_dom\":\"23\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"113\",\"id_dom\":\"24\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"114\",\"id_dom\":\"27\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"115\",\"id_dom\":\"28\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"116\",\"id_dom\":\"31\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"117\",\"id_dom\":\"32\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"118\",\"id_dom\":\"35\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"119\",\"id_dom\":\"36\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"120\",\"id_dom\":\"39\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"121\",\"id_dom\":\"40\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"122\",\"id_dom\":\"21\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"123\",\"id_dom\":\"22\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"124\",\"id_dom\":\"3\",\"new_price\":\"999500.00\",\"change_date\":\"2026-10-05\"}];\n\t\t<\/script>\n\t\n\n<script>\nif (window._orbitaViewerInit) {\n} else {\n  window._orbitaViewerInit = true;\n\n  const totalImages = 14;\n  let currentIndex = 0;\n\n  const viewer = document.getElementById('viewer');\n  const content = document.getElementById('content');\n  const img = document.getElementById('current');\n  const status = document.getElementById('status');\n\n  const prevBtn = document.getElementById('prevBtn');\n  const nextBtn = document.getElementById('nextBtn');\n  const statusWrap = document.querySelector('.status-wrap');\n  const bigLoader = document.getElementById('bigLoader');\n\n  const toggleSwitch = document.getElementById('toggleSwitch');\n  const legendRow = document.querySelector('.legend-row');\n  let svgVisible = true;\n  const switchOverlay = document.querySelector('.switch-overlay');\n\n  function setNavigationVisibility(visible) {\n    if (!statusWrap) return;\n    statusWrap.classList.toggle('hidden', !visible);\n  }\n\n  switchOverlay.addEventListener('pointerdown', e => {\n    e.stopPropagation();\n  });\n  switchOverlay.addEventListener('mousedown', e => {\n    e.stopPropagation();\n  });\n  switchOverlay.addEventListener('touchstart', e => {\n    e.stopPropagation();\n  });\n\n  toggleSwitch.addEventListener('change', () => {\n    svgVisible = toggleSwitch.checked;\n    const svgs = content.querySelectorAll('svg');\n    svgs.forEach(s => s.style.display = svgVisible ? 'block' : 'none');\n    if (legendRow) legendRow.style.display = svgVisible ? 'flex' : 'none';\n  });\n\n  function formatStatePL(state) {\n    if (!state) return '';\n    const map = {\n      'Dostepny': 'dost\u0119pny',\n      'Zarezerwowany': 'zarezerwowany',\n      'Sprzedany': 'sprzedany',\n      'Nastepny etap': 'nast\u0119pny etap'\n    };\n    return map[state] || state.toLowerCase();\n  }\n\n  function parsePrice(raw) {\n    if (raw == null) return '';\n    const cleaned = String(raw).replace(\/\\s+\/g, '').replace(\/,\/g, '.').replace(\/[^\\d.]\/g, '');\n    const n = Number(cleaned);\n    if (!isFinite(n)) return String(raw);\n    return new Intl.NumberFormat('pl-PL').format(n) + ' z\u0142';\n  }\n\n  const domkiByName = (() => {\n    if (!Array.isArray(window.domkiData)) return {};\n    const map = {};\n    window.domkiData.forEach(d => {\n      if (d.name) map[String(d.name)] = d;\n      if (d.id) map['id:' + String(d.id)] = d;\n    });\n    return map;\n  })();\n\n  function stateColor(state) {\n    if (state === 'Dostepny') return { fill: '#B4FF00', stroke: '#B2C486', opacity: 0.7 };\n    if (state === 'Zarezerwowany') return { fill: '#A09165', stroke: '#8b7841', opacity: 0.85 };\n    if (state === 'Sprzedany') return { fill: '#6E665E', stroke: '#3d3b3a', opacity: 0.85 };\n    if (state === 'Nastepny etap') return { fill: '#B8B1A8', stroke: '#B8B1A8', opacity: 0.9 };\n    return { fill: '#B4FF00', stroke: '#B4FF00', opacity: 1 };\n  }\n\n  function applyLegendColors() {\n    const map = {\n      'available': 'Dostepny',\n      'reserved': 'Zarezerwowany',\n      'sold': 'Sprzedany',\n      'next': 'Nastepny etap'\n    };\n    Object.keys(map).forEach(cls => {\n      const svg = document.querySelector('svg.dot.' + cls);\n      if (!svg) return;\n      const p = svg.querySelector('path');\n      if (!p) return;\n      const color = stateColor(map[cls]);\n      p.setAttribute('fill', color.fill);\n      p.setAttribute('stroke', color.stroke);\n      p.setAttribute('fill-opacity', color.opacity);\n      p.style.opacity = color.opacity;\n      p.setAttribute('stroke-width', '3');\n    });\n  }\n\n  let isReady = false;\n  const svgCache = new Array(totalImages).fill(null);\n  const imageCache = new Array(totalImages).fill(null);\n\n  function escapeHtml(str) {\n    return String(str === undefined || str === null ? '' : str)\n      .replace(\/&\/g, '&amp;')\n      .replace(\/<\/g, '&lt;')\n      .replace(\/>\/g, '&gt;')\n      .replace(\/\"\/g, '&quot;')\n      .replace(\/'\/g, '&#39;');\n  }\n\n  function fmtArea(val) {\n    if (val == null || val === '') return '';\n    const n = Number(String(val).replace(\/,\/g, '.'));\n    if (!isFinite(n)) return escapeHtml(String(val)) + ' m\u00b2';\n    return new Intl.NumberFormat('pl-PL').format(n) + ' m\u00b2';\n  }\n\n  function getHouseKey(group) {\n    if (!group) return '';\n    const dataId = group.getAttribute('data-id');\n    if (dataId) return 'id:' + dataId;\n    const name = (group._domki && group._domki.name) || group.getAttribute('data-name') || group.id;\n    return String(name || '');\n  }\n\n  function applyDomkiDataToSVG(svg) {\n    const groups = svg.querySelectorAll('g');\n    groups.forEach(group => {\n      const name = group.id || group.getAttribute('data-name') || '';\n      const data = domkiByName[name] || domkiByName['id:' + group.getAttribute('data-id')] || null;\n      group._domki = data ? Object.assign({}, data, { name }) : { name, stan: 'Dostepny', cena: data?.cena };\n\n      try {\n        group.dataset.houseKey = getHouseKey(group);\n      } catch (e) {}\n\n      const state = group._domki.stan || 'Dostepny';\n      const shapes = group.querySelectorAll('path');\n      const color = stateColor(state);\n\n      shapes.forEach(p => {\n        p.removeAttribute('fill-opacity');\n        p.removeAttribute('stroke-opacity');\n        p.removeAttribute('opacity');\n\n        p.style.fill = color.fill;\n        p.style.stroke = color.stroke;\n        p.style.fillOpacity = String(color.opacity ?? 1);\n        p.style.strokeOpacity = String(color.opacity ?? 1);\n        p.style.opacity = String(color.opacity ?? 1);\n        p.style.transition = 'fill .25s ease, opacity .25s ease, stroke .25s ease';\n      });\n\n      group.style.pointerEvents = 'auto';\n      group.style.cursor = 'pointer';\n\n      if (!group._clickAttached) {\n        group._clickAttached = true;\n        group.addEventListener('click', onGroupClick);\n      }\n    });\n  }\n\n  const PULSE_HOVER = { fill: '#F9F0D7', stroke: '#E2D1BE', opacity: '0.8' };\n\n  function stopPulse(group) {\n    if (!group) return;\n    group.classList.remove('pulsing');\n    group.classList.remove('reserved');\n\n    const paths = Array.from(group.querySelectorAll('path'));\n    if (group._origStyles && Array.isArray(group._origStyles) && group._origStyles.length === paths.length) {\n      paths.forEach((p, i) => {\n        const s = group._origStyles[i];\n        p.style.fill = s.fill;\n        p.style.stroke = s.stroke;\n        p.style.opacity = s.opacity;\n        p.style.transition = 'fill .25s ease, opacity .25s ease, stroke .25s ease';\n        p.style.animation = '';\n      });\n    } else {\n      const state = group._domki?.stan || 'Dostepny';\n      const color = stateColor(state);\n      paths.forEach(p => {\n        p.style.fill = color.fill;\n        p.style.stroke = color.stroke;\n        p.style.opacity = color.opacity;\n        p.style.transition = 'fill .25s ease, opacity .25s ease, stroke .25s ease';\n        p.style.animation = '';\n      });\n    }\n\n    delete group._origStyles;\n    if (viewer._pulsingGroup === group) viewer._pulsingGroup = null;\n  }\n\n  function startPulse(group) {\n    if (!group) return;\n    const state = group._domki?.stan || 'Dostepny';\n    if (!(state === 'Dostepny' || state === 'Zarezerwowany')) return;\n\n    if (viewer._pulsingGroup === group) return;\n    if (viewer._pulsingGroup) stopPulse(viewer._pulsingGroup);\n\n    try {\n      viewer._focusedHouseKey = group.dataset.houseKey || getHouseKey(group);\n    } catch (e) {}\n\n    const paths = Array.from(group.querySelectorAll('path'));\n    group._origStyles = paths.map(p => ({\n      fill: p.style.fill,\n      stroke: p.style.stroke,\n      opacity: p.style.opacity\n    }));\n\n    if (state === 'Zarezerwowany') {\n      group.classList.add('reserved');\n    } else {\n      group.classList.remove('reserved');\n    }\n\n    paths.forEach(p => {\n      p.style.fill = PULSE_HOVER.fill;\n      p.style.stroke = PULSE_HOVER.stroke;\n      p.style.opacity = PULSE_HOVER.opacity;\n      p.style.transition = 'none';\n      p.style.animation = '';\n      void p.offsetWidth;\n    });\n\n    group.classList.add('pulsing');\n    viewer._pulsingGroup = group;\n  }\n\n  function computeZoomForGroup(group) {\n    try {\n      const rectGroup = group.getBoundingClientRect();\n      const rectViewer = viewer.getBoundingClientRect();\n      if (rectGroup.width <= 0 || rectGroup.height <= 0) return null;\n\n      const desiredScale = Math.max(\n        minScale,\n        Math.min(maxScale, Math.min(rectViewer.width \/ rectGroup.width, rectViewer.height \/ rectGroup.height) * 0.9)\n      );\n\n      const cx = rectGroup.left + rectGroup.width \/ 2;\n      const cy = rectGroup.top + rectGroup.height \/ 2;\n      const vx = cx - rectViewer.left;\n      const vy = cy - rectViewer.top;\n      const contentX = (vx - translate.x) \/ scale;\n      const contentY = (vy - translate.y) \/ scale;\n\n      const newScale = desiredScale;\n      const newX = rectViewer.width \/ 2 - contentX * newScale;\n      const newY = rectViewer.height * 0.42 - contentY * newScale;\n\n      return { newScale, newX, newY };\n    } catch (e) {\n      return null;\n    }\n  }\n\n  function applyTransformImmediate(newScale, newX, newY) {\n    const prevTransition = content.style.transition;\n    content.style.transition = 'none';\n    scale = newScale;\n    translate.x = newX;\n    translate.y = newY;\n    content.style.transform = `translate(${translate.x}px,${translate.y}px) scale(${scale})`;\n    void content.offsetWidth;\n    requestAnimationFrame(() => {\n      content.style.transition = prevTransition || '';\n    });\n  }\n\n  function zoomToGroup(group) {\n    try {\n      const rectGroup = group.getBoundingClientRect();\n      const rectViewer = viewer.getBoundingClientRect();\n      if (rectGroup.width <= 0 || rectGroup.height <= 0) return;\n\n      const desiredScale = Math.max(\n        minScale,\n        Math.min(maxScale, Math.min(rectViewer.width \/ rectGroup.width, rectViewer.height \/ rectGroup.height) * 0.9)\n      );\n\n      const cx = rectGroup.left + rectGroup.width \/ 2;\n      const cy = rectGroup.top + rectGroup.height \/ 2;\n      const vx = cx - rectViewer.left;\n      const vy = cy - rectViewer.top;\n      const contentX = (vx - translate.x) \/ scale;\n      const contentY = (vy - translate.y) \/ scale;\n\n      const newScale = desiredScale;\n      const newX = rectViewer.width \/ 2 - contentX * newScale;\n      const newY = rectViewer.height * 0.42 - contentY * newScale;\n\n      scale = newScale;\n      translate.x = newX;\n      translate.y = newY;\n      requestAnimationFrame(() => content.style.transform = `translate(${translate.x}px,${translate.y}px) scale(${scale})`);\n    } catch (e) {}\n  }\n\n  function removeAskOverlayIfOpen(panel) {\n    if (!panel) return;\n    if (typeof panel._cleanupAskOverlay === 'function') {\n      panel._cleanupAskOverlay();\n    }\n  }\n\n  function onGroupClick(e) {\n    e.stopPropagation();\n    e.preventDefault();\n\n    const group = e.currentTarget;\n    const data = group._domki || {};\n    if (data.stan === \"Sprzedany\" || data.stan === \"Nastepny etap\") return;\n\n    const existingPanel = document.querySelector('.house-panel');\n    removeAskOverlayIfOpen(existingPanel);\n\n    startPulse(group);\n\n    try {\n      viewer._focusedHouseKey = group.dataset.houseKey || getHouseKey(group);\n    } catch (e) {}\n\n    const name = (data && (data.name || data.id)) || group.id || 'miejsce';\n\n    if (viewer._openTimeout) {\n      clearTimeout(viewer._openTimeout);\n      viewer._openTimeout = null;\n    }\n\n    zoomToGroup(group);\n\n    const panelExistsAndOpen = document.querySelector('.house-panel')?.classList.contains('open');\n    viewer._openTimeout = setTimeout(() => {\n      openHousePanel(String(name), data);\n      viewer._openGroup = group;\n      viewer._openTimeout = null;\n    }, panelExistsAndOpen ? 80 : 120);\n  }\n\n  let scale = 1;\n  let minScale = 1;\n  let maxScale = 3.9;\n  let translate = { x: 0, y: 0 };\n\n  function clampPan() {\n    const rect = viewer.getBoundingClientRect();\n    const scaledW = rect.width * scale;\n    const scaledH = rect.height * scale;\n    const minX = Math.min(0, rect.width - scaledW);\n    const minY = Math.min(0, rect.height - scaledH);\n    translate.x = Math.max(minX, Math.min(0, translate.x));\n    translate.y = Math.max(minY, Math.min(0, translate.y));\n  }\n\n  function applyTransform() {\n    clampPan();\n    content.style.transform = `translate(${translate.x}px,${translate.y}px) scale(${scale})`;\n  }\n\n  async function preloadSVGsAndImages() {\n    const promises = [];\n    for (let i = 0; i < totalImages; i++) {\n      const idx = i + 1;\n\n      promises.push((async () => {\n        try {\n          const res = await fetch(`https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-content\/uploads\/2026\/03\/etap1_orbita_${idx}_obrys.svg`);\n          if (!res.ok) throw new Error();\n          const text = await res.text();\n          const doc = new DOMParser().parseFromString(text, \"image\/svg+xml\");\n          const svg = doc.querySelector('svg');\n          if (svg) {\n            svg.style.width = '100%';\n            svg.style.height = '100%';\n            svg.style.position = 'absolute';\n            svg.style.top = '0';\n            svg.style.left = '0';\n            svg._sourceIndex = i;\n            svgCache[i] = svg;\n            svg.style.display = 'block';\n          }\n        } catch (e) {\n          svgCache[i] = null;\n        }\n      })());\n\n      promises.push((async () => {\n        const imgUrl = `https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-content\/uploads\/2026\/03\/etap1_orbita_${idx}_tlo.png`;\n        const test = new Image();\n        const p = new Promise(resolve => {\n          test.onload = () => resolve({ ok: true });\n          test.onerror = () => resolve({ ok: false });\n        });\n        test.src = imgUrl;\n        imageCache[i] = test;\n        return p;\n      })());\n    }\n\n    await Promise.all(promises);\n    isReady = true;\n    status.textContent = '';\n    if (bigLoader) {\n      bigLoader.style.display = 'none';\n    }\n  }\n\n  let imageSeq = 0;\n\n  async function updateImage() {\n    if (!isReady) return;\n    const token = ++imageSeq;\n    const nextIndex = currentIndex;\n\n    let nextImg = content._nextImg;\n    if (!nextImg) {\n      nextImg = document.createElement('img');\n      nextImg.className = 'layer next';\n      nextImg.draggable = false;\n      nextImg.alt = '';\n      Object.assign(nextImg.style, {\n        position: 'absolute',\n        top: '0',\n        left: '0',\n        width: '100%',\n        height: '100%',\n        objectFit: 'contain',\n        pointerEvents: 'none',\n        opacity: '1',\n        transition: 'none'\n      });\n      content._nextImg = nextImg;\n    } else {\n      nextImg.style.transition = 'none';\n      nextImg.style.opacity = '1';\n    }\n\n    const cached = imageCache[nextIndex];\n    const nextSrc = (cached && cached.src)\n      ? cached.src\n      : `https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-content\/uploads\/2026\/03\/orbita_${nextIndex + 1}_tlo.png`;\n\n    nextImg.src = nextSrc;\n\n    try {\n      if (nextImg.decode) {\n        await nextImg.decode();\n      } else {\n        await new Promise(res => {\n          const done = () => {\n            nextImg.onload = null;\n            nextImg.onerror = null;\n            res();\n          };\n          nextImg.onload = done;\n          nextImg.onerror = done;\n        });\n      }\n    } catch (e) {}\n\n    if (token !== imageSeq) return;\n\n    content.style.backgroundImage = `url(\"${nextSrc}\")`;\n\n    if (!nextImg.parentNode) content.appendChild(nextImg);\n\n    nextImg.style.zIndex = '20';\n    nextImg.style.opacity = '1';\n    nextImg.id = 'current';\n    nextImg.classList.remove('next');\n\n    const prevImg = content.querySelector('#current');\n    if (prevImg && prevImg !== nextImg) {\n      try {\n        if (prevImg.parentNode) prevImg.parentNode.removeChild(prevImg);\n      } catch (e) {}\n    }\n\n    try {\n      nextImg.style.zIndex = '';\n    } catch (e) {}\n\n    const previousSvgs = Array.from(content.querySelectorAll('svg'));\n    const sourceSvg = svgCache[nextIndex];\n\n    if (viewer._pulsingGroup) {\n      try { stopPulse(viewer._pulsingGroup); } catch (e) {}\n    }\n\n    if (sourceSvg) {\n      previousSvgs.forEach(sv => {\n        try { if (sv.parentNode) sv.parentNode.removeChild(sv); } catch (e) {}\n      });\n\n      const clone = sourceSvg.cloneNode(true);\n      Object.assign(clone.style, {\n        position: 'absolute',\n        top: '0',\n        left: '0',\n        width: '100%',\n        height: '100%',\n        pointerEvents: 'auto',\n        opacity: '1',\n        transition: 'none',\n        zIndex: '30',\n        display: svgVisible ? 'block' : 'none',\n        visibility: 'visible'\n      });\n\n      content.appendChild(clone);\n      applyDomkiDataToSVG(clone);\n\n      if (viewer._focusedHouseKey) {\n        (async () => {\n          const found = findGroupByKey(clone, viewer._focusedHouseKey);\n          if (found) {\n            const computed = computeZoomForGroup(found);\n            if (computed) {\n              try { applyTransformImmediate(computed.newScale, computed.newX, computed.newY); } catch (e) {}\n            }\n            try { startPulse(found); } catch (e) {}\n            viewer._openGroup = found;\n          }\n        })();\n      }\n    } else {\n      previousSvgs.forEach(sv => {\n        try { if (sv.parentNode) sv.parentNode.removeChild(sv); } catch (e) {}\n      });\n    }\n\n    status.textContent = `${nextIndex + 1} \/ ${totalImages}`;\n  }\n\n  function findGroupByKey(root, key) {\n    if (!root || !key) return null;\n    const groups = root.querySelectorAll('g');\n    for (const g of groups) {\n      if (g.dataset && g.dataset.houseKey === key) return g;\n      try {\n        if (getHouseKey && getHouseKey(g) === key) return g;\n      } catch (e) {}\n    }\n    return null;\n  }\n\n  function openHousePanel(name, data) {\n    if (data && (data.stan === \"Sprzedany\" || data.stan === \"Nastepny etap\")) return;\n\n    let panel = document.querySelector('.house-panel');\n    const legend = document.querySelector('.legend-row');\n\n    setNavigationVisibility(false);\n    if (legend) legend.style.display = 'none';\n\n    if (!panel) {\n      panel = document.createElement('div');\n      panel.className = 'house-panel';\n      panel.setAttribute('role', 'dialog');\n      panel.setAttribute('aria-hidden', 'true');\n\n      panel.style.background = '#FFFCF8';\n      panel.style.fontSize = '15px';\n      panel.style.zIndex = '5000';\n\n      panel.addEventListener('wheel', e => { e.stopPropagation(); }, { passive: true });\n      panel.addEventListener('touchmove', e => { e.stopPropagation(); }, { passive: true });\n\n      panel.innerHTML = `\n        <button class=\"close\" aria-label=\"close\" style=\"position:absolute;left:12px;top:12px;border:none;background:transparent;color:#000;font-weight:800;font-size:36px;cursor:pointer;padding:2px 6px;width:auto;height:auto;border-radius:0;box-shadow:none;z-index:300;line-height:1;\">&times;<\/button>\n\n        <div class=\"inner\" style=\"padding-top:8px;padding-left:8px;padding-right:8px;position:relative;\">\n          <h1 style=\"margin:32px 0 10px 0;text-align:center;\"><\/h1>\n          <div class=\"meta\" style=\"font-size:14px;color:#6E665E;margin-top:8px\"><\/div>\n\n          <div class=\"panel-image-row\" style=\"margin-top:14px;gap:8px;width:100%;\">\n            <div id=\"panel-image-toggle-left\"\n                 role=\"button\"\n                 aria-label=\"toggle image\"\n                 style=\"cursor:pointer;display:flex;align-items:center;justify-content:center;flex:0 0 36px;font-size:26px;font-weight:700;color:#6E665E;padding:0;user-select:none;\">\n              &lt;\n            <\/div>\n\n            <div class=\"panel-image\" style=\"display:block;\">\n              <img decoding=\"async\" id=\"panel-image-image\"\n                   src=\"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-content\/uploads\/2026\/03\/B_parter_miniaturka.png\"\n                   alt=\"House Image\"\n                   style=\"height:auto;display:block;\" \/>\n            <\/div>\n\n            <div id=\"panel-image-toggle-right\"\n                 role=\"button\"\n                 aria-label=\"toggle image\"\n                 style=\"cursor:pointer;display:flex;align-items:center;justify-content:center;flex:0 0 36px;font-size:26px;font-weight:700;color:#6E665E;padding:0;user-select:none;\">\n              &gt;\n            <\/div>\n\n            <div class=\"panel-image-extra\" style=\"display:flex;flex-direction:column;align-items:stretch;gap:8px;margin-top:-25px\">\n              <p id=\"panel-image-description\"\n                 style=\"font-size:14px;color:#6E665E;margin:6px 0 0 0;text-align:left;font-weight:600;align-self:flex-start;\">\n                Parter\n              <\/p>\n\n              <a id=\"panel-open-plan\"\n                 class=\"panel-open-plan-btn\"\n                 href=\"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/rzut\/\"\n                 target=\"_blank\"\n                 rel=\"noopener noreferrer\"\n                 aria-label=\"zobacz rzut\"\n                 style=\"text-decoration:none;display:inline-flex;align-items:center;justify-content:center;\">\n                zobacz szczeg\u00f3\u0142owy rzut\n              <\/a>\n              <button id=\"panel-ask-local\"\n                  class=\"panel-open-plan-btn\"\n                  type=\"button\"\n                  aria-label=\"zapytaj o lokal\">\n            zapytaj o lokal\n          <\/button>\n            <\/div>\n          <\/div>\n        <\/div>\n      `;\n\n      viewer.insertAdjacentElement('afterend', panel);\n\n      panel.addEventListener('click', e => e.stopPropagation());\n\n      const closeBtn = panel.querySelector('.close');\n      closeBtn.addEventListener('click', e => {\n        e.preventDefault();\n        e.stopPropagation();\n        closeHousePanel();\n      });\n\n      panel.addEventListener('pointerdown', e => {\n        e.stopPropagation();\n      });\n\n      try {\n        const askBtn = panel.querySelector('#panel-ask-local');\n        if (askBtn) {\n          askBtn.addEventListener('click', function(ev) {\n            ev.stopPropagation();\n            ev.preventDefault();\n\n            askBtn.style.visibility = 'hidden';\n\n            const unitName = (panel.querySelector('h1') && panel.querySelector('h1').textContent)\n              ? panel.querySelector('h1').textContent.trim()\n              : 'putlokalnumberhere';\n\n            if (panel.querySelector('.ask-overlay')) {\n              const existing = panel.querySelector('.ask-overlay');\n              existing.style.display = 'block';\n              return;\n            }\n\n            const overlay = document.createElement('div');\n            overlay.className = 'ask-overlay';\n            overlay.setAttribute('role', 'dialog');\n            overlay.setAttribute('aria-modal', 'true');\n\n            if (getComputedStyle(panel).position === 'static') {\n              panel.style.position = 'relative';\n            }\n\n            overlay.style.position = 'absolute';\n            overlay.style.top = '0';\n            overlay.style.left = '0';\n            overlay.style.right = '0';\n            overlay.style.bottom = '0';\n            overlay.style.width = '100%';\n            overlay.style.height = '100%';\n            overlay.style.boxSizing = 'border-box';\n            overlay.style.padding = '20px';\n            overlay.style.overflow = 'auto';\n            overlay.style.background = '#FFFCF8';\n            overlay.style.zIndex = '9999';\n            overlay.style.overflowY = 'none';\n            overlay.style.display = 'flex';\n            overlay.style.alignItems = 'flex-start';\n            overlay.style.justifyContent = 'center';\n            overlay.style.webkitOverflowScrolling = 'touch';\n            overlay.style.border = '1px solid rgba(0,0,0,0.04)';\n\n            const innerWrap = document.createElement('div');\n            innerWrap.style.width = '100%';\n            innerWrap.style.maxWidth = '520px';\n            innerWrap.style.marginTop = '6px';\n            innerWrap.style.paddingBottom = '60px';\n            innerWrap.style.boxSizing = 'border-box';\n            innerWrap.style.maxHeight = 'calc(100% - 24px)';\n            innerWrap.style.overflowY = 'none';\n            innerWrap.style.background = 'transparent';\n\n            const innerHtml = `\n              <button class=\"ask-close\" aria-label=\"close\" style=\"position:absolute;left:12px;top:12px;border:none;background:transparent;color:#000;font-weight:800;font-size:36px;cursor:pointer;padding:2px 6px;z-index:10000;line-height:1;\">&times;<\/button>\n\n              <div style=\"width:100%;max-width:520px;margin-top:6px;padding-bottom:60px;\">\n                <h2 style=\"margin:6px 0 12px 32px;font-size:16px;font-weight:800;color:#111\">Zapytaj o lokal: ${escapeHtml(unitName)}<\/h2>\n                <p style=\"color:#6E665E;margin:0 0 14px 0;font-size:13px\">\n                  <strong style=\"display:block;color:#111;font-size:14px;margin-bottom:6px\">\n                    Email:\n                    <a href=\"mailto:skandynawskie@klepper.com.pl\" style=\"color:#636C4D;text-decoration:none;border-bottom:1px solid #636C4D;\">skandynawskie@klepper.com.pl<\/a><br>\n                    Nr. tel:\n                    <a href=\"tel:+48606832063\" style=\"color:#636C4D;text-decoration:none;border-bottom:1px solid #636C4D;\">48 606 832 063<\/a>\n                  <\/strong>\n                  Lub wype\u0142nij poni\u017cszy formularz - skontaktujemy si\u0119 z Tob\u0105 w sprawie wybranego lokalu.\n                <\/p>\n\n                <form id=\"ask-form\"\n                      method=\"post\"\n                      action=\"<?php echo esc_url( admin_url('admin-post.php') ); ?>\"\n                      style=\"display:flex;flex-direction:column;gap:8px;margin-top:8px;font-size:13px;\">\n\n                  <input name=\"imie\" required placeholder=\"Imi\u0119\"\n                         style=\"background:#E2D1BE80;padding:8px;border-radius:6px;border:1px solid rgba(0,0,0,0.12);font-size:13px;outline:none;\" \/>\n\n                  <input name=\"nazwisko\" required placeholder=\"Nazwisko\"\n                         style=\"background:#E2D1BE80;padding:8px;border-radius:6px;border:1px solid rgba(0,0,0,0.12);font-size:13px;outline:none;\" \/>\n\n                  <input name=\"email\" type=\"email\" required placeholder=\"Email\"\n                         style=\"background:#E2D1BE80;padding:8px;border-radius:6px;border:1px solid rgba(0,0,0,0.12);font-size:13px;outline:none;\" \/>\n\n                  <input name=\"telefon\" type=\"tel\" required placeholder=\"Numer telefonu\"\n                         style=\"background:#E2D1BE80;padding:8px;border-radius:6px;border:1px solid rgba(0,0,0,0.12);font-size:13px;outline:none;\" \/>\n\n                  <textarea name=\"tresc\" placeholder=\"Tre\u015b\u0107 zapytania (opcjonalnie)\" rows=\"4\"\n                            style=\"background:#E2D1BE80;padding:8px;border-radius:6px;border:1px solid rgba(0,0,0,0.12);font-size:13px;outline:none;\"><\/textarea>\n\n                  <label style=\"display:flex;align-items:center;gap:8px;font-size:13px\">\n                    <input type=\"checkbox\" name=\"consent\" required style=\"transform:scale(1.05)\" \/>\n                    Wyra\u017cam zgod\u0119 na przetwarzanie danych osobowych\n                  <\/label>\n\n                  <div style=\"display:flex;flex-direction:column;gap:12px;justify-content:flex-end;margin-top:6px;align-items:stretch;\">\n                    <div style=\"display:flex;justify-content:center;\">\n                      <div class=\"cf-turnstile\"\n                           data-sitekey=\"0x4AAAAAACpJEFmToYMvQw2v\"\n                           data-theme=\"dark\"\n                           data-size=\"compact\">\n                      <\/div>\n                    <\/div>\n\n                    <input type=\"hidden\" name=\"action\" value=\"cf_turnstile_form\">\n\n                    <div style=\"display:flex;gap:8px;justify-content:flex-end;align-items:center;width:100%;\">\n                      <button type=\"submit\" class=\"panel-open-plan-btn\"\n                              style=\"font-size:14px;padding:8px 12px;background:#636C4D;color:#FFEBD4;border:none;border-radius:0;text-transform:lowercase;display:inline-block;min-height:34px;line-height:1.2;\">\n                        wy\u015blij\n                      <\/button>\n                    <\/div>\n                  <\/div>\n                <\/form>\n              <\/div>\n            `;\n\n            innerWrap.innerHTML = innerHtml;\n            overlay.appendChild(innerWrap);\n            panel.appendChild(overlay);\n\n            function cleanupOverlay() {\n              try { overlay.remove(); } catch (err) {}\n              try { askBtn.style.visibility = 'visible'; } catch (err) {}\n              try { panel._cleanupAskOverlay = null; } catch (err) {}\n              try { panel._askOverlay = null; } catch (err) {}\n              try { panel.querySelector('#panel-open-plan')?.focus(); } catch (err) {}\n            }\n\n            panel._cleanupAskOverlay = cleanupOverlay;\n            panel._askOverlay = overlay;\n\n            const askClose = overlay.querySelector('.ask-close');\n            askClose && askClose.addEventListener('click', function(ev2) {\n              ev2.stopPropagation();\n              ev2.preventDefault();\n              cleanupOverlay();\n            });\n\n            overlay.addEventListener('pointerdown', function(ev2) {\n              ev2.stopPropagation();\n            });\n\n            if (window.turnstile) {\n              const ts = overlay.querySelector('.cf-turnstile');\n              if (ts) {\n                window.turnstile.render(ts, {\n                  sitekey: \"0x4AAAAAACpJEFmToYMvQw2v\",\n                  size: \"compact\",\n                  theme: \"dark\"\n                });\n              }\n            }\n\n            const form = overlay.querySelector('#ask-form');\n            if (form) {\n              form.addEventListener('submit', async function(subE) {\n                subE.preventDefault();\n                subE.stopPropagation();\n\n                const formData = new FormData(form);\n                formData.append('lokal', (typeof unitName !== 'undefined' && unitName) ? unitName : (panel.querySelector('h1')?.textContent || 'putlokalnumberhere'));\n                formData.append('action', 'send_ask_form');\n                formData.append('nonce', (window.MyAjax && window.MyAjax.nonce) ? window.MyAjax.nonce : '');\n\n                const submitBtn = form.querySelector('[type=\"submit\"]');\n                submitBtn && (submitBtn.disabled = true);\n\n                try {\n                  const resp = await fetch((window.MyAjax && window.MyAjax.ajax_url) || '\/wp-admin\/admin-ajax.php', {\n                    method: 'POST',\n                    body: formData,\n                    credentials: 'same-origin'\n                  });\n\n                  const json = await resp.json();\n\n                  if (json.success) {\n                    const record = {\n                      lokal: (formData.get('lokal') || form.querySelector('h1')?.textContent || 'putlokalnumberhere').toString().trim(),\n                      imie: (formData.get('imie') || '').toString().trim(),\n                      nazwisko: (formData.get('nazwisko') || '').toString().trim(),\n                      email: (formData.get('email') || '').toString().trim(),\n                      telefon: (formData.get('telefon') || '').toString().trim(),\n                      tresc: (formData.get('tresc') || '').toString().trim(),\n                      consent: formData.get('consent') ? true : false,\n                      createdAt: (new Date()).toISOString()\n                    };\n                    window.collectedInquiries = window.collectedInquiries || [];\n                    window.collectedInquiries.push(record);\n\n                    cleanupOverlay();\n                    showToast(json.data || 'Wys\u0142ano \u2014 dzi\u0119kujemy!');\n                  } else {\n                    showToast('B\u0142\u0105d: ' + (json.data || 'Nie uda\u0142o si\u0119 wys\u0142a\u0107. Spr\u00f3buj ponownie.'));\n                  }\n                } catch (err) {\n                  showToast('B\u0142\u0105d sieci. Spr\u00f3buj ponownie.');\n                } finally {\n                  submitBtn && (submitBtn.disabled = false);\n                }\n              });\n            }\n          });\n        }\n      } catch (e) {}\n    }\n\n    const title = panel.querySelector('h1');\n    title.textContent = name;\n    title.style.textAlign = 'center';\n\n    const meta = panel.querySelector('.meta');\n\n    if (data) {\n      const priceRaw = data.cena ?? data.price ?? null;\n      const priceText = priceRaw ? parsePrice(priceRaw) : '';\n      const stan = data.stan || '';\n      const areaOgr = data.metrazOgr\n        ? new Intl.NumberFormat('pl-PL').format(Number(String(data.metrazOgr).replace(',', '.'))) + ' a'\n        : '';\n      const area = data.metraz ? fmtArea(data.metraz) : '';\n      const etap = data.etap || '';\n\n      const baseHtml = ''\n        + (stan ? `<div style=\"margin-bottom:6px;\">Stan: ${escapeHtml(formatStatePL(stan))}<\/div>` : '')\n        + (priceText ? `<div style=\"margin-bottom:6px;\">Cena: ${escapeHtml(priceText)}<\/div>` : '')\n        + (area ? `<div style=\"margin-bottom:6px;\">Metra\u017c: ${escapeHtml(area)}<\/div>` : '')\n        + (areaOgr ? `<div style=\"margin-bottom:6px;\">Powierzchnia dzia\u0142ki: ${escapeHtml(areaOgr)}<\/div>` : '')\n        + (etap ? `<div style=\"margin-bottom:6px;\">Etap ${escapeHtml(etap)}<\/div>` : '');\n\n      meta.innerHTML = baseHtml;\n    }\n\n    (function() {\n      try {\n        const imgEl = panel.querySelector('#panel-image-image');\n        const descEl = panel.querySelector('#panel-image-description');\n        const btnLeft = panel.querySelector('#panel-image-toggle-left');\n        const btnRight = panel.querySelector('#panel-image-toggle-right');\n        if (!imgEl || !btnLeft || !btnRight) return;\n\n        const detected = (String(name || '')).trim().toUpperCase();\n        let houseType = 'B';\n        if (detected[0] === 'A' || detected[1] === 'A') houseType = 'A';\n        else if (detected[0] === 'B' || detected[1] === 'B') houseType = 'B';\n\n        const thumbs = {\n          A: {\n            parter: 'https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-content\/uploads\/2026\/03\/A_parter_miniaturka_6.png',\n            pietro: 'https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-content\/uploads\/2026\/03\/A_pietro_miniaturka_2.png'\n          },\n          B: {\n            parter: 'https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-content\/uploads\/2026\/03\/B_parter_miniaturka.png',\n            pietro: 'https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-content\/uploads\/2026\/03\/B_pietro_miniaturka.png'\n          }\n        };\n\n        const srcs = thumbs[houseType] || thumbs.B;\n\n        imgEl.src = srcs.parter;\n        imgEl.dataset.toggled = '0';\n        descEl.textContent = 'Parter';\n\n        const newBtnLeft = btnLeft.cloneNode(true);\n        btnLeft.parentNode.replaceChild(newBtnLeft, btnLeft);\n        newBtnLeft.style.display = 'none';\n\n        const newBtnRight = btnRight.cloneNode(true);\n        btnRight.parentNode.replaceChild(newBtnRight, btnRight);\n\n        newBtnRight.addEventListener('click', function(ev) {\n          ev.stopPropagation();\n          ev.preventDefault();\n\n          imgEl.src = srcs.pietro;\n          descEl.textContent = 'Pi\u0119tro';\n          imgEl.dataset.toggled = '1';\n\n          newBtnRight.style.display = 'none';\n          newBtnLeft.style.display = 'inline-flex';\n        });\n\n        newBtnLeft.addEventListener('click', function(ev) {\n          ev.stopPropagation();\n          ev.preventDefault();\n\n          imgEl.src = srcs.parter;\n          descEl.textContent = 'Parter';\n          imgEl.dataset.toggled = '0';\n\n          newBtnRight.style.display = 'inline-flex';\n          newBtnLeft.style.display = 'none';\n        });\n\n        imgEl.style.maxWidth = '100%';\n        imgEl.style.height = 'auto';\n        imgEl.style.display = 'block';\n        imgEl.setAttribute('alt', `Podgl\u0105d ${houseType}`);\n      } catch (e) {}\n    })();\n\n    panel.setAttribute('aria-hidden', 'false');\n    panel.classList.remove('closing-right');\n    requestAnimationFrame(() => panel.classList.add('open'));\n  }\n\n  function closeHousePanel() {\n    setNavigationVisibility(true);\n    const panel = document.querySelector('.house-panel');\n    const legend = document.querySelector('.legend-row');\n\n    if (viewer._pulsingGroup) stopPulse(viewer._pulsingGroup);\n    viewer._focusedHouseKey = null;\n    viewer._openGroup = null;\n\n    if (!panel) return;\n\n    if (viewer._openTimeout) {\n      clearTimeout(viewer._openTimeout);\n      viewer._openTimeout = null;\n    }\n\n    if (typeof panel._cleanupAskOverlay === 'function') {\n      try { panel._cleanupAskOverlay(); } catch (e) {}\n    }\n\n    if (legend) legend.style.display = 'flex';\n\n    panel.setAttribute('aria-hidden', 'true');\n    panel.classList.remove('open');\n    panel.classList.add('closing-right');\n\n    content.style.transition = 'transform 320ms cubic-bezier(.2,.8,.2,1)';\n    scale = 1;\n    translate = { x: 0, y: 0 };\n    applyTransform();\n\n    const onTransitionEnd = ev => {\n      if (ev.propertyName === 'transform' || ev.propertyName === 'opacity') {\n        if (panel && panel.parentNode) {\n          panel.parentNode.removeChild(panel);\n        }\n      }\n    };\n\n    panel.addEventListener('transitionend', onTransitionEnd, { once: true });\n  }\n\n  function showToast(message) {\n    const toast = document.createElement('div');\n    toast.textContent = message;\n    toast.style.position = 'fixed';\n    toast.style.bottom = '20px';\n    toast.style.left = '50%';\n    toast.style.transform = 'translateX(-50%)';\n    toast.style.background = '#fff';\n    toast.style.color = '#111';\n    toast.style.padding = '10px 18px';\n    toast.style.borderRadius = '6px';\n    toast.style.boxShadow = '0 2px 12px rgba(0,0,0,0.15)';\n    toast.style.fontSize = '13px';\n    toast.style.fontWeight = '600';\n    toast.style.zIndex = '100000';\n    toast.style.opacity = '0';\n    toast.style.transition = 'opacity 0.3s ease, transform 0.3s ease';\n\n    document.body.appendChild(toast);\n\n    requestAnimationFrame(() => {\n      toast.style.opacity = '1';\n      toast.style.transform = 'translateX(-50%) translateY(0)';\n    });\n\n    setTimeout(() => {\n      toast.style.opacity = '0';\n      toast.style.transform = 'translateX(-50%) translateY(10px)';\n      toast.addEventListener('transitionend', () => toast.remove());\n    }, 2500);\n  }\n\n  if (prevBtn && nextBtn) {\n    prevBtn.addEventListener('click', function(ev) {\n      ev.stopPropagation();\n      ev.preventDefault();\n      if (viewer._focusedHouseKey) return;\n      currentIndex = (currentIndex + 1) % totalImages;\n      updateImage();\n    });\n\n    nextBtn.addEventListener('click', function(ev) {\n      ev.stopPropagation();\n      ev.preventDefault();\n      if (viewer._focusedHouseKey) return;\n      currentIndex = (currentIndex - 1 + totalImages) % totalImages;\n      updateImage();\n    });\n  }\n\n  window.addEventListener('keydown', e => {\n    if (e.key === 'Escape') {\n      closeHousePanel();\n    }\n  });\n\n  (async function() {\n    await preloadSVGsAndImages();\n    applyLegendColors();\n    updateImage();\n    applyTransform();\n  })();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ed6aebc elementor-widget elementor-widget-html\" data-id=\"ed6aebc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Rosario:wght@400;500;600&display=swap\" rel=\"stylesheet\">\n\n<script src=\"https:\/\/challenges.cloudflare.com\/turnstile\/v0\/api.js\" async defer><\/script>\n\n\t\t<script>\n\t\t\twindow.domkiData = [{\"id\":\"1\",\"name\":\"1A\",\"cena\":\"0.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"750.00\",\"plot_area_m2\":\"911.00\",\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"2\",\"name\":\"1B\",\"cena\":\"999000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"164.00\",\"plot_area_m2\":\"325.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"3\",\"name\":\"2A\",\"cena\":\"999500.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"237.00\",\"plot_area_m2\":\"398.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"4\",\"name\":\"2B\",\"cena\":\"1015000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"334.00\",\"plot_area_m2\":\"495.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"5\",\"name\":\"3A\",\"cena\":\"999000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"164.00\",\"plot_area_m2\":\"325.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"6\",\"name\":\"3B\",\"cena\":\"999000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"164.00\",\"plot_area_m2\":\"325.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"7\",\"name\":\"4A\",\"cena\":\"980000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"8\",\"name\":\"4B\",\"cena\":\"980000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"9\",\"name\":\"5A\",\"cena\":\"999000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"164.00\",\"plot_area_m2\":\"325.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"10\",\"name\":\"5B\",\"cena\":\"999000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"163.00\",\"plot_area_m2\":\"324.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"11\",\"name\":\"6A\",\"cena\":\"980000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"12\",\"name\":\"6B\",\"cena\":\"980000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"13\",\"name\":\"7A\",\"cena\":\"999000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"163.00\",\"plot_area_m2\":\"324.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"14\",\"name\":\"7B\",\"cena\":\"999000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"162.00\",\"plot_area_m2\":\"323.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"15\",\"name\":\"8A\",\"cena\":\"980000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"16\",\"name\":\"8B\",\"cena\":\"980000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"17\",\"name\":\"9A\",\"cena\":\"999000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"162.00\",\"plot_area_m2\":\"323.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"18\",\"name\":\"9B\",\"cena\":\"999000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"162.00\",\"plot_area_m2\":\"323.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"19\",\"name\":\"10A\",\"cena\":\"980000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"20\",\"name\":\"10B\",\"cena\":\"980000.00\",\"metraz\":\"111.00\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"I\",\"stan\":\"Dostepny\"},{\"id\":\"21\",\"name\":\"11A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"161.00\",\"plot_area_m2\":\"322.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"22\",\"name\":\"11B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"161.00\",\"plot_area_m2\":\"322.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"23\",\"name\":\"12A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"24\",\"name\":\"12B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"25\",\"name\":\"13A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"161.00\",\"plot_area_m2\":\"322.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"26\",\"name\":\"13B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"160.00\",\"plot_area_m2\":\"321.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"27\",\"name\":\"14A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"28\",\"name\":\"14B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"29\",\"name\":\"15A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"160.00\",\"plot_area_m2\":\"321.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"30\",\"name\":\"15B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"159.00\",\"plot_area_m2\":\"320.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"31\",\"name\":\"16A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"32\",\"name\":\"16B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"33\",\"name\":\"17A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"159.00\",\"plot_area_m2\":\"320.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"34\",\"name\":\"17B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"159.00\",\"plot_area_m2\":\"320.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"35\",\"name\":\"18A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"36\",\"name\":\"18B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"37\",\"name\":\"19A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"158.00\",\"plot_area_m2\":\"319.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"38\",\"name\":\"19B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"142.00\",\"plot_area_m2\":\"303.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"39\",\"name\":\"20A\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"103.00\",\"plot_area_m2\":\"264.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"40\",\"name\":\"20B\",\"cena\":\"0.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"106.00\",\"plot_area_m2\":\"267.00\",\"etap\":\"II\",\"stan\":\"Nastepny etap\"},{\"id\":\"41\",\"name\":\"21A\",\"cena\":\"969700.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"42\",\"name\":\"21B\",\"cena\":\"871100.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"43\",\"name\":\"22A\",\"cena\":\"446500.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"44\",\"name\":\"22B\",\"cena\":\"319300.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"45\",\"name\":\"23A\",\"cena\":\"956900.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"46\",\"name\":\"23B\",\"cena\":\"276700.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"47\",\"name\":\"24A\",\"cena\":\"912700.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"48\",\"name\":\"24B\",\"cena\":\"183500.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"49\",\"name\":\"25A\",\"cena\":\"579400.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"50\",\"name\":\"25B\",\"cena\":\"496500.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"51\",\"name\":\"26A\",\"cena\":\"594400.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"52\",\"name\":\"26B\",\"cena\":\"482600.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"53\",\"name\":\"27A\",\"cena\":\"479800.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"54\",\"name\":\"27B\",\"cena\":\"198765.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"4.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"55\",\"name\":\"28A\",\"cena\":\"716200.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"56\",\"name\":\"28B\",\"cena\":\"178000.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"57\",\"name\":\"29A\",\"cena\":\"291100.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"58\",\"name\":\"29B\",\"cena\":\"771700.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"59\",\"name\":\"30A\",\"cena\":\"285200.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"60\",\"name\":\"30B\",\"cena\":\"660800.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"61\",\"name\":\"31A\",\"cena\":\"598700.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"62\",\"name\":\"31B\",\"cena\":\"861000.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"63\",\"name\":\"32A\",\"cena\":\"659000.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"},{\"id\":\"64\",\"name\":\"32B\",\"cena\":\"562000.00\",\"metraz\":\"107.90\",\"metrazOgr\":\"3.00\",\"plot_area_m2\":null,\"etap\":\"III\",\"stan\":\"Nastepny etap\"}];\n\t\t\twindow.domkiLabels = {\"plotArea\":\"Powierzchnia dzia\\u0142ki\",\"gardenArea\":\"Powierzchnia ogr\\u00f3dka\"};\n\t\t\twindow.historyData = [{\"id\":\"41\",\"id_dom\":\"1\",\"new_price\":\"92345641.00\",\"change_date\":\"2027-03-04\"},{\"id\":\"82\",\"id_dom\":\"1\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"83\",\"id_dom\":\"2\",\"new_price\":\"999000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"84\",\"id_dom\":\"5\",\"new_price\":\"999000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"85\",\"id_dom\":\"6\",\"new_price\":\"999000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"86\",\"id_dom\":\"9\",\"new_price\":\"999000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"87\",\"id_dom\":\"10\",\"new_price\":\"999000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"88\",\"id_dom\":\"13\",\"new_price\":\"999000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"89\",\"id_dom\":\"14\",\"new_price\":\"999000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"90\",\"id_dom\":\"17\",\"new_price\":\"999000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"91\",\"id_dom\":\"18\",\"new_price\":\"999000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"93\",\"id_dom\":\"4\",\"new_price\":\"1015000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"94\",\"id_dom\":\"7\",\"new_price\":\"980000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"95\",\"id_dom\":\"8\",\"new_price\":\"980000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"96\",\"id_dom\":\"11\",\"new_price\":\"980000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"97\",\"id_dom\":\"12\",\"new_price\":\"980000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"98\",\"id_dom\":\"15\",\"new_price\":\"980000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"99\",\"id_dom\":\"16\",\"new_price\":\"980000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"100\",\"id_dom\":\"19\",\"new_price\":\"980000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"101\",\"id_dom\":\"20\",\"new_price\":\"980000.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"102\",\"id_dom\":\"21\",\"new_price\":null,\"change_date\":\"2026-10-02\"},{\"id\":\"103\",\"id_dom\":\"22\",\"new_price\":null,\"change_date\":\"2026-10-02\"},{\"id\":\"104\",\"id_dom\":\"25\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"105\",\"id_dom\":\"26\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"106\",\"id_dom\":\"29\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"107\",\"id_dom\":\"30\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"108\",\"id_dom\":\"33\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"109\",\"id_dom\":\"34\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"110\",\"id_dom\":\"37\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"111\",\"id_dom\":\"38\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"112\",\"id_dom\":\"23\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"113\",\"id_dom\":\"24\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"114\",\"id_dom\":\"27\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"115\",\"id_dom\":\"28\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"116\",\"id_dom\":\"31\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"117\",\"id_dom\":\"32\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"118\",\"id_dom\":\"35\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"119\",\"id_dom\":\"36\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"120\",\"id_dom\":\"39\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"121\",\"id_dom\":\"40\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"122\",\"id_dom\":\"21\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"123\",\"id_dom\":\"22\",\"new_price\":\"0.00\",\"change_date\":\"2026-10-02\"},{\"id\":\"124\",\"id_dom\":\"3\",\"new_price\":\"999500.00\",\"change_date\":\"2026-10-05\"}];\n\t\t<\/script>\n\t\n\n<style>\n  .domki-note{\n    width:85%;\n    margin:0 auto 15px auto;\n    font-family:'Rosario',sans-serif;\n    font-size:14px;\n    color:#555;\n    text-align:center;\n    margin-top:60px;\n  }\n\n  #domki-table{\n  width:100%;\n  max-width:100vw;\n  box-sizing:border-box;\n  padding:0 10px;\n  \n}\n\n.domki-table-scroll{\n  overflow-x:auto;\n  overflow-y:auto;\n  overscroll-behavior-x: contain; \n  overscroll-behavior-y: auto;   \n  max-height:min(72vh,760px);\n    transform: translateZ(0);\n  will-change: scroll-position;\n}\n\n.domki-table-footer{\n  width:100%;\n}\n\n  #domki-table .domki-table{\n    min-width:1080px;\n    width:max-content;\n    max-width:none;\n    border-collapse:collapse;\n    font-family:'Rosario',sans-serif;\n  }\n\n  #domki-table .domki-table th,\n  #domki-table .domki-table td{\n    white-space:nowrap;\n  }\n\n  .ask-slide-panel,\n  .image-slide-panel{\n    -webkit-overflow-scrolling:touch;\n    overscroll-behavior:contain;\n    touch-action:manipulation;\n  }\n\n  @media (max-width: 768px){\n    .domki-note{\n      width:92% !important;\n      margin-top:24px !important;\n      font-size:13px !important;\n    }\n\n    #domki-table{\n      padding:0 6px;\n      max-height:calc(100vh - 210px);\n    }\n\n    .ask-slide-panel,\n    .image-slide-panel{\n      left:0 !important;\n      right:0 !important;\n      width:100vw !important;\n      max-width:none !important;\n      height:100dvh !important;\n    }\n  }\n<\/style>\n\n<div class=\"domki-note\">\n  Lokale dost\u0119pne w ofercie. Ceny oraz dost\u0119pno\u015b\u0107 mog\u0105 ulec zmianie.\n<\/div>\n\n<div id=\"domki-table\">\n  <div class=\"domki-table-scroll\"><\/div>\n  <div class=\"domki-table-footer\"><\/div>\n<\/div>\n\n<script>\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n\n  function escapeHtml(str){\n    if(!str && str !== 0) return '';\n    return String(str)\n      .replace(\/&\/g,'&amp;')\n      .replace(\/<\/g,'&lt;')\n      .replace(\/>\/g,'&gt;')\n      .replace(\/\"\/g,'&quot;')\n      .replace(\/'\/g,'&#39;');\n  }\n\n  function formatPrice(price){\n    if(!price && price !== 0) return \"\";\n    let num = parseFloat(price);\n    if(isNaN(num)) return price;\n    return Math.round(num).toString().replace(\/\\B(?=(\\d{3})+(?!\\d))\/g,\" \");\n  }\n\n  const order = {\n    \"dostepny\":0,\n    \"zarezerwowany\":1,\n    \"nastepny etap\":2\n  };\n\n  const defaultImg = \"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-content\/uploads\/2026\/03\/Karta-Lokalu-Osiedle-Kory-1A.jpg\";\n\n  function getStateIcon(state){\n    if(state===\"dostepny\"){\n      return `<svg viewBox=\"0 0 24 24\" style=\"width:22px;height:22px;display:block;margin:auto;\"><path d=\"M20 6L9 17l-5-5\" fill=\"none\" stroke=\"#1f7a2e\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>`;\n    }\n    if(state===\"zarezerwowany\"){\n      return `<svg viewBox=\"0 0 24 24\" style=\"width:22px;height:22px;display:block;margin:auto;\"><rect x=\"5\" y=\"11\" width=\"14\" height=\"10\" rx=\"2\" fill=\"#f4c542\" stroke=\"#b38a00\" stroke-width=\"1.5\"\/><path d=\"M8 11V7a4 4 0 118 0v4\" fill=\"none\" stroke=\"#8c6b00\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>`;\n    }\n    if(state===\"nastepny etap\"){\n      return `<svg viewBox=\"0 0 24 24\" style=\"width:22px;height:22px;display:block;margin:auto;\"><circle cx=\"12\" cy=\"12\" r=\"9\" fill=\"none\" stroke=\"#666\" stroke-width=\"2\"\/><path d=\"M12 7v5l3 2\" fill=\"none\" stroke=\"#666\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>`;\n    }\n    return \"\";\n  }\n\n  function updateBodyOverflow(){\n    const anyOpen = !!document.querySelector('.ask-slide-panel, .image-slide-panel');\n    document.documentElement.style.overflow = anyOpen ? 'hidden' : '';\n    document.body.style.overflow = anyOpen ? 'hidden' : '';\n  }\n\n  function updatePanelsSpacing(){\n    const left = document.querySelector('.image-slide-panel');\n    const right = document.querySelector('.ask-slide-panel');\n\n    if(window.innerWidth < 768){\n      if(left) left.style.right = '';\n      return;\n    }\n\n    if(left){\n      if(right){\n        const rWidth = right.getBoundingClientRect().width;\n        const gap = window.innerWidth * 0.08;\n        left.style.right = (rWidth + gap) + 'px';\n      } else {\n        left.style.right = '';\n      }\n    }\n  }\n\n  function closePanelIfOutsideClick(ev){\n    const openPanels = document.querySelectorAll('.ask-slide-panel, .image-slide-panel');\n    openPanels.forEach(panel => {\n      if(panel && !panel.contains(ev.target) && typeof panel._closePanel === 'function'){\n        panel._closePanel();\n      }\n    });\n  }\n\n  document.addEventListener('click', closePanelIfOutsideClick);\n\n  if(!window.domkiData || !Array.isArray(window.domkiData)){\n    document.getElementById(\"domki-table\").innerHTML = \"<div style='width:85%;margin:16px auto;font-family:Rosario,sans-serif;color:#777;'>No data found.<\/div>\";\n    return;\n  }\n\n  let filtered = window.domkiData\n    .filter(d => (d.stan||\"\").toLowerCase() !== \"sprzedany\")\n    .sort((a,b)=>{\n      let sa = (a.stan||\"\").toLowerCase();\n      let sb = (b.stan||\"\").toLowerCase();\n      return (order[sa] ?? 99) - (order[sb] ?? 99);\n    });\n\n  let html = `\n  <table class=\"domki-table\" style=\"width:85%;margin:0 auto;border-collapse:collapse;font-family:'Rosario',sans-serif;position:relative;\">\n    <thead>\n      <tr>\n        <th style=\"padding:10px;border:1px solid #ddd;text-align:center;background:#f7f7f7;vertical-align:middle;\">Numer<\/th>\n        <th style=\"padding:10px;border:1px solid #ddd;text-align:center;background:#f7f7f7;vertical-align:middle;\">Cena brutto [PLN]<\/th>\n        <th style=\"padding:10px;border:1px solid #ddd;text-align:center;background:#f7f7f7;vertical-align:middle;\">Cena za m\u00b2<\/th>\n        <th style=\"padding:10px;border:1px solid #ddd;text-align:center;background:#f7f7f7;vertical-align:middle;\">Powierzchnia u\u017cytkowa<\/th>\n        <th style=\"padding:10px;border:1px solid #ddd;text-align:center;background:#f7f7f7;vertical-align:middle;\">Powierzchnia dzia\u0142ki<\/th>\n        <th style=\"padding:10px;border:1px solid #ddd;text-align:center;background:#f7f7f7;vertical-align:middle;\">Etap<\/th>\n        <th style=\"padding:10px;border:1px solid #ddd;text-align:center;background:#f7f7f7;vertical-align:middle;\">Stan<\/th>\n        <th style=\"padding:0;border:1px solid #ddd;background:#f7f7f7;vertical-align:middle;width:120px;\"><\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n  `;\n\n  filtered.forEach(d=>{\n      let etap = (d.etap||'').toString().trim();\n    if(['II','III'].includes(etap.toUpperCase())) return;\n    let name = (d.name||\"\")\n      .replace(\/^dom\\s*(\\d+)$\/i,\"Dom $1\")\n      .replace(\/^dom(\\d+)$\/i,\"Dom $1\");\n\n    let state = (d.stan||\"\").toLowerCase();\n\n    let price = \"\";\n    if(state === \"nastepny etap\") price = \"cena wkr\u00f3tce\";\n    else price = formatPrice(d.cena);\n\n    let cenaZaMetr = \"\";\n    if(state === \"nastepny etap\"){\n      cenaZaMetr = \"-\";\n    }\n\n    if(state !== \"nastepny etap\" && d.cena && d.metraz){\n      let val = parseFloat(d.cena) \/ parseFloat(d.metraz);\n      if(!isNaN(val)){\n        cenaZaMetr = formatPrice(val) + \" z\u0142\";\n      }\n    }\n\n    let metraz = d.metraz ? d.metraz + \" m\u00b2\" : \"\";\n    let ogrod = d.metrazOgr ? d.metrazOgr + \" a\" : \"\";\n\n    let rowClass = \"\";\n    if(state === \"dostepny\") rowClass = \"available\";\n    else if(state === \"zarezerwowany\") rowClass = \"zarezerwowany\";\n\n    const envelopeSvg = `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" style=\"width:26px;height:26px;display:block;\">\n      <path d=\"M21 12a8 8 0 0 1-8 8H9l-2.5 2 1-3A8 8 0 1 1 21 12z\" fill=\"none\" stroke=\"#636C4D\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\n      <circle cx=\"10.2\" cy=\"13\" r=\"1\" fill=\"#636C4D\"\/>\n      <circle cx=\"13\" cy=\"13\" r=\"1\" fill=\"#636C4D\"\/>\n      <circle cx=\"15.8\" cy=\"13\" r=\"1\" fill=\"#636C4D\"\/>\n    <\/svg>`;\n\n    const emptySvgSvg = `\n    <svg viewBox=\"0 0 24 24\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n      <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" fill=\"none\" stroke=\"#636C4D\" stroke-width=\"1.5\"\/>\n      <circle cx=\"9\" cy=\"10\" r=\"1.6\" fill=\"#636C4D\"\/>\n      <path d=\"M4 17l6-5 3 3 4-4 3 6\" fill=\"none\" stroke=\"#636C4D\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\n    <\/svg>`;\n    const emptySvgData = 'data:image\/svg+xml;utf8,' + encodeURIComponent(emptySvgSvg);\n\n    let rowStyle = '';\n    if(rowClass === 'available') rowStyle = 'background:#e7f6ea;';\n    if(rowClass === 'zarezerwowany') rowStyle = 'background:#fef9ea;';\n\n    html += `\n    <tr class=\"${rowClass}\" style=\"${rowStyle}\">\n      <td style=\"padding:10px;border:1px solid #ddd;text-align:center;vertical-align:middle;\">${escapeHtml(name)}<\/td>\n      <td style=\"padding:10px;border:1px solid #ddd;text-align:center;vertical-align:middle;\">${escapeHtml(price)}<\/td>\n      <td style=\"padding:10px;border:1px solid #ddd;text-align:center;vertical-align:middle;\">${escapeHtml(cenaZaMetr)}<\/td>\n      <td style=\"padding:10px;border:1px solid #ddd;text-align:center;vertical-align:middle;\">${escapeHtml(metraz)}<\/td>\n      <td style=\"padding:10px;border:1px solid #ddd;text-align:center;vertical-align:middle;\">${escapeHtml(ogrod)}<\/td>\n      <td style=\"padding:10px;border:1px solid #ddd;text-align:center;vertical-align:middle;\">${escapeHtml(d.etap ?? \"\")}<\/td>\n      <td style=\"padding:10px;border:1px solid #ddd;text-align:center;vertical-align:middle;\">${getStateIcon(state)}<\/td>\n      <td style=\"padding:10px;border:1px solid #ddd;text-align:center;vertical-align:middle;white-space:nowrap;\">\n        <div style=\"display:inline-flex;align-items:center;justify-content:flex-end;gap:5px;\">\n          <button type=\"button\"\n            class=\"show-image-btn\"\n            title=\"wy\u015bwietl kart\u0119 lokalu\"\n            data-unit=\"${escapeHtml(name)}\"\n            data-area=\"${escapeHtml(metraz)}\"\n            style=\"display:flex;align-items:center;justify-content:center;background:none;border:none;cursor:pointer;padding:0;width:32px;height:32px;\">\n            <img decoding=\"async\" src=\"${emptySvgData}\" style=\"width:26px;height:26px;display:block;\" \/>\n          <\/button>\n\n          <button type=\"button\"\n            class=\"ask-row-btn\"\n            title=\"zapytaj o lokal\"\n            data-unit=\"${escapeHtml(name)}\"\n            style=\"display:flex;align-items:center;justify-content:center;background:none;border:none;cursor:pointer;padding:0;width:32px;height:32px;\">\n            ${envelopeSvg}\n          <\/button>\n        <\/div>\n      <\/td>\n    <\/tr>`;\n  });\n\n  html += \"<\/tbody><\/table>\";\n\n  const wrapper = document.getElementById(\"domki-table\");\nwrapper.querySelector(\".domki-table-scroll\").innerHTML = html;\n\nwrapper.querySelector(\".domki-table-footer\").innerHTML = `\n  <div style=\"width:85%;margin:14px auto 30px auto;text-align:center;\">\n    <a href=\"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/plan-osiedla-historia-cen\/\" \n       style=\"\n         font-family:'Rosario',sans-serif;\n         font-size:14px;\n         color:#636C4D;\n         text-decoration:none;\n         border-bottom:1px solid #636C4D;\n         padding-bottom:2px;\n         transition:opacity 0.2s ease;\n       \"\n       onmouseover=\"this.style.opacity='0.7'\"\n       onmouseout=\"this.style.opacity='1'\"\n    >\n      Kliknij, aby zobaczy\u0107 histori\u0119 cen lokali\n    <\/a>\n  <\/div>\n`;\n\n  function openAskSlide(unitName, openerButton){\n    try{\n      const existingAsk = document.querySelector('.ask-slide-panel');\nif(existingAsk && typeof existingAsk._closePanel === 'function'){\n  existingAsk._closePanel();\n}\n\n      const nameEsc = escapeHtml(unitName || '\u2014');\n      const isMobile = window.innerWidth < 768;\n\n      const slide = document.createElement('div');\n      slide.className = 'ask-slide-panel';\n      slide.setAttribute('role','dialog');\n      slide.setAttribute('aria-modal','true');\n\n      slide.style.position = 'fixed';\n      slide.style.top = '0';\n      slide.style.right = '0';\n      slide.style.height = '100dvh';\n      slide.style.width = isMobile ? '100vw' : 'min(92vw, 560px)';\n      slide.style.boxSizing = 'border-box';\n      slide.style.background = '#FFFCF8';\n      slide.style.zIndex = '100001';\n      slide.style.padding = isMobile ? '16px' : '22px';\n      slide.style.overflowY = 'auto';\n      slide.style.boxShadow = '-12px 0 30px rgba(0,0,0,0.12)';\n      slide.style.transform = 'translateX(100%)';\n      slide.style.transition = 'transform 320ms cubic-bezier(.2,.8,.2,1)';\n      slide.style.fontFamily = \"'Rosario', sans-serif\";\n      slide.style.webkitOverflowScrolling = 'touch';\n\n      const innerHtml = `\n        <button class=\"ask-slide-close\" aria-label=\"Zamknij\" style=\"position:absolute;left:12px;top:12px;border:none;background:transparent;color:#000;font-weight:800;font-size:28px;cursor:pointer;padding:8px;z-index:100002;\">&times;<\/button>\n\n        <div style=\"width:100%;max-width:520px;margin:36px auto 24px auto;padding-bottom:30px;\">\n          <h2 style=\"margin:6px 0 12px 0;font-size:20px;font-weight:800;color:#111\">Zapytaj o lokal: ${nameEsc}<\/h2>\n\n          <p style=\"color:#6E665E;margin:0 0 14px 0;font-size:13px\">\n            <strong style=\"display:block;color:#111;font-size:14px;margin-bottom:6px\">\n              Email:\n              <a href=\"mailto:skandynawskie@klepper.com.pl\" style=\"color:#636C4D;text-decoration:none;border-bottom:1px solid #636C4D;\">skandynawskie@klepper.com.pl<\/a><br>\n              Nr. tel:\n              <a href=\"tel:+48606832063\" style=\"color:#636C4D;text-decoration:none;border-bottom:1px solid #636C4D;\">48 606 832 063<\/a>\n            <\/strong>\n            Lub wype\u0142nij poni\u017cszy formularz - skontaktujemy si\u0119 z Tob\u0105 w sprawie wybranego lokalu.\n          <\/p>\n\n          <form id=\"ask-form-slide\" method=\"post\" style=\"display:flex;flex-direction:column;gap:12px;margin-top:8px;font-size:15px;\">\n            <input name=\"imie\" required placeholder=\"Imi\u0119\" style=\"background:#E2D1BE80;padding:12px;border-radius:8px;border:1px solid rgba(0,0,0,0.12);font-size:16px;outline:none;\"\/>\n            <input name=\"nazwisko\" required placeholder=\"Nazwisko\" style=\"background:#E2D1BE80;padding:12px;border-radius:8px;border:1px solid rgba(0,0,0,0.12);font-size:16px;outline:none;\"\/>\n            <input name=\"email\" type=\"email\" required placeholder=\"Email\" style=\"background:#E2D1BE80;padding:12px;border-radius:8px;border:1px solid rgba(0,0,0,0.12);font-size:16px;outline:none;\"\/>\n            <input name=\"telefon\" type=\"tel\" required placeholder=\"Numer telefonu\" style=\"background:#E2D1BE80;padding:12px;border-radius:8px;border:1px solid rgba(0,0,0,0.12);font-size:16px;outline:none;\"\/>\n            <textarea name=\"tresc\" placeholder=\"Tre\u015b\u0107 zapytania (opcjonalnie)\" rows=\"6\" style=\"background:#E2D1BE80;padding:12px;border-radius:8px;border:1px solid rgba(0,0,0,0.12);font-size:15px;outline:none;min-height:120px;\"><\/textarea>\n\n            <label style=\"display:flex;align-items:center;gap:10px;font-size:15px\">\n              <input type=\"checkbox\" name=\"consent\" required style=\"transform:scale(1.05)\" \/>\n              <span>Wyra\u017cam zgod\u0119 na przetwarzanie danych osobowych<\/span>\n            <\/label>\n\n            <div style=\"display:flex;justify-content:center;margin-top:4px;\">\n              <div class=\"cf-turnstile-slide\" data-sitekey=\"0x4AAAAAACpJEFmToYMvQw2v\" style=\"display:flex;justify-content:center;\"><\/div>\n            <\/div>\n\n            <input type=\"hidden\" name=\"lokal\" value=\"${nameEsc}\" \/>\n            <input type=\"hidden\" name=\"action\" value=\"send_ask_form\" \/>\n\n            <div style=\"display:flex;gap:8px;justify-content:flex-end;align-items:center;width:100%;margin-top:4px;\">\n              <button type=\"submit\" style=\"font-size:16px;padding:12px 16px;background:#636C4D;color:#FFEBD4;border:none;border-radius:6px;text-transform:lowercase;display:inline-block;min-height:42px;line-height:1.2;cursor:pointer;\">wy\u015blij<\/button>\n            <\/div>\n          <\/form>\n        <\/div>\n      `;\n\n      slide.innerHTML = innerHtml;\n      document.body.appendChild(slide);\n\n      updateBodyOverflow();\n      updatePanelsSpacing();\n\n      requestAnimationFrame(()=>{ slide.style.transform='translateX(0)'; });\n\n      const closeBtn = slide.querySelector('.ask-slide-close');\n\n      function closeSlide(){\n        if(slide._closing) return;\n        slide._closing = true;\n        slide.style.transform='translateX(100%)';\n        slide.addEventListener('transitionend', function(){\n          slide.remove();\n          updateBodyOverflow();\n          updatePanelsSpacing();\n        }, {once:true});\n        setTimeout(()=>{\n          if(slide.isConnected){\n            slide.remove();\n            updateBodyOverflow();\n            updatePanelsSpacing();\n          }\n        },450);\n        try{ if(openerButton) openerButton.focus(); }catch(e){}\n      }\n\n      slide._closePanel = closeSlide;\n\n      closeBtn.addEventListener('click', function(e){\n        e.preventDefault();\n        e.stopPropagation();\n        closeSlide();\n      });\n\n      slide.addEventListener('keydown', function(ev){\n        if(ev.key === 'Escape'){ closeSlide(); }\n      });\n\n      try{\n        const tsEl = slide.querySelector('.cf-turnstile-slide');\n        if(window.turnstile && tsEl){\n          try{\n            window.turnstile.render(tsEl, {\n              sitekey: tsEl.getAttribute('data-sitekey') || \"0x4AAAAAACpJEFmToYMvQw2v\",\n              theme: \"dark\"\n            });\n          }catch(e){\n            console.error('turnstile render slide error', e);\n          }\n        }\n\n        const slideForm = slide.querySelector('#ask-form-slide');\n        if(slideForm){\n          slideForm.addEventListener('submit', async function(subE){\n            subE.preventDefault();\n            subE.stopPropagation();\n\n            const submitBtn = slideForm.querySelector('[type=\"submit\"]');\n            submitBtn && (submitBtn.disabled = true);\n\n            try {\n              const formData = new FormData(slideForm);\n\n              if(!formData.get('lokal')) formData.append('lokal', nameEsc);\n              formData.set('action', 'send_ask_form');\n              formData.append('nonce', (window.MyAjax && window.MyAjax.nonce) ? window.MyAjax.nonce : '');\n\n              const resp = await fetch((window.MyAjax && window.MyAjax.ajax_url) || '\/wp-admin\/admin-ajax.php', {\n                method: 'POST',\n                body: formData,\n                credentials: 'same-origin'\n              });\n\n              let json = null;\n              try { json = await resp.json(); } catch (errJson) { console.error('parse json error', errJson); }\n\n              if(json && json.success){\n                if (window.history && window.history.replaceState) {\n                  window.history.replaceState(null, '', window.location.href);\n                }\n                const record = {\n                  lokal: (formData.get('lokal') || nameEsc).toString().trim(),\n                  imie: (formData.get('imie')||'').toString().trim(),\n                  nazwisko: (formData.get('nazwisko')||'').toString().trim(),\n                  email: (formData.get('email')||'').toString().trim(),\n                  telefon: (formData.get('telefon')||'').toString().trim(),\n                  tresc: (formData.get('tresc')||'').toString().trim(),\n                  consent: formData.get('consent') ? true : false,\n                  createdAt: (new Date()).toISOString()\n                };\n                window.collectedInquiries = window.collectedInquiries || [];\n                window.collectedInquiries.push(record);\n\n                try{ closeSlide(); }catch(e){}\n                try{ openerButton.style.visibility = ''; openerButton.focus(); }catch(e){}\n                showToast(json.data || 'Wys\u0142ano \u2014 dzi\u0119kujemy!');\n              } else {\n                showToast('B\u0142\u0105d: ' + ((json && json.data) || 'Nie uda\u0142o si\u0119 wys\u0142a\u0107. Spr\u00f3buj ponownie.'));\n              }\n            } catch (err){\n              console.error('Fetch error', err);\n              showToast('B\u0142\u0105d: Nie uda\u0142o si\u0119 wys\u0142a\u0107. Spr\u00f3buj ponownie.');\n            } finally {\n              submitBtn && (submitBtn.disabled = false);\n            }\n          });\n        }\n      }catch(errSlideForm){\n        console.error('ask slide extra logic error', errSlideForm);\n      }\n    }catch(err){console.error(err);}\n  }\n\n  function openImageSlide(unitName, openerButton, imageSrc, area){\n    try{\n      const existingImage = document.querySelector('.image-slide-panel');\nif(existingImage && typeof existingImage._closePanel === 'function'){\n  existingImage._closePanel();\n}\n\n        const nameEsc = escapeHtml(unitName || '\u2014');\n\n\n        const klepperSrc = `https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-content\/uploads\/2026\/03\/karta_lokalu_${nameEsc}.png`;\n        const imgSrc = klepperSrc;\n      const isMobile = window.innerWidth < 768;\n\n      const slide = document.createElement('div');\n      slide.className = 'image-slide-panel';\n      slide.setAttribute('role','dialog');\n      slide.setAttribute('aria-modal','true');\n\n      slide.style.position = 'fixed';\n      slide.style.top = '0';\n      slide.style.left = '0';\n      slide.style.height = '100dvh';\n      slide.style.width = isMobile ? '100vw' : 'min(58vw, 760px)';\n      slide.style.maxWidth = 'none';\n      slide.style.boxSizing = 'border-box';\n      slide.style.background = '#FFF';\n      slide.style.zIndex = '100000';\n      slide.style.padding = '0';\n      slide.style.overflow = 'hidden';\n      slide.style.boxShadow = '12px 0 30px rgba(0,0,0,0.12)';\n      slide.style.transform = 'translateX(-100%)';\n      slide.style.transition = 'transform 320ms cubic-bezier(.2,.8,.2,1)';\n      slide.style.fontFamily = \"'Rosario', sans-serif\";\n      slide.style.display = 'flex';\n      slide.style.flexDirection = 'column';\n      slide.style.webkitOverflowScrolling = 'touch';\n\n      const downloadSvg = `\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" style=\"width:22px;height:22px;display:block;\">\n          <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\n          <path d=\"M7 10l5 5 5-5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\n          <path d=\"M12 3v12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\n        <\/svg>\n      `;\n\n      const envelopeSvgTop = `\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" style=\"width:22px;height:22px;display:block;\">\n          <path d=\"M3 7.5v9A2.5 2.5 0 0 0 5.5 19h13a2.5 2.5 0 0 0 2.5-2.5v-9A2.5 2.5 0 0 0 18.5 5h-13A2.5 2.5 0 0 0 3 7.5z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"\/>\n          <path d=\"M21 7.5l-9 6-9-6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\n        <\/svg>\n      `;\n\n      slide.innerHTML = `\n        <div style=\"display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:14px 16px 12px;border-bottom:1px solid #eee;flex:0 0 auto;background:#fff;\">\n          <div style=\"min-width:0;\">\n            <div style=\"font-size:20px;font-weight:800;line-height:1.2;color:#111;\">${nameEsc}<\/div>\n            ${area ? `<div style=\"margin-top:4px;color:#666;font-size:13px;\">Powierzchnia: ${escapeHtml(area)}<\/div>` : ''}\n          <\/div>\n\n          <button class=\"image-slide-close\" aria-label=\"Zamknij\" style=\"border:none;background:transparent;color:#000;font-weight:800;font-size:28px;cursor:pointer;padding:8px;line-height:1;flex:0 0 auto;\">&times;<\/button>\n        <\/div>\n\n        <div class=\"image-slide-body\" style=\"\n          flex:1;\n          min-height:0;\n          display:flex;\n          align-items:center;\n          justify-content:center;\n          padding:16px;\n          overflow:auto;\n          background:#fff;\n        \">\n          <img decoding=\"async\" \n            src=\"${imgSrc}\"\n            alt=\"${nameEsc}\"\n            style=\"\n              width:100%;\n              height:100%;\n              max-width:100%;\n              max-height:100%;\n              object-fit:contain;\n              display:block;\n            \"\n            data-unit-name=\"${escapeHtml(unitName||'')}\"\n            data-unit-area=\"${escapeHtml(area||'')}\"\n          \/>\n        <\/div>\n\n        <div class=\"image-slide-controls\" style=\"\n          flex:0 0 auto;\n          padding:14px 16px 18px;\n          border-top:1px solid #eee;\n          background:rgba(255,255,255,0.98);\n          display:flex;\n          gap:10px;\n          flex-wrap:wrap;\n          justify-content:space-between;\n          align-items:stretch;\n        \">\n          <button class=\"image-download-btn\" title=\"Pobierz obraz\" aria-label=\"Pobierz obraz\"\n            style=\"\n              background:#636C4D;\n              color:#fff;\n              border:none;\n              padding:12px 14px;\n              border-radius:12px;\n              cursor:pointer;\n              display:flex;\n              align-items:center;\n              justify-content:center;\n              min-width:120px;\n              min-height:52px;\n              box-shadow:0 8px 20px rgba(0,0,0,0.16);\n              transition:transform .12s ease, box-shadow .12s ease, opacity .12s ease;\n              flex:1 1 140px;\n            \">\n            <span style=\"display:flex;align-items:center;gap:10px;line-height:1;\">\n              ${downloadSvg}\n              <span style=\"font-size:14px;font-weight:700;letter-spacing:.01em;\">Pobierz<\/span>\n            <\/span>\n          <\/button>\n\n          <button class=\"image-envelope-btn\" title=\"Wy\u015blij obraz e-mailem\" aria-label=\"Wy\u015blij obraz e-mailem\"\n            style=\"\n              background:#636C4D;\n              color:#fff;\n              border:none;\n              padding:12px 14px;\n              border-radius:12px;\n              cursor:pointer;\n              display:flex;\n              align-items:center;\n              justify-content:center;\n              min-width:120px;\n              min-height:52px;\n              box-shadow:0 8px 20px rgba(0,0,0,0.16);\n              transition:transform .12s ease, box-shadow .12s ease, opacity .12s ease;\n              flex:1 1 140px;\n            \">\n            <span style=\"display:flex;align-items:center;gap:10px;line-height:1;text-align:center;\">\n              ${envelopeSvgTop}\n              <span style=\"font-size:14px;font-weight:700;letter-spacing:.01em;\">E-mail<\/span>\n            <\/span>\n          <\/button>\n        <\/div>\n      `;\n\n      document.body.appendChild(slide);\n\n      updatePanelsSpacing();\n      updateBodyOverflow();\n\n      requestAnimationFrame(()=>{ slide.style.transform='translateX(0)'; });\n\n      const closeBtn = slide.querySelector('.image-slide-close');\n\n      function closeSlide(){\n        if(slide._closing) return;\n        slide._closing = true;\n        slide.style.transform='translateX(-100%)';\n        slide.addEventListener('transitionend', function(){\n          slide.remove();\n          updateBodyOverflow();\n          updatePanelsSpacing();\n        }, {once:true});\n        setTimeout(()=>{\n          if(slide.isConnected){\n            slide.remove();\n            updateBodyOverflow();\n            updatePanelsSpacing();\n          }\n        },450);\n        try{ if(openerButton) openerButton.focus(); }catch(e){}\n      }\n\n      slide._closePanel = closeSlide;\n\n      closeBtn.addEventListener('click', function(e){\n        e.preventDefault();\n        e.stopPropagation();\n        closeSlide();\n      });\n\n      slide.addEventListener('keydown', function(ev){\n        if(ev.key === 'Escape'){ closeSlide(); }\n      });\n\n      const resizeObserver = new ResizeObserver(()=> updatePanelsSpacing());\n      try{\n        const rightPanel = document.querySelector('.ask-slide-panel');\n        if(rightPanel) resizeObserver.observe(rightPanel);\n      }catch(e){}\n\n      slide.addEventListener('DOMNodeRemoved', function(){\n        try{ resizeObserver.disconnect(); }catch(e){}\n      });\n\n      const downloadBtn = slide.querySelector('.image-download-btn');\n      if(downloadBtn){\n        downloadBtn.addEventListener('click', async function(ev){\n          ev.preventDefault();\n          ev.stopPropagation();\n          try{\n            const imgEl = slide.querySelector('img');\n            if(!imgEl) return;\n            const src = imgEl.src || imgEl.getAttribute('data-src') || '';\n            if(!src) return;\n\n            if(src.startsWith('data:')){\n              const a = document.createElement('a');\n              a.href = src;\n              a.download = (src.split(',')[0].match(\/image\\\/([a-zA-Z0-9.+-]+)\/) || ['image','png'])[1] || 'image';\n              document.body.appendChild(a);\n              a.click();\n              a.remove();\n              return;\n            }\n\n            try{\n              const url = new URL(src, window.location.href);\n              if(url.origin === window.location.origin){\n                const a = document.createElement('a');\n                a.href = src;\n                a.download = (url.pathname.split('\/').pop() || 'image.jpg');\n                document.body.appendChild(a);\n                a.click();\n                a.remove();\n                return;\n              }\n            }catch(errUrl){}\n\n            try{\n              const resp = await fetch(src, {mode:'cors'});\n              if(!resp.ok) throw new Error('fetch failed ' + resp.status);\n              const blob = await resp.blob();\n              const blobUrl = URL.createObjectURL(blob);\n              const filename = (src.split('\/').pop() || 'image.jpg').split('?')[0];\n              const a2 = document.createElement('a');\n              a2.href = blobUrl;\n              a2.download = filename;\n              document.body.appendChild(a2);\n              a2.click();\n              a2.remove();\n              setTimeout(()=> URL.revokeObjectURL(blobUrl), 5000);\n              return;\n            }catch(errFetch){\n              window.open(src, '_blank');\n            }\n          }catch(errAll){\n            console.error('download error', errAll);\n            const imgEl = slide.querySelector('img');\n            if(imgEl && imgEl.src) window.open(imgEl.src, '_blank');\n          }\n        });\n      }\n\n      const envelopeBtn = slide.querySelector('.image-envelope-btn');\n      if(envelopeBtn){\n        envelopeBtn.addEventListener('click', function(ev){\n          ev.preventDefault();\n          ev.stopPropagation();\n          openEmailForm(slide, openerButton, unitName, area);\n        });\n      }\n\n    }catch(err){ console.error(err); }\n  }\n\n  function openEmailForm(imageSlideEl, openerButton, unitName, area){\n    try{\n      const existing = imageSlideEl.querySelector('.image-email-form');\n\n      if(existing){\n        existing.remove();\n        return;\n      }\n\n      const imgEl = imageSlideEl.querySelector('img');\n      const currentImageSrc = imgEl ? (imgEl.src || imgEl.getAttribute('data-src') || '') : '';\n\n      const formWrapper = document.createElement('div');\n      formWrapper.className = 'image-email-form';\n\n      formWrapper.style.position = 'absolute';\n      formWrapper.style.left = '12px';\n      formWrapper.style.right = '12px';\n      formWrapper.style.bottom = '92px';\n      formWrapper.style.width = 'auto';\n      formWrapper.style.maxWidth = '420px';\n      formWrapper.style.maxHeight = 'calc(100% - 170px)';\n      formWrapper.style.overflowY = 'auto';\n      formWrapper.style.background = '#ffffff';\n      formWrapper.style.border = '1px solid rgba(0,0,0,0.06)';\n      formWrapper.style.boxShadow = '0 10px 25px rgba(0,0,0,0.08)';\n      formWrapper.style.padding = '14px';\n      formWrapper.style.borderRadius = '12px';\n      formWrapper.style.zIndex = '100003';\n      formWrapper.style.fontFamily = \"'Rosario', sans-serif\";\n\n      formWrapper.innerHTML = `\n        <div style=\"font-weight:700;margin-bottom:10px;font-size:14px;color:#111\">\n          Wy\u015blij kart\u0119 lokalu na email\n        <\/div>\n\n        <form class=\"image-email-form-el\" style=\"display:flex;flex-direction:column;gap:10px;\">\n          <input \n            name=\"email\" \n            type=\"email\" \n            required \n            placeholder=\"Tw\u00f3j e-mail\"\n            style=\"\n              background:#fff;\n              padding:11px;\n              border-radius:8px;\n              border:1px solid #e5e5e5;\n              font-size:14px;\n              outline:none;\n            \"\n            onfocus=\"this.style.borderColor='#636C4D'\"\n            onblur=\"this.style.borderColor='#e5e5e5'\"\n          \/>\n\n          <div style=\"display:flex;justify-content:center;\">\n            <div class=\"cf-turnstile-image\" data-sitekey=\"0x4AAAAAACpJEFmToYMvQw2v\"><\/div>\n          <\/div>\n\n          <input type=\"hidden\" name=\"image_src\" value=\"${escapeHtml(currentImageSrc)}\" \/>\n          <input type=\"hidden\" name=\"unit_name\" value=\"${escapeHtml(unitName||'')}\" \/>\n          <input type=\"hidden\" name=\"unit_area\" value=\"${escapeHtml(area||'')}\" \/>\n\n          <button type=\"submit\"\n            style=\"\n              margin-top:4px;\n              font-size:14px;\n              padding:10px 14px;\n              background:#636C4D;\n              color:#fff;\n              border:none;\n              border-radius:8px;\n              cursor:pointer;\n              transition:opacity 0.2s ease;\n              width:100%;\n              display:block;\n            \"\n            onmouseover=\"this.style.opacity='0.85'\"\n            onmouseout=\"this.style.opacity='1'\"\n          >\n            wy\u015blij\n          <\/button>\n        <\/form>\n      `;\n\n      imageSlideEl.appendChild(formWrapper);\n\n      const emailInput = formWrapper.querySelector('input[name=\"email\"]');\n      emailInput && emailInput.focus();\n\n      try{\n        const ts = formWrapper.querySelector('.cf-turnstile-image');\n        if(window.turnstile && ts){\n          window.turnstile.render(ts, {\n            sitekey: ts.getAttribute('data-sitekey') || \"0x4AAAAAACpJEFmToYMvQw2v\",\n            theme: \"light\"\n          });\n        }\n      }catch(e){\n        console.error('turnstile render image form error', e);\n      }\n\n      const formEl = formWrapper.querySelector('.image-email-form-el');\n      formEl.addEventListener('submit', async function(ev){\n        ev.preventDefault();\n        ev.stopPropagation();\n\n        const submitBtn = formEl.querySelector('button[type=\"submit\"]');\n        submitBtn && (submitBtn.disabled = true);\n\n        try{\n          const fd = new FormData(formEl);\n          fd.append('action', 'send_image_preview_email');\n          fd.append('nonce', (window.MyAjax && window.MyAjax.nonce) ? window.MyAjax.nonce : '');\n\n          const resp = await fetch((window.MyAjax && window.MyAjax.ajax_url) || '\/wp-admin\/admin-ajax.php', {\n            method: 'POST',\n            body: fd,\n            credentials: 'same-origin'\n          });\n\n          let json = null;\n          try{ json = await resp.json(); }catch(e){}\n\n          if(json && json.success){\n            showToast(json.data || 'Wys\u0142ano \u2014 dzi\u0119kujemy!');\n            formWrapper.remove();\n          } else {\n            showToast('B\u0142\u0105d: ' + ((json && json.data) || 'Nie uda\u0142o si\u0119 wys\u0142a\u0107.'));\n          }\n\n        }catch(err){\n          console.error(err);\n          showToast('B\u0142\u0105d: Nie uda\u0142o si\u0119 wys\u0142a\u0107.');\n        }finally{\n          submitBtn && (submitBtn.disabled = false);\n        }\n      });\n\n    }catch(err){\n      console.error(err);\n    }\n  }\n\n  document.querySelectorAll('.ask-row-btn').forEach(btn=>{\n    btn.addEventListener('click', function(e){\n      e.preventDefault();\n      e.stopPropagation();\n      const unit = btn.getAttribute('data-unit') || '\u2014';\n      openAskSlide(unit, btn);\n    });\n  });\n\n  document.querySelectorAll('.show-image-btn').forEach(btn=>{\n    btn.addEventListener('click', function(e){\n      e.preventDefault();\n      e.stopPropagation();\n      const unit = btn.getAttribute('data-unit') || '\u2014';\n      const area = btn.getAttribute('data-area') || '';\n      openImageSlide(unit, btn, null, area);\n    });\n  });\n\n  const bodyObserver = new MutationObserver(()=> updatePanelsSpacing());\n  bodyObserver.observe(document.body, {childList:true, subtree:false});\n\n  window.addEventListener('resize', updatePanelsSpacing);\n\n});\n\nfunction showToast(message){\n  const toast = document.createElement('div');\n  toast.textContent = message;\n  toast.style.position = 'fixed';\n  toast.style.bottom = '20px';\n  toast.style.left = '50%';\n  toast.style.transform = 'translateX(-50%)';\n  toast.style.background = '#fff';\n  toast.style.color = '#111';\n  toast.style.padding = '10px 18px';\n  toast.style.borderRadius = '6px';\n  toast.style.boxShadow = '0 2px 12px rgba(0,0,0,0.15)';\n  toast.style.fontSize = '13px';\n  toast.style.fontWeight = '600';\n  toast.style.zIndex = '100000';\n  toast.style.opacity = '0';\n  toast.style.transition = 'opacity 0.3s ease, transform 0.3s ease';\n\n  document.body.appendChild(toast);\n\n  requestAnimationFrame(()=>{\n    toast.style.opacity = '1';\n    toast.style.transform = 'translateX(-50%) translateY(0)';\n  });\n\n  setTimeout(()=>{\n    toast.style.opacity = '0';\n    toast.style.transform = 'translateX(-50%) translateY(10px)';\n    toast.addEventListener('transitionend', ()=>toast.remove());\n  },2500);\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Plan Osiedla Wr\u00f3\u0107 do wyboru etapu Dost\u0119pny Zarezerwowany Sprzedany Nast\u0119pny etap \u0142adowanie&#8230; poka\u017c dost\u0119pno\u015b\u0107 lokali \u2039 loading\u2026 \u203a Lokale dost\u0119pne w ofercie. Ceny oraz dost\u0119pno\u015b\u0107 mog\u0105 ulec zmianie.<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_eb_attr":"","footnotes":""},"class_list":["post-4976","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-json\/wp\/v2\/pages\/4976","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-json\/wp\/v2\/comments?post=4976"}],"version-history":[{"count":185,"href":"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-json\/wp\/v2\/pages\/4976\/revisions"}],"predecessor-version":[{"id":5506,"href":"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-json\/wp\/v2\/pages\/4976\/revisions\/5506"}],"wp:attachment":[{"href":"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-json\/wp\/v2\/media?parent=4976"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}