52acdc98e2
- Навигация: макет Кабинет 04 + карточка врача из PDF, фото дверей 13 и 31, указатели по этажам - Транспорт: рендер макета трамвая из PDF вместо CSS-заглушки - Тайтлы: единый формат «Раздел. Цифровой брендбук Клиники ухо, горло, нос им. проф. Е.Н.Оленевой» на всех страницах - Сайдбар: убран пункт «Печать» (нет данных из брендбука) - SPRINTS.md: обновлены фактические результаты Sprint 2 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
178 lines
6.0 KiB
TypeScript
178 lines
6.0 KiB
TypeScript
"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", soon: true },
|
||
{ label: "Форм-контролы", href: "/components/forms", soon: true },
|
||
{ label: "Карточки", href: "/components/cards", soon: true },
|
||
{ label: "Бейджи и теги", href: "/components/badges", soon: true },
|
||
{ label: "Алерты", href: "/components/alerts", soon: true },
|
||
{ label: "Модальные окна", href: "/components/modals", soon: true },
|
||
{ label: "Таблицы", href: "/components/tables", soon: true },
|
||
{ label: "Навигация", href: "/components/navigation", soon: true },
|
||
],
|
||
},
|
||
{
|
||
title: "Блоки",
|
||
items: [
|
||
{ label: "Hero", href: "/blocks/hero", soon: true },
|
||
{ label: "CEO-текст", href: "/blocks/ceo", soon: true },
|
||
{ label: "Наши врачи", href: "/blocks/doctors", soon: true },
|
||
{ label: "Отзывы", href: "/blocks/reviews", soon: true },
|
||
{ label: "Новости", href: "/blocks/news", soon: true },
|
||
{ label: "Формы контакта", href: "/blocks/contact-forms", soon: true },
|
||
{ label: "Контакт", href: "/blocks/contact", soon: true },
|
||
{ label: "Услуги", href: "/blocks/services", soon: true },
|
||
],
|
||
},
|
||
{
|
||
title: "Страницы",
|
||
items: [
|
||
{ 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: "/experiments", 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 2 · v0.2.0
|
||
</div>
|
||
</aside>
|
||
);
|
||
}
|