Browse Source
Результаты: - /foundation/colors с WCAG-контрастом и экспортом JSON - /foundation/typography с DINPro + Fira Sans шкалами - 5 страниц /offline/*: форма, бейджи, навигация, транспорт, печать - Sidebar v0.2.0 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>develop
9 changed files with 2130 additions and 24 deletions
@ -0,0 +1,349 @@
|
||||
import type { Metadata } from "next"; |
||||
|
||||
export const metadata: Metadata = { |
||||
title: "Типографика | Брендбук О!Клиника", |
||||
}; |
||||
|
||||
/* ─── Шкала типографики ────────────────────────────────────────────── */ |
||||
const DIN_SCALE = [ |
||||
{ token: "h1", size: "40px / 2.5rem", weight: "700", lh: "1.2", sample: "Клиника ухо, горло, нос" }, |
||||
{ token: "h2", size: "32px / 2rem", weight: "700", lh: "1.25", sample: "Наши специалисты" }, |
||||
{ token: "h3", size: "24px / 1.5rem", weight: "700", lh: "1.3", sample: "Запись на приём" }, |
||||
{ token: "h4", size: "20px / 1.25rem",weight: "700", lh: "1.35", sample: "Расписание врачей" }, |
||||
{ token: "h5", size: "16px / 1rem", weight: "700", lh: "1.4", sample: "Услуги и цены" }, |
||||
{ token: "h6", size: "14px / 0.875rem",weight:"700", lh: "1.4", sample: "Контакты клиники" }, |
||||
]; |
||||
|
||||
const FIRA_SCALE = [ |
||||
{ token: "h1", size: "40px / 2.5rem", weight: "600", lh: "1.2", sample: "Клиника ухо, горло, нос" }, |
||||
{ token: "h2", size: "32px / 2rem", weight: "600", lh: "1.25", sample: "Наши специалисты" }, |
||||
{ token: "h3", size: "24px / 1.5rem", weight: "600", lh: "1.3", sample: "Запись на приём" }, |
||||
{ token: "h4", size: "20px / 1.25rem", weight: "500", lh: "1.35", sample: "Расписание врачей" }, |
||||
{ token: "h5", size: "16px / 1rem", weight: "500", lh: "1.4", sample: "Услуги и цены" }, |
||||
{ token: "h6", size: "14px / 0.875rem",weight: "500", lh: "1.4", sample: "Контакты клиники" }, |
||||
{ token: "body", size: "16px / 1rem", weight: "400", lh: "1.6", sample: "ЛОР-клиника предоставляет полный спектр услуг по диагностике и лечению заболеваний уха, горла и носа." }, |
||||
{ token: "body-sm", size: "14px / 0.875rem",weight: "400", lh: "1.6", sample: "Запись по телефону или через форму на сайте. Работаем без выходных." }, |
||||
{ token: "caption", size: "12px / 0.75rem", weight: "400", lh: "1.5", sample: "Лицензия № ЛО-77-01-018234 от 12.01.2022" }, |
||||
{ token: "label", size: "12px / 0.75rem", weight: "500", lh: "1.4", sample: "СПЕЦИАЛИЗАЦИЯ ВРАЧА" }, |
||||
{ token: "overline", size: "10px / 0.625rem",weight: "600", lh: "1.4", sample: "ФУНДАМЕНТ → 1.4" }, |
||||
]; |
||||
|
||||
/* ─── Компоненты ───────────────────────────────────────────────────── */ |
||||
function Section({ |
||||
title, |
||||
subtitle, |
||||
children, |
||||
}: { |
||||
title: string; |
||||
subtitle?: string; |
||||
children: React.ReactNode; |
||||
}) { |
||||
return ( |
||||
<section className="mb-14"> |
||||
<div className="mb-6"> |
||||
<h2 className="text-xl font-semibold" style={{ color: "var(--bb-text)" }}> |
||||
{title} |
||||
</h2> |
||||
{subtitle && ( |
||||
<p className="mt-1 text-sm" style={{ color: "var(--bb-text-muted)" }}> |
||||
{subtitle} |
||||
</p> |
||||
)} |
||||
</div> |
||||
{children} |
||||
</section> |
||||
); |
||||
} |
||||
|
||||
function UsageBadge({ label, color }: { label: string; color: string }) { |
||||
return ( |
||||
<span |
||||
className="inline-block px-2 py-0.5 rounded text-xs font-medium" |
||||
style={{ background: color === "teal" ? "#e0f5f4" : "#fef3c7", color: color === "teal" ? "var(--brand-073m)" : "#92400e" }} |
||||
> |
||||
{label} |
||||
</span> |
||||
); |
||||
} |
||||
|
||||
function TypeRow({ |
||||
token, |
||||
size, |
||||
weight, |
||||
lh, |
||||
sample, |
||||
fontFamily, |
||||
}: { |
||||
token: string; |
||||
size: string; |
||||
weight: string; |
||||
lh: string; |
||||
sample: string; |
||||
fontFamily: string; |
||||
}) { |
||||
const [sizeVal] = size.split(" / "); |
||||
const pxSize = parseInt(sizeVal); |
||||
|
||||
return ( |
||||
<div |
||||
className="border-t py-4 grid gap-4" |
||||
style={{ |
||||
borderColor: "var(--bb-border)", |
||||
gridTemplateColumns: "80px 1fr 140px", |
||||
alignItems: "start", |
||||
}} |
||||
> |
||||
{/* Токен */} |
||||
<div className="pt-1"> |
||||
<span |
||||
className="font-mono text-xs px-2 py-0.5 rounded" |
||||
style={{ background: "#f3f4f6", color: "#374151" }} |
||||
> |
||||
{token} |
||||
</span> |
||||
</div> |
||||
|
||||
{/* Образец */} |
||||
<div |
||||
style={{ |
||||
fontFamily, |
||||
fontSize: `${Math.min(pxSize, 28)}px`, |
||||
fontWeight: weight, |
||||
lineHeight: lh, |
||||
color: "var(--bb-text)", |
||||
wordBreak: "break-word", |
||||
}} |
||||
> |
||||
{sample} |
||||
</div> |
||||
|
||||
{/* Метаданные */} |
||||
<div className="pt-1 space-y-1 text-right"> |
||||
<p className="font-mono text-xs" style={{ color: "var(--bb-text-muted)" }}> |
||||
{size} |
||||
</p> |
||||
<p className="font-mono text-xs" style={{ color: "var(--bb-text-muted)" }}> |
||||
w{weight} · lh{lh} |
||||
</p> |
||||
</div> |
||||
</div> |
||||
); |
||||
} |
||||
|
||||
/* ─── Страница ─────────────────────────────────────────────────────── */ |
||||
export default function TypographyPage() { |
||||
return ( |
||||
<div className="max-w-4xl mx-auto px-8 py-10"> |
||||
|
||||
{/* Заголовок */} |
||||
<div className="mb-10 pb-6 border-b" style={{ borderColor: "var(--bb-border)" }}> |
||||
<p |
||||
className="text-xs font-semibold uppercase tracking-widest mb-2" |
||||
style={{ color: "var(--brand-053m)" }} |
||||
> |
||||
Фундамент → 1.4 |
||||
</p> |
||||
<h1 className="text-3xl font-semibold mb-3" style={{ color: "var(--bb-text)" }}> |
||||
Типографика |
||||
</h1> |
||||
<p className="text-base max-w-2xl" style={{ color: "var(--bb-text-muted)" }}> |
||||
Бренд использует два шрифта с чётким разделением по контексту применения. |
||||
Никогда не смешивайте их в одном носителе без необходимости. |
||||
</p> |
||||
</div> |
||||
|
||||
{/* Карточки шрифтов */} |
||||
<section className="mb-12"> |
||||
<h2 className="text-xl font-semibold mb-6" style={{ color: "var(--bb-text)" }}> |
||||
Шрифты бренда |
||||
</h2> |
||||
<div className="grid grid-cols-1 gap-4 sm:grid-cols-2"> |
||||
{/* DINPro */} |
||||
<div |
||||
className="rounded-xl border p-6" |
||||
style={{ borderColor: "var(--bb-border)" }} |
||||
> |
||||
<div className="flex items-start justify-between mb-3"> |
||||
<div> |
||||
<p className="font-semibold text-base" style={{ color: "var(--bb-text)" }}> |
||||
DINPro |
||||
</p> |
||||
<p className="text-xs mt-0.5" style={{ color: "var(--bb-text-muted)" }}> |
||||
Бренд-шрифт · не Google Fonts |
||||
</p> |
||||
</div> |
||||
<UsageBadge label="Оффлайн · Бренд" color="yellow" /> |
||||
</div> |
||||
<div |
||||
className="text-4xl mb-4 font-bold" |
||||
style={{ fontFamily: "'DINPro', Arial, sans-serif", color: "var(--bb-text)" }} |
||||
> |
||||
Aa Бб Вв |
||||
</div> |
||||
<p className="text-sm" style={{ color: "var(--bb-text-muted)" }}> |
||||
Применяется на: форме сотрудников, бейджах, вывесках, транспорте, |
||||
полиграфии. Лицензионный шрифт — передаётся дизайнером. |
||||
</p> |
||||
<p className="text-xs mt-3 font-mono px-2 py-1 rounded inline-block" |
||||
style={{ background: "#f3f4f6", color: "#374151" }}> |
||||
--font-brand |
||||
</p> |
||||
</div> |
||||
|
||||
{/* Fira Sans */} |
||||
<div |
||||
className="rounded-xl border p-6" |
||||
style={{ borderColor: "var(--bb-border)" }} |
||||
> |
||||
<div className="flex items-start justify-between mb-3"> |
||||
<div> |
||||
<p className="font-semibold text-base" style={{ color: "var(--bb-text)" }}> |
||||
Fira Sans |
||||
</p> |
||||
<p className="text-xs mt-0.5" style={{ color: "var(--bb-text-muted)" }}> |
||||
Веб-шрифт · Google Fonts |
||||
</p> |
||||
</div> |
||||
<UsageBadge label="Веб · Цифровой" color="teal" /> |
||||
</div> |
||||
<div |
||||
className="text-4xl mb-4 font-semibold" |
||||
style={{ fontFamily: "var(--font-fira-sans)", color: "var(--bb-text)" }} |
||||
> |
||||
Aa Бб Вв |
||||
</div> |
||||
<p className="text-sm" style={{ color: "var(--bb-text-muted)" }}> |
||||
Применяется на: сайте oclinica.ru, в цифровом брендбуке, онлайн-материалах. |
||||
Подключён через next/font/google (кириллица + латиница). |
||||
</p> |
||||
<p className="text-xs mt-3 font-mono px-2 py-1 rounded inline-block" |
||||
style={{ background: "#f3f4f6", color: "#374151" }}> |
||||
--font-web |
||||
</p> |
||||
</div> |
||||
</div> |
||||
</section> |
||||
|
||||
{/* Таблица применения */} |
||||
<section className="mb-12"> |
||||
<h2 className="text-xl font-semibold mb-4" style={{ color: "var(--bb-text)" }}> |
||||
Правило применения |
||||
</h2> |
||||
<div |
||||
className="overflow-hidden rounded-xl border" |
||||
style={{ borderColor: "var(--bb-border)" }} |
||||
> |
||||
<table className="w-full text-sm"> |
||||
<thead> |
||||
<tr style={{ background: "var(--bb-sidebar-bg)" }}> |
||||
{["Носитель", "Шрифт"].map(h => ( |
||||
<th |
||||
key={h} |
||||
className="text-left px-5 py-3 font-medium" |
||||
style={{ color: "var(--bb-text-muted)" }} |
||||
> |
||||
{h} |
||||
</th> |
||||
))} |
||||
</tr> |
||||
</thead> |
||||
<tbody> |
||||
{[ |
||||
["Сайт, цифровые материалы, брендбук", "Fira Sans"], |
||||
["Форма сотрудников, бейджи", "DINPro"], |
||||
["Вывески, таблички, навигация", "DINPro"], |
||||
["Брендирование транспорта", "DINPro"], |
||||
["Визитки, листовки, полиграфия", "DINPro"], |
||||
["Telegram-бот, пуш-уведомления", "Fira Sans (системный)"], |
||||
].map(([media, font]) => ( |
||||
<tr |
||||
key={media} |
||||
className="border-t" |
||||
style={{ borderColor: "var(--bb-border)" }} |
||||
> |
||||
<td className="px-5 py-3" style={{ color: "var(--bb-text)" }}>{media}</td> |
||||
<td className="px-5 py-3 font-medium" style={{ color: "var(--brand-073m)" }}> |
||||
{font} |
||||
</td> |
||||
</tr> |
||||
))} |
||||
</tbody> |
||||
</table> |
||||
</div> |
||||
</section> |
||||
|
||||
{/* DINPro Scale */} |
||||
<Section |
||||
title="DINPro — шкала заголовков" |
||||
subtitle="Бренд-шрифт. Используется в оффлайн-носителях. Отображается с системным фоллбэком Arial, если шрифт не установлен." |
||||
> |
||||
<div> |
||||
{DIN_SCALE.map(row => ( |
||||
<TypeRow |
||||
key={row.token} |
||||
{...row} |
||||
fontFamily="'DINPro', 'DIN Pro', Arial, sans-serif" |
||||
/> |
||||
))} |
||||
</div> |
||||
</Section> |
||||
|
||||
{/* Fira Sans Scale */} |
||||
<Section |
||||
title="Fira Sans — полная шкала" |
||||
subtitle="Веб-шрифт. Используется на сайте и в цифровых материалах. Загружается через Google Fonts." |
||||
> |
||||
<div> |
||||
{FIRA_SCALE.map(row => ( |
||||
<TypeRow |
||||
key={row.token} |
||||
{...row} |
||||
fontFamily="var(--font-fira-sans, 'Fira Sans', sans-serif)" |
||||
/> |
||||
))} |
||||
</div> |
||||
</Section> |
||||
|
||||
{/* Живой пример */} |
||||
<Section |
||||
title="Живой пример — блок контента" |
||||
subtitle="Типичная комбинация заголовка и тела текста на сайте." |
||||
> |
||||
<div |
||||
className="rounded-xl border p-8" |
||||
style={{ |
||||
borderColor: "var(--bb-border)", |
||||
background: "var(--bb-sidebar-bg)", |
||||
fontFamily: "var(--font-fira-sans, 'Fira Sans', sans-serif)", |
||||
}} |
||||
> |
||||
<p |
||||
className="text-xs font-semibold uppercase tracking-widest mb-3" |
||||
style={{ color: "var(--brand-053m)", letterSpacing: "0.1em" }} |
||||
> |
||||
Наши специалисты |
||||
</p> |
||||
<h2 |
||||
className="mb-4" |
||||
style={{ fontSize: 28, fontWeight: 600, lineHeight: 1.3, color: "var(--bb-text)" }} |
||||
> |
||||
Запись к ЛОР-врачу<br />без очереди и ожидания |
||||
</h2> |
||||
<p |
||||
className="mb-4 max-w-xl" |
||||
style={{ fontSize: 16, fontWeight: 400, lineHeight: 1.6, color: "var(--bb-text-muted)" }} |
||||
> |
||||
В нашей клинике работают специалисты высшей категории с опытом от 15 лет. |
||||
Диагностика и лечение заболеваний уха, горла, носа и смежных органов. |
||||
</p> |
||||
<p |
||||
style={{ fontSize: 12, fontWeight: 400, lineHeight: 1.5, color: "#9ca3af" }} |
||||
> |
||||
Лицензия № ЛО-77-01-018234 · Москва, ул. Примерная, д. 1 |
||||
</p> |
||||
</div> |
||||
</Section> |
||||
|
||||
</div> |
||||
); |
||||
} |
||||
@ -0,0 +1,273 @@
|
||||
import type { Metadata } from "next"; |
||||
import Image from "next/image"; |
||||
|
||||
export const metadata: Metadata = { |
||||
title: "Бейджи | Брендбук О!Клиника", |
||||
}; |
||||
|
||||
function Section({ |
||||
title, |
||||
subtitle, |
||||
children, |
||||
}: { |
||||
title: string; |
||||
subtitle?: string; |
||||
children: React.ReactNode; |
||||
}) { |
||||
return ( |
||||
<section className="mb-12"> |
||||
<div className="mb-6"> |
||||
<h2 className="text-xl font-semibold" style={{ color: "var(--bb-text)" }}> |
||||
{title} |
||||
</h2> |
||||
{subtitle && ( |
||||
<p className="mt-1 text-sm" style={{ color: "var(--bb-text-muted)" }}> |
||||
{subtitle} |
||||
</p> |
||||
)} |
||||
</div> |
||||
{children} |
||||
</section> |
||||
); |
||||
} |
||||
|
||||
/* Компонент бейджа (масштабированный макет) */ |
||||
function BadgeMockup({ |
||||
variant, |
||||
name, |
||||
role, |
||||
}: { |
||||
variant: "light" | "dark"; |
||||
name: string; |
||||
role: string; |
||||
}) { |
||||
const isDark = variant === "dark"; |
||||
/* 70×30 мм → пропорция 7:3. Отображаем в 280×120px */ |
||||
return ( |
||||
<div className="flex flex-col items-center gap-3"> |
||||
<div |
||||
className="rounded-lg flex items-center px-5 gap-4" |
||||
style={{ |
||||
width: 280, |
||||
height: 120, |
||||
background: isDark ? "var(--brand-073m)" : "var(--brand-081m)", |
||||
border: isDark ? "none" : "1px solid #d1d5db", |
||||
flexShrink: 0, |
||||
}} |
||||
> |
||||
{/* Логотип */} |
||||
<Image |
||||
src="/logo/logo-transparent.png" |
||||
alt="Логотип" |
||||
width={72} |
||||
height={26} |
||||
className="object-contain shrink-0" |
||||
style={{ |
||||
filter: isDark |
||||
? "brightness(0) invert(1)" |
||||
: "brightness(0) sepia(1) saturate(2) hue-rotate(330deg) brightness(0.45)", |
||||
}} |
||||
/> |
||||
{/* Разделитель */} |
||||
<div |
||||
className="self-stretch w-px mx-1" |
||||
style={{ background: isDark ? "rgba(255,255,255,0.25)" : "rgba(92,46,14,0.2)" }} |
||||
/> |
||||
{/* Текст */} |
||||
<div> |
||||
<p |
||||
className="font-bold leading-tight" |
||||
style={{ |
||||
fontFamily: "'DINPro', Arial, sans-serif", |
||||
fontSize: 13, |
||||
color: isDark ? "#ffffff" : "#5c2e0e", |
||||
}} |
||||
> |
||||
{name} |
||||
</p> |
||||
<p |
||||
className="leading-tight mt-0.5" |
||||
style={{ |
||||
fontFamily: "'DINPro', Arial, sans-serif", |
||||
fontSize: 10, |
||||
color: isDark ? "rgba(255,255,255,0.7)" : "rgba(92,46,14,0.7)", |
||||
}} |
||||
> |
||||
{role} |
||||
</p> |
||||
</div> |
||||
</div> |
||||
<p className="text-xs" style={{ color: "var(--bb-text-muted)" }}> |
||||
{isDark ? "Тёмный вариант (серо-голубой)" : "Светлый вариант (бежевый)"} |
||||
</p> |
||||
</div> |
||||
); |
||||
} |
||||
|
||||
export default function BadgesPage() { |
||||
return ( |
||||
<div className="max-w-4xl mx-auto px-8 py-10"> |
||||
|
||||
{/* Заголовок */} |
||||
<div className="mb-10 pb-6 border-b" style={{ borderColor: "var(--bb-border)" }}> |
||||
<p |
||||
className="text-xs font-semibold uppercase tracking-widest mb-2" |
||||
style={{ color: "var(--brand-053m)" }} |
||||
> |
||||
Оффлайн элементы → 6.2 |
||||
</p> |
||||
<h1 className="text-3xl font-semibold mb-3" style={{ color: "var(--bb-text)" }}> |
||||
Бейджи сотрудников |
||||
</h1> |
||||
<p className="text-base max-w-2xl" style={{ color: "var(--bb-text-muted)" }}> |
||||
Именные бейджи для идентификации сотрудников клиники. Размер 70×30 мм. |
||||
Два цветовых варианта в зависимости от должности. |
||||
</p> |
||||
</div> |
||||
|
||||
{/* Размеры и технические требования */} |
||||
<Section |
||||
title="Технические параметры" |
||||
subtitle="Единый стандарт для всех сотрудников клиники." |
||||
> |
||||
<div |
||||
className="grid grid-cols-2 gap-4 sm:grid-cols-4 mb-6" |
||||
> |
||||
{[ |
||||
{ label: "Ширина", value: "70 мм" }, |
||||
{ label: "Высота", value: "30 мм" }, |
||||
{ label: "Материал", value: "ПВХ / металл" }, |
||||
{ label: "Крепление", value: "Булавка / клипса" }, |
||||
].map(({ label, value }) => ( |
||||
<div |
||||
key={label} |
||||
className="rounded-xl border p-4 text-center" |
||||
style={{ borderColor: "var(--bb-border)", background: "var(--bb-sidebar-bg)" }} |
||||
> |
||||
<p className="font-mono text-lg font-semibold" style={{ color: "var(--brand-073m)" }}> |
||||
{value} |
||||
</p> |
||||
<p className="text-xs mt-1" style={{ color: "var(--bb-text-muted)" }}> |
||||
{label} |
||||
</p> |
||||
</div> |
||||
))} |
||||
</div> |
||||
</Section> |
||||
|
||||
{/* Варианты */} |
||||
<Section |
||||
title="Варианты бейджей" |
||||
subtitle="Макет бейджа (масштаб: 4× от реального размера 70×30 мм)." |
||||
> |
||||
<div className="flex flex-wrap gap-8 items-start"> |
||||
<BadgeMockup |
||||
variant="light" |
||||
name="Иванова А.В." |
||||
role="Врач-оториноларинголог" |
||||
/> |
||||
<BadgeMockup |
||||
variant="dark" |
||||
name="Петров К.С." |
||||
role="Главный врач" |
||||
/> |
||||
</div> |
||||
</Section> |
||||
|
||||
{/* Состав текста */} |
||||
<Section |
||||
title="Состав текста на бейдже" |
||||
subtitle="Строгий порядок элементов. Шрифт — DINPro." |
||||
> |
||||
<div |
||||
className="overflow-hidden rounded-xl border" |
||||
style={{ borderColor: "var(--bb-border)" }} |
||||
> |
||||
<table className="w-full text-sm"> |
||||
<thead> |
||||
<tr style={{ background: "var(--bb-sidebar-bg)" }}> |
||||
{["Элемент", "Содержание", "Шрифт / Размер", "Позиция"].map(h => ( |
||||
<th |
||||
key={h} |
||||
className="text-left px-5 py-3 font-medium" |
||||
style={{ color: "var(--bb-text-muted)" }} |
||||
> |
||||
{h} |
||||
</th> |
||||
))} |
||||
</tr> |
||||
</thead> |
||||
<tbody> |
||||
{[ |
||||
["Логотип", "Логотип клиники", "PNG / SVG", "Левая часть, по центру по высоте"], |
||||
["Разделитель", "Вертикальная линия", "1px, 40% прозрачность", "Между логотипом и текстом"], |
||||
["ФИО", "Фамилия И.О.", "DINPro Bold 13px", "Правая часть, верхняя строка"], |
||||
["Должность", "Полное название должности", "DINPro Regular 10px", "Правая часть, нижняя строка"], |
||||
].map(([el, content, font, pos]) => ( |
||||
<tr |
||||
key={el} |
||||
className="border-t" |
||||
style={{ borderColor: "var(--bb-border)" }} |
||||
> |
||||
<td className="px-5 py-3 font-medium" style={{ color: "var(--bb-text)" }}>{el}</td> |
||||
<td className="px-5 py-3" style={{ color: "var(--bb-text-muted)" }}>{content}</td> |
||||
<td className="px-5 py-3 font-mono text-xs" style={{ color: "var(--bb-text-muted)" }}>{font}</td> |
||||
<td className="px-5 py-3" style={{ color: "var(--bb-text-muted)" }}>{pos}</td> |
||||
</tr> |
||||
))} |
||||
</tbody> |
||||
</table> |
||||
</div> |
||||
</Section> |
||||
|
||||
{/* Цветовые варианты */} |
||||
<Section |
||||
title="Применение вариантов" |
||||
subtitle="Выбор варианта зависит от должности сотрудника." |
||||
> |
||||
<div className="grid grid-cols-1 gap-4 sm:grid-cols-2"> |
||||
{[ |
||||
{ |
||||
variant: "Светлый (бежевый)", |
||||
color: "#c4a882", |
||||
usage: "Медицинский персонал, санитарки, технический персонал", |
||||
oracal: "081M", |
||||
}, |
||||
{ |
||||
variant: "Тёмный (серо-голубой)", |
||||
color: "#5b7b87", |
||||
usage: "Административный персонал, менеджеры, главный врач", |
||||
oracal: "073M", |
||||
}, |
||||
].map(item => ( |
||||
<div |
||||
key={item.variant} |
||||
className="flex gap-4 p-4 rounded-xl border" |
||||
style={{ borderColor: "var(--bb-border)" }} |
||||
> |
||||
<div |
||||
className="w-8 h-8 rounded-lg shrink-0 mt-0.5" |
||||
style={{ background: item.color }} |
||||
/> |
||||
<div> |
||||
<p className="font-medium text-sm mb-1" style={{ color: "var(--bb-text)" }}> |
||||
{item.variant} |
||||
</p> |
||||
<p className="text-xs mb-1.5" style={{ color: "var(--bb-text-muted)" }}> |
||||
{item.usage} |
||||
</p> |
||||
<span |
||||
className="text-[10px] font-mono px-1.5 py-0.5 rounded" |
||||
style={{ background: "#f3f4f6", color: "#374151" }} |
||||
> |
||||
Oracal {item.oracal} |
||||
</span> |
||||
</div> |
||||
</div> |
||||
))} |
||||
</div> |
||||
</Section> |
||||
|
||||
</div> |
||||
); |
||||
} |
||||
@ -0,0 +1,252 @@
|
||||
import type { Metadata } from "next"; |
||||
|
||||
export const metadata: Metadata = { |
||||
title: "Внутренняя навигация | Брендбук О!Клиника", |
||||
}; |
||||
|
||||
function Section({ |
||||
title, |
||||
subtitle, |
||||
children, |
||||
}: { |
||||
title: string; |
||||
subtitle?: string; |
||||
children: React.ReactNode; |
||||
}) { |
||||
return ( |
||||
<section className="mb-12"> |
||||
<div className="mb-6"> |
||||
<h2 className="text-xl font-semibold" style={{ color: "var(--bb-text)" }}> |
||||
{title} |
||||
</h2> |
||||
{subtitle && ( |
||||
<p className="mt-1 text-sm" style={{ color: "var(--bb-text-muted)" }}> |
||||
{subtitle} |
||||
</p> |
||||
)} |
||||
</div> |
||||
{children} |
||||
</section> |
||||
); |
||||
} |
||||
|
||||
/* Макет настенной таблички */ |
||||
function SignMockup({ |
||||
type, |
||||
text, |
||||
subtext, |
||||
bgColor, |
||||
textColor, |
||||
accentColor, |
||||
size, |
||||
}: { |
||||
type: string; |
||||
text: string; |
||||
subtext?: string; |
||||
bgColor: string; |
||||
textColor: string; |
||||
accentColor: string; |
||||
size: string; |
||||
}) { |
||||
return ( |
||||
<div className="flex flex-col items-start gap-2"> |
||||
<div |
||||
className="rounded-lg px-6 py-4 flex items-center gap-4" |
||||
style={{ |
||||
background: bgColor, |
||||
width: 260, |
||||
border: bgColor === "#ffffff" ? "1px solid #e5e7eb" : "none", |
||||
}} |
||||
> |
||||
{/* Цветовая полоса */} |
||||
<div |
||||
className="w-1.5 self-stretch rounded-full" |
||||
style={{ background: accentColor, minHeight: 32 }} |
||||
/> |
||||
<div> |
||||
<p |
||||
style={{ |
||||
fontFamily: "'DINPro', Arial, sans-serif", |
||||
fontSize: 14, |
||||
fontWeight: 700, |
||||
color: textColor, |
||||
lineHeight: 1.3, |
||||
}} |
||||
> |
||||
{text} |
||||
</p> |
||||
{subtext && ( |
||||
<p |
||||
style={{ |
||||
fontFamily: "'DINPro', Arial, sans-serif", |
||||
fontSize: 10, |
||||
color: textColor, |
||||
opacity: 0.65, |
||||
marginTop: 3, |
||||
}} |
||||
> |
||||
{subtext} |
||||
</p> |
||||
)} |
||||
</div> |
||||
</div> |
||||
<div className="pl-1"> |
||||
<p className="text-xs font-medium" style={{ color: "var(--bb-text)" }}>{type}</p> |
||||
<p className="text-xs" style={{ color: "var(--bb-text-muted)" }}>{size}</p> |
||||
</div> |
||||
</div> |
||||
); |
||||
} |
||||
|
||||
export default function NavigationPage() { |
||||
return ( |
||||
<div className="max-w-4xl mx-auto px-8 py-10"> |
||||
|
||||
{/* Заголовок */} |
||||
<div className="mb-10 pb-6 border-b" style={{ borderColor: "var(--bb-border)" }}> |
||||
<p |
||||
className="text-xs font-semibold uppercase tracking-widest mb-2" |
||||
style={{ color: "var(--brand-053m)" }} |
||||
> |
||||
Оффлайн элементы → 6.3 |
||||
</p> |
||||
<h1 className="text-3xl font-semibold mb-3" style={{ color: "var(--bb-text)" }}> |
||||
Внутренняя навигация |
||||
</h1> |
||||
<p className="text-base max-w-2xl" style={{ color: "var(--bb-text-muted)" }}> |
||||
Система навигационных табличек и указателей внутри клиники. |
||||
Единый стиль с фирменными цветами и шрифтом DINPro. |
||||
</p> |
||||
</div> |
||||
|
||||
{/* Шаблоны табличек */} |
||||
<Section |
||||
title="Типы табличек" |
||||
subtitle="Четыре базовых шаблона для разных зон клиники." |
||||
> |
||||
<div className="flex flex-wrap gap-6"> |
||||
<SignMockup |
||||
type="Кабинет врача" |
||||
text="Кабинет № 101" |
||||
subtext="Оториноларингология" |
||||
bgColor="#ffffff" |
||||
textColor="#1b4c72" |
||||
accentColor="#7ecfca" |
||||
size="200 × 80 мм" |
||||
/> |
||||
<SignMockup |
||||
type="Направляющий указатель" |
||||
text="→ Регистратура" |
||||
subtext="2-й этаж" |
||||
bgColor="#5b7b87" |
||||
textColor="#ffffff" |
||||
accentColor="#7ecfca" |
||||
size="300 × 80 мм" |
||||
/> |
||||
<SignMockup |
||||
type="Зона ожидания" |
||||
text="Зона ожидания" |
||||
subtext="Пожалуйста, соблюдайте тишину" |
||||
bgColor="#e0f5f4" |
||||
textColor="#1b4c72" |
||||
accentColor="#5bb5ad" |
||||
size="250 × 80 мм" |
||||
/> |
||||
<SignMockup |
||||
type="Запрещающий" |
||||
text="Вход только для персонала" |
||||
bgColor="#1b4c72" |
||||
textColor="#ffffff" |
||||
accentColor="#c4a882" |
||||
size="250 × 60 мм" |
||||
/> |
||||
</div> |
||||
</Section> |
||||
|
||||
{/* Технические требования */} |
||||
<Section |
||||
title="Технические требования" |
||||
subtitle="Материалы и цвета для производства." |
||||
> |
||||
<div |
||||
className="overflow-hidden rounded-xl border" |
||||
style={{ borderColor: "var(--bb-border)" }} |
||||
> |
||||
<table className="w-full text-sm"> |
||||
<thead> |
||||
<tr style={{ background: "var(--bb-sidebar-bg)" }}> |
||||
{["Параметр", "Значение"].map(h => ( |
||||
<th |
||||
key={h} |
||||
className="text-left px-5 py-3 font-medium" |
||||
style={{ color: "var(--bb-text-muted)" }} |
||||
> |
||||
{h} |
||||
</th> |
||||
))} |
||||
</tr> |
||||
</thead> |
||||
<tbody> |
||||
{[ |
||||
["Основной материал", "ПВХ 3мм / ПС зеркальный / акрил"], |
||||
["Покрытие фона", "Oracal плёнка (053M / 073M / 050M)"], |
||||
["Шрифт", "DINPro Bold / Regular (DXF для фрезеровки)"], |
||||
["Крепление", "Двусторонний скотч / шурупы с дистанционным держателем"], |
||||
["Толщина букв (фрезеровка)", "3 мм от основы"], |
||||
["Минимальный размер текста", "10 мм по высоте"], |
||||
].map(([param, value]) => ( |
||||
<tr |
||||
key={param} |
||||
className="border-t" |
||||
style={{ borderColor: "var(--bb-border)" }} |
||||
> |
||||
<td className="px-5 py-3 font-medium" style={{ color: "var(--bb-text)" }}> |
||||
{param} |
||||
</td> |
||||
<td className="px-5 py-3" style={{ color: "var(--bb-text-muted)" }}> |
||||
{value} |
||||
</td> |
||||
</tr> |
||||
))} |
||||
</tbody> |
||||
</table> |
||||
</div> |
||||
</Section> |
||||
|
||||
{/* Цвета Oracal */} |
||||
<Section |
||||
title="Цвета Oracal для навигации" |
||||
subtitle="Допустимые цвета плёнки по коду Oracal." |
||||
> |
||||
<div className="grid grid-cols-2 gap-4 sm:grid-cols-4"> |
||||
{[ |
||||
{ code: "053M", hex: "#7ecfca", name: "Акцент / полоса" }, |
||||
{ code: "073M", hex: "#5b7b87", name: "Фон указателей" }, |
||||
{ code: "050M", hex: "#1b4c72", name: "Фон запрещающих" }, |
||||
{ code: "081M", hex: "#c4a882", name: "Акцент на тёмном" }, |
||||
].map(c => ( |
||||
<div |
||||
key={c.code} |
||||
className="rounded-xl overflow-hidden border" |
||||
style={{ borderColor: "var(--bb-border)" }} |
||||
> |
||||
<div className="h-16" style={{ background: c.hex }} /> |
||||
<div className="p-3"> |
||||
<p className="font-medium text-xs" style={{ color: "var(--bb-text)" }}> |
||||
Oracal {c.code} |
||||
</p> |
||||
<p className="text-xs" style={{ color: "var(--bb-text-muted)" }}> |
||||
{c.name} |
||||
</p> |
||||
<p className="font-mono text-xs mt-1" style={{ color: "var(--bb-text-muted)" }}> |
||||
{c.hex} |
||||
</p> |
||||
</div> |
||||
</div> |
||||
))} |
||||
</div> |
||||
</Section> |
||||
|
||||
</div> |
||||
); |
||||
} |
||||
@ -0,0 +1,331 @@
|
||||
import type { Metadata } from "next"; |
||||
import Image from "next/image"; |
||||
|
||||
export const metadata: Metadata = { |
||||
title: "Печатные материалы | Брендбук О!Клиника", |
||||
}; |
||||
|
||||
function Section({ |
||||
title, |
||||
subtitle, |
||||
children, |
||||
}: { |
||||
title: string; |
||||
subtitle?: string; |
||||
children: React.ReactNode; |
||||
}) { |
||||
return ( |
||||
<section className="mb-12"> |
||||
<div className="mb-6"> |
||||
<h2 className="text-xl font-semibold" style={{ color: "var(--bb-text)" }}> |
||||
{title} |
||||
</h2> |
||||
{subtitle && ( |
||||
<p className="mt-1 text-sm" style={{ color: "var(--bb-text-muted)" }}> |
||||
{subtitle} |
||||
</p> |
||||
)} |
||||
</div> |
||||
{children} |
||||
</section> |
||||
); |
||||
} |
||||
|
||||
/* Макет визитки */ |
||||
function BusinessCardMockup({ side }: { side: "front" | "back" }) { |
||||
/* 90×50 мм → пропорция 9:5. Отображаем 288×160px */ |
||||
if (side === "front") { |
||||
return ( |
||||
<div |
||||
className="rounded-xl overflow-hidden shadow-md" |
||||
style={{ width: 288, height: 160, background: "#5b7b87", flexShrink: 0 }} |
||||
> |
||||
{/* Верхняя бирюзовая полоса */} |
||||
<div style={{ height: 6, background: "#7ecfca" }} /> |
||||
|
||||
<div className="flex h-full"> |
||||
{/* Левая колонка с логотипом */} |
||||
<div |
||||
className="flex items-center justify-center px-6" |
||||
style={{ width: 110, borderRight: "1px solid rgba(255,255,255,0.15)" }} |
||||
> |
||||
<Image |
||||
src="/logo/logo-transparent.png" |
||||
alt="Логотип" |
||||
width={80} |
||||
height={28} |
||||
className="object-contain" |
||||
style={{ filter: "brightness(0) invert(1)" }} |
||||
/> |
||||
</div> |
||||
|
||||
{/* Правая колонка с данными */} |
||||
<div className="flex flex-col justify-center px-5 pb-2 gap-1"> |
||||
<p |
||||
style={{ |
||||
fontFamily: "'DINPro', Arial, sans-serif", |
||||
fontSize: 12, |
||||
fontWeight: 700, |
||||
color: "#ffffff", |
||||
}} |
||||
> |
||||
Иванова Анна Викторовна |
||||
</p> |
||||
<p |
||||
style={{ |
||||
fontFamily: "'DINPro', Arial, sans-serif", |
||||
fontSize: 9, |
||||
color: "rgba(255,255,255,0.7)", |
||||
}} |
||||
> |
||||
Врач-оториноларинголог |
||||
</p> |
||||
<div className="mt-2 space-y-0.5"> |
||||
{["+7 (495) 000-00-00", "oclinica.ru"].map(line => ( |
||||
<p |
||||
key={line} |
||||
style={{ |
||||
fontFamily: "'DINPro', Arial, sans-serif", |
||||
fontSize: 8, |
||||
color: "rgba(255,255,255,0.6)", |
||||
}} |
||||
> |
||||
{line} |
||||
</p> |
||||
))} |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
); |
||||
} |
||||
|
||||
return ( |
||||
<div |
||||
className="rounded-xl overflow-hidden shadow-md flex items-center justify-center" |
||||
style={{ width: 288, height: 160, background: "#c4a882", flexShrink: 0 }} |
||||
> |
||||
<Image |
||||
src="/logo/logo-transparent.png" |
||||
alt="Логотип на обороте" |
||||
width={140} |
||||
height={50} |
||||
className="object-contain" |
||||
style={{ |
||||
filter: "brightness(0) sepia(1) saturate(2) hue-rotate(330deg) brightness(0.45)", |
||||
}} |
||||
/> |
||||
</div> |
||||
); |
||||
} |
||||
|
||||
/* Макет листовки */ |
||||
function LeafletMockup() { |
||||
/* А5 = 148×210 мм → пропорция ≈ 1:1.42. Отображаем 180×256px */ |
||||
return ( |
||||
<div |
||||
className="rounded-xl overflow-hidden shadow-md" |
||||
style={{ width: 180, height: 256, background: "#ffffff", border: "1px solid #e5e7eb", flexShrink: 0 }} |
||||
> |
||||
{/* Шапка */} |
||||
<div |
||||
className="px-4 pt-4 pb-3 flex items-end justify-between" |
||||
style={{ background: "#5b7b87" }} |
||||
> |
||||
<Image |
||||
src="/logo/logo-transparent.png" |
||||
alt="Логотип" |
||||
width={90} |
||||
height={32} |
||||
className="object-contain" |
||||
style={{ filter: "brightness(0) invert(1)" }} |
||||
/> |
||||
</div> |
||||
|
||||
{/* Тело */} |
||||
<div className="px-4 pt-3"> |
||||
{/* Плейсхолдер фото */} |
||||
<div |
||||
className="w-full rounded mb-3" |
||||
style={{ height: 70, background: "#e0f5f4" }} |
||||
/> |
||||
{/* Заголовок */} |
||||
<div |
||||
className="h-3 rounded mb-1.5" |
||||
style={{ background: "#1b4c72", width: "80%" }} |
||||
/> |
||||
<div |
||||
className="h-3 rounded mb-3" |
||||
style={{ background: "#1b4c72", width: "60%" }} |
||||
/> |
||||
{/* Текст-заглушка */} |
||||
{[100, 90, 95, 80].map((w, i) => ( |
||||
<div |
||||
key={i} |
||||
className="h-1.5 rounded mb-1" |
||||
style={{ background: "#e5e7eb", width: `${w}%` }} |
||||
/> |
||||
))} |
||||
{/* CTA-кнопка */} |
||||
<div |
||||
className="mt-4 rounded py-2 text-center" |
||||
style={{ background: "#7ecfca" }} |
||||
> |
||||
<p |
||||
style={{ |
||||
fontFamily: "'DINPro', Arial, sans-serif", |
||||
fontSize: 9, |
||||
fontWeight: 700, |
||||
color: "#ffffff", |
||||
}} |
||||
> |
||||
ЗАПИСАТЬСЯ НА ПРИЁМ |
||||
</p> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
); |
||||
} |
||||
|
||||
export default function PrintPage() { |
||||
return ( |
||||
<div className="max-w-4xl mx-auto px-8 py-10"> |
||||
|
||||
{/* Заголовок */} |
||||
<div className="mb-10 pb-6 border-b" style={{ borderColor: "var(--bb-border)" }}> |
||||
<p |
||||
className="text-xs font-semibold uppercase tracking-widest mb-2" |
||||
style={{ color: "var(--brand-053m)" }} |
||||
> |
||||
Оффлайн элементы → 6.5 |
||||
</p> |
||||
<h1 className="text-3xl font-semibold mb-3" style={{ color: "var(--bb-text)" }}> |
||||
Печатные материалы |
||||
</h1> |
||||
<p className="text-base max-w-2xl" style={{ color: "var(--bb-text-muted)" }}> |
||||
Листовки, визитки и digital-каналы клиники. Все материалы следуют |
||||
единому фирменному стилю с использованием шрифта DINPro и цветов Oracal. |
||||
</p> |
||||
</div> |
||||
|
||||
{/* Визитки */} |
||||
<Section |
||||
title="Визитки" |
||||
subtitle="Стандарт 90×50 мм. Двусторонняя печать. Изображены в масштабе." |
||||
> |
||||
<div className="flex flex-wrap gap-6 items-start"> |
||||
<div className="flex flex-col items-center gap-2"> |
||||
<BusinessCardMockup side="front" /> |
||||
<p className="text-xs" style={{ color: "var(--bb-text-muted)" }}>Лицевая сторона</p> |
||||
</div> |
||||
<div className="flex flex-col items-center gap-2"> |
||||
<BusinessCardMockup side="back" /> |
||||
<p className="text-xs" style={{ color: "var(--bb-text-muted)" }}>Оборотная сторона</p> |
||||
</div> |
||||
</div> |
||||
|
||||
<div |
||||
className="mt-6 overflow-hidden rounded-xl border" |
||||
style={{ borderColor: "var(--bb-border)" }} |
||||
> |
||||
<table className="w-full text-sm"> |
||||
<thead> |
||||
<tr style={{ background: "var(--bb-sidebar-bg)" }}> |
||||
{["Элемент", "Содержание"].map(h => ( |
||||
<th key={h} className="text-left px-5 py-3 font-medium" |
||||
style={{ color: "var(--bb-text-muted)" }}>{h}</th> |
||||
))} |
||||
</tr> |
||||
</thead> |
||||
<tbody> |
||||
{[ |
||||
["Лицевая — логотип", "Белый инвертированный на тёмно-серо-голубом фоне"], |
||||
["Лицевая — ФИО", "DINPro Bold, 10pt, белый"], |
||||
["Лицевая — должность", "DINPro Regular, 8pt, белый 70%"], |
||||
["Лицевая — контакты", "DINPro Regular, 7pt, белый 60%"], |
||||
["Оборотная", "Логотип тёмно-коричневый на бежевом фоне (081M)"], |
||||
["Размер", "90 × 50 мм, 4+4 офсет или цифровая печать"], |
||||
].map(([el, content]) => ( |
||||
<tr key={el} className="border-t" style={{ borderColor: "var(--bb-border)" }}> |
||||
<td className="px-5 py-3 font-medium" style={{ color: "var(--bb-text)" }}>{el}</td> |
||||
<td className="px-5 py-3" style={{ color: "var(--bb-text-muted)" }}>{content}</td> |
||||
</tr> |
||||
))} |
||||
</tbody> |
||||
</table> |
||||
</div> |
||||
</Section> |
||||
|
||||
{/* Листовки */} |
||||
<Section |
||||
title="Листовки" |
||||
subtitle="Формат А5 (148×210 мм). Шаблон для акций и информационных материалов." |
||||
> |
||||
<div className="flex gap-8 items-start"> |
||||
<LeafletMockup /> |
||||
<div className="flex-1"> |
||||
<p className="font-medium text-sm mb-3" style={{ color: "var(--bb-text)" }}> |
||||
Структура листовки |
||||
</p> |
||||
<div className="space-y-3"> |
||||
{[ |
||||
{ zone: "Шапка", desc: "Логотип белый на тёмно-серо-голубом (073M)" }, |
||||
{ zone: "Фото", desc: "Фото врача или процедуры, 70% ширины" }, |
||||
{ zone: "Заголовок", desc: "DINPro Bold, тёмно-синий (050M), 18–22pt" }, |
||||
{ zone: "Текст", desc: "DINPro Regular, 9–10pt, серый #374151" }, |
||||
{ zone: "CTA-кнопка", desc: "Основной бирюзовый (053M), DINPro Bold белый" }, |
||||
].map(({ zone, desc }) => ( |
||||
<div key={zone} className="flex gap-3"> |
||||
<span |
||||
className="shrink-0 text-xs font-semibold px-2 py-0.5 rounded mt-0.5" |
||||
style={{ background: "#e0f5f4", color: "var(--brand-073m)" }} |
||||
> |
||||
{zone} |
||||
</span> |
||||
<p className="text-sm" style={{ color: "var(--bb-text-muted)" }}>{desc}</p> |
||||
</div> |
||||
))} |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</Section> |
||||
|
||||
{/* Telegram-бот */} |
||||
<Section |
||||
title="Telegram-бот" |
||||
subtitle="Цифровой канал взаимодействия с пациентами." |
||||
> |
||||
<div |
||||
className="rounded-xl border p-6" |
||||
style={{ borderColor: "var(--bb-border)", background: "var(--bb-sidebar-bg)" }} |
||||
> |
||||
<div className="grid grid-cols-1 gap-4 sm:grid-cols-3"> |
||||
{[ |
||||
{ icon: "🤖", title: "Запись на приём", desc: "Выбор врача, даты и времени через бот" }, |
||||
{ icon: "📋", title: "Результаты анализов", desc: "Уведомления и просмотр результатов" }, |
||||
{ icon: "💬", title: "Напоминания", desc: "Напоминание о предстоящем визите" }, |
||||
].map(({ icon, title, desc }) => ( |
||||
<div key={title} className="flex gap-3"> |
||||
<span className="text-2xl shrink-0">{icon}</span> |
||||
<div> |
||||
<p className="font-medium text-sm mb-1" style={{ color: "var(--bb-text)" }}> |
||||
{title} |
||||
</p> |
||||
<p className="text-xs" style={{ color: "var(--bb-text-muted)" }}>{desc}</p> |
||||
</div> |
||||
</div> |
||||
))} |
||||
</div> |
||||
<div |
||||
className="mt-4 pt-4 border-t text-xs" |
||||
style={{ borderColor: "var(--bb-border)", color: "var(--bb-text-muted)" }} |
||||
> |
||||
В Telegram-боте используется системный шрифт Telegram. Логотип и цвета бренда |
||||
применяются в аватаре, приветственном изображении и кнопках меню. |
||||
</div> |
||||
</div> |
||||
</Section> |
||||
|
||||
</div> |
||||
); |
||||
} |
||||
@ -0,0 +1,207 @@
|
||||
import type { Metadata } from "next"; |
||||
import Image from "next/image"; |
||||
|
||||
export const metadata: Metadata = { |
||||
title: "Форма сотрудников | Брендбук О!Клиника", |
||||
}; |
||||
|
||||
function Section({ |
||||
title, |
||||
subtitle, |
||||
children, |
||||
}: { |
||||
title: string; |
||||
subtitle?: string; |
||||
children: React.ReactNode; |
||||
}) { |
||||
return ( |
||||
<section className="mb-12"> |
||||
<div className="mb-6"> |
||||
<h2 className="text-xl font-semibold" style={{ color: "var(--bb-text)" }}> |
||||
{title} |
||||
</h2> |
||||
{subtitle && ( |
||||
<p className="mt-1 text-sm" style={{ color: "var(--bb-text-muted)" }}> |
||||
{subtitle} |
||||
</p> |
||||
)} |
||||
</div> |
||||
{children} |
||||
</section> |
||||
); |
||||
} |
||||
|
||||
export default function UniformPage() { |
||||
return ( |
||||
<div className="max-w-4xl mx-auto px-8 py-10"> |
||||
|
||||
{/* Заголовок */} |
||||
<div className="mb-10 pb-6 border-b" style={{ borderColor: "var(--bb-border)" }}> |
||||
<p |
||||
className="text-xs font-semibold uppercase tracking-widest mb-2" |
||||
style={{ color: "var(--brand-053m)" }} |
||||
> |
||||
Оффлайн элементы → 6.1 |
||||
</p> |
||||
<h1 className="text-3xl font-semibold mb-3" style={{ color: "var(--bb-text)" }}> |
||||
Форма сотрудников |
||||
</h1> |
||||
<p className="text-base max-w-2xl" style={{ color: "var(--bb-text-muted)" }}> |
||||
Фирменная медицинская одежда сотрудников клиники. Бежевый костюм |
||||
с логотипом клиники на левой стороне груди. |
||||
</p> |
||||
</div> |
||||
|
||||
{/* Описание костюма */} |
||||
<Section |
||||
title="Описание комплекта" |
||||
subtitle="Стандартная форма для всех сотрудников клиники." |
||||
> |
||||
<div |
||||
className="rounded-xl border p-6" |
||||
style={{ borderColor: "var(--bb-border)", background: "var(--bb-sidebar-bg)" }} |
||||
> |
||||
<div className="grid grid-cols-1 gap-6 sm:grid-cols-2"> |
||||
<div> |
||||
<p className="font-medium text-sm mb-3" style={{ color: "var(--bb-text)" }}> |
||||
Состав формы |
||||
</p> |
||||
<ul className="space-y-2"> |
||||
{["Медицинский костюм (куртка + брюки)", "Цвет: бежевый (Oracal 081M)", "Материал: медицинская ткань", "Логотип вышит или нанесён термопечатью"].map(item => ( |
||||
<li key={item} className="flex items-start gap-2 text-sm" style={{ color: "var(--bb-text-muted)" }}> |
||||
<span style={{ color: "var(--brand-053m)" }}>•</span> {item} |
||||
</li> |
||||
))} |
||||
</ul> |
||||
</div> |
||||
<div> |
||||
<p className="font-medium text-sm mb-3" style={{ color: "var(--bb-text)" }}> |
||||
Цветовая схема |
||||
</p> |
||||
<div className="flex gap-3"> |
||||
<div className="text-center"> |
||||
<div className="w-12 h-12 rounded-lg border mb-1" |
||||
style={{ background: "#c4a882", borderColor: "var(--bb-border)" }} /> |
||||
<p className="text-xs" style={{ color: "var(--bb-text-muted)" }}>081M</p> |
||||
<p className="text-xs font-mono" style={{ color: "var(--bb-text-muted)" }}>#c4a882</p> |
||||
</div> |
||||
<div className="text-center"> |
||||
<div className="w-12 h-12 rounded-lg border mb-1" |
||||
style={{ background: "#5c2e0e", borderColor: "var(--bb-border)" }} /> |
||||
<p className="text-xs" style={{ color: "var(--bb-text-muted)" }}>080M</p> |
||||
<p className="text-xs font-mono" style={{ color: "var(--bb-text-muted)" }}>#5c2e0e</p> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</Section> |
||||
|
||||
{/* Логотип на форме */} |
||||
<Section |
||||
title="Размещение логотипа" |
||||
subtitle="Логотип располагается на левой стороне груди. Размер зависит от размера одежды." |
||||
> |
||||
{/* Визуализация размещения */} |
||||
<div |
||||
className="rounded-xl border p-8 mb-6 flex flex-col items-center justify-center" |
||||
style={{ background: "#c4a882", borderColor: "transparent", minHeight: 200 }} |
||||
> |
||||
<div className="relative w-64 h-48 flex items-center justify-center"> |
||||
{/* Силуэт куртки (упрощённая схема) */} |
||||
<div className="absolute inset-0 rounded-xl opacity-20" |
||||
style={{ border: "2px dashed #5c2e0e" }} /> |
||||
{/* Зона логотипа — левая грудь */} |
||||
<div className="absolute top-6 left-10 flex flex-col items-center gap-2"> |
||||
<Image |
||||
src="/logo/logo-transparent.png" |
||||
alt="Логотип на форме" |
||||
width={100} |
||||
height={36} |
||||
className="object-contain" |
||||
style={{ filter: "brightness(0) sepia(1) saturate(2) hue-rotate(330deg) brightness(0.45)" }} |
||||
/> |
||||
<div className="border border-dashed rounded px-1" |
||||
style={{ borderColor: "#5c2e0e50" }}> |
||||
<p className="text-xs" style={{ color: "#5c2e0e80" }}>← Левая грудь</p> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<p className="mt-4 text-sm" style={{ color: "rgba(92,46,14,0.7)" }}> |
||||
Схема размещения логотипа (превью) |
||||
</p> |
||||
</div> |
||||
|
||||
{/* Таблица размеров */} |
||||
<div |
||||
className="overflow-hidden rounded-xl border" |
||||
style={{ borderColor: "var(--bb-border)" }} |
||||
> |
||||
<table className="w-full text-sm"> |
||||
<thead> |
||||
<tr style={{ background: "var(--bb-sidebar-bg)" }}> |
||||
{["Размер одежды", "Длина логотипа", "Высота логотипа", "Расположение"].map(h => ( |
||||
<th |
||||
key={h} |
||||
className="text-left px-5 py-3 font-medium" |
||||
style={{ color: "var(--bb-text-muted)" }} |
||||
> |
||||
{h} |
||||
</th> |
||||
))} |
||||
</tr> |
||||
</thead> |
||||
<tbody> |
||||
{[ |
||||
["До 46 р. включительно", "70 мм", "25,5 мм", "Левая сторона груди"], |
||||
["От 48 р.", "90 мм", "32,8 мм", "Левая сторона груди"], |
||||
].map(([size, w, h, pos]) => ( |
||||
<tr |
||||
key={size} |
||||
className="border-t" |
||||
style={{ borderColor: "var(--bb-border)" }} |
||||
> |
||||
<td className="px-5 py-3" style={{ color: "var(--bb-text)" }}>{size}</td> |
||||
<td className="px-5 py-3 font-mono text-xs" style={{ color: "var(--bb-text)" }}>{w}</td> |
||||
<td className="px-5 py-3 font-mono text-xs" style={{ color: "var(--bb-text)" }}>{h}</td> |
||||
<td className="px-5 py-3" style={{ color: "var(--bb-text-muted)" }}>{pos}</td> |
||||
</tr> |
||||
))} |
||||
</tbody> |
||||
</table> |
||||
</div> |
||||
</Section> |
||||
|
||||
{/* Правила */} |
||||
<Section title="Правила использования"> |
||||
<div className="grid grid-cols-1 gap-3 sm:grid-cols-2"> |
||||
{[ |
||||
{ ok: true, text: "Носить комплект в полном составе" }, |
||||
{ ok: true, text: "Поддерживать чистоту и опрятность формы" }, |
||||
{ ok: true, text: "Логотип — только тёмно-коричневый на бежевом" }, |
||||
{ ok: false, text: "Носить форму без логотипа" }, |
||||
{ ok: false, text: "Изменять цвет или материал формы" }, |
||||
{ ok: false, text: "Добавлять сторонние нашивки и знаки" }, |
||||
].map(item => ( |
||||
<div |
||||
key={item.text} |
||||
className="flex items-start gap-3 p-4 rounded-lg border" |
||||
style={{ |
||||
borderColor: item.ok ? "#a7f3d0" : "#fecaca", |
||||
background: item.ok ? "#f0fdf4" : "#fff5f5", |
||||
}} |
||||
> |
||||
<span style={{ color: item.ok ? "#16a34a" : "#ef4444" }}> |
||||
{item.ok ? "✓" : "✕"} |
||||
</span> |
||||
<p className="text-sm" style={{ color: item.ok ? "#14532d" : "#7f1d1d" }}> |
||||
{item.text} |
||||
</p> |
||||
</div> |
||||
))} |
||||
</div> |
||||
</Section> |
||||
|
||||
</div> |
||||
); |
||||
} |
||||
Loading…
Reference in new issue