{"id":12,"date":"2026-08-11T17:32:42","date_gmt":"2026-08-11T17:32:42","guid":{"rendered":"https:\/\/fizjoterapia.marcinbilecki.pl\/?page_id=12"},"modified":"2026-08-11T18:38:34","modified_gmt":"2026-08-11T18:38:34","slug":"strona-glowna","status":"publish","type":"page","link":"https:\/\/fizjoterapia.marcinbilecki.pl\/","title":{"rendered":"Strona g\u0142\u00f3wna"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"12\" class=\"elementor elementor-12\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5a72f7d e-con-full e-flex e-con e-parent\" data-id=\"5a72f7d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-126fbc0 elementor-widget elementor-widget-html\" data-id=\"126fbc0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div class=\"fz-site\" id=\"fz-strona\">\n\n<style>\n\/* ---------- Font (jedna rodzina, dwa kroje wagowe) ---------- *\/\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Manrope:wght@400;500;700;800&display=swap');\n\n\/* ---------- Zmienne kolorystyczne (jeden akcent: spokojny turkus\/ziele\u0144) ---------- *\/\n.fz-site{\n  --fz-akcent:#0e7c6b;          \/* g\u0142\u00f3wny kolor akcentu *\/\n  --fz-akcent-ciemny:#0a5c50;   \/* ciemniejszy wariant (hover) *\/\n  --fz-akcent-jasny:#e6f2ef;    \/* bardzo jasne t\u0142o akcentowe *\/\n  --fz-tusz:#22302d;            \/* kolor tekstu (ciep\u0142a czer\u0144) *\/\n  --fz-tusz-slaby:#5c6b67;      \/* tekst drugorz\u0119dny *\/\n  --fz-tlo:#fbfcfb;             \/* t\u0142o strony (lekko tonowana biel) *\/\n  --fz-tlo-alt:#e2f0e9;         \/* t\u0142o sekcji naprzemiennych (mi\u0119towa ziele\u0144 \u2014 kontrast) *\/\n  --fz-linia:#dfe8e5;           \/* delikatne obramowania *\/\n  --fz-naglowek:64px;           \/* wysoko\u015b\u0107 sticky nag\u0142\u00f3wka (pasek demo + menu) *\/\n  font-family:'Manrope',system-ui,-apple-system,'Segoe UI',sans-serif;\n  color:var(--fz-tusz);\n  background:var(--fz-tlo);\n  line-height:1.6;\n  font-size:16px;\n  -webkit-font-smoothing:antialiased;\n}\n\/* ---------- Reset lokalny (tylko wewn\u0105trz .fz-site) ---------- *\/\n.fz-site *,.fz-site *::before,.fz-site *::after{box-sizing:border-box;margin:0;padding:0}\n.fz-site img{max-width:100%;display:block}\n.fz-site a{color:var(--fz-akcent);text-decoration:none}\n.fz-site a:hover{color:var(--fz-akcent-ciemny)}\n.fz-site button{font:inherit;cursor:pointer}\n\n\/* ---------- Uk\u0142ad: centralna kolumna (dobra te\u017c do pionowych kadr\u00f3w 9:16) ---------- *\/\n.fz-wrap{max-width:1060px;margin:0 auto;padding:0 20px}\n.fz-wrap-waska{max-width:720px;margin:0 auto;padding:0 20px}\n\n\/* ---------- Pasek DEMO (sticky, dyskretny) ---------- *\/\n.fz-demo-pasek{\n  position:sticky;top:0;z-index:60;\n  background:var(--fz-tusz);color:#e8efed;\n  font-size:11.5px;letter-spacing:.06em;text-transform:uppercase;\n  text-align:center;padding:6px 12px;font-weight:500;\n}\n.fz-demo-pasek a{color:#9fd8cc;font-weight:700}\n.fz-demo-pasek a:hover{color:#fff}\n\n\/* ---------- Menu (sticky pod paskiem demo) ---------- *\/\n.fz-nav{\n  position:sticky;top:29px;z-index:50;\n  background:rgba(251,252,251,.92);backdrop-filter:blur(8px);\n  border-bottom:1px solid var(--fz-linia);\n}\n.fz-nav-srodek{max-width:1060px;margin:0 auto;padding:0 20px;display:flex;align-items:center;justify-content:space-between;min-height:58px;gap:16px}\n.fz-logo{display:flex;align-items:center;gap:10px;font-weight:800;font-size:17px;color:var(--fz-tusz);letter-spacing:-.01em}\n.fz-logo-znak{width:34px;height:34px;border-radius:50%;background:var(--fz-akcent);color:#fff;display:flex;align-items:center;justify-content:center;flex:none}\n.fz-menu{display:flex;gap:4px;list-style:none}\n.fz-menu a{display:block;padding:8px 12px;border-radius:8px;font-size:14.5px;font-weight:500;color:var(--fz-tusz)}\n.fz-menu a:hover{background:var(--fz-akcent-jasny);color:var(--fz-akcent-ciemny)}\n.fz-menu a:focus-visible{outline:2px solid var(--fz-akcent);outline-offset:2px}\n.fz-nav-cta{display:inline-block;background:var(--fz-akcent);color:#fff !important;padding:9px 18px;border-radius:999px;font-size:14px;font-weight:700}\n.fz-nav-cta:hover{background:var(--fz-akcent-ciemny)}\n.fz-hamburger{display:none;background:none;border:1px solid var(--fz-linia);border-radius:8px;width:42px;height:42px;flex-direction:column;align-items:center;justify-content:center;gap:5px}\n.fz-hamburger span{display:block;width:20px;height:2px;background:var(--fz-tusz);transition:transform .2s,opacity .2s}\n.fz-hamburger:focus-visible{outline:2px solid var(--fz-akcent);outline-offset:2px}\n\n\/* ---------- Przyciski ---------- *\/\n.fz-btn{\n  display:inline-block;background:var(--fz-akcent);color:#fff !important;\n  padding:15px 34px;border-radius:999px;font-weight:700;font-size:16.5px;\n  border:none;transition:background .2s,transform .2s;\n}\n.fz-btn:hover{background:var(--fz-akcent-ciemny);transform:translateY(-1px)}\n.fz-btn:focus-visible{outline:3px solid var(--fz-akcent);outline-offset:3px}\n\n\/* ---------- Placeholder na zdj\u0119cia (do \u0142atwej podmiany) ---------- *\/\n.fz-foto{\n  background:\n    repeating-linear-gradient(135deg,rgba(14,124,107,.10) 0 14px,rgba(14,124,107,.045) 14px 28px),\n    var(--fz-akcent-jasny);\n  border:1px dashed rgba(14,124,107,.4);border-radius:14px;\n  display:flex;align-items:center;justify-content:center;text-align:center;\n  color:var(--fz-akcent-ciemny);font-family:ui-monospace,'Cascadia Mono',Menlo,monospace;\n  font-size:13px;padding:16px;line-height:1.5;\n}\n\n\/* ---------- Nag\u0142\u00f3wki sekcji ---------- *\/\n.fz-sekcja{padding:76px 0}\n.fz-sekcja-alt{background:var(--fz-tlo-alt)}\n.fz-nadtytul{color:var(--fz-akcent);font-weight:800;font-size:13px;letter-spacing:.14em;text-transform:uppercase;margin-bottom:10px;text-align:center}\n.fz-h2{font-size:clamp(26px,4vw,36px);font-weight:800;letter-spacing:-.02em;line-height:1.2;text-align:center;margin-bottom:14px;text-wrap:balance}\n.fz-lead{color:var(--fz-tusz-slaby);text-align:center;max-width:620px;margin:0 auto 44px;font-size:17px;text-wrap:pretty}\n\n\/* ---------- HERO (zdj\u0119cie w tle, tekst po lewej, pasek statystyk na dole) ---------- *\/\n.fz-hero{\n  position:relative;\n  min-height:calc(100vh - 89px);  \/* pomniejszone o sticky nag\u0142\u00f3wek (pasek demo 30px + menu 59px) \u2014 ca\u0142y hero w jednym widoku *\/\n  display:flex;flex-direction:column;\n  overflow:hidden;      \/* dodane: kadruje warstwy t\u0142a (parallax\/spotlight) w obr\u0119bie hero *\/\n  isolation:isolate;    \/* dodane: w\u0142asny kontekst nak\u0142adania \u2014 warstwa t\u0142a z-index:-1 nie ucieka za sekcj\u0119 *\/\n  \/* Uwaga: t\u0142o hero przeniesione do osobnej warstwy .fz-hero-tlo (poni\u017cej),\n     \u017ceby da\u0142o si\u0119 je parallaxowa\u0107 przez transform bez ruszania tre\u015bci. *\/\n}\n\/* delikatna jasna nak\u0142adka od lewej \u2014 poprawia czytelno\u015b\u0107 tekstu, nie zas\u0142ania postaci po prawej *\/\n.fz-hero::before{\n  content:\"\";position:absolute;inset:0;pointer-events:none;\n  background:linear-gradient(90deg,\n    rgba(251,252,251,.94) 0%,\n    rgba(251,252,251,.85) 30%,\n    rgba(251,252,251,.45) 52%,\n    rgba(251,252,251,0) 70%);\n}\n.fz-hero-tresc{position:relative;z-index:1;flex:1;display:flex;align-items:center}\n.fz-hero-srodek{max-width:1060px;margin:0 auto;padding:16px 20px;width:100%}\n.fz-hero-tekst{max-width:520px;text-align:left}   \/* tekst w lewej po\u0142owie *\/\n.fz-hero h1{font-size:clamp(32px,5.4vw,54px);font-weight:800;letter-spacing:-.025em;line-height:1.1;margin:18px 0 16px;text-wrap:balance;color:var(--fz-tusz)}\n.fz-hero h1 em{font-style:normal;color:var(--fz-akcent)}\n.fz-hero-nazwa{display:inline-flex;align-items:center;gap:8px;background:rgba(255,255,255,.85);border:1px solid var(--fz-linia);border-radius:999px;padding:7px 16px;font-size:13.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--fz-akcent-ciemny)}\n.fz-hero-pod{color:var(--fz-tusz-slaby);font-size:18px;max-width:440px;margin:0 0 30px;text-wrap:pretty}\n\n\/* pasek statystyk (marquee) na dole hero \u2014 ci\u0105g\u0142a p\u0119tla, bez pauzy na hover *\/\n.fz-hero-pasek{position:relative;z-index:1;overflow:hidden;background:var(--fz-akcent);color:#fff}\n.fz-hero-pasek-tor{display:flex;width:max-content;animation:fz-statystyki 40s linear infinite}\n.fz-hero-pasek-grupa{display:flex;align-items:center;flex:none}\n.fz-stat{display:inline-flex;align-items:center;gap:14px;padding:14px 0;font-size:15px;font-weight:700;letter-spacing:.02em;white-space:nowrap}\n.fz-stat::after{content:\"\";display:inline-block;width:6px;height:6px;border-radius:50%;background:rgba(255,255,255,.6);margin:0 26px}\n\/* przesuw o dok\u0142adnie jedn\u0105 kopi\u0119 (-50% toru = szeroko\u015b\u0107 jednej grupy) \u2014 p\u0119tla bez przerwy *\/\n@keyframes fz-statystyki{from{transform:translateX(0)}to{transform:translateX(-50%)}}\n@media (prefers-reduced-motion:reduce){\n  .fz-hero{min-height:auto}\n  .fz-hero-pasek-tor{animation:none;width:100%;justify-content:center}\n  .fz-hero-pasek-grupa{flex-wrap:wrap;justify-content:center}\n}\n\n\/* ---------- O GABINECIE ---------- *\/\n.fz-o-siatka{display:grid;grid-template-columns:1fr 1fr;gap:44px;align-items:center}\n.fz-o-tekst .fz-h2,.fz-o-tekst .fz-nadtytul{text-align:left}\n.fz-o-tekst p{color:var(--fz-tusz-slaby);margin-bottom:26px;text-wrap:pretty}\n.fz-o-foto-blok{position:relative}\n.fz-o-foto{aspect-ratio:3\/4;min-height:320px;border-radius:14px;background-image:url('https:\/\/fizjoterapia.marcinbilecki.pl\/wp-content\/uploads\/2026\/08\/zespolfizjoterapia.png');background-size:cover;background-position:center top} \/* TODO: wgraj plik zespol-fizjoterapia.png do Biblioteki Medi\u00f3w WP i wklej jego URL powy\u017cej *\/\n\/* belka z podpisami zespo\u0142u \u2014 nak\u0142adka u do\u0142u zdj\u0119cia (desktop) *\/\n.fz-zespol{position:absolute;left:0;right:0;bottom:0;display:grid;grid-template-columns:repeat(4,1fr);\n  padding:44px 8px 12px;border-radius:0 0 14px 14px;\n  background:linear-gradient(to top,rgba(18,28,26,.9) 0%,rgba(18,28,26,.62) 55%,rgba(18,28,26,0) 100%)}\n.fz-podpis{text-align:center;padding:0 4px;line-height:1.25}\n.fz-podpis b{display:block;color:#fff;font-size:14px;font-weight:800}\n.fz-podpis small{display:block;color:#9fe0d2;font-size:11.5px;font-weight:600;margin-top:1px;text-wrap:balance}\n.fz-wyroznik{display:flex;gap:14px;align-items:flex-start;padding:14px 0;border-top:1px solid var(--fz-linia)}\n.fz-wyroznik:last-child{border-bottom:1px solid var(--fz-linia)}\n.fz-ikona{flex:none;width:44px;height:44px;border-radius:12px;background:var(--fz-akcent-jasny);color:var(--fz-akcent);display:flex;align-items:center;justify-content:center}\n.fz-wyroznik h3{font-size:16px;font-weight:800;margin-bottom:2px}\n.fz-wyroznik p{font-size:14.5px;margin:0;color:var(--fz-tusz-slaby)}\n\n\/* ---------- US\u0141UGI (wej\u015bcie stagger + mocny hover + subtelny ruch ikon) ---------- *\/\n.fz-uslugi{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}\n.fz-usluga{background:#fff;border:1px solid var(--fz-linia);border-radius:14px;padding:26px 24px;\n  \/* stan pocz\u0105tkowy do wjazdu przy scrollu (animujemy tylko transform + opacity) *\/\n  opacity:0;transform:translateY(28px);\n  transition:opacity .5s ease, transform .55s cubic-bezier(.22,1,.36,1),\n             box-shadow .3s ease, background .3s ease, border-color .3s ease}\n\/* po wej\u015bciu sekcji w widok: kafelki si\u0119 pokazuj\u0105, kolejno (stagger przez transition-delay) *\/\n.fz-uslugi.fz-widoczne .fz-usluga{opacity:1;transform:none}\n.fz-uslugi.fz-widoczne .fz-usluga:nth-child(2){transition-delay:.08s}\n.fz-uslugi.fz-widoczne .fz-usluga:nth-child(3){transition-delay:.16s}\n.fz-uslugi.fz-widoczne .fz-usluga:nth-child(4){transition-delay:.24s}\n.fz-uslugi.fz-widoczne .fz-usluga:nth-child(5){transition-delay:.32s}\n.fz-uslugi.fz-widoczne .fz-usluga:nth-child(6){transition-delay:.40s}\n\/* mocny hover: uniesienie, wyra\u017aniejszy cie\u0144, delikatny gradient w stron\u0119 akcentu *\/\n.fz-usluga:hover{transform:scale(1.045);border-color:var(--fz-akcent);\n  box-shadow:0 18px 38px rgba(14,124,107,.18);\n  background:linear-gradient(160deg,#fff 42%,var(--fz-akcent-jasny));\n  transition-delay:0s}\n.fz-usluga .fz-ikona{margin-bottom:16px;\n  \/* ci\u0105g\u0142e, powolne unoszenie ikony w p\u0119tli (element \u017cyje bez interakcji) *\/\n  animation:fz-unosi-ikone 3.6s ease-in-out infinite}\n.fz-usluga:nth-child(2) .fz-ikona{animation-delay:-.6s}\n.fz-usluga:nth-child(3) .fz-ikona{animation-delay:-1.2s}\n.fz-usluga:nth-child(4) .fz-ikona{animation-delay:-1.8s}\n.fz-usluga:nth-child(5) .fz-ikona{animation-delay:-2.4s}\n.fz-usluga:nth-child(6) .fz-ikona{animation-delay:-3s}\n\/* obr\u00f3t + powi\u0119kszenie ikony na hover (na svg, by nie kolidowa\u0142o z unoszeniem boxu) *\/\n.fz-usluga .fz-ikona svg{transition:transform .35s cubic-bezier(.34,1.56,.64,1)}\n.fz-usluga:hover .fz-ikona{background:var(--fz-akcent);color:#fff}\n.fz-usluga:hover .fz-ikona svg{transform:scale(1.18) rotate(-8deg)}\n@keyframes fz-unosi-ikone{0%,100%{transform:translateY(0)}50%{transform:translateY(-5px)}}\n\/* dost\u0119pno\u015b\u0107 z klawiatury: to samo pod\u015bwietlenie na focus *\/\n.fz-usluga:focus-within{transform:scale(1.045);border-color:var(--fz-akcent);box-shadow:0 18px 38px rgba(14,124,107,.18);transition-delay:0s}\n.fz-usluga h3{font-size:17px;font-weight:800;margin-bottom:6px}\n.fz-usluga p{font-size:14.5px;color:var(--fz-tusz-slaby);text-wrap:pretty}\n\/* przy prefers-reduced-motion: bez wjazd\u00f3w\/puls\u00f3w\/ruchu \u2014 tylko proste, statyczne pod\u015bwietlenie *\/\n@media (prefers-reduced-motion:reduce){\n  .fz-usluga{opacity:1;transform:none}\n  .fz-usluga:hover,.fz-usluga:focus-within{transform:none;box-shadow:0 6px 22px rgba(14,124,107,.12);background:#fff;border-color:var(--fz-akcent)}\n  .fz-usluga:hover .fz-ikona svg{transform:none}\n}\n\n\/* ---------- OPINIE (dwa przesuwaj\u0105ce si\u0119 pasy \u2013 marquee) ---------- *\/\n.fz-marq{position:relative;overflow:hidden;padding:14px 0;\n  \/* wygaszenie kraw\u0119dzi, \u017ceby karty \u201ewchodzi\u0142y\u201d p\u0142ynnie *\/\n  -webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);\n  mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);\n}\n.fz-marq+.fz-marq{margin-top:6px}\n.fz-marq-tor{display:flex;gap:18px;width:max-content;will-change:transform}\n.fz-marq-lewo .fz-marq-tor{animation:fz-przesuw-lewo 46s linear infinite}\n.fz-marq-prawo .fz-marq-tor{animation:fz-przesuw-prawo 46s linear infinite}\n\/* zatrzymanie po najechaniu \/ fokusie w obr\u0119bie pasa *\/\n.fz-marq:hover .fz-marq-tor,\n.fz-marq:focus-within .fz-marq-tor{animation-play-state:paused}\n@keyframes fz-przesuw-lewo{from{transform:translateX(0)}to{transform:translateX(-50%)}}\n@keyframes fz-przesuw-prawo{from{transform:translateX(-50%)}to{transform:translateX(0)}}\n.fz-opinia{flex:none;width:330px;background:#fff;border:1px solid var(--fz-linia);border-radius:14px;padding:24px 24px;display:flex;flex-direction:column;gap:12px;\n  transition:transform .25s ease,box-shadow .25s ease,border-color .25s ease;transform-origin:center}\n.fz-opinia:hover,.fz-opinia:focus-within{transform:scale(1.06);box-shadow:0 12px 30px rgba(14,124,107,.16);border-color:var(--fz-akcent);z-index:2;position:relative}\n.fz-gwiazdki{color:#e8a13a;font-size:17px;letter-spacing:2px}\n.fz-opinia blockquote{font-size:15px;color:var(--fz-tusz);text-wrap:pretty;flex:1}\n.fz-opinia figcaption{font-size:14px;font-weight:700;color:var(--fz-tusz-slaby)}\n@media (prefers-reduced-motion:reduce){\n  .fz-marq-lewo .fz-marq-tor,.fz-marq-prawo .fz-marq-tor{animation:none;flex-wrap:wrap;justify-content:center}\n}\n\n\/* ---------- CENNIK (kafelki powi\u0119kszaj\u0105ce si\u0119 po najechaniu) ---------- *\/\n.fz-cennik{max-width:900px;margin:0 auto;display:grid;grid-template-columns:repeat(2,1fr);gap:16px}\n.fz-cena{position:relative;background:#fff;border:1px solid var(--fz-linia);border-radius:14px;padding:22px 24px;\n  display:flex;flex-direction:column;gap:8px;\n  transition:transform .25s ease,box-shadow .25s ease,border-color .25s ease;transform-origin:center}\n.fz-cena:hover,.fz-cena:focus-within{transform:scale(1.045);box-shadow:0 14px 34px rgba(14,124,107,.16);border-color:var(--fz-akcent);z-index:2}\n.fz-cena-gora{display:flex;justify-content:space-between;align-items:baseline;gap:16px}\n.fz-cena-nazwa{font-weight:800;font-size:16.5px}\n.fz-cena-czas{display:block;font-size:12.5px;color:var(--fz-tusz-slaby);font-weight:600;text-transform:uppercase;letter-spacing:.06em;margin-top:3px}\n.fz-cena-kwota{font-weight:800;color:var(--fz-akcent-ciemny);white-space:nowrap;font-size:22px}\n.fz-cena-opis{font-size:14px;color:var(--fz-tusz-slaby);text-wrap:pretty;margin:0}\n.fz-cena-polecane{position:absolute;top:-10px;right:18px;background:var(--fz-akcent);color:#fff;font-size:11px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;padding:4px 10px;border-radius:999px}\n.fz-cena.fz-cena-wyroz{border-color:var(--fz-akcent);background:linear-gradient(180deg,var(--fz-akcent-jasny),#fff)}\n.fz-cennik-dopisek{text-align:center;color:var(--fz-tusz-slaby);font-size:13.5px;margin-top:20px}\n@media (max-width:640px){.fz-cennik{grid-template-columns:1fr}}\n\n\/* ---------- FAQ (natywne details\/summary \u2014 dost\u0119pne z klawiatury) ---------- *\/\n.fz-faq{max-width:720px;margin:0 auto;display:flex;flex-direction:column;gap:12px}\n.fz-faq details{background:#fff;border:1px solid var(--fz-linia);border-radius:12px;overflow:hidden}\n.fz-faq details[open]{border-color:var(--fz-akcent)}\n.fz-faq summary{list-style:none;display:flex;justify-content:space-between;align-items:center;gap:14px;padding:17px 22px;font-weight:700;font-size:15.5px;cursor:pointer}\n.fz-faq summary::-webkit-details-marker{display:none}\n.fz-faq summary:hover{color:var(--fz-akcent-ciemny)}\n.fz-faq summary:focus-visible{outline:2px solid var(--fz-akcent);outline-offset:-2px;border-radius:12px}\n.fz-faq-plus{flex:none;width:26px;height:26px;border-radius:50%;background:var(--fz-akcent-jasny);color:var(--fz-akcent);display:flex;align-items:center;justify-content:center;font-weight:800;font-size:16px;transition:transform .2s}\n.fz-faq details[open] .fz-faq-plus{transform:rotate(45deg)}\n.fz-faq-tresc{padding:0 22px 18px;color:var(--fz-tusz-slaby);font-size:14.5px;text-wrap:pretty}\n\n\/* ---------- TERMINARZ (interaktywny, demo) ---------- *\/\n.fz-terminarz{background:#fff;border:1px solid var(--fz-linia);border-radius:14px;padding:24px;min-width:0}\n.fz-terminarz h3{font-size:18px;font-weight:800;margin-bottom:4px}\n.fz-terminarz-pod{font-size:13.5px;color:var(--fz-tusz-slaby);margin-bottom:18px}\n.fz-terminarz-etyk{font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:var(--fz-tusz-slaby);margin:2px 0 8px}\n.fz-dni{display:flex;gap:8px;overflow-x:auto;padding:2px 2px 10px;scrollbar-width:thin;min-width:0}\n.fz-dzien{flex:none;width:60px;border:1px solid var(--fz-linia);background:var(--fz-tlo);border-radius:12px;padding:9px 4px;display:flex;flex-direction:column;align-items:center;gap:1px;transition:border-color .15s,background .15s}\n.fz-dzien:hover{border-color:var(--fz-akcent)}\n.fz-dzien:focus-visible{outline:2px solid var(--fz-akcent);outline-offset:2px}\n.fz-dzien-nazwa{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--fz-tusz-slaby)}\n.fz-dzien-nr{font-size:19px;font-weight:800;color:var(--fz-tusz)}\n.fz-dzien-mies{font-size:10.5px;color:var(--fz-tusz-slaby)}\n.fz-dzien[aria-pressed=\"true\"]{background:var(--fz-akcent);border-color:var(--fz-akcent)}\n.fz-dzien[aria-pressed=\"true\"] .fz-dzien-nazwa,.fz-dzien[aria-pressed=\"true\"] .fz-dzien-nr,.fz-dzien[aria-pressed=\"true\"] .fz-dzien-mies{color:#fff}\n.fz-sloty{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:6px}\n.fz-sloty-puste{grid-column:1\/-1;font-size:13.5px;color:var(--fz-tusz-slaby);padding:6px 2px}\n.fz-slot{border:1px solid var(--fz-linia);background:var(--fz-tlo);border-radius:10px;padding:11px 4px;font-size:14px;font-weight:700;color:var(--fz-tusz);transition:border-color .15s,background .15s,color .15s}\n.fz-slot:hover:not(:disabled){border-color:var(--fz-akcent);color:var(--fz-akcent-ciemny)}\n.fz-slot:focus-visible{outline:2px solid var(--fz-akcent);outline-offset:2px}\n.fz-slot[aria-pressed=\"true\"]{background:var(--fz-akcent);border-color:var(--fz-akcent);color:#fff}\n.fz-slot:disabled{opacity:.4;cursor:not-allowed;text-decoration:line-through}\n\n\/* --- przep\u0142yw rezerwacji --- *\/\n.fz-rezerwacja{margin-top:18px;border-top:1px solid var(--fz-linia);padding-top:18px}\n.fz-termin-wybor{display:none;background:var(--fz-akcent-jasny);border:1px solid var(--fz-akcent);border-radius:10px;padding:12px 16px;font-size:14.5px;color:var(--fz-akcent-ciemny);margin-bottom:14px}\n.fz-termin-wybor.fz-akt{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}\n.fz-termin-wybor strong{font-weight:800}\n.fz-termin-usun{background:none;border:none;color:var(--fz-akcent-ciemny);font-size:13px;font-weight:700;text-decoration:underline;padding:4px}\n.fz-termin-usun:hover{color:var(--fz-tusz)}\n.fz-termin-usun:focus-visible{outline:2px solid var(--fz-akcent);outline-offset:2px}\n.fz-btn-rezerwuj{width:100%;background:var(--fz-akcent);color:#fff;border:none;border-radius:999px;padding:16px 20px;font-weight:800;font-size:16px;letter-spacing:.03em;text-transform:uppercase;transition:background .2s,transform .2s}\n.fz-btn-rezerwuj:hover:not(:disabled){background:var(--fz-akcent-ciemny);transform:translateY(-1px)}\n.fz-btn-rezerwuj:focus-visible{outline:3px solid var(--fz-akcent);outline-offset:3px}\n.fz-btn-rezerwuj:disabled{background:#c8d5d1;color:#eef4f2;cursor:not-allowed}\n.fz-brakuje{font-size:12.5px;color:var(--fz-tusz-slaby);text-align:center;margin-top:10px;text-wrap:pretty}\n.fz-brakuje b{color:var(--fz-akcent-ciemny);font-weight:700}\n.fz-sukces{display:none;text-align:center}\n.fz-sukces-ikona{width:56px;height:56px;border-radius:50%;background:var(--fz-akcent);color:#fff;display:flex;align-items:center;justify-content:center;margin:0 auto 14px}\n.fz-sukces h4{font-size:19px;font-weight:800;margin-bottom:8px}\n.fz-sukces-termin{font-size:16px;font-weight:800;color:var(--fz-akcent-ciemny);margin-bottom:8px}\n.fz-sukces p{font-size:14px;color:var(--fz-tusz-slaby);margin-bottom:20px;text-wrap:pretty}\n.fz-btn-nowy{background:none;border:1px solid var(--fz-akcent);color:var(--fz-akcent-ciemny);border-radius:999px;padding:12px 26px;font-weight:700;font-size:14.5px;transition:background .2s}\n.fz-btn-nowy:hover{background:var(--fz-akcent-jasny)}\n.fz-btn-nowy:focus-visible{outline:2px solid var(--fz-akcent);outline-offset:2px}\n\n\/* ---------- KONTAKT (dwie kolumny: formularz+dane | terminarz) ---------- *\/\n.fz-kontakt-siatka{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:26px;align-items:start;max-width:980px;margin:0 auto}\n.fz-kontakt-lewo{display:flex;flex-direction:column;gap:22px}\n.fz-form{background:#fff;border:1px solid var(--fz-linia);border-radius:14px;padding:26px;display:flex;flex-direction:column;gap:15px}\n.fz-form h3{font-size:18px;font-weight:800;margin-bottom:-2px}\n.fz-pole label{display:block;font-size:13.5px;font-weight:700;margin-bottom:6px}\n.fz-pole input,.fz-pole textarea{\n  width:100%;border:1px solid var(--fz-linia);border-radius:10px;padding:12px 14px;\n  font:inherit;font-size:15px;color:var(--fz-tusz);background:var(--fz-tlo);\n}\n.fz-pole input:focus,.fz-pole textarea:focus{outline:2px solid var(--fz-akcent);outline-offset:0;border-color:var(--fz-akcent)}\n.fz-zgoda{display:flex;gap:10px;align-items:flex-start;font-size:12.5px;color:var(--fz-tusz-slaby)}\n.fz-zgoda input{margin-top:3px;width:16px;height:16px;accent-color:var(--fz-akcent);flex:none}\n.fz-zgoda input:focus-visible{outline:2px solid var(--fz-akcent);outline-offset:2px}\n.fz-dane{background:#fff;border:1px solid var(--fz-linia);border-radius:14px;padding:24px;display:flex;flex-direction:column;gap:16px}\n.fz-dana{display:flex;gap:14px;align-items:flex-start}\n.fz-dana h3{font-size:13px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:var(--fz-tusz-slaby);margin-bottom:2px}\n.fz-dana p{font-size:15.5px;font-weight:600}\n.fz-mapa{aspect-ratio:16\/9;min-height:170px;margin-top:2px}\n\/* sekcja Kontakt (dane + mapa) *\/\n.fz-kontakt2-siatka{display:grid;grid-template-columns:1fr 1.15fr;gap:26px;align-items:stretch;max-width:980px;margin:0 auto}\n.fz-kontakt2-siatka .fz-dane{background:#fff;border:1px solid var(--fz-linia);border-radius:14px;padding:26px;justify-content:center}\n.fz-kontakt2-siatka .fz-dane .fz-btn{align-self:flex-start;margin-top:6px}\n\/* kontener mapy \u2014 obrazek wype\u0142nia blok, zaokr\u0105glone rogi, sta\u0142e proporcje *\/\n.fz-mapa2{min-height:340px;height:100%;padding:0;overflow:hidden;border:1px solid var(--fz-linia)}\n.fz-mapa2-img{width:100%;height:100%;object-fit:cover;object-position:center;border-radius:13px;display:block}\n@media (max-width:860px){\n  .fz-kontakt2-siatka{grid-template-columns:1fr;gap:22px}\n  .fz-mapa2{min-height:240px;aspect-ratio:16\/9}\n}\n\n\/* ---------- STOPKA ---------- *\/\n.fz-stopka{background:var(--fz-tusz);color:#b9c6c2;text-align:center;padding:34px 20px;font-size:13.5px}\n.fz-stopka a{color:#9fd8cc;font-weight:700}\n.fz-stopka a:hover{color:#fff}\n.fz-stopka p+p{margin-top:6px}\n\n\/* ---------- Animacje wej\u015bcia (lekkie; wy\u0142\u0105czane przy prefers-reduced-motion) ---------- *\/\n.fz-anim{opacity:0;transform:translateY(16px);transition:opacity .55s ease,transform .55s ease}\n.fz-anim.fz-widoczne{opacity:1;transform:none}\n@media (prefers-reduced-motion:reduce){\n  .fz-anim{opacity:1 !important;transform:none !important;transition:none !important}\n  .fz-site *{transition:none !important;animation:none !important}\n}\n\n\/* ---------- Responsywno\u015b\u0107 (mobile: wszystko w jednej centralnej kolumnie) ---------- *\/\n@media (max-width:860px){\n  .fz-sekcja{padding:56px 0}\n  .fz-o-siatka,.fz-kontakt-siatka{grid-template-columns:1fr;gap:30px}\n  .fz-uslugi{grid-template-columns:repeat(2,1fr)}\n  .fz-o-foto-blok{order:-1}\n  .fz-o-foto{aspect-ratio:16\/12;min-height:260px}\n}\n@media (max-width:640px){\n  .fz-uslugi{grid-template-columns:1fr}\n  \/* podpisy zespo\u0142u: z nak\u0142adki na zdj\u0119ciu -> lista pod zdj\u0119ciem (czytelnie na w\u0105skim kadrze) *\/\n  .fz-o-foto{aspect-ratio:3\/4;min-height:0;border-radius:14px 14px 0 0}\n  .fz-zespol{position:static;grid-template-columns:1fr;gap:0;padding:12px 18px;border-radius:0 0 14px 14px;background:var(--fz-akcent-jasny);border:1px solid var(--fz-linia);border-top:none}\n  .fz-podpis{text-align:left;padding:9px 0;border-top:1px solid rgba(14,124,107,.18)}\n  .fz-podpis:first-child{border-top:none}\n  .fz-podpis b{display:inline;color:var(--fz-tusz);font-size:15px}\n  .fz-podpis small{display:inline;color:var(--fz-akcent-ciemny);font-size:13.5px;margin-left:6px}\n  \/* menu mobilne *\/\n  .fz-hamburger{display:flex}\n  .fz-menu{\n    display:none;position:absolute;left:0;right:0;top:100%;\n    flex-direction:column;background:var(--fz-tlo);\n    border-bottom:1px solid var(--fz-linia);padding:10px 16px 16px;gap:2px;\n    box-shadow:0 14px 30px rgba(34,48,45,.10);\n  }\n  .fz-menu.fz-otwarte{display:flex}\n  .fz-menu a{padding:12px 12px;font-size:16px}\n  .fz-nav-cta{display:none}\n  \/* na w\u0105skich ekranach tekst na \u015brodek + mocniejsza, pionowa nak\u0142adka (t\u0142o kadruje si\u0119 inaczej) *\/\n  .fz-hero::before{background:linear-gradient(180deg,rgba(251,252,251,.93) 0%,rgba(251,252,251,.74) 45%,rgba(251,252,251,.42) 100%)}\n  .fz-hero-tekst{max-width:none;text-align:center;margin:0 auto}\n  .fz-hero-pod{margin-left:auto;margin-right:auto}\n  .fz-hero-srodek{padding:28px 20px}\n  .fz-stat{font-size:14px}\n}\n\n\/* ============================================================\n   WARSTWA WIZUALNA \u2014 DODATKI (tylko efekty, bez zmian tre\u015bci\/struktury)\n   \u2022 prefiks .fz-  \u2022 animowane wy\u0142\u0105cznie transform \/ opacity\n   \u2022 wsp\u00f3lny easing nowych przej\u015b\u0107: cubic-bezier(0.16,1,0.3,1)\n   \u2022 efekty wy\u0142\u0105czane globalnie regu\u0142\u0105 @media (prefers-reduced-motion)\n     zdefiniowan\u0105 wy\u017cej (.fz-site *{transition:none;animation:none})\n   ============================================================ *\/\n\n\/* --- 1. HERO: warstwa t\u0142a do parallaxu (przesuwana transformem) --- *\/\n.fz-hero-tlo{\n  position:absolute;left:0;right:0;top:-48px;bottom:-48px;  \/* zapas 48px na przesuw bez ods\u0142aniania kraw\u0119dzi *\/\n  z-index:-1;pointer-events:none;\n  \/* TODO: wgraj plik hero-fizjoterapia.png do Biblioteki Medi\u00f3w WP i wklej jego URL poni\u017cej *\/\n  background-image:url('https:\/\/fizjoterapia.marcinbilecki.pl\/wp-content\/uploads\/2026\/08\/herofizjoterapia.png');\n  background-size:cover;background-position:center;background-repeat:no-repeat;\n  transform:translate3d(0,0,0);   \/* start; JS aktualizuje translateY w rAF *\/\n}\n\/* pulsuj\u0105cy, delikatny gradient w kolorze akcentu nad zdj\u0119ciem (cykl 10s, szczyt opacity .06) *\/\n.fz-hero-poswiata{\n  position:absolute;inset:0;z-index:0;pointer-events:none;opacity:0;\n  background:radial-gradient(120% 90% at 72% 38%, rgba(14,124,107,1) 0%, rgba(14,124,107,0) 60%);\n  animation:fz-puls 10s cubic-bezier(0.16,1,0.3,1) infinite;\n}\n@keyframes fz-puls{0%,100%{opacity:0}50%{opacity:.06}}\n\/* mi\u0119kki spotlight pod\u0105\u017caj\u0105cy za kursorem (desktop; w\u0142\u0105czany klas\u0105 .fz-spotlight-akt przez JS) *\/\n.fz-hero-spotlight{\n  position:absolute;inset:0;z-index:0;pointer-events:none;opacity:0;\n  transition:opacity .6s cubic-bezier(0.16,1,0.3,1);\n  background:radial-gradient(340px 340px at var(--fz-mysz-x,50%) var(--fz-mysz-y,30%), rgba(255,255,255,.10) 0%, rgba(255,255,255,0) 70%);\n}\n.fz-hero.fz-spotlight-akt .fz-hero-spotlight{opacity:1}\n\n\/* --- 2. Nag\u0142\u00f3wki H1\/H2: reveal per-linia (spany wstawia JS po stronie klienta) --- *\/\n.fz-linia{display:block;overflow:hidden;padding-bottom:.14em;margin-bottom:-.14em}  \/* clip wiersza; padding chroni przed obci\u0119ciem znak\u00f3w z podkre\u015bleniem *\/\n.fz-linia-in{display:inline-block;transform:translateY(115%);\n  transition:transform .7s cubic-bezier(0.16,1,0.3,1)}\n.fz-linie-widoczne .fz-linia-in{transform:none}\n\/* nag\u0142\u00f3wek z podzia\u0142em na linie: wy\u0142\u0105cz zwyk\u0142y fade z .fz-anim (ruch przejmuj\u0105 wiersze) *\/\n.fz-linie{opacity:1 !important;transform:none !important;transition:none !important}\n\n\/* --- 3. Pasek statystyk: liczniki (JS podmienia sam tekst) --- *\/\n\/* tabular-nums + rezerwacja szeroko\u015bci (min-width w JS) = brak reflow toru marquee podczas liczenia *\/\n.fz-licznik{display:inline-block;font-variant-numeric:tabular-nums;text-align:right}\n\n\/* (dynamiczny cie\u0144 reaguj\u0105cy na pozycj\u0119 kursora ustawia JS inline \u2014 tylko desktop) *\/\n\n\/* --- 6. Parallax sekcji: kadrowanie zdj\u0119cia, by przesuw nie ods\u0142ania\u0142 kraw\u0119dzi (transformy ustawia JS inline) --- *\/\n.fz-o-foto-blok{overflow:hidden;border-radius:14px}\n\n\/* --- prefers-reduced-motion: dodatkowo w pe\u0142ni chowamy nowe warstwy dekoracyjne --- *\/\n@media (prefers-reduced-motion:reduce){\n  .fz-hero-poswiata,.fz-hero-spotlight{display:none}\n  .fz-linia{overflow:visible}\n  .fz-linia-in{transform:none}\n}\n<\/style>\n\n<!-- ================= PASEK DEMO (sticky) ================= -->\n<div class=\"fz-demo-pasek\" role=\"note\">\n  STRONA PRZYK\u0141ADOWA \u2014 przyk\u0142ad realizacji \u00b7 Marcin Bilecki \u00b7 <a href=\"https:\/\/marcinbilecki.pl\" target=\"_blank\" rel=\"noopener\">marcinbilecki.pl<\/a>\n<\/div>\n\n<!-- ================= MENU ================= -->\n<nav class=\"fz-nav\" aria-label=\"Menu g\u0142\u00f3wne\">\n  <div class=\"fz-nav-srodek\">\n    <a class=\"fz-logo\" href=\"#fz-strona\" data-fz-kotwica>\n      <span class=\"fz-logo-znak\" aria-hidden=\"true\">\n        <!-- prosty znak: krzy\u017cyk medyczny -->\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\"><rect x=\"6\" y=\"1\" width=\"4\" height=\"14\" rx=\"1\"\/><rect x=\"1\" y=\"6\" width=\"14\" height=\"4\" rx=\"1\"\/><\/svg>\n      <\/span>\n      ZDROWY RUCH\n    <\/a>\n    <button class=\"fz-hamburger\" id=\"fz-hamburger\" aria-label=\"Otw\u00f3rz menu\" aria-expanded=\"false\" aria-controls=\"fz-menu\">\n      <span><\/span><span><\/span><span><\/span>\n    <\/button>\n    <ul class=\"fz-menu\" id=\"fz-menu\">\n      <li><a href=\"#fz-o-gabinecie\" data-fz-kotwica>O gabinecie<\/a><\/li>\n      <li><a href=\"#fz-oferta\" data-fz-kotwica>Oferta<\/a><\/li>\n      <li><a href=\"#fz-opinie\" data-fz-kotwica>Opinie<\/a><\/li>\n      <li><a href=\"#fz-cennik\" data-fz-kotwica>Cennik<\/a><\/li>\n      <li><a href=\"#fz-faq\" data-fz-kotwica>FAQ<\/a><\/li>\n      <li><a href=\"#fz-kontakt\" data-fz-kotwica>Kontakt<\/a><\/li>\n    <\/ul>\n    <a class=\"fz-nav-cta\" href=\"#fz-rezerwacja\" data-fz-kotwica>Um\u00f3w wizyt\u0119<\/a>\n  <\/div>\n<\/nav>\n\n<!-- ================= 1. HERO ================= -->\n<header class=\"fz-hero\">\n  <!-- WARSTWA WIZUALNA: t\u0142o (parallax) + pulsuj\u0105cy gradient + spotlight kursora \u2014 dekoracyjne (aria-hidden) -->\n  <div class=\"fz-hero-tlo\" id=\"fz-hero-tlo\" aria-hidden=\"true\"><\/div>\n  <div class=\"fz-hero-poswiata\" aria-hidden=\"true\"><\/div>\n  <div class=\"fz-hero-spotlight\" aria-hidden=\"true\"><\/div>\n  <div class=\"fz-hero-tresc\">\n    <div class=\"fz-hero-srodek\">\n      <div class=\"fz-hero-tekst fz-anim\">\n        <span class=\"fz-hero-nazwa\">Gabinet Fizjoterapii ZDROWY RUCH<\/span>\n        <h1>Wr\u00f3\u0107 do sprawno\u015bci <em>bez b\u00f3lu<\/em><\/h1>\n        <p class=\"fz-hero-pod\">Skuteczna fizjoterapia i rehabilitacja w przyjaznej atmosferze. Pierwsza wizyta zawsze zaczyna si\u0119 od dok\u0142adnej diagnozy \u2014 nie od gotowego schematu.<\/p>\n        <a class=\"fz-btn\" href=\"#fz-rezerwacja\" data-fz-kotwica>Um\u00f3w wizyt\u0119<\/a>\n      <\/div>\n    <\/div>\n  <\/div>\n  <!-- Pasek statystyk \u2014 jedna grupa; JS dope\u0142nia i duplikuje j\u0105 dla ci\u0105g\u0142ej p\u0119tli bez przerwy -->\n  <div class=\"fz-hero-pasek\" aria-label=\"Nasze wyniki w liczbach\">\n    <div class=\"fz-hero-pasek-tor\" id=\"fz-statystyki-tor\">\n      <div class=\"fz-hero-pasek-grupa\" data-fz-grupa>\n        <span class=\"fz-stat\">12 lat do\u015bwiadczenia<\/span>\n        <span class=\"fz-stat\">2500+ pacjent\u00f3w<\/span>\n        <span class=\"fz-stat\">10 000+ zabieg\u00f3w<\/span>\n        <span class=\"fz-stat\">97% zadowolonych pacjent\u00f3w<\/span>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/header>\n\n<!-- ================= 2. O GABINECIE ================= -->\n<section class=\"fz-sekcja\" id=\"fz-o-gabinecie\" aria-labelledby=\"fz-o-tytul\">\n  <div class=\"fz-wrap\">\n    <div class=\"fz-o-siatka\">\n      <div class=\"fz-o-tekst fz-anim\">\n        <p class=\"fz-nadtytul\">O gabinecie<\/p>\n        <h2 class=\"fz-h2\" id=\"fz-o-tytul\">Fizjoterapia, kt\u00f3ra zaczyna si\u0119 od s\u0142uchania<\/h2>\n        <p>Od ponad dekady pomagamy pacjentom wraca\u0107 do pe\u0142nej sprawno\u015bci \u2014 po urazach, operacjach i latach pracy przy biurku. Ka\u017cd\u0105 terapi\u0119 planujemy indywidualnie, na podstawie szczeg\u00f3\u0142owego wywiadu i badania funkcjonalnego.<\/p>\n        <div>\n          <div class=\"fz-wyroznik\">\n            <span class=\"fz-ikona\" aria-hidden=\"true\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"10\" cy=\"10\" r=\"7.5\"\/><path d=\"M10 6v4l2.5 2.5\"\/><\/svg><\/span>\n            <div>\n              <h3>12 lat do\u015bwiadczenia<\/h3>\n              <p>Tysi\u0105ce przeprowadzonych terapii i stale aktualizowana wiedza kliniczna.<\/p>\n            <\/div>\n          <\/div>\n          <div class=\"fz-wyroznik\">\n            <span class=\"fz-ikona\" aria-hidden=\"true\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 14l4-8 3 5 2-3 3 6\"\/><\/svg><\/span>\n            <div>\n              <h3>Indywidualne podej\u015bcie<\/h3>\n              <p>Plan terapii dopasowany do Twojego cia\u0142a, cel\u00f3w i trybu \u017cycia.<\/p>\n            <\/div>\n          <\/div>\n          <div class=\"fz-wyroznik\">\n            <span class=\"fz-ikona\" aria-hidden=\"true\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><rect x=\"3\" y=\"3\" width=\"14\" height=\"14\" rx=\"3\"\/><path d=\"M10 7v6M7 10h6\"\/><\/svg><\/span>\n            <div>\n              <h3>Nowoczesny sprz\u0119t<\/h3>\n              <p>Diagnostyka i terapia z u\u017cyciem sprawdzonych, certyfikowanych urz\u0105dze\u0144.<\/p>\n            <\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n      <div class=\"fz-anim\">\n        <!-- Zdj\u0119cie zespo\u0142u z podpisami (dane fikcyjne \u2014 strona przyk\u0142adowa) -->\n        <div class=\"fz-o-foto-blok\">\n          <div class=\"fz-o-foto\" role=\"img\" aria-label=\"Zesp\u00f3\u0142 gabinetu: czworo fizjoterapeut\u00f3w\"><\/div>\n          <div class=\"fz-zespol\">\n            <span class=\"fz-podpis\"><b>Anna<\/b><small>fizjoterapeutka<\/small><\/span>\n            <span class=\"fz-podpis\"><b>Marek<\/b><small>terapeuta manualny<\/small><\/span>\n            <span class=\"fz-podpis\"><b>Karolina<\/b><small>fizjoterapeutka sportowa<\/small><\/span>\n            <span class=\"fz-podpis\"><b>Tomasz<\/b><small>specjalista rehabilitacji<\/small><\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- ================= 3. OFERTA \/ US\u0141UGI ================= -->\n<section class=\"fz-sekcja fz-sekcja-alt\" id=\"fz-oferta\" aria-labelledby=\"fz-oferta-tytul\">\n  <div class=\"fz-wrap\">\n    <p class=\"fz-nadtytul fz-anim\">Oferta<\/p>\n    <h2 class=\"fz-h2 fz-anim\" id=\"fz-oferta-tytul\">W czym mo\u017cemy pom\u00f3c<\/h2>\n    <p class=\"fz-lead fz-anim\">Pracujemy zar\u00f3wno z b\u00f3lem przewlek\u0142ym, jak i \u015bwie\u017cymi urazami \u2014 od diagnozy po pe\u0142ny powr\u00f3t do aktywno\u015bci.<\/p>\n    <div class=\"fz-uslugi\">\n      <article class=\"fz-usluga\">\n        <span class=\"fz-ikona\" aria-hidden=\"true\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"10\" cy=\"10\" r=\"7.5\"\/><circle cx=\"10\" cy=\"10\" r=\"2.5\"\/><\/svg><\/span>\n        <h3>Terapia manualna<\/h3>\n        <p>Praca na stawach i tkankach mi\u0119kkich, kt\u00f3ra przywraca prawid\u0142ow\u0105 ruchomo\u015b\u0107 i zmniejsza b\u00f3l.<\/p>\n      <\/article>\n      <article class=\"fz-usluga\">\n        <span class=\"fz-ikona\" aria-hidden=\"true\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M3 10h14M5 6h10M5 14h10\"\/><\/svg><\/span>\n        <h3>Masa\u017c leczniczy<\/h3>\n        <p>Rozlu\u017ania napi\u0119te mi\u0119\u015bnie, poprawia kr\u0105\u017cenie i wspiera regeneracj\u0119 po wysi\u0142ku.<\/p>\n      <\/article>\n      <article class=\"fz-usluga\">\n        <span class=\"fz-ikona\" aria-hidden=\"true\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 12l4 4 8-9\"\/><\/svg><\/span>\n        <h3>Rehabilitacja pourazowa<\/h3>\n        <p>Bezpieczny powr\u00f3t do sprawno\u015bci po z\u0142amaniach, skr\u0119ceniach i zabiegach operacyjnych.<\/p>\n      <\/article>\n      <article class=\"fz-usluga\">\n        <span class=\"fz-ikona\" aria-hidden=\"true\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M4 16V8M10 16V4M16 16v-6\"\/><\/svg><\/span>\n        <h3>Fizjoterapia sportowa<\/h3>\n        <p>Terapia i profilaktyka uraz\u00f3w dla os\u00f3b aktywnych \u2014 od amator\u00f3w po zawodnik\u00f3w.<\/p>\n      <\/article>\n      <article class=\"fz-usluga\">\n        <span class=\"fz-ikona\" aria-hidden=\"true\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><rect x=\"4\" y=\"3\" width=\"12\" height=\"14\" rx=\"3\"\/><path d=\"M8 8h4M8 12h4\"\/><\/svg><\/span>\n        <h3>Terapia kr\u0119gos\u0142upa<\/h3>\n        <p>Praca z b\u00f3lem plec\u00f3w i karku wynikaj\u0105cym z pracy siedz\u0105cej i wad postawy.<\/p>\n      <\/article>\n      <article class=\"fz-usluga\">\n        <span class=\"fz-ikona\" aria-hidden=\"true\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"10\" cy=\"6\" r=\"2.5\"\/><path d=\"M5 17c0-3 2-5 5-5s5 2 5 5\"\/><\/svg><\/span>\n        <h3>Trening medyczny<\/h3>\n        <p>\u0106wiczenia pod okiem fizjoterapeuty, kt\u00f3re utrwalaj\u0105 efekty terapii na lata.<\/p>\n      <\/article>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- ================= 4. OPINIE ================= -->\n<section class=\"fz-sekcja\" id=\"fz-opinie\" aria-labelledby=\"fz-opinie-tytul\">\n  <div class=\"fz-wrap\">\n    <p class=\"fz-nadtytul fz-anim\">Opinie<\/p>\n    <h2 class=\"fz-h2 fz-anim\" id=\"fz-opinie-tytul\">Co m\u00f3wi\u0105 pacjenci<\/h2>\n    <p class=\"fz-lead fz-anim\">Opinie przyk\u0142adowe \u2014 na stronie docelowej podepniemy prawdziwe recenzje z wizyt\u00f3wki Google. Najed\u017a na kart\u0119, aby zatrzyma\u0107 i powi\u0119kszy\u0107.<\/p>\n\n    <!-- G\u00f3rny pas \u2014 przesuwa si\u0119 w LEWO. Karty klonowane w JS dla p\u0142ynnej p\u0119tli. -->\n    <div class=\"fz-marq fz-marq-lewo fz-anim\" aria-label=\"Opinie pacjent\u00f3w, cz\u0119\u015b\u0107 1\">\n      <div class=\"fz-marq-tor\" data-fz-tor>\n        <figure class=\"fz-opinia\" tabindex=\"0\">\n          <span class=\"fz-gwiazdki\" role=\"img\" aria-label=\"Ocena 5 na 5\">\u2605\u2605\u2605\u2605\u2605<\/span>\n          <blockquote>\u201ePo dw\u00f3ch miesi\u0105cach terapii wr\u00f3ci\u0142am do biegania, cho\u0107 wcze\u015bniej b\u00f3l kolana nie pozwala\u0142 mi nawet na spacer. Konkretny plan i pe\u0142ne zaanga\u017cowanie.\u201d<\/blockquote>\n          <figcaption>\u2014 Anna K.<\/figcaption>\n        <\/figure>\n        <figure class=\"fz-opinia\" tabindex=\"0\">\n          <span class=\"fz-gwiazdki\" role=\"img\" aria-label=\"Ocena 5 na 5\">\u2605\u2605\u2605\u2605\u2605<\/span>\n          <blockquote>\u201eProfesjonalne podej\u015bcie od pierwszej wizyty. Wszystko dok\u0142adnie wyt\u0142umaczone, dosta\u0142em te\u017c \u0107wiczenia do domu. Kr\u0119gos\u0142up w ko\u0144cu odpu\u015bci\u0142.\u201d<\/blockquote>\n          <figcaption>\u2014 Tomasz W.<\/figcaption>\n        <\/figure>\n        <figure class=\"fz-opinia\" tabindex=\"0\">\n          <span class=\"fz-gwiazdki\" role=\"img\" aria-label=\"Ocena 5 na 5\">\u2605\u2605\u2605\u2605\u2605<\/span>\n          <blockquote>\u201eRehabilitacja po operacji barku przebieg\u0142a szybciej, ni\u017c zak\u0142ada\u0142 lekarz. Mi\u0142a atmosfera i zawsze punktualnie. Polecam ka\u017cdemu.\u201d<\/blockquote>\n          <figcaption>\u2014 Maria Z.<\/figcaption>\n        <\/figure>\n        <figure class=\"fz-opinia\" tabindex=\"0\">\n          <span class=\"fz-gwiazdki\" role=\"img\" aria-label=\"Ocena 5 na 5\">\u2605\u2605\u2605\u2605\u2605<\/span>\n          <blockquote>\u201eSiedz\u0105ca praca dawa\u0142a mi si\u0119 we znaki od lat. Tutaj pierwszy raz kto\u015b naprawd\u0119 wyt\u0142umaczy\u0142, sk\u0105d bierze si\u0119 b\u00f3l. Efekt czuj\u0119 ka\u017cdego dnia.\u201d<\/blockquote>\n          <figcaption>\u2014 Pawe\u0142 R.<\/figcaption>\n        <\/figure>\n        <figure class=\"fz-opinia\" tabindex=\"0\">\n          <span class=\"fz-gwiazdki\" role=\"img\" aria-label=\"Ocena 5 na 5\">\u2605\u2605\u2605\u2605\u2605<\/span>\n          <blockquote>\u201eTrafi\u0142am z ostrym b\u00f3lem karku i ju\u017c po pierwszej wizycie poczu\u0142am ulg\u0119. \u0106wiczenia domowe proste i skuteczne. Serdecznie polecam.\u201d<\/blockquote>\n          <figcaption>\u2014 Katarzyna B.<\/figcaption>\n        <\/figure>\n        <figure class=\"fz-opinia\" tabindex=\"0\">\n          <span class=\"fz-gwiazdki\" role=\"img\" aria-label=\"Ocena 5 na 5\">\u2605\u2605\u2605\u2605\u2605<\/span>\n          <blockquote>\u201eRwa\u0142em si\u0119 do biegania po kontuzji \u015bci\u0119gna. Terapia by\u0142a wymagaj\u0105ca, ale bardzo dobrze poprowadzona. Wr\u00f3ci\u0142em na trening bez nawrot\u00f3w.\u201d<\/blockquote>\n          <figcaption>\u2014 Micha\u0142 D.<\/figcaption>\n        <\/figure>\n      <\/div>\n    <\/div>\n\n    <!-- Dolny pas \u2014 przesuwa si\u0119 w PRAWO. -->\n    <div class=\"fz-marq fz-marq-prawo fz-anim\" aria-label=\"Opinie pacjent\u00f3w, cz\u0119\u015b\u0107 2\">\n      <div class=\"fz-marq-tor\" data-fz-tor>\n        <figure class=\"fz-opinia\" tabindex=\"0\">\n          <span class=\"fz-gwiazdki\" role=\"img\" aria-label=\"Ocena 5 na 5\">\u2605\u2605\u2605\u2605\u2605<\/span>\n          <blockquote>\u201eBardzo dok\u0142adna diagnoza migreny napi\u0119ciowej \u2014 okaza\u0142o si\u0119, \u017ce \u017ar\u00f3d\u0142em by\u0142y barki. Po serii wizyt b\u00f3le g\u0142owy praktycznie ust\u0105pi\u0142y.\u201d<\/blockquote>\n          <figcaption>\u2014 Joanna S.<\/figcaption>\n        <\/figure>\n        <figure class=\"fz-opinia\" tabindex=\"0\">\n          <span class=\"fz-gwiazdki\" role=\"img\" aria-label=\"Ocena 5 na 5\">\u2605\u2605\u2605\u2605\u2605<\/span>\n          <blockquote>\u201ePo operacji kolana ba\u0142em si\u0119 rehabilitacji. Niepotrzebnie \u2014 spokojne tempo, jasne wyja\u015bnienia i realne post\u0119py z tygodnia na tydzie\u0144.\u201d<\/blockquote>\n          <figcaption>\u2014 Grzegorz N.<\/figcaption>\n        <\/figure>\n        <figure class=\"fz-opinia\" tabindex=\"0\">\n          <span class=\"fz-gwiazdki\" role=\"img\" aria-label=\"Ocena 5 na 5\">\u2605\u2605\u2605\u2605\u2605<\/span>\n          <blockquote>\u201eMasa\u017c leczniczy na najwy\u017cszym poziomie. Napi\u0119te mi\u0119\u015bnie plec\u00f3w po ci\u0105\u017cy wreszcie odpu\u015bci\u0142y. Czuj\u0119 si\u0119 jak nowo narodzona.\u201d<\/blockquote>\n          <figcaption>\u2014 Agnieszka L.<\/figcaption>\n        <\/figure>\n        <figure class=\"fz-opinia\" tabindex=\"0\">\n          <span class=\"fz-gwiazdki\" role=\"img\" aria-label=\"Ocena 5 na 5\">\u2605\u2605\u2605\u2605\u2605<\/span>\n          <blockquote>\u201eZawodowo gram w siatk\u00f3wk\u0119 \u2014 regularna fizjoterapia sportowa trzyma mnie w formie i chroni przed kontuzjami. Pe\u0142en profesjonalizm.\u201d<\/blockquote>\n          <figcaption>\u2014 Rafa\u0142 K.<\/figcaption>\n        <\/figure>\n        <figure class=\"fz-opinia\" tabindex=\"0\">\n          <span class=\"fz-gwiazdki\" role=\"img\" aria-label=\"Ocena 5 na 5\">\u2605\u2605\u2605\u2605\u2605<\/span>\n          <blockquote>\u201ePrzyprowadzi\u0142am mam\u0119 po udarze. Ogromna cierpliwo\u015b\u0107 i empatia, a przy tym konkretne efekty. Za takie podej\u015bcie ogromne dzi\u0119ki.\u201d<\/blockquote>\n          <figcaption>\u2014 Ewa M.<\/figcaption>\n        <\/figure>\n        <figure class=\"fz-opinia\" tabindex=\"0\">\n          <span class=\"fz-gwiazdki\" role=\"img\" aria-label=\"Ocena 5 na 5\">\u2605\u2605\u2605\u2605\u2605<\/span>\n          <blockquote>\u201eB\u00f3l nadgarstka od pracy przy komputerze mija\u0142 na chwil\u0119 po ka\u017cdej ma\u015bci. Dopiero tutaj rozwi\u0105zali problem u \u017ar\u00f3d\u0142a. Polecam bez wahania.\u201d<\/blockquote>\n          <figcaption>\u2014 \u0141ukasz P.<\/figcaption>\n        <\/figure>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- ================= 5. CENNIK ================= -->\n<section class=\"fz-sekcja fz-sekcja-alt\" id=\"fz-cennik\" aria-labelledby=\"fz-cennik-tytul\">\n  <div class=\"fz-wrap\">\n    <p class=\"fz-nadtytul fz-anim\">Cennik<\/p>\n    <h2 class=\"fz-h2 fz-anim\" id=\"fz-cennik-tytul\">Przejrzyste ceny, bez niespodzianek<\/h2>\n    <p class=\"fz-lead fz-anim\">Ceny przyk\u0142adowe (demo). P\u0142atno\u015b\u0107 got\u00f3wk\u0105 lub kart\u0105 po wizycie.<\/p>\n    <div class=\"fz-cennik fz-anim\">\n      <div class=\"fz-cena fz-cena-wyroz\" tabindex=\"0\">\n        <span class=\"fz-cena-polecane\">Zacznij tutaj<\/span>\n        <div class=\"fz-cena-gora\">\n          <span class=\"fz-cena-nazwa\">Pierwsza wizyta z diagnoz\u0105<span class=\"fz-cena-czas\">60 min<\/span><\/span>\n          <span class=\"fz-cena-kwota\">180 z\u0142<\/span>\n        <\/div>\n        <p class=\"fz-cena-opis\">Szczeg\u00f3\u0142owy wywiad, badanie funkcjonalne i test\u00f3w ruchomo\u015bci, wst\u0119pna terapia oraz indywidualny plan leczenia z zestawem \u0107wicze\u0144 do domu.<\/p>\n      <\/div>\n      <div class=\"fz-cena\" tabindex=\"0\">\n        <div class=\"fz-cena-gora\">\n          <span class=\"fz-cena-nazwa\">Terapia manualna<span class=\"fz-cena-czas\">45 min<\/span><\/span>\n          <span class=\"fz-cena-kwota\">160 z\u0142<\/span>\n        <\/div>\n        <p class=\"fz-cena-opis\">Praca na stawach i tkankach mi\u0119kkich, mobilizacje i techniki rozlu\u017aniaj\u0105ce przywracaj\u0105ce prawid\u0142ow\u0105 ruchomo\u015b\u0107 i zmniejszaj\u0105ce b\u00f3l.<\/p>\n      <\/div>\n      <div class=\"fz-cena\" tabindex=\"0\">\n        <div class=\"fz-cena-gora\">\n          <span class=\"fz-cena-nazwa\">Masa\u017c leczniczy<span class=\"fz-cena-czas\">45 min<\/span><\/span>\n          <span class=\"fz-cena-kwota\">140 z\u0142<\/span>\n        <\/div>\n        <p class=\"fz-cena-opis\">Masa\u017c wybranej partii cia\u0142a rozlu\u017aniaj\u0105cy napi\u0119te mi\u0119\u015bnie, poprawiaj\u0105cy kr\u0105\u017cenie i wspieraj\u0105cy regeneracj\u0119 po wysi\u0142ku.<\/p>\n      <\/div>\n      <div class=\"fz-cena\" tabindex=\"0\">\n        <div class=\"fz-cena-gora\">\n          <span class=\"fz-cena-nazwa\">Rehabilitacja pourazowa<span class=\"fz-cena-czas\">50 min<\/span><\/span>\n          <span class=\"fz-cena-kwota\">170 z\u0142<\/span>\n        <\/div>\n        <p class=\"fz-cena-opis\">Program powrotu do sprawno\u015bci po z\u0142amaniach, skr\u0119ceniach i zabiegach operacyjnych \u2014 terapia plus stopniowane \u0107wiczenia wzmacniaj\u0105ce.<\/p>\n      <\/div>\n      <div class=\"fz-cena\" tabindex=\"0\">\n        <div class=\"fz-cena-gora\">\n          <span class=\"fz-cena-nazwa\">Fizjoterapia sportowa<span class=\"fz-cena-czas\">50 min<\/span><\/span>\n          <span class=\"fz-cena-kwota\">170 z\u0142<\/span>\n        <\/div>\n        <p class=\"fz-cena-opis\">Terapia i profilaktyka uraz\u00f3w dla os\u00f3b aktywnych \u2014 ocena wzorc\u00f3w ruchu, praca nad wydolno\u015bci\u0105 i bezpieczny powr\u00f3t do treningu.<\/p>\n      <\/div>\n      <div class=\"fz-cena\" tabindex=\"0\">\n        <div class=\"fz-cena-gora\">\n          <span class=\"fz-cena-nazwa\">Trening medyczny<span class=\"fz-cena-czas\">55 min<\/span><\/span>\n          <span class=\"fz-cena-kwota\">130 z\u0142<\/span>\n        <\/div>\n        <p class=\"fz-cena-opis\">\u0106wiczenia pod okiem fizjoterapeuty utrwalaj\u0105ce efekty terapii \u2014 wzmacnianie, stabilizacja i nauka prawid\u0142owych wzorc\u00f3w ruchowych.<\/p>\n      <\/div>\n    <\/div>\n    <p class=\"fz-cennik-dopisek fz-anim\">Pakiet 5 wizyt: rabat 10%. Odwo\u0142anie wizyty \u2014 bezp\u0142atnie do 24 h przed terminem.<\/p>\n  <\/div>\n<\/section>\n\n<!-- ================= 6. FAQ ================= -->\n<section class=\"fz-sekcja\" id=\"fz-faq\" aria-labelledby=\"fz-faq-tytul\">\n  <div class=\"fz-wrap-waska\">\n    <p class=\"fz-nadtytul fz-anim\">FAQ<\/p>\n    <h2 class=\"fz-h2 fz-anim\" id=\"fz-faq-tytul\">Cz\u0119ste pytania<\/h2>\n    <p class=\"fz-lead fz-anim\">Nie znalaz\u0142e\u015b odpowiedzi? Zadzwo\u0144 \u2014 ch\u0119tnie doradzimy.<\/p>\n    <div class=\"fz-faq fz-anim\">\n      <details>\n        <summary>Czy potrzebuj\u0119 skierowania od lekarza?<span class=\"fz-faq-plus\" aria-hidden=\"true\">+<\/span><\/summary>\n        <p class=\"fz-faq-tresc\">Nie. Do fizjoterapeuty mo\u017cesz przyj\u015b\u0107 bez skierowania. Je\u015bli masz dokumentacj\u0119 medyczn\u0105 (RTG, MRI, wypisy), warto zabra\u0107 j\u0105 na pierwsz\u0105 wizyt\u0119.<\/p>\n      <\/details>\n      <details>\n        <summary>Jak przygotowa\u0107 si\u0119 do pierwszej wizyty?<span class=\"fz-faq-plus\" aria-hidden=\"true\">+<\/span><\/summary>\n        <p class=\"fz-faq-tresc\">Za\u0142\u00f3\u017c wygodny, sportowy str\u00f3j umo\u017cliwiaj\u0105cy ods\u0142oni\u0119cie badanej okolicy. Pierwsza wizyta obejmuje szczeg\u00f3\u0142owy wywiad i badanie funkcjonalne \u2014 zarezerwuj oko\u0142o 60 minut.<\/p>\n      <\/details>\n      <details>\n        <summary>Ile wizyt b\u0119dzie potrzebnych?<span class=\"fz-faq-plus\" aria-hidden=\"true\">+<\/span><\/summary>\n        <p class=\"fz-faq-tresc\">To zale\u017cy od problemu \u2014 proste dolegliwo\u015bci ust\u0119puj\u0105 cz\u0119sto po 2\u20134 wizytach, stany przewlek\u0142e wymagaj\u0105 d\u0142u\u017cszej pracy. Po diagnozie przedstawimy realny plan terapii i szacowan\u0105 liczb\u0119 spotka\u0144.<\/p>\n      <\/details>\n      <details>\n        <summary>Czy terapia boli?<span class=\"fz-faq-plus\" aria-hidden=\"true\">+<\/span><\/summary>\n        <p class=\"fz-faq-tresc\">Niekt\u00f3re techniki mog\u0105 powodowa\u0107 chwilowy dyskomfort, ale pracujemy zawsze w granicach Twojej tolerancji. Cel to zmniejszenie b\u00f3lu, a nie jego zadawanie.<\/p>\n      <\/details>\n      <details>\n        <summary>Czy mog\u0119 odwo\u0142a\u0107 lub prze\u0142o\u017cy\u0107 wizyt\u0119?<span class=\"fz-faq-plus\" aria-hidden=\"true\">+<\/span><\/summary>\n        <p class=\"fz-faq-tresc\">Tak \u2014 bezp\u0142atnie do 24 godzin przed terminem, telefonicznie lub SMS-em. P\u00f3\u017aniejsze odwo\u0142ania mog\u0105 wi\u0105za\u0107 si\u0119 z op\u0142at\u0105 za zarezerwowany czas.<\/p>\n      <\/details>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- ================= 7. UM\u00d3W WIZYT\u0118 (rezerwacja) ================= -->\n<section class=\"fz-sekcja fz-sekcja-alt\" id=\"fz-rezerwacja\" aria-labelledby=\"fz-rezerwacja-tytul\">\n  <div class=\"fz-wrap\">\n    <p class=\"fz-nadtytul fz-anim\">Rezerwacja<\/p>\n    <h2 class=\"fz-h2 fz-anim\" id=\"fz-rezerwacja-tytul\">Um\u00f3w wizyt\u0119<\/h2>\n    <p class=\"fz-lead fz-anim\">Wybierz termin, zostaw dane i zarezerwuj wizyt\u0119 online. To wersja przyk\u0142adowa \u2014 rezerwacja nie jest realnie wysy\u0142ana.<\/p>\n    <div class=\"fz-kontakt-siatka\">\n      <!-- LEWA KOLUMNA: formularz -->\n      <div class=\"fz-kontakt-lewo fz-anim\">\n        <!-- Dane osoby \u2014 wype\u0142niane przed rezerwacj\u0105 (demo, bez realnej wysy\u0142ki) -->\n        <form class=\"fz-form\" id=\"fz-formularz\" novalidate>\n          <h3>Twoje dane<\/h3>\n          <div class=\"fz-pole\">\n            <label for=\"fz-imie\">Imi\u0119 <span aria-hidden=\"true\">*<\/span><\/label>\n            <input type=\"text\" id=\"fz-imie\" name=\"imie\" autocomplete=\"given-name\" required>\n          <\/div>\n          <div class=\"fz-pole\">\n            <label for=\"fz-telefon\">Telefon <span aria-hidden=\"true\">*<\/span><\/label>\n            <input type=\"tel\" id=\"fz-telefon\" name=\"telefon\" autocomplete=\"tel\" inputmode=\"tel\" placeholder=\"np. 123 456 789\" required>\n          <\/div>\n          <div class=\"fz-pole\">\n            <label for=\"fz-email\">E-mail <span aria-hidden=\"true\">*<\/span><\/label>\n            <input type=\"email\" id=\"fz-email\" name=\"email\" autocomplete=\"email\" placeholder=\"np. jan@przyklad.pl\" required>\n          <\/div>\n          <div class=\"fz-pole\">\n            <label for=\"fz-wiadomosc\">Wiadomo\u015b\u0107 (opcjonalnie)<\/label>\n            <textarea id=\"fz-wiadomosc\" name=\"wiadomosc\" rows=\"3\" placeholder=\"Np. b\u00f3l kr\u0119gos\u0142upa l\u0119d\u017awiowego od 2 tygodni\u2026\"><\/textarea>\n          <\/div>\n          <label class=\"fz-zgoda\">\n            <input type=\"checkbox\" id=\"fz-zgoda\" required>\n            <span>Wyra\u017cam zgod\u0119 na przetwarzanie moich danych osobowych w celu kontaktu i um\u00f3wienia wizyty. (Wersja demo \u2014 formularz nie wysy\u0142a danych.)<\/span>\n          <\/label>\n        <\/form>\n      <\/div>\n\n      <!-- PRAWA KOLUMNA: terminarz z przep\u0142ywem rezerwacji (demo) -->\n      <div class=\"fz-terminarz fz-anim\" id=\"fz-terminarz\">\n        <!-- widok wyboru terminu -->\n        <div id=\"fz-terminarz-widok\">\n          <h3>Zarezerwuj wizyt\u0119<\/h3>\n          <p class=\"fz-terminarz-pod\">Wybierz dzie\u0144 i woln\u0105 godzin\u0119. (Wersja demo \u2014 dost\u0119pno\u015b\u0107 jest przyk\u0142adowa.)<\/p>\n          <p class=\"fz-terminarz-etyk\">Dzie\u0144<\/p>\n          <div class=\"fz-dni\" id=\"fz-dni\" role=\"group\" aria-label=\"Wyb\u00f3r dnia wizyty\"><\/div>\n          <p class=\"fz-terminarz-etyk\">Godzina<\/p>\n          <div class=\"fz-sloty\" id=\"fz-sloty\" role=\"group\" aria-label=\"Wyb\u00f3r godziny wizyty\">\n            <p class=\"fz-sloty-puste\">Najpierw wybierz dzie\u0144 powy\u017cej.<\/p>\n          <\/div>\n          <div class=\"fz-rezerwacja\">\n            <div class=\"fz-termin-wybor\" id=\"fz-termin-wybor\">\n              <span>Wybrany termin: <strong id=\"fz-termin-tekst\"><\/strong><\/span>\n              <button type=\"button\" class=\"fz-termin-usun\" id=\"fz-termin-usun\">Usu\u0144 wyb\u00f3r<\/button>\n            <\/div>\n            <button type=\"button\" class=\"fz-btn-rezerwuj\" id=\"fz-rezerwuj\" disabled>Rezerwuj\u0119 termin<\/button>\n            <p class=\"fz-brakuje\" id=\"fz-brakuje\" role=\"status\"><\/p>\n          <\/div>\n        <\/div>\n        <!-- widok sukcesu (po rezerwacji) -->\n        <div class=\"fz-sukces\" id=\"fz-sukces\" role=\"status\">\n          <div class=\"fz-sukces-ikona\" aria-hidden=\"true\"><svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 12l5 5L20 6\"\/><\/svg><\/div>\n          <h4>Termin zarezerwowany!<\/h4>\n          <p class=\"fz-sukces-termin\" id=\"fz-sukces-termin\"><\/p>\n          <p>Potwierdzenie rezerwacji wy\u015blemy na podany adres e-mail. (Wersja demo \u2014 rezerwacja nie jest realnie wysy\u0142ana.)<\/p>\n          <button type=\"button\" class=\"fz-btn-nowy\" id=\"fz-nowy\">Zarezerwuj kolejny termin<\/button>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- ================= 8. KONTAKT (dane + mapa) ================= -->\n<section class=\"fz-sekcja\" id=\"fz-kontakt\" aria-labelledby=\"fz-kontakt-tytul\">\n  <div class=\"fz-wrap\">\n    <p class=\"fz-nadtytul fz-anim\">Kontakt<\/p>\n    <h2 class=\"fz-h2 fz-anim\" id=\"fz-kontakt-tytul\">Jak nas znale\u017a\u0107<\/h2>\n    <p class=\"fz-lead fz-anim\">Dane s\u0105 fikcyjne (strona przyk\u0142adowa). Zadzwo\u0144 lub napisz \u2014 ch\u0119tnie odpowiemy na pytania.<\/p>\n    <div class=\"fz-kontakt2-siatka\">\n      <!-- Dane kontaktowe -->\n      <div class=\"fz-dane fz-anim\">\n        <div class=\"fz-dana\">\n          <span class=\"fz-ikona\" aria-hidden=\"true\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><rect x=\"4\" y=\"2\" width=\"12\" height=\"16\" rx=\"3\"\/><path d=\"M8 15h4\"\/><\/svg><\/span>\n          <div><h3>Telefon<\/h3><p><a href=\"tel:+48123456789\">123 456 789<\/a><\/p><\/div>\n        <\/div>\n        <div class=\"fz-dana\">\n          <span class=\"fz-ikona\" aria-hidden=\"true\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"4\" width=\"16\" height=\"12\" rx=\"2\"\/><path d=\"M2 6l8 6 8-6\"\/><\/svg><\/span>\n          <div><h3>E-mail<\/h3><p><a href=\"mailto:kontakt@przyklad.pl\">kontakt@przyklad.pl<\/a><\/p><\/div>\n        <\/div>\n        <div class=\"fz-dana\">\n          <span class=\"fz-ikona\" aria-hidden=\"true\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"10\" cy=\"8\" r=\"3\"\/><path d=\"M10 18c4-4 6-7 6-10a6 6 0 10-12 0c0 3 2 6 6 10z\"\/><\/svg><\/span>\n          <div><h3>Adres<\/h3><p>ul. Przyk\u0142adowa 1, 00-001 Miasto<\/p><\/div>\n        <\/div>\n        <div class=\"fz-dana\">\n          <span class=\"fz-ikona\" aria-hidden=\"true\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"10\" cy=\"10\" r=\"7.5\"\/><path d=\"M10 6v4l2.5 2.5\"\/><\/svg><\/span>\n          <div><h3>Godziny otwarcia<\/h3><p>pon.\u2013pt. 8:00\u201320:00, sob. 9:00\u201314:00<\/p><\/div>\n        <\/div>\n        <a class=\"fz-btn\" href=\"#fz-rezerwacja\" data-fz-kotwica>Um\u00f3w wizyt\u0119<\/a>\n      <\/div>\n      <!-- Mapa: TODO \u2014 wgraj plik mapa-gabinet.png do Biblioteki Medi\u00f3w WP i wklej jego URL w src poni\u017cej -->\n      <div class=\"fz-mapa2 fz-anim\">\n        <img decoding=\"async\" class=\"fz-mapa2-img\"\n             src=\"https:\/\/fizjoterapia.marcinbilecki.pl\/wp-content\/uploads\/2026\/08\/mapagabinet.png\"\n             alt=\"Mapa z lokalizacj\u0105 gabinetu \u2014 ul. Przyk\u0142adowa 1\" loading=\"lazy\">\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- ================= STOPKA ================= -->\n<footer class=\"fz-stopka\">\n  <p><strong>Gabinet Fizjoterapii ZDROWY RUCH<\/strong> \u00b7 ul. Przyk\u0142adowa 1, 00-001 Miasto \u00b7 tel. 123 456 789<\/p>\n  <p>Strona przyk\u0142adowa (demo) \u2014 wszystkie dane s\u0105 fikcyjne. Projekt: <a href=\"https:\/\/marcinbilecki.pl\" target=\"_blank\" rel=\"noopener\">marcinbilecki.pl<\/a><\/p>\n<\/footer>\n\n<script>\n\/* ============================================================\n   Skrypty strony \u2014 czysty JS, bez bibliotek i bez localStorage.\n   Wszystko zamkni\u0119te w IIFE, \u017ceby nie za\u015bmieca\u0107 globalnego zakresu\n   (bezpieczne w WordPress\/Elementor).\n   ============================================================ *\/\n(function(){\n  'use strict';\n  var strona = document.getElementById('fz-strona');\n  if(!strona) return;\n\n  \/* Czy u\u017cytkownik preferuje ograniczenie animacji? *\/\n  var mniejRuchu = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n  \/* ---------- Menu mobilne (hamburger) ---------- *\/\n  var hamburger = document.getElementById('fz-hamburger');\n  var menu = document.getElementById('fz-menu');\n  function zamknijMenu(){\n    menu.classList.remove('fz-otwarte');\n    hamburger.setAttribute('aria-expanded','false');\n    hamburger.setAttribute('aria-label','Otw\u00f3rz menu');\n  }\n  hamburger.addEventListener('click', function(){\n    var otwarte = menu.classList.toggle('fz-otwarte');\n    hamburger.setAttribute('aria-expanded', otwarte ? 'true' : 'false');\n    hamburger.setAttribute('aria-label', otwarte ? 'Zamknij menu' : 'Otw\u00f3rz menu');\n  });\n  \/* Zamknij menu klawiszem Escape *\/\n  document.addEventListener('keydown', function(e){\n    if(e.key === 'Escape' && menu.classList.contains('fz-otwarte')){\n      zamknijMenu();\n      hamburger.focus();\n    }\n  });\n\n  \/* ---------- P\u0142ynne przewijanie do kotwic (z korekt\u0105 na sticky nag\u0142\u00f3wek) ---------- *\/\n  var linki = strona.querySelectorAll('[data-fz-kotwica]');\n  linki.forEach(function(link){\n    link.addEventListener('click', function(e){\n      var id = link.getAttribute('href');\n      if(!id || id.charAt(0) !== '#') return;\n      var cel = document.querySelector(id);\n      if(!cel) return;\n      e.preventDefault();\n      zamknijMenu();\n      \/* wysoko\u015b\u0107 paska demo + menu, \u017ceby nag\u0142\u00f3wek nie zas\u0142ania\u0142 sekcji *\/\n      var przesuniecie = 96;\n      var pozycja = cel.getBoundingClientRect().top + window.pageYOffset - przesuniecie;\n      window.scrollTo({ top: Math.max(pozycja, 0), behavior: mniejRuchu ? 'auto' : 'smooth' });\n      \/* przenie\u015b fokus na sekcj\u0119 (dost\u0119pno\u015b\u0107 z klawiatury) *\/\n      cel.setAttribute('tabindex','-1');\n      cel.focus({ preventScroll: true });\n    });\n  });\n\n  \/* ---------- Lekkie animacje wej\u015bcia sekcji (IntersectionObserver) ---------- *\/\n  var animowane = strona.querySelectorAll('.fz-anim');\n  if(mniejRuchu || !('IntersectionObserver' in window)){\n    \/* wariant statyczny: poka\u017c wszystko od razu *\/\n    animowane.forEach(function(el){ el.classList.add('fz-widoczne'); });\n  } else {\n    var obserwator = new IntersectionObserver(function(wpisy){\n      wpisy.forEach(function(wpis){\n        if(wpis.isIntersecting){\n          wpis.target.classList.add('fz-widoczne');\n          obserwator.unobserve(wpis.target);\n        }\n      });\n    }, { threshold: 0.12 });\n    animowane.forEach(function(el){ obserwator.observe(el); });\n    \/* Zabezpieczenie 1: elementy widoczne w oknie od razu pokazujemy,\n       nie czekaj\u0105c na observer (wa\u017cne m.in. przy osadzeniu w iframe) *\/\n    animowane.forEach(function(el){\n      var r = el.getBoundingClientRect();\n      if(r.top < window.innerHeight && r.bottom > 0){\n        el.classList.add('fz-widoczne');\n        obserwator.unobserve(el);\n      }\n    });\n    \/* Zabezpieczenie 2: gdyby observer nie zadzia\u0142a\u0142, po 1,2 s poka\u017c wszystko *\/\n    setTimeout(function(){\n      animowane.forEach(function(el){ el.classList.add('fz-widoczne'); });\n      obserwator.disconnect();\n    }, 1200);\n  }\n\n  \/* ---------- Oferta: wjazd kafelk\u00f3w (stagger) przy wej\u015bciu w widok ----------\n     Dodajemy klas\u0119 .fz-widoczne do siatki \u2014 stagger realizuj\u0105 regu\u0142y\n     transition-delay w CSS. Przy prefers-reduced-motion pokazujemy od razu. *\/\n  var siatkaUslug = document.querySelector('.fz-uslugi');\n  if(siatkaUslug){\n    if(mniejRuchu || !('IntersectionObserver' in window)){\n      siatkaUslug.classList.add('fz-widoczne');\n    } else {\n      var obsUslugi = new IntersectionObserver(function(wpisy){\n        wpisy.forEach(function(wpis){\n          if(wpis.isIntersecting){\n            wpis.target.classList.add('fz-widoczne');\n            obsUslugi.unobserve(wpis.target);\n          }\n        });\n      }, { threshold: 0.2 });\n      obsUslugi.observe(siatkaUslug);\n      \/* zabezpieczenie: je\u015bli ju\u017c widoczna w oknie, poka\u017c od razu *\/\n      var rU = siatkaUslug.getBoundingClientRect();\n      if(rU.top < window.innerHeight && rU.bottom > 0){ siatkaUslug.classList.add('fz-widoczne'); }\n      \/* awaryjnie po 1,4 s ods\u0142o\u0144, gdyby observer nie zadzia\u0142a\u0142 *\/\n      setTimeout(function(){ siatkaUslug.classList.add('fz-widoczne'); }, 1400);\n    }\n  }\n\n  \/* ---------- Opinie: pasy marquee ----------\n     Klonujemy zawarto\u015b\u0107 ka\u017cdego toru, \u017ceby przesuw -50% dawa\u0142\n     p\u0142ynn\u0105, niesko\u0144czon\u0105 p\u0119tl\u0119 bez \u201eprzeskoku\u201d. Klony ukryte dla czytnik\u00f3w. *\/\n  if(!mniejRuchu){\n    strona.querySelectorAll('[data-fz-tor]').forEach(function(tor){\n      var oryginaly = Array.prototype.slice.call(tor.children);\n      oryginaly.forEach(function(el){\n        var klon = el.cloneNode(true);\n        klon.setAttribute('aria-hidden','true');\n        klon.setAttribute('tabindex','-1');\n        tor.appendChild(klon);\n      });\n    });\n  }\n\n  \/* ---------- Pasek statystyk hero: dope\u0142nienie + duplikacja grupy ----------\n     Aby p\u0119tla nie mia\u0142a przerwy, jedna grupa musi by\u0107 co najmniej tak szeroka\n     jak pasek. Dope\u0142niamy j\u0105 kopiami statystyk, po czym duplikujemy ca\u0142\u0105 grup\u0119,\n     a animacja przesuwa t\u00f3r o dok\u0142adnie -50% (szeroko\u015b\u0107 jednej grupy). *\/\n  if(!mniejRuchu){\n    var statTor = document.getElementById('fz-statystyki-tor');\n    var statPasek = statTor && statTor.parentElement;\n    var statGrupa = statTor && statTor.querySelector('[data-fz-grupa]');\n    if(statGrupa && statPasek){\n      var bazoweStaty = Array.prototype.slice.call(statGrupa.children);\n      \/* dope\u0142niaj grup\u0119, a\u017c b\u0119dzie szersza ni\u017c pasek (z zapasem) *\/\n      var zabezpieczenie = 0;\n      while(statGrupa.offsetWidth < statPasek.offsetWidth + 100 && zabezpieczenie < 20){\n        bazoweStaty.forEach(function(el){ statGrupa.appendChild(el.cloneNode(true)); });\n        zabezpieczenie++;\n      }\n      \/* druga, identyczna grupa \u2014 razem tworz\u0105 bezszwow\u0105 p\u0119tl\u0119 (przesuw -50%) *\/\n      var klonGrupy = statGrupa.cloneNode(true);\n      klonGrupy.setAttribute('aria-hidden','true');\n      statTor.appendChild(klonGrupy);\n      \/* sta\u0142e, spokojne tempo niezale\u017cne od liczby kopii (~55 px\/s) *\/\n      var czas = Math.max(30, Math.round(statGrupa.offsetWidth \/ 55));\n      statTor.style.animationDuration = czas + 's';\n    }\n  }\n\n  \/* ---------- Terminarz + przep\u0142yw rezerwacji (DEMO) ----------\n     Ca\u0142y stan w zmiennych JS (bez localStorage).\n     \u201eZaj\u0119te\u201d godziny s\u0105 wyliczane deterministycznie z daty, a sloty\n     zarezerwowane w tej sesji dopisujemy do zbioru `zajeteWSesji`. *\/\n  var dniKont = document.getElementById('fz-dni');\n  var slotyKont = document.getElementById('fz-sloty');\n  var wyborKont = document.getElementById('fz-termin-wybor');\n  var wyborTekst = document.getElementById('fz-termin-tekst');\n  var wyborUsun = document.getElementById('fz-termin-usun');\n  var przyciskRezerwuj = document.getElementById('fz-rezerwuj');\n  var brakujeInfo = document.getElementById('fz-brakuje');\n  var widokTerminarz = document.getElementById('fz-terminarz-widok');\n  var widokSukces = document.getElementById('fz-sukces');\n  var sukcesTermin = document.getElementById('fz-sukces-termin');\n  var przyciskNowy = document.getElementById('fz-nowy');\n  var formularz = document.getElementById('fz-formularz');\n  var poleImie = document.getElementById('fz-imie');\n  var poleTelefon = document.getElementById('fz-telefon');\n  var poleEmail = document.getElementById('fz-email');\n  var poleZgoda = document.getElementById('fz-zgoda');\n\n  var nazwyDni = ['nd.','pon.','wt.','\u015br.','czw.','pt.','sob.'];\n  var nazwyMies = ['sty','lut','mar','kwi','maj','cze','lip','sie','wrz','pa\u017a','lis','gru'];\n  var wybranyDzien = null;    \/* obiekt Date *\/\n  var wybranaGodzina = null;  \/* np. \"10:00\" *\/\n  var zajeteWSesji = {};      \/* klucz \"YYYY-M-D-H\" -> true (zarezerwowane w tej sesji) *\/\n\n  function kluczSlotu(data, godzina){\n    return data.getFullYear() + '-' + data.getMonth() + '-' + data.getDate() + '-' + godzina;\n  }\n  \/* Godziny dla dnia (pn\u2013pt 8\u201319, sob 9\u201313) *\/\n  function godzinyDla(data){\n    var dz = data.getDay();\n    var g = [], od = dz === 6 ? 9 : 8, doG = dz === 6 ? 13 : 19;\n    for(var h = od; h <= doG; h++){ g.push(h); }\n    return g;\n  }\n  \/* Deterministyczna \u201ezaj\u0119to\u015b\u0107\u201d + sloty zarezerwowane w tej sesji *\/\n  function zajety(data, godzina){\n    if(zajeteWSesji[kluczSlotu(data, godzina)]) return true;\n    var n = data.getDate() * 7 + data.getMonth() * 3 + godzina * 5;\n    return n % 3 === 0;\n  }\n  function formatujTermin(data, godzina){\n    return nazwyDni[data.getDay()] + ' ' + data.getDate() + ' ' + nazwyMies[data.getMonth()] + ', godz. ' + godzina;\n  }\n  \/* Prosta walidacja p\u00f3l (demo) *\/\n  function poprawnyEmail(v){ return \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(v.trim()); }\n  function poprawnyTelefon(v){ return (v.replace(\/\\D\/g,'').length) >= 9; }\n\n  \/* Ustala, czego brakuje do rezerwacji i w\u0142\u0105cza\/wy\u0142\u0105cza przycisk *\/\n  function aktualizujStan(){\n    var braki = [];\n    if(!(wybranyDzien && wybranaGodzina)) braki.push('wybierz termin');\n    if(!poleImie.value.trim()) braki.push('podaj imi\u0119');\n    if(!poprawnyTelefon(poleTelefon.value)) braki.push('podaj poprawny telefon');\n    if(!poprawnyEmail(poleEmail.value)) braki.push('podaj poprawny e-mail');\n    if(!poleZgoda.checked) braki.push('zaznacz zgod\u0119');\n\n    if(braki.length === 0){\n      przyciskRezerwuj.disabled = false;\n      brakujeInfo.innerHTML = 'Wszystko gotowe \u2014 mo\u017cesz zarezerwowa\u0107 termin.';\n    } else {\n      przyciskRezerwuj.disabled = true;\n      brakujeInfo.innerHTML = 'Aby zarezerwowa\u0107: <b>' + braki.join('<\/b>, <b>') + '<\/b>.';\n    }\n  }\n  function odswiezWybor(){\n    if(wybranyDzien && wybranaGodzina){\n      wyborTekst.textContent = formatujTermin(wybranyDzien, wybranaGodzina);\n      wyborKont.classList.add('fz-akt');\n    } else {\n      wyborKont.classList.remove('fz-akt');\n    }\n    aktualizujStan();\n  }\n  \/* Rysuje sloty godzin dla wybranego dnia *\/\n  function rysujSloty(){\n    slotyKont.innerHTML = '';\n    if(!wybranyDzien){\n      slotyKont.innerHTML = '<p class=\"fz-sloty-puste\">Najpierw wybierz dzie\u0144 powy\u017cej.<\/p>';\n      return;\n    }\n    godzinyDla(wybranyDzien).forEach(function(h){\n      var etykieta = h + ':00';\n      var przycisk = document.createElement('button');\n      przycisk.type = 'button';\n      przycisk.className = 'fz-slot';\n      przycisk.textContent = etykieta;\n      if(zajety(wybranyDzien, h)){\n        przycisk.disabled = true;\n        przycisk.setAttribute('aria-label', etykieta + ' \u2014 termin zaj\u0119ty');\n      } else {\n        przycisk.setAttribute('aria-pressed', wybranaGodzina === etykieta ? 'true' : 'false');\n        przycisk.addEventListener('click', function(){\n          wybranaGodzina = etykieta;\n          slotyKont.querySelectorAll('.fz-slot').forEach(function(s){\n            if(!s.disabled) s.setAttribute('aria-pressed','false');\n          });\n          przycisk.setAttribute('aria-pressed','true');\n          odswiezWybor();\n        });\n      }\n      slotyKont.appendChild(przycisk);\n    });\n  }\n  \/* Rysuje pasek najbli\u017cszych 14 dni roboczych (bez niedziel) *\/\n  (function rysujDni(){\n    if(!dniKont) return;\n    var dzis = new Date();\n    var dodane = 0, przesuniecieDnia = 1;\n    while(dodane < 14){\n      var d = new Date(dzis.getFullYear(), dzis.getMonth(), dzis.getDate() + przesuniecieDnia);\n      przesuniecieDnia++;\n      if(d.getDay() === 0) continue; \/* niedziele pomijamy *\/\n      (function(data){\n        var przycisk = document.createElement('button');\n        przycisk.type = 'button';\n        przycisk.className = 'fz-dzien';\n        przycisk.setAttribute('aria-pressed','false');\n        przycisk.innerHTML =\n          '<span class=\"fz-dzien-nazwa\">' + nazwyDni[data.getDay()] + '<\/span>' +\n          '<span class=\"fz-dzien-nr\">' + data.getDate() + '<\/span>' +\n          '<span class=\"fz-dzien-mies\">' + nazwyMies[data.getMonth()] + '<\/span>';\n        przycisk.setAttribute('aria-label', 'Wybierz dzie\u0144: ' + nazwyDni[data.getDay()] + ' ' + data.getDate() + ' ' + nazwyMies[data.getMonth()]);\n        przycisk.addEventListener('click', function(){\n          wybranyDzien = data;\n          wybranaGodzina = null;\n          dniKont.querySelectorAll('.fz-dzien').forEach(function(b){ b.setAttribute('aria-pressed','false'); });\n          przycisk.setAttribute('aria-pressed','true');\n          rysujSloty();\n          odswiezWybor();\n        });\n        dniKont.appendChild(przycisk);\n      })(d);\n      dodane++;\n    }\n  })();\n\n  \/* Usu\u0144 wyb\u00f3r godziny *\/\n  wyborUsun.addEventListener('click', function(){\n    wybranaGodzina = null;\n    slotyKont.querySelectorAll('.fz-slot').forEach(function(s){\n      if(!s.disabled) s.setAttribute('aria-pressed','false');\n    });\n    odswiezWybor();\n  });\n\n  \/* Ka\u017cda zmiana w polach formularza od\u015bwie\u017ca stan przycisku rezerwacji *\/\n  [poleImie, poleTelefon, poleEmail].forEach(function(p){ p.addEventListener('input', aktualizujStan); });\n  poleZgoda.addEventListener('change', aktualizujStan);\n  formularz.addEventListener('submit', function(e){ e.preventDefault(); }); \/* brak realnej wysy\u0142ki *\/\n\n  \/* Rezerwacja (demo): pokazujemy sukces, slot staje si\u0119 zaj\u0119ty *\/\n  przyciskRezerwuj.addEventListener('click', function(){\n    if(przyciskRezerwuj.disabled) return;\n    var tekst = formatujTermin(wybranyDzien, wybranaGodzina);\n    zajeteWSesji[kluczSlotu(wybranyDzien, parseInt(wybranaGodzina,10))] = true;\n    sukcesTermin.textContent = tekst;\n    widokTerminarz.style.display = 'none';\n    widokSukces.style.display = 'block';\n    widokSukces.setAttribute('tabindex','-1');\n    widokSukces.focus();\n  });\n\n  \/* Rezerwacja kolejnego terminu \u2014 reset widoku i wyboru (dane osoby zostaj\u0105) *\/\n  przyciskNowy.addEventListener('click', function(){\n    wybranyDzien = null;\n    wybranaGodzina = null;\n    dniKont.querySelectorAll('.fz-dzien').forEach(function(b){ b.setAttribute('aria-pressed','false'); });\n    rysujSloty();\n    odswiezWybor();\n    widokSukces.style.display = 'none';\n    widokTerminarz.style.display = 'block';\n    widokTerminarz.setAttribute('tabindex','-1');\n    widokTerminarz.focus();\n  });\n\n  \/* ---------- FAQ: tylko jedno pytanie otwarte naraz (akordeon) ---------- *\/\n  var faqPozycje = strona.querySelectorAll('.fz-faq details');\n  faqPozycje.forEach(function(det){\n    det.addEventListener('toggle', function(){\n      if(!det.open) return;\n      faqPozycje.forEach(function(inny){\n        if(inny !== det) inny.open = false;\n      });\n    });\n  });\n\n  aktualizujStan(); \/* stan pocz\u0105tkowy (przycisk wy\u0142\u0105czony + lista brak\u00f3w) *\/\n})();\n<\/script>\n\n<script>\n\/* ============================================================\n   WARSTWA WIZUALNA \u2014 SKRYPTY DODATKOWE\n   Osobne IIFE \u2014 nie rusza istniej\u0105cej logiki. Czysty JS, bez bibliotek.\n   Zasady (wymogi techniczne):\n   \u2022 animujemy wy\u0142\u0105cznie transform \/ opacity (wyj\u0105tek: OFFSET cienia w cenniku),\n   \u2022 listenery scroll\/mousemove przez requestAnimationFrame z flag\u0105 \"ticking\",\n   \u2022 will-change tylko na czas trwania animacji (potem zdejmowane),\n   \u2022 na mobile (<768px) parallax \/ spotlight \/ cie\u0144 NIE s\u0105 podpinane,\n   \u2022 przy prefers-reduced-motion \u017caden nowy efekt si\u0119 nie uruchamia.\n   ============================================================ *\/\n(function(){\n  'use strict';\n  var strona=document.getElementById('fz-strona');\n  if(!strona) return;\n\n  var mniejRuchu=window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n  var desktop=window.matchMedia('(min-width: 768px)').matches;                    \/* parallax od 768px *\/\n  var wskaznikPrecyzyjny=window.matchMedia('(hover: hover) and (pointer: fine)').matches;  \/* spotlight + cie\u0144: tylko myszka *\/\n\n  \/* pomocnik: format liczby (opcjonalne grupowanie tysi\u0119cy spacj\u0105 + sufiks) *\/\n  function sformatuj(v,grupuj,suf){\n    var n=Math.round(v);\n    var s=grupuj ? String(n).replace(\/\\B(?=(\\d{3})+(?!\\d))\/g,' ') : String(n);\n    return s+suf;\n  }\n\n  \/* pomocnik: wywo\u0142aj cb() jednorazowo, gdy element wejdzie w widok.\n     Oparte na scrollu (nie na IntersectionObserver) \u2014 pewne tak\u017ce w iframe\/Elementor,\n     gdzie IO bywa zawodny; dzi\u0119ki temu nag\u0142\u00f3wki\/liczniki nigdy nie zostaj\u0105 ukryte. *\/\n  function gdyWWidoku(el, cb, prog){\n    if(!el) return;\n    prog = prog || 0.9;\n    var zrobione=false, tick=false;\n    function zdejmij(){ window.removeEventListener('scroll',na); window.removeEventListener('resize',na); }\n    function spr(){\n      tick=false;\n      if(zrobione) return;\n      var wys=window.innerHeight||document.documentElement.clientHeight;\n      var r=el.getBoundingClientRect();\n      if(r.top < wys*prog && r.bottom > 0){ zrobione=true; zdejmij(); cb(); }\n    }\n    function na(){ if(!tick){requestAnimationFrame(spr);tick=true;} }\n    window.addEventListener('scroll',na,{passive:true});\n    window.addEventListener('resize',na,{passive:true});\n    spr();  \/* od razu sprawd\u017a stan startowy (np. hero widoczne bez scrolla) *\/\n  }\n\n  \/* ========== 1a. HERO \u2014 parallax t\u0142a (transform: translate3d) ========== *\/\n  var hero=strona.querySelector('.fz-hero');\n  var heroTlo=document.getElementById('fz-hero-tlo');\n  if(!mniejRuchu && desktop && hero && heroTlo){\n    var maxPrzes=40, tickP=false, heroWidoczny=true;\n    \/* IO: liczymy tylko gdy hero jest w widoku; steruje te\u017c will-change *\/\n    if('IntersectionObserver' in window){\n      new IntersectionObserver(function(wp){\n        wp.forEach(function(w){\n          heroWidoczny=w.isIntersecting;\n          heroTlo.style.willChange=w.isIntersecting?'transform':'auto';\n        });\n      },{threshold:0}).observe(hero);\n    } else { heroTlo.style.willChange='transform'; }\n    function rysujParallax(){\n      tickP=false;\n      if(!heroWidoczny) return;\n      var y=window.pageYOffset||document.documentElement.scrollTop||0;\n      \/* t\u0142o przesuwa si\u0119 wolniej ni\u017c tre\u015b\u0107 (0.3\u00d7), ograniczone do 40px *\/\n      var przes=Math.min(y*0.3, maxPrzes);\n      heroTlo.style.transform='translate3d(0,'+przes.toFixed(1)+'px,0)';\n    }\n    window.addEventListener('scroll',function(){\n      if(!tickP){requestAnimationFrame(rysujParallax);tickP=true;}\n    },{passive:true});\n    rysujParallax();\n  }\n\n  \/* ========== 1b. HERO \u2014 spotlight pod\u0105\u017caj\u0105cy za kursorem ========== *\/\n  if(!mniejRuchu && desktop && wskaznikPrecyzyjny && hero){\n    var myszX=0, myszY=0, tickS=false;\n    function rysujSpotlight(){\n      tickS=false;\n      var r=hero.getBoundingClientRect();            \/* jeden odczyt + jeden zapis na klatk\u0119 (bez thrashingu) *\/\n      hero.style.setProperty('--fz-mysz-x', ((myszX-r.left)\/r.width*100).toFixed(2)+'%');\n      hero.style.setProperty('--fz-mysz-y', ((myszY-r.top)\/r.height*100).toFixed(2)+'%');\n    }\n    hero.addEventListener('mouseenter',function(){ hero.classList.add('fz-spotlight-akt'); });\n    hero.addEventListener('mouseleave',function(){ hero.classList.remove('fz-spotlight-akt'); });\n    hero.addEventListener('mousemove',function(e){\n      myszX=e.clientX; myszY=e.clientY;\n      if(!tickS){requestAnimationFrame(rysujSpotlight);tickS=true;}\n    });\n  }\n\n  \/* ========== 2. Nag\u0142\u00f3wki H1\/H2 \u2014 reveal per-linia ========== *\/\n  if(!mniejRuchu){\n    var naglowki=[].slice.call(strona.querySelectorAll('.fz-hero h1, .fz-h2'));\n\n    \/* tokenizacja s\u0142\u00f3w z zachowaniem <em> (akcentowany fragment nag\u0142\u00f3wka) \u2014 cache na elemencie *\/\n    function tokeny(el){\n      if(el.__tokeny) return el.__tokeny;\n      var t=[];\n      [].forEach.call(el.childNodes,function(w){\n        if(w.nodeType===3){\n          w.nodeValue.split(\/\\s+\/).forEach(function(s){ if(s) t.push({t:s,em:false}); });\n        } else if(w.nodeType===1){\n          var jestEm=(w.tagName==='EM');\n          (w.textContent||'').split(\/\\s+\/).forEach(function(s){ if(s) t.push({t:s,em:jestEm}); });\n        }\n      });\n      el.__tokeny=t;\n      return t;\n    }\n    function podzielLinie(el){\n      var t=tokeny(el);\n      if(!t.length) return;\n      \/* etap 1: s\u0142owa jako tymczasowe spany \u2014 pomiar podzia\u0142u na wiersze *\/\n      el.innerHTML='';\n      var spany=t.map(function(tk,i){\n        var s=document.createElement('span');\n        s.textContent=(i?' ':'')+tk.t;              \/* spacja przed s\u0142owem (poza pierwszym) *\/\n        if(tk.em) s.setAttribute('data-fz-em','1');\n        el.appendChild(s);\n        return s;\n      });\n      \/* etap 2: grupuj s\u0142owa po offsetTop w wiersze *\/\n      var linie=[], biezaca=null, ostatniTop=null;\n      spany.forEach(function(s){\n        var top=s.offsetTop;\n        if(ostatniTop===null || Math.abs(top-ostatniTop)>1){ biezaca=[]; linie.push(biezaca); ostatniTop=top; }\n        biezaca.push(s);\n      });\n      \/* etap 3: przebuduj na struktur\u0119 wierszy (overflow:hidden + wewn\u0119trzny element do przesuwu) *\/\n      el.innerHTML='';\n      linie.forEach(function(grupa,li){\n        var wrap=document.createElement('span'); wrap.className='fz-linia';\n        var inner=document.createElement('span'); inner.className='fz-linia-in';\n        inner.style.transitionDelay=(li*60)+'ms';   \/* stagger 60ms na wiersz *\/\n        grupa.forEach(function(s){\n          if(s.getAttribute('data-fz-em')){\n            var em=document.createElement('em'); em.textContent=s.textContent; inner.appendChild(em);\n          } else {\n            inner.appendChild(document.createTextNode(s.textContent));\n          }\n        });\n        wrap.appendChild(inner);\n        el.appendChild(wrap);\n      });\n      el.classList.add('fz-linie');\n    }\n    function odslon(el){\n      [].forEach.call(el.querySelectorAll('.fz-linia-in'),function(ln){\n        ln.style.willChange='transform';\n        ln.addEventListener('transitionend',function h(){ ln.style.willChange='auto'; ln.removeEventListener('transitionend',h); });\n      });\n      el.classList.add('fz-linie-widoczne');\n    }\n    \/* podzia\u0142 synchronicznie (bez migotania) *\/\n    naglowki.forEach(podzielLinie);\n    void strona.offsetWidth;  \/* utrwal stan pocz\u0105tkowy wierszy, \u017ceby przej\u015bcie faktycznie si\u0119 odegra\u0142o *\/\n    \/* wyzwalanie oparte na scrollu (pewne tak\u017ce w iframe\/Elementor \u2014 nag\u0142\u00f3wki nigdy nie zostaj\u0105 ukryte) *\/\n    naglowki.forEach(function(el){ gdyWWidoku(el, function(){ odslon(el); }); });\n    \/* po za\u0142adowaniu font\u00f3w przelicz wiersze dla nag\u0142\u00f3wk\u00f3w jeszcze nieods\u0142oni\u0119tych (poprawny podzia\u0142) *\/\n    if(document.fonts && document.fonts.ready){\n      document.fonts.ready.then(function(){\n        naglowki.forEach(function(el){\n          if(!el.classList.contains('fz-linie-widoczne')){ podzielLinie(el); }\n        });\n      });\n    }\n  }\n\n  \/* ========== 3. Pasek statystyk \u2014 liczniki 0 \u2192 warto\u015b\u0107 (raz, przy wej\u015bciu w widok) ========== *\/\n  if(!mniejRuchu){\n    var pasek=strona.querySelector('.fz-hero-pasek');\n    var liczniki=[];\n    if(pasek){\n      \/* obejmujemy wszystkie .fz-stat, tak\u017ce klony utworzone przez marquee \u2014 licz\u0105 si\u0119 zgodnie *\/\n      [].forEach.call(pasek.querySelectorAll('.fz-stat'),function(st){\n        var m=st.textContent.match(\/^\\s*(\\d[\\d\\s]*\\d|\\d)([%+]?)\/);  \/* bez \\s* przed sufiksem \u2014 inaczej \u201ezjada\u0142\u201d spacj\u0119 przed etykiet\u0105 *\/\n        if(!m) return;\n        var surowa=m[1];\n        var cel=parseInt(surowa.replace(\/\\s\/g,''),10);\n        if(isNaN(cel)) return;\n        var suf=m[2]||'';\n        var grupuj=\/\\s\/.test(surowa);\n        var reszta=st.textContent.slice(m[0].length);\n        var span=document.createElement('span');\n        span.className='fz-licznik';\n        var koniec=sformatuj(cel,grupuj,suf);\n        span.style.minWidth=koniec.length+'ch';        \/* rezerwacja szeroko\u015bci \u2014 brak reflow podczas liczenia *\/\n        span.textContent=sformatuj(0,grupuj,suf);\n        st.textContent='';\n        st.appendChild(span);\n        if(reszta) st.appendChild(document.createTextNode(reszta));\n        liczniki.push({el:span,cel:cel,grupuj:grupuj,suf:suf});\n      });\n    }\n    function animujLiczniki(){\n      var start=null, czas=1200;\n      function krok(ts){\n        if(start===null) start=ts;\n        var t=Math.min((ts-start)\/czas,1);\n        var e=1-Math.pow(1-t,3);                        \/* ease-out *\/\n        liczniki.forEach(function(l){ l.el.textContent=sformatuj(l.cel*e,l.grupuj,l.suf); });\n        if(t<1) requestAnimationFrame(krok);\n      }\n      requestAnimationFrame(krok);\n    }\n    if(liczniki.length){\n      \/* wyzwalanie oparte na scrollu \u2014 liczniki ruszaj\u0105, gdy pasek wejdzie w widok (bez IntersectionObserver) *\/\n      gdyWWidoku(pasek, animujLiczniki, 0.85);\n    }\n  }\n\n  \/* ========== 4. Cennik \u2014 dynamiczny cie\u0144 reaguj\u0105cy na kursor (desktop) ========== *\/\n  if(!mniejRuchu && desktop && wskaznikPrecyzyjny){\n    [].forEach.call(strona.querySelectorAll('.fz-cena'),function(k){\n      var r=null, cx=0, cy=0, tickC=false;\n      function rysujCien(){\n        tickC=false;\n        \/* zmienia si\u0119 WY\u0141\u0104CZNIE offset cienia (rozmycie sta\u0142e 34px \u2014 brak animacji blur w p\u0119tli) *\/\n        k.style.boxShadow=(cx*10).toFixed(1)+'px '+(cy*8+16).toFixed(1)+'px 34px rgba(14,124,107,.20)';\n      }\n      k.addEventListener('mouseenter',function(){ r=k.getBoundingClientRect(); });   \/* rect raz na wej\u015bciu *\/\n      k.addEventListener('mousemove',function(e){\n        if(!r) r=k.getBoundingClientRect();\n        cx=((e.clientX-r.left)\/r.width-0.5)*-2;         \/* -1..1, cie\u0144 \u201eucieka\u201d od kursora *\/\n        cy=((e.clientY-r.top)\/r.height-0.5)*-2;\n        if(!tickC){requestAnimationFrame(rysujCien);tickC=true;}\n      });\n      k.addEventListener('mouseleave',function(){ r=null; k.style.boxShadow=''; }); \/* powr\u00f3t do cienia z :hover w CSS *\/\n    });\n  }\n\n  \/* ========== 6. Parallax sekcji (subtelny; tylko desktop, bez listener\u00f3w na mobile) ========== *\/\n  if(!mniejRuchu && desktop){\n    var celeParallax=[];\n    var foto=strona.querySelector('.fz-o-foto');\n    \/* zdj\u0119cie zespo\u0142u: lekkie powi\u0119kszenie (zapas na przesuw) + parallax w kontenerze z overflow:hidden *\/\n    if(foto){ foto.style.transform='translate3d(0,0,0) scale(1.08)'; celeParallax.push({el:foto,sila:0.06,max:24}); }\n    if(celeParallax.length){\n      var tickPS=false;\n      function rysujParallaxSekcji(){\n        tickPS=false;\n        var wys=window.innerHeight||document.documentElement.clientHeight;\n        celeParallax.forEach(function(c){\n          var r=c.el.getBoundingClientRect();\n          var wWidoku=(r.bottom>0 && r.top<wys);\n          c.el.style.willChange = wWidoku ? 'transform' : 'auto';   \/* will-change tylko gdy w widoku *\/\n          if(!wWidoku) return;\n          \/* przesuw proporcjonalny do odleg\u0142o\u015bci \u015brodka elementu od \u015brodka ekranu, ograniczony do \u00b1max *\/\n          var delta=(r.top+r.height\/2)-wys\/2;\n          var przes=Math.max(-c.max, Math.min(c.max, -delta*c.sila));\n          c.el.style.transform='translate3d(0,'+przes.toFixed(1)+'px,0) scale(1.08)';\n        });\n      }\n      window.addEventListener('scroll',function(){ if(!tickPS){requestAnimationFrame(rysujParallaxSekcji);tickPS=true;} },{passive:true});\n      window.addEventListener('resize',function(){ if(!tickPS){requestAnimationFrame(rysujParallaxSekcji);tickPS=true;} },{passive:true});\n      rysujParallaxSekcji();\n    }\n  }\n})();\n<\/script>\n\n<\/div><!-- \/koniec .fz-site -->\n\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>STRONA PRZYK\u0141ADOWA \u2014 przyk\u0142ad realizacji \u00b7 Marcin Bilecki \u00b7 marcinbilecki.pl ZDROWY RUCH O gabinecie Oferta Opinie Cennik FAQ Kontakt Um\u00f3w wizyt\u0119 Gabinet Fizjoterapii ZDROWY RUCH Wr\u00f3\u0107 do sprawno\u015bci bez b\u00f3lu Skuteczna fizjoterapia i rehabilitacja w przyjaznej atmosferze. Pierwsza wizyta zawsze zaczyna si\u0119 od dok\u0142adnej diagnozy \u2014 nie od gotowego schematu. Um\u00f3w wizyt\u0119 12 lat do\u015bwiadczenia [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-12","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/fizjoterapia.marcinbilecki.pl\/index.php?rest_route=\/wp\/v2\/pages\/12","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fizjoterapia.marcinbilecki.pl\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/fizjoterapia.marcinbilecki.pl\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/fizjoterapia.marcinbilecki.pl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fizjoterapia.marcinbilecki.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=12"}],"version-history":[{"count":7,"href":"https:\/\/fizjoterapia.marcinbilecki.pl\/index.php?rest_route=\/wp\/v2\/pages\/12\/revisions"}],"predecessor-version":[{"id":24,"href":"https:\/\/fizjoterapia.marcinbilecki.pl\/index.php?rest_route=\/wp\/v2\/pages\/12\/revisions\/24"}],"wp:attachment":[{"href":"https:\/\/fizjoterapia.marcinbilecki.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=12"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}