{"id":4771,"date":"2026-03-19T09:21:01","date_gmt":"2026-03-19T09:21:01","guid":{"rendered":"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/?page_id=4771"},"modified":"2026-03-23T10:53:06","modified_gmt":"2026-03-23T10:53:06","slug":"plan-osiedla-wersja-svg-mobilna","status":"publish","type":"page","link":"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/plan-osiedla-wersja-svg-mobilna\/","title":{"rendered":"Plan osiedla &#8211; wersja SVG mobilna"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"4771\" class=\"elementor elementor-4771\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9a11dcf 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=\"9a11dcf\" 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-f1370ad elementor-widget elementor-widget-html\" data-id=\"f1370ad\" 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\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  margin:0;\n  background:#FFFCF8;\n  font-family:'Rosario', system-ui;\n}\n\n\n.wrap{\n  display:flex;\n  flex-direction:column;\n  align-items:center;\n}\n\n.viewer{\n  width:100vw;\n  aspect-ratio:8064 \/ 4536;\n  position:relative;\n  overflow:hidden;\n  background:#000;\n}\n\n.content{\n  position:absolute;\n  inset:0;\n}\n\n.content img{\n  position:absolute;\n  inset:0;\n  width:100%;\n  height:100%;\n  object-fit:contain;\n  pointer-events:none;\n}\n\n.content svg{\n  position:absolute;\n  inset:0;\n  width:100%;\n  height:100%;\n}\n\n.etap-group{\n  cursor:pointer;\n}\n\n.etap-label{\n  position:absolute;\n  transform:translate(-50%,-50%);\n  background:#fff;\n\n  font-size:clamp(9px, 1.8vw, 13px);\n  padding:clamp(4px, 1vw, 8px) clamp(6px, 1.5vw, 10px);\n\n  border-radius:8px;\n  font-weight:600;\n  pointer-events:none;\n  white-space:nowrap;\n\n  box-shadow:0 6px 18px rgba(0,0,0,0.15);\n}\n\n.etap-label .state{\n  display:block;\n  font-size:clamp(8px, 1.6vw, 11px);\n  margin-top:2px;\n  font-weight:500;\n}\n.buttons {\n  display: flex;\n  gap:15px;\n  margin:25px;\n  align-content: center;\n  align-items:center;\n  justify-content:center;\n}\n.buttons button{\n  border:0;\n  border-radius:5px;\n  padding: clamp(10px,1.8vw,14px) clamp(16px,2.6vw,22px);\n  border-radius:10px;\n  font-family: Cormorant;\n  font-weight:600;\n  font-size:clamp(20px,1.9vw,23px);\n  min-width:33.3%;\n  text-align: center;\n  justify-content: center;\n  align-items: center;\n  display:flex;\n\n\n  transition: all .18s ease;\n  box-shadow:0 6px 16px rgba(0,0,0,0.08);\n}\n\n.buttons button.active{\n  background:#B4FF00;\n  color:#1a1a1a;\n  cursor:pointer;\n}\n\n.buttons button.active:hover{\n  transform:translateY(-3px);\n  box-shadow:0 10px 24px rgba(0,0,0,0.12);\n}\n\n.buttons button.disabled{\n  background:#B8B1A8;\n  color:#555;\n  cursor:not-allowed;\n  pointer-events:none;\n  box-shadow:none;\n  opacity:0.7;\n}\n\n.buttons button:active{\n  transform:translateY(0);\n  box-shadow:0 4px 10px rgba(0,0,0,0.08);\n}\n\n\n\n<\/style>\n\n<div class=\"wrap\">\n    <h2 style=\"font-family:Cormorant; color:#6E665E; font-weight:400;font-size:36px;margin-top:40px;\">Plan Osiedla<\/h2>\n    <h2 style=\"font-family:Cormorant; color:#6E665E; font-weight:600;font-size:26px;margin-top:5px;\">Wybierz etap<\/h2>\n  <div class=\"viewer\" id=\"viewer\">\n    <div class=\"content\" id=\"content\"><\/div>\n  <\/div>\n  <div class=\"buttons\">\n  <button id=\"btn-etap-1\">Etap 1<\/button>\n  <button id=\"btn-etap-2\">Etap 2<\/button>\n  <button id=\"btn-etap-3\">Etap 3<\/button>\n<\/div>\n<\/div>\n\n\n<script>\n(() => {\n\nconst LABELS_URL = 'https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-content\/uploads\/2026\/03\/etapowanie_etykiety.svg';\nconst BG_URL = 'https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-content\/uploads\/2026\/03\/etapowanie_tlo_2-scaled.png';\nconst SVG_URL = 'https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-content\/uploads\/2026\/03\/etapowanie_obrys.svg';\n\n\/\/ EDYCJA STANU ETAPU\n\/\/ \"dostepny\" \"zakonczone\" \"nastepny etap\"\nconst ETAP_STATE = {\n  1: 'dostepny',\n  2: 'dostepny',\n  3: 'dostepny',\n};\nfunction initButtons(){\n  [1,2,3].forEach(etap => {\n    const btn = document.getElementById(`btn-etap-${etap}`);\n    const state = ETAP_STATE[etap] || 'dostepny';\n    const isClickable = STATE_STYLE[state].clickable;\n\n    if(isClickable){\n      btn.classList.add('active');\n\n      if(state === 'dostepny'){\n        btn.style.background = '#636C4D';\n        btn.style.color = '#fff'; \n      }\n\n      btn.onclick = () => {\n        window.location.href =\n          \"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/plan-osiedla-wersja-svg-\" + etap + \"\/\";\n      };\n    } else {\n      btn.classList.add('disabled');\n      btn.disabled = true;\n    }\n  });\n}\n\nconst STATE_STYLE = {\n  'dostepny': {\n    fill: '#B4FF00',\n    stroke: '#000',\n    clickable: true,\n    label: 'dost\u0119pny'\n  },\n  'zakonczone': {\n    fill: '#B8B1A8',\n    stroke: '#000',\n    clickable: false,\n    label: 'zako\u0144czone'\n  },\n  'nastepny etap': {\n    fill: '#B8B1A8',\n    stroke: '#000',\n    clickable: false,\n    label: 'nast\u0119pny etap'\n  }\n};\n\nconst viewer = document.getElementById('viewer');\nconst content = document.getElementById('content');\n\nfunction getEtapNumber(g){\n  const m = g.id.match(\/\\d+\/);\n  return m ? Number(m[0]) : null;\n}\n\nfunction applyStyle(group, state){\n  const s = STATE_STYLE[state] || STATE_STYLE['dostepny'];\n\n  group.querySelectorAll('*').forEach(el=>{\n    if(el.tagName !== 'g'){\n      el.style.fill = s.fill;\n      el.style.stroke = s.stroke;\n    }\n  });\n\n  group.style.pointerEvents = s.clickable ? 'all' : 'none';\n  group.style.cursor = s.clickable ? 'pointer' : 'default';\n}\n\nfunction createLabel(group, etap, state, showLabels = false){\n  if(!showLabels) return;\n\n}\n\nasync function init(){\n  content.innerHTML = '';\n\n  const img = document.createElement('img');\n  img.src = BG_URL;\n  content.appendChild(img);\n\n  const res = await fetch(SVG_URL);\n  const text = await res.text();\n\n  const doc = new DOMParser().parseFromString(text,'image\/svg+xml');\n  const svg = document.importNode(doc.documentElement,true);\n\n  content.appendChild(svg);\nconst labelsRes = await fetch(LABELS_URL);\nconst labelsText = await labelsRes.text();\n\nconst labelsDoc = new DOMParser().parseFromString(labelsText,'image\/svg+xml');\nconst labelsSvg = document.importNode(labelsDoc.documentElement, true);\n\nlabelsSvg.style.position = 'absolute';\nlabelsSvg.style.inset = '0';\nlabelsSvg.style.width = '100%';\nlabelsSvg.style.height = '100%';\nlabelsSvg.style.pointerEvents = 'none'; \nconst labelGroups = Array.from(labelsSvg.querySelectorAll('g'))\n  .filter(g => \/^etykieta\\d+$\/i.test(g.id));\n  labelGroups.forEach(group => {\n  const etap = getEtapNumber(group);\n  const state = ETAP_STATE[etap] || 'dostepny';\n\n  const isClickable = STATE_STYLE[state].clickable;\n\n  if(isClickable){\n    group.style.pointerEvents = 'all';\n    group.style.cursor = 'pointer';\n\n    group.addEventListener('click', () => {\n      window.location.href =\n        \"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/plan-osiedla-wersja-svg-\" + etap + \"\/\";\n    });\n  } else {\n    group.style.pointerEvents = 'none';\n  }\n});\n\ncontent.appendChild(labelsSvg);\n\n  const groups = Array.from(svg.querySelectorAll('g'))\n    .filter(g => \/^etap\\d+$\/i.test(g.id));\n\n  groups.forEach(group=>{\n    const etap = getEtapNumber(group);\n    const state = ETAP_STATE[etap] || 'dostepny';\n\n    applyStyle(group, state);\n\n    createLabel(group, etap, state);\n\n    if(STATE_STYLE[state].clickable){\n      group.addEventListener('click', () => {\n        window.location.href =\n          \"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/plan-osiedla-wersja-svg-\" + etap + \"\/\";\n      });\n    }\n  });\n  initButtons();\n}\n\ninit();\n\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-39743a2 elementor-widget elementor-widget-html\" data-id=\"39743a2\" 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.domki-table-scroll{\n  overflow-x:auto;\n  overflow-y:auto;\n  -webkit-overflow-scrolling:touch;\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  function formatDomkiArea(value, unit) {\n    if (value === null || value === undefined || String(value).trim() === '') return '-';\n    const area = Number(String(value).replace(',', '.'));\n    if (!Number.isFinite(area)) return '-';\n    return new Intl.NumberFormat('pl-PL', { maximumFractionDigits: 2 }).format(area) + ' ' + unit;\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;\">${escapeHtml(window.domkiLabels.plotArea)}<\/th>\n        <th style=\"padding:10px;border:1px solid #ddd;text-align:center;background:#f7f7f7;vertical-align:middle;\">${escapeHtml(window.domkiLabels.gardenArea)}<\/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 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 plotArea = formatDomkiArea(d.plot_area_m2, \"m\u00b2\");\n    let ogrod = formatDomkiArea(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(plotArea)}<\/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\nfunction 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        const imgElImmediate = slide.querySelector('img');\n        if(imgElImmediate){\n            imgElImmediate.addEventListener('error', function onErr(){\n                this.removeEventListener('error', onErr);\n                this.src = imageSrc || defaultImg;\n            });\n        }\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 Wybierz etap Etap 1 Etap 2 Etap 3 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-4771","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-json\/wp\/v2\/pages\/4771","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=4771"}],"version-history":[{"count":211,"href":"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-json\/wp\/v2\/pages\/4771\/revisions"}],"predecessor-version":[{"id":5497,"href":"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-json\/wp\/v2\/pages\/4771\/revisions\/5497"}],"wp:attachment":[{"href":"https:\/\/klepper.com.pl\/inwestycje\/osiedle-skandynawskie\/wp-json\/wp\/v2\/media?parent=4771"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}