Files
brand_book/apps/web/components/layout/Sidebar.tsx
T
AR 15 M4 d4d86e6343 feat(sprint-5): document all blocks from perm.oclinica.ru/lor
Created 8 pages from real site (screenshot source):
- /components/navigation — header: top-bar, logo, nav menu (8 items)
- /blocks/hero         — hero banner: #b8e6ed bg, 3 checkmarks, CTA button
- /blocks/ceo          — intro text: clinic description + Q&A stimuli
- /blocks/doctors      — doctors: 3 stats (#dff0fa) + 6 card grid
- /blocks/reviews      — reviews carousel: #eef4d1 bg, decorative quote
- /blocks/contact-forms — 2 forms: "Будьте здоровы!" (#b8e6ed) + "Стоимость"
- /blocks/news         — 4 news cards row + "Все новости" button
- /blocks/contact      — footer: 4 link columns + logo + address + hours

globals.css: added .bb-nav-link:hover (#0089c3)
Sidebar: all blocks/navigation unlocked (removed soon), v0.5.1

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

174 lines
5.6 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/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 · v0.5.1
</div>
</aside>
);
}