/* === Shared components for all pages === */ const { useState, useEffect, useRef } = React; /* ---------- Placeholder ---------- */ function Placeholder({ label, className = "", dark = false, style, src, alt, eager = false }) { if (src) { return (
{alt
); } return (
{label}
); } /* ---------- Phone (beautiful, consistent) ---------- */ const PhoneIcon = () => ( ); function Phone({ number, display, size = "md", light = false, label, sub, kind = "inline" }) { const cleanHref = "tel:" + number.replace(/[^\d+]/g, ""); const sizeCls = size === "xl" ? "phone-xl" : size === "lg" ? "phone-lg" : size === "sm" ? "phone-sm" : ""; if (kind === "box") { return ( {label &&
{label}
} {display || number} {sub &&
{sub}
}
); } return ( {display || number} ); } /* ---------- Brand ---------- */ function Brand({ light = false }) { return ( Первая Медицинская Клиника
Первая Медицинская Клиника
Реконструкция позвоночника
); } /* ---------- Nav ---------- */ function Nav({ active }) { const links = [ { id: "index", label: "Главная", href: "index.html" }, { id: "method", label: "Метод", href: "method.html" }, { id: "contact", label: "Запись", href: "contact.html" }, ]; return ( ); } /* ---------- Footer ---------- */ function Footer() { return ( ); } /* ---------- Marquee strip ---------- */ function ScrollStrip({ items }) { return (
{items.map((t, i) => ( · {t} ))} {items.map((t, i) => ( · {t} ))}
); } /* ---------- Section head ---------- */ function SectionHead({ eyebrow, title, lede }) { return (
{eyebrow}

{title}

{lede &&

{lede}

}
); } /* ---------- Spine illustration (SVG, abstract) ---------- */ function SpineDiagram() { // simple, abstract: column of vertebrae shapes const segs = Array.from({ length: 12 }); return ( {segs.map((_, i) => { const y = 30 + i * 28; const w = 70 - Math.abs(i - 5) * 2.5; return ( ); })} {/* connector */} {/* labels */} C1–C7 T1–T12 L1–L5 S1 ); } /* ---------- FAQ accordion ---------- */ function Faq({ items }) { const [open, setOpen] = useState(0); return (
{items.map((it, i) => (
))}
); } /* ---------- Hero (variant-aware) ---------- */ function Hero({ variant = "editorial" }) { return (

Реконструкция
позвоночника без
операции.

Как проходит процедура
{variant !== "diagnostic" ? ( ) : (
)}
Без операции Без госпитализации Эффект после первой процедуры Бесплатная консультация
); } /* ---------- Indications grid ---------- */ const INDICATION_DETAILS = { "ostex": { title: "Остеохондроз позвоночника", short: "Дегенеративные изменения дисков шейного, грудного и поясничного отделов.", intro: "Дистрофические изменения межпозвонковых дисков — самая распространённая причина боли в спине. Со временем диск теряет влагу и высоту, перестаёт амортизировать нагрузку.", bullets: [ "Боль усиливается после нагрузки или долгого нахождения в одной позе", "Скованность в спине утром, проходит после движения", "Хруст и щелчки в позвоночнике", "Постепенно — снижение подвижности", ], treatment: "Лекарственный коктейль снимает воспаление и отёк вокруг диска, запускает восстановительные процессы. Эффект — после первой процедуры.", }, "gryzha": { title: "Грыжа межпозвонкового диска", short: "Шейный, грудной, пояснично-крестцовый отделы. В том числе крупные грыжи.", intro: "Часть диска выходит за пределы фиброзного кольца и сдавливает нервный корешок или спинной мозг. Раньше это было показанием к операции — сейчас лечится безоперационно.", bullets: [ "Резкая боль, отдающая в руку или ногу", "Прострелы, «электрические» удары", "Онемение, покалывание, слабость в конечности", "Не помогают обезболивающие или помогают ненадолго", ], treatment: "Коктейль препаратов прицельно вводится под 3D-навигацией в область диска. Снимается компрессия, уходит воспаление, диск восстанавливается.", }, "sekvestr": { title: "Секвестрированная грыжа", short: "Фрагмент диска оторвался и сместился в позвоночный канал.", intro: "Самая сложная форма грыжи — фрагмент пульпозного ядра отделяется и попадает в спинномозговой канал, давит на нервные структуры.", bullets: [ "Сильная боль, не поддающаяся лекарствам", "Серьёзное ограничение движений", "Возможны нарушения чувствительности", "Раньше — почти всегда операция", ], treatment: "Даже секвестрированную грыжу часто удаётся лечить без операции. Метод подбирается индивидуально, по результатам МРТ.", }, "protruz": { title: "Протрузия диска", short: "Ранняя стадия грыжи — выпячивание без разрыва фиброзного кольца.", intro: "Диск выпячивается, но фиброзное кольцо ещё цело. Если начать лечение на этой стадии — можно остановить прогрессирование и избежать грыжи.", bullets: [ "Тупая ноющая боль в спине", "Усиление боли при наклонах и поворотах", "Иногда — лёгкое онемение", "Симптомы могут появляться и исчезать", ], treatment: "Самая благодарная стадия для лечения. Реконструкция возвращает диск к нормальному состоянию, грыжа не развивается.", }, "shmorl": { title: "Грыжи Шморля", short: "Вдавления диска в тело позвонка. Часто бессимптомны, но могут давать боль.", intro: "Особый тип грыж — диск продавливается не в спинномозговой канал, а в тело самого позвонка. Часто обнаруживается случайно на МРТ.", bullets: [ "Боль при долгой статической нагрузке", "Снижение роста (в выраженных случаях)", "Чувство усталости в спине", "Иногда совсем без симптомов", ], treatment: "Лечение направлено на укрепление костной ткани вокруг вдавления и восстановление диска.", }, "spondilo": { title: "Спондилоартроз", short: "Артроз межпозвонковых суставов с хронической болью и ограничением подвижности.", intro: "Износ мелких суставов позвоночника — фасеточных. Часто идёт вместе с остеохондрозом. Боль локальная, усиливается при определённых движениях.", bullets: [ "Боль при разгибании назад", "Скованность по утрам", "Хруст при поворотах", "Боль усиливается к концу дня", ], treatment: "Препарат вводится в область поражённых суставов, снимает воспаление и восстанавливает суставной хрящ.", }, "stenoz": { title: "Стеноз позвоночного канала", short: "Сужение канала с компрессией спинного мозга и корешков.", intro: "Спинномозговой канал сужается из-за разрастания костной ткани, грыжи или утолщения связок. Возникает «перемежающаяся хромота» — боль при ходьбе, проходящая в покое.", bullets: [ "Боль и слабость в ногах при ходьбе", "Облегчение в наклоне вперёд или сидя", "Онемение в стопах", "Постепенное сокращение дистанции, которую можно пройти", ], treatment: "Реконструкция уменьшает компрессию структур канала. Возвращается возможность ходить без боли.", }, "listez": { title: "Листез — сдвиг позвонков", short: "Смещение позвонка относительно соседнего. Нестабильность, хроническая боль.", intro: "Один позвонок «съезжает» относительно другого. Возникает нестабильность сегмента, постоянная боль, иногда корешковый синдром.", bullets: [ "Хроническая боль в пояснице", "Усиление боли стоя или при ходьбе", "«Ступенька» прощупывается на спине", "Чувство, что «спина не держит»", ], treatment: "Восстановление диска и связочного аппарата стабилизирует сегмент. Боль уходит, позвонок перестаёт смещаться.", }, "radikulit": { title: "Радикулит и корешковый синдром", short: "Сдавление нерва с прострелами в руку или ногу.", intro: "Воспаление или сдавление нервного корешка, выходящего из спинного мозга. Резкая боль распространяется по ходу нерва.", bullets: [ "Острая «стреляющая» боль", "Боль отдаёт в конечность по чёткой линии", "Онемение, покалывание, иногда слабость", "Усиливается при кашле, чихании, натуживании", ], treatment: "Прицельное введение препарата в зону компрессии корешка снимает воспаление и боль уже в первые часы.", }, }; function IndicationsBlock() { const order = [ "ostex", "gryzha", "sekvestr", "protruz", "shmorl", "spondilo", "stenoz", "listez", "radikulit", ]; const openDetail = (key) => { window.dispatchEvent(new CustomEvent("open-indication", { detail: { key } })); }; return (
{order.map((key, i) => { const it = INDICATION_DETAILS[key]; return ( ); })}
); } /* ---------- Doctor block ---------- */ function DoctorBlock() { const openDoctor = () => window.dispatchEvent(new CustomEvent("open-doctor")); return (
Главный врач клиники · нейрохирург

Ястребов
Роман Александрович

Нейрохирург, вертебролог, артролог, ортопед-травматолог. Высшая квалификационная категория, стаж более {new Date().getFullYear() - 2006} лет. Реконструкцию межпозвонковых дисков под 3D-навигацией в «Первой Медицинской Клинике» проводит лично — таких специалистов в России не много.

Образование
Медицинский институт ПетрГУ (2001). Ординатура по нейрохирургии в РНХИ им. профессора А. Л. Поленова (2006).
Категория
Высшая квалификационная категория. Стаж более {new Date().getFullYear() - 2006} лет.
Метод
Авторская методика реконструкции межпозвонкового диска под мониторинговой 3D-навигацией
); } /* ---------- Testimonials ---------- */ /* Реальные отзывы со страницы https://pervaya-medklinika.ru/pervaya-medicinskaya-klinika/otzyvy/ */ function Testimonials() { const items = [ { quote: "Проходила курс лечения у главного врача Ястребова Романа Александровича по реконструкции межпозвонковых дисков в поясничном отделе позвоночника. Уже после первой процедуры мне стало значительно легче, я смогла уснуть без боли впервые за долгое время. В течение проводимого курса все боли прошли. Доктор подарил мне вторую жизнь — жизнь без боли.", name: "Светлана", meta: "Грыжи поясничного отдела · 31.03.2020", }, { quote: "19 июня мне должны были делать операцию по грыже. Но я боялась просто ужас. И решила проконсультироваться в «Первой Медицинской клинике». Врач убедил меня начать комплексное лечение. Сейчас на 75% самочувствие лучше — вопрос об операции уже не стоит.", name: "Михайлова М. Б.", meta: "Грыжа · 19.03.2019", }, { quote: "С проблемами спины познакомилась с детства, падение с высоты напоминает о себе уже 26 лет. После первого курса остались очень хорошие впечатления, а главное — результаты. Сейчас закончила второй курс. Клиникой я очень довольна.", name: "Пешкова А. А.", meta: "Хронические боли в спине · 12.03.2019", }, { quote: "Очень благодарна врачам клиники — настоящие помощники, искренне помогающие своим пациентам. Спасибо за внимание и профессионализм на каждом приёме.", name: "Валентина С.", meta: "Отзыв с сайта клиники · 28.08.2019", }, { quote: "Обращалась с болями в тазобедренных суставах, прошла курс лечения. Боль ушла, состояние значительно улучшилось. Буду рекомендовать клинику своим знакомым.", name: "Галицына О. А.", meta: "Боли в суставах · 01.04.2019", }, { quote: "Лечилась по поводу боли в шее. Врач подробно объяснил весь план лечения, всё прошло профессионально. Получила выписку с рекомендациями. Очень довольна результатом.", name: "Харатьянова М. С.", meta: "Шейный отдел · 17.02.2019", }, ]; const trackRef = useRef(null); const scrollByDir = (dir) => { const el = trackRef.current; if (!el) return; const card = el.querySelector(".testimonial"); const step = card ? card.offsetWidth + 24 : el.clientWidth * 0.85; el.scrollBy({ left: dir * step, behavior: "smooth" }); }; // Медленное автодвижение отзывов: плавный дрейф с разворотом у краёв. // Пауза при наведении/касании; уважает prefers-reduced-motion. useEffect(() => { const el = trackRef.current; if (!el) return; if (window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches) return; const SPEED = 0.4; // px за кадр (~24px/с при 60fps) — медленный дрейф let raf = 0; let paused = false; let driftDir = 1; let carry = 0; // На время автоскролла гасим snap + smooth, иначе они дёргают дрейф. const prevSnap = el.style.scrollSnapType; const prevBehavior = el.style.scrollBehavior; el.style.scrollSnapType = "none"; el.style.scrollBehavior = "auto"; const tick = () => { if (!paused && el.scrollWidth > el.clientWidth + 1) { carry += driftDir * SPEED; const whole = Math.trunc(carry); if (whole !== 0) { carry -= whole; const max = el.scrollWidth - el.clientWidth; let next = el.scrollLeft + whole; if (next >= max) { next = max; driftDir = -1; carry = 0; } else if (next <= 0) { next = 0; driftDir = 1; carry = 0; } el.scrollLeft = next; } } raf = requestAnimationFrame(tick); }; raf = requestAnimationFrame(tick); const pause = () => { paused = true; }; const resume = () => { paused = false; }; el.addEventListener("mouseenter", pause); el.addEventListener("mouseleave", resume); el.addEventListener("touchstart", pause, { passive: true }); el.addEventListener("touchend", resume); el.addEventListener("pointerdown", pause); window.addEventListener("pointerup", resume); return () => { cancelAnimationFrame(raf); el.style.scrollSnapType = prevSnap; el.style.scrollBehavior = prevBehavior; el.removeEventListener("mouseenter", pause); el.removeEventListener("mouseleave", resume); el.removeEventListener("touchstart", pause); el.removeEventListener("touchend", resume); el.removeEventListener("pointerdown", pause); window.removeEventListener("pointerup", resume); }; }, []); return (
Листайте отзывы — свайп или стрелки
{items.map((t, i) => (
«{t.quote}»
{t.name[0]}
{t.name}
{t.meta}
))}
+
Почитать остальные отзывы
Десятки историй пациентов на официальном сайте клиники
); } /* ---------- Video testimonials ---------- */ function VideoTestimonials() { const [lightbox, setLightbox] = useState(null); // Local videos served from /preview/videos/. Posters are stop-frames at t=15s. const videos = [ { title: "Лечение грыжи позвоночника", author: "Реальный пациент", glyph: "Г", src: "videos/v1-otzyv-na-sait.mp4", poster: "videos/v1-otzyv-na-sait-poster.jpg", }, { title: "Возвращение к подвижности", author: "Реальный пациент", glyph: "В", src: "videos/v2-pmk-otzyvy.mp4", poster: "videos/v2-pmk-otzyvy-poster.jpg", }, { title: "После процедуры — на работе", author: "Реальный пациент", glyph: "П", src: "videos/v3-20240905.mp4", poster: "videos/v3-20240905-poster.jpg", }, { title: "Лечение без операции", author: "Реальный пациент", glyph: "Л", src: "videos/v4-pmk-video.mov", poster: "videos/v4-pmk-video-poster.jpg", }, ]; return ( <>
{videos.map((v, i) => ( { if (e.metaKey || e.ctrlKey || e.shiftKey || e.button === 1) return; e.preventDefault(); setLightbox(v); }} aria-label={`Видеоотзыв: ${v.title}`} > {/* Poster frame from t=15s of each clip */}
{v.title}
{v.author}
))}
Полная коллекция видеоотзывов — на официальном сайте клиники. Десятки историй пациентов до и после процедуры.
Все отзывы на сайте клиники
{lightbox && (
e.target === e.currentTarget && setLightbox(null)}>
)} ); } function CtaBanner({ title, lede, btnLabel = "Записаться на консультацию" }) { const EMAIL = "med4424@yandex.ru"; let ledeNode = null; if (lede && lede.includes(EMAIL)) { const parts = lede.split(EMAIL); ledeNode = (

{parts[0]} { e.preventDefault(); window.dispatchEvent(new CustomEvent("open-email")); }} >{EMAIL} {parts.slice(1).join(EMAIL)}

); } else if (lede) { ledeNode =

{lede}

; } return (
Следующий шаг

{title}

{ledeNode}
+7 (812) 907-50-50
); } /* ---------- Expose to window ---------- */ Object.assign(window, { Placeholder, Brand, Phone, PhoneIcon, Nav, Footer, ScrollStrip, SectionHead, SpineDiagram, Faq, Hero, IndicationsBlock, INDICATION_DETAILS, DoctorBlock, Testimonials, VideoTestimonials, CtaBanner, });