diff --git a/apps/web/app/blocks/doctors/page.tsx b/apps/web/app/blocks/doctors/page.tsx
index beb7de8..5f8156a 100644
--- a/apps/web/app/blocks/doctors/page.tsx
+++ b/apps/web/app/blocks/doctors/page.tsx
@@ -1,57 +1,20 @@
import type { Metadata } from "next";
import { LlmBlock, LlmSection, LlmTable, LlmRules } from "@/components/llm/LlmBlock";
+import { DoctorsBlock, STATS, DOCTORS } from "@/components/blocks/DoctorsBlock";
export const metadata: Metadata = {
title: "Блок «Наши врачи». Цифровой брендбук Клиники ухо, горло, нос им. проф. Е.Н.Оленевой",
};
-const STATS = [
- { num: "27", label: "ЛОР врачей работает в клинике", prefix: "Ежедневно" },
- { num: "6", label: "кандидатов медицинских наук", prefix: "В том числе" },
- { num: "12 000+", label: "успешно проведённых операций", prefix: "Свыше" },
-];
-
-const DOCTORS = [
- {
- name: "Макарова Людмила Германовна",
- spec: "ЛОР врач, сурдолог",
- photo: "/doctors/makarova.jpg",
- },
- {
- name: "Семерикова Наталия Александровна",
- spec: "ЛОР врач, сурдолог, хирург. К.М.Н. Завед. Центром сурдологии",
- photo: "/doctors/semerikova.png",
- },
- {
- name: "Ворончихина Наталия Валерьевна",
- spec: "Отоневролог, хирург. К.М.Н., доцент кафедры ПГМУ",
- photo: "/doctors/voronchikhina.png",
- },
- {
- name: "Лобанова Ирина Юрьевна",
- spec: "ЛОР врач, сурдолог",
- photo: "/doctors/lobanova.jpg",
- },
- {
- name: "Торсунова Наталья Сергеевна",
- spec: "Специалист по слухопротезированию (сурдоакустик)",
- photo: "/doctors/torsunova.jpg",
- },
- {
- name: "Суворова Светлана Викторовна",
- spec: "ЛОР врач, сурдолог",
- photo: "/doctors/suvorova.jpg",
- },
-];
-
const LLM_DOCTORS_TEXT = `
БЛОК: Наши врачи
Источник: perm.oclinica.ru/lor — блок под CEO-текстом
-Версия: v1.0
+Версия: v1.1
СТРУКТУРА БЛОКА:
1. ЗАГОЛОВОК H2: «Приём ведут опытные ЛОР врачи»
Подзаголовок: описание принципа работы врачей клиники
+ Размер: ~30px (text-3xl), font-bold, #111827
2. БЛОК СТАТИСТИКИ (3 показателя в ряд):
— «Ежедневно 27 ЛОР врачей работают в клинике»
@@ -75,8 +38,8 @@ const LLM_DOCTORS_TEXT = `
ПРАВИЛА:
✓ Заголовок H2 + описание обязательны
-✓ 3 stat-блока в ряд
-✓ Сетка 3 колонки, 2 ряда (6 карточек)
+✓ 3 stat-блока в ряд, без фоновых блоков
+✓ Сетка 6 колонок (6 карточек в ряд)
✕ Не отображать более 6 врачей в основном блоке
✕ Не убирать статистику
`.trim();
@@ -106,69 +69,14 @@ export default function DoctorsBlockPage() {
Живой пример
- {/* Заголовок */}
-
-
- Приём ведут опытные ЛОР врачи
-
-
- Фундаментальная теоретическая подготовка и большой практический опыт в сочетании
- с внимательным индивидуальным подходом являются причиной успеха лечения тысяч наших пациентов
-
-
-
- {/* Статистика — текст тёмно-бирюзовым, без фоновых блоков */}
-
- {STATS.map((s) => (
-
-
- {s.prefix} {s.num} {s.label}
-
-
- ))}
-
-
- {/* Сетка врачей — плотнее, имена тёмно-бирюзовым */}
-
+ Фундаментальная теоретическая подготовка и большой практический опыт в сочетании
+ с внимательным индивидуальным подходом являются причиной успеха лечения тысяч наших пациентов
+
+ );
+}
diff --git a/apps/web/components/layout/Sidebar.tsx b/apps/web/components/layout/Sidebar.tsx
index 78b60ee..5f99fb3 100644
--- a/apps/web/components/layout/Sidebar.tsx
+++ b/apps/web/components/layout/Sidebar.tsx
@@ -48,6 +48,7 @@ const NAV: NavSection[] = [
{
title: "Страницы",
items: [
+ { label: "Просмотр страницы", href: "/pages/preview" },
{ label: "Главная", href: "/pages/home", soon: true },
{ label: "Заболевание", href: "/pages/disease", soon: true },
{ label: "Все врачи", href: "/pages/doctors", soon: true },
@@ -166,7 +167,7 @@ export function Sidebar() {
color: "var(--bb-sidebar-text-muted)",
}}
>
- Sprint 5 · v0.5.1
+ Sprint 5.5 · v0.5.5
);
diff --git a/docs/SPRINTS.md b/docs/SPRINTS.md
index c3f351f..cfe9a9a 100644
--- a/docs/SPRINTS.md
+++ b/docs/SPRINTS.md
@@ -229,6 +229,68 @@
---
+## Sprint 5.5 — «Просмотр текущей страницы» (внеочередной)
+
+**Цель:** Добавить интерактивный раздел брендбука, который собирает главную страницу из уже задокументированных блоков.
+Показывает живой превью того, как выглядит сайт на основе данных брендбука.
+
+### Концепция UX
+
+**Маршрут:** `/pages/preview`
+**Сайдбар:** добавить в раздел «Страницы» с пометкой (если ещё нет блоков — показывает заглушку с кнопкой)
+
+**Два состояния страницы:**
+
+1. **Пустое состояние** (первый вход, или если превью не создавалось):
+ - Заголовок «Просмотр текущей страницы»
+ - Описание: «Здесь будет собрана главная страница из задокументированных блоков»
+ - Активная кнопка «Создать» (`.bb-btn bb-btn-primary`)
+ - После нажатия → переход в «созданное» состояние
+
+2. **Созданное состояние** (после нажатия «Создать»):
+ - Превью главной страницы из всех доступных блоков в порядке сверху вниз, как на perm.oclinica.ru/lor
+ - Кнопка «Пересобрать» в шапке (сбрасывает до исходного состояния)
+ - Сборка только из блоков, у которых есть готовый компонент (не mock-заглушки)
+ - Блоки рендерятся как реальные React-компоненты внутри ``
+
+**Порядок блоков в превью** (по perm.oclinica.ru/lor, только готовые):
+1. Hero-баннер (`/blocks/hero` → компонент HeroBlock)
+2. Блок врачей (`/blocks/doctors` → компонент DoctorsBlock)
+3. Блок отзывов (`/blocks/reviews` → когда будет готов)
+4. Форма записи (`/blocks/contact-forms` → когда будет готова)
+5. Блок новостей (`/blocks/news` → когда будет готов)
+6. Footer (`/blocks/contact` → когда будет готов)
+
+**Техническая реализация (FE only, без бэкенда):**
+- Состояние сохраняется в `localStorage` (`preview-created: true/false`)
+- Каждый задокументированный блок выносится в переиспользуемый React-компонент
+- Страница `/pages/preview` импортирует компоненты и рендерит их в нужном порядке
+- Блоки, которых ещё нет → показывается placeholder с текстом «Блок в разработке»
+
+### Задачи
+
+- [ ] FE: Страница `/pages/preview` — пустое состояние с кнопкой «Создать»
+- [ ] FE: Логика `localStorage` — сохранение/сброс состояния превью
+- [ ] FE: Рефактор `/blocks/hero/page.tsx` — вынести баннер в компонент `HeroBlock` (переиспользуемый)
+- [ ] FE: Рефактор `/blocks/doctors/page.tsx` — вынести в компонент `DoctorsBlock`
+- [ ] FE: Placeholder-компонент для блоков, которые ещё не готовы (серая рамка с названием блока)
+- [ ] FE: Сборка превью: рендер всех доступных компонентов в порядке реального сайта
+- [ ] FE: Sidebar — добавить «Просмотр страницы» в раздел «Страницы»
+- [ ] FE: Кнопка «Пересобрать» в созданном состоянии
+- [ ] Docs: Добавить `/pages/preview` v1.0 в LLM_CONTEXT.md
+
+### Зависимости
+- Зависит от: Sprint 5 (блоки hero и doctors уже готовы — ✅)
+- По мере добавления новых блоков в Sprint 5 — они автоматически подключаются к превью
+
+### Ожидаемый результат
+- Раздел «Просмотр текущей страницы» работает в браузере
+- Кнопка «Создать» собирает главную страницу из задокументированных блоков
+- Отсутствующие блоки отображаются как плейсхолдеры
+- Кнопка «Пересобрать» позволяет сбросить и пересоздать
+
+---
+
## Sprint 6 — Страницы (сборки из блоков)
**Цель:** Задокументировать полные страницы как сборки уже готовых блоков.
@@ -355,6 +417,7 @@
| 3 | Кнопки и форм-контролы | FE | CSS реального сайта |
| 4 | Карточки, бейджи, алерты | FE | CSS реального сайта |
| 5 | ВСЕ блоки сайта | FE | Все блоки /lor, mock-данные |
+| 5.5 | Просмотр текущей страницы | FE | Кнопка «Создать», сборка из блоков, localStorage |
| 6 | Все страницы (сборки) | FE | Сборки из блоков, mock-данные |
| 7 | Авторизация (viewer / editor) | BE + FE | JWT, роли, login-страница, шапка с именем |
| 8 | Реальные данные | BE + FE | NestJS прокси → oclinica.ru, кэш 15 мин |