Files
brand_book/apps/web/components/layout/Sidebar.tsx
T
AR 15 M4 72829b5d46 feat(sprint-5.5): add page preview section with Create button
- New route /pages/preview with empty state ("Создать") and assembled preview
- Preview assembles real site blocks in order (Hero + Doctors ready, rest placeholders)
- localStorage persists created state; "Пересобрать" resets it
- Extracted HeroBlock and DoctorsBlock as reusable components
- Refactored hero and doctors pages to import from components/blocks/
- Sidebar: added "Просмотр страницы" link, bumped to Sprint 5.5 · v0.5.5
- SPRINTS.md: added Sprint 5.5 plan with summary table row

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 16:21:40 +05:00

175 lines
5.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use client";
import Link from "next/link";
import { usePathname } from "next/navigation";
type NavItem = {
label: string;
href: string;
soon?: boolean;
};
type NavSection = {
title: string;
items: NavItem[];
};
const NAV: NavSection[] = [
{
title: "Фундамент",
items: [
{ label: "Логотип", href: "/foundation/logo" },
{ label: "Цвета", href: "/foundation/colors" },
{ label: "Типографика", href: "/foundation/typography" },
{ label: "Иконография", href: "/foundation/icons", soon: true },
],
},
{
title: "Компоненты",
items: [
{ label: "Кнопки", href: "/components/buttons" },
{ label: "Форм-контролы", href: "/components/forms" },
{ label: "Карточки", href: "/components/cards" },
{ label: "Шапка / Навигация", href: "/components/navigation" },
],
},
{
title: "Блоки",
items: [
{ label: "Hero-баннер", href: "/blocks/hero" },
{ label: "Вводный текст", href: "/blocks/ceo" },
{ label: "Наши врачи", href: "/blocks/doctors" },
{ label: "Отзывы", href: "/blocks/reviews" },
{ label: "Формы записи", href: "/blocks/contact-forms" },
{ label: "Новости", href: "/blocks/news" },
{ label: "Подвал / Контакт", href: "/blocks/contact" },
],
},
{
title: "Страницы",
items: [
{ label: "Просмотр страницы", href: "/pages/preview" },
{ label: "Главная", href: "/pages/home", soon: true },
{ label: "Заболевание", href: "/pages/disease", soon: true },
{ label: "Все врачи", href: "/pages/doctors", soon: true },
{ label: "Врач", href: "/pages/doctor", soon: true },
{ label: "Цены", href: "/pages/prices", soon: true },
{ label: "Контакты", href: "/pages/contacts", soon: true },
],
},
{
title: "Оффлайн элементы",
items: [
{ label: "Форма сотрудников", href: "/offline/uniform" },
{ label: "Бейджи", href: "/offline/badges" },
{ label: "Навигация", href: "/offline/navigation" },
{ label: "Транспорт", href: "/offline/transport" },
],
},
{
title: "Эксперименты",
items: [
{ label: "Дубли компонентов", href: "/variants/blocks", soon: true },
{ label: "Дубли страниц", href: "/variants/pages", soon: true },
],
},
];
export function Sidebar() {
const pathname = usePathname();
return (
<aside
className="w-64 shrink-0 h-screen overflow-y-auto border-r flex flex-col"
style={{
background: "var(--bb-sidebar-bg)",
borderColor: "var(--bb-sidebar-border)",
}}
>
{/* Логотип брендбука */}
<div
className="px-5 py-4 border-b"
style={{ borderColor: "var(--bb-sidebar-border)" }}
>
<p
className="text-xs font-semibold uppercase tracking-widest mb-0.5"
style={{ color: "var(--brand-053m)" }}
>
Брендбук
</p>
<p
className="text-xs leading-tight"
style={{ color: "var(--bb-sidebar-text-muted)" }}
>
Клиника ухо, горло, нос
<br />
им. проф. Е.Н.Оленевой
</p>
</div>
{/* Навигация */}
<nav className="flex-1 px-3 py-4 space-y-5">
{NAV.map((section) => (
<div key={section.title}>
<p
className="px-2 mb-1 text-[10px] font-semibold uppercase tracking-widest"
style={{ color: "var(--bb-sidebar-section)" }}
>
{section.title}
</p>
<ul className="space-y-0.5">
{section.items.map((item) => {
const isActive = pathname === item.href;
return (
<li key={item.href}>
<Link
href={item.soon ? "#" : item.href}
className="flex items-center justify-between px-2 py-1.5 rounded-md text-sm transition-colors"
style={{
color: isActive
? "var(--brand-073m)"
: item.soon
? "var(--bb-sidebar-text-muted)"
: "var(--bb-sidebar-text)",
background: isActive
? "var(--bb-sidebar-active-bg)"
: "transparent",
fontWeight: isActive ? 500 : 400,
cursor: item.soon ? "default" : "pointer",
}}
>
{item.label}
{item.soon && (
<span
className="text-[10px] px-1.5 py-0.5 rounded"
style={{
background: "#f3f4f6",
color: "var(--bb-sidebar-section)",
}}
>
скоро
</span>
)}
</Link>
</li>
);
})}
</ul>
</div>
))}
</nav>
{/* Версия */}
<div
className="px-5 py-3 border-t text-xs"
style={{
borderColor: "var(--bb-sidebar-border)",
color: "var(--bb-sidebar-text-muted)",
}}
>
Sprint 5.5 · v0.5.5
</div>
</aside>
);
}