feat(badges): реальные фото бейджей из PDF-брендбука
- Извлечены 2 фото (стр.12 PDF): лицевая (белый бейдж с ФИО) и оборотная (магнитное крепление) - Убран CSS-макет, добавлены реальные фото с описанием - Добавлен пример из брендбука (Лебединская Е.А.) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -31,79 +31,6 @@ function 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() {
|
export default function BadgesPage() {
|
||||||
return (
|
return (
|
||||||
<div className="max-w-4xl mx-auto px-8 py-10">
|
<div className="max-w-4xl mx-auto px-8 py-10">
|
||||||
@@ -120,24 +47,76 @@ export default function BadgesPage() {
|
|||||||
Бейджи сотрудников
|
Бейджи сотрудников
|
||||||
</h1>
|
</h1>
|
||||||
<p className="text-base max-w-2xl" style={{ color: "var(--bb-text-muted)" }}>
|
<p className="text-base max-w-2xl" style={{ color: "var(--bb-text-muted)" }}>
|
||||||
Именные бейджи для идентификации сотрудников клиники. Размер 70×30 мм.
|
Именные бейджи для идентификации сотрудников клиники. Размер 70×30 мм,
|
||||||
Два цветовых варианта в зависимости от должности.
|
магнитное крепление. Белый фон, чёрный текст.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Размеры и технические требования */}
|
{/* Фотографии */}
|
||||||
|
<Section
|
||||||
|
title="Образцы бейджей"
|
||||||
|
subtitle="Фотографии реальных бейджей из брендбука клиники."
|
||||||
|
>
|
||||||
|
<div className="grid grid-cols-1 gap-6 sm:grid-cols-2">
|
||||||
|
{/* Лицевая сторона */}
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
className="rounded-xl overflow-hidden border mb-4"
|
||||||
|
style={{ borderColor: "var(--bb-border)" }}
|
||||||
|
>
|
||||||
|
<Image
|
||||||
|
src="/offline/badges/badge-2.jpeg"
|
||||||
|
alt="Лицевая сторона бейджа: Лебединская Елена Александровна, врач оториноларинголог"
|
||||||
|
width={690}
|
||||||
|
height={347}
|
||||||
|
className="w-full object-cover"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<p className="font-medium text-sm mb-1" style={{ color: "var(--bb-text)" }}>
|
||||||
|
Лицевая сторона
|
||||||
|
</p>
|
||||||
|
<p className="text-sm" style={{ color: "var(--bb-text-muted)" }}>
|
||||||
|
Белый фон, скруглённые углы. ФИО — крупный шрифт,
|
||||||
|
должности — мелкий. Металлическая рамка.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Оборотная сторона */}
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
className="rounded-xl overflow-hidden border mb-4"
|
||||||
|
style={{ borderColor: "var(--bb-border)" }}
|
||||||
|
>
|
||||||
|
<Image
|
||||||
|
src="/offline/badges/badge-1.jpeg"
|
||||||
|
alt="Оборотная сторона бейджа с магнитным креплением"
|
||||||
|
width={657}
|
||||||
|
height={369}
|
||||||
|
className="w-full object-cover"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<p className="font-medium text-sm mb-1" style={{ color: "var(--bb-text)" }}>
|
||||||
|
Оборотная сторона
|
||||||
|
</p>
|
||||||
|
<p className="text-sm" style={{ color: "var(--bb-text-muted)" }}>
|
||||||
|
Чёрный пластик, магнитное крепление (CAUTION MAGNETIC).
|
||||||
|
Не требует проколов в одежде.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Section>
|
||||||
|
|
||||||
|
{/* Технические параметры */}
|
||||||
<Section
|
<Section
|
||||||
title="Технические параметры"
|
title="Технические параметры"
|
||||||
subtitle="Единый стандарт для всех сотрудников клиники."
|
subtitle="Единый стандарт для всех сотрудников клиники."
|
||||||
>
|
>
|
||||||
<div
|
<div className="grid grid-cols-2 gap-4 sm:grid-cols-4 mb-6">
|
||||||
className="grid grid-cols-2 gap-4 sm:grid-cols-4 mb-6"
|
|
||||||
>
|
|
||||||
{[
|
{[
|
||||||
{ label: "Ширина", value: "70 мм" },
|
{ label: "Ширина", value: "70 мм" },
|
||||||
{ label: "Высота", value: "30 мм" },
|
{ label: "Высота", value: "30 мм" },
|
||||||
{ label: "Материал", value: "ПВХ / металл" },
|
{ label: "Материал", value: "Металл / ПВХ" },
|
||||||
{ label: "Крепление", value: "Булавка / клипса" },
|
{ label: "Крепление", value: "Магнитное" },
|
||||||
].map(({ label, value }) => (
|
].map(({ label, value }) => (
|
||||||
<div
|
<div
|
||||||
key={label}
|
key={label}
|
||||||
@@ -155,29 +134,10 @@ export default function BadgesPage() {
|
|||||||
</div>
|
</div>
|
||||||
</Section>
|
</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
|
<Section
|
||||||
title="Состав текста на бейдже"
|
title="Состав текста на бейдже"
|
||||||
subtitle="Строгий порядок элементов. Шрифт — DINPro."
|
subtitle="Строгий порядок элементов."
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
className="overflow-hidden rounded-xl border"
|
className="overflow-hidden rounded-xl border"
|
||||||
@@ -186,7 +146,7 @@ export default function BadgesPage() {
|
|||||||
<table className="w-full text-sm">
|
<table className="w-full text-sm">
|
||||||
<thead>
|
<thead>
|
||||||
<tr style={{ background: "var(--bb-sidebar-bg)" }}>
|
<tr style={{ background: "var(--bb-sidebar-bg)" }}>
|
||||||
{["Элемент", "Содержание", "Шрифт / Размер", "Позиция"].map(h => (
|
{["Элемент", "Содержание", "Оформление"].map(h => (
|
||||||
<th
|
<th
|
||||||
key={h}
|
key={h}
|
||||||
className="text-left px-5 py-3 font-medium"
|
className="text-left px-5 py-3 font-medium"
|
||||||
@@ -199,11 +159,10 @@ export default function BadgesPage() {
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{[
|
{[
|
||||||
["Логотип", "Логотип клиники", "PNG / SVG", "Левая часть, по центру по высоте"],
|
["ФИО", "Фамилия Имя Отчество", "Крупный шрифт, первая строка"],
|
||||||
["Разделитель", "Вертикальная линия", "1px, 40% прозрачность", "Между логотипом и текстом"],
|
["Должность", "Основная должность", "Мелкий шрифт, вторая строка"],
|
||||||
["ФИО", "Фамилия И.О.", "DINPro Bold 13px", "Правая часть, верхняя строка"],
|
["Специализация", "Специализация / учёная степень (если есть)", "Мелкий шрифт, третья строка"],
|
||||||
["Должность", "Полное название должности", "DINPro Regular 10px", "Правая часть, нижняя строка"],
|
].map(([el, content, style]) => (
|
||||||
].map(([el, content, font, pos]) => (
|
|
||||||
<tr
|
<tr
|
||||||
key={el}
|
key={el}
|
||||||
className="border-t"
|
className="border-t"
|
||||||
@@ -211,60 +170,33 @@ export default function BadgesPage() {
|
|||||||
>
|
>
|
||||||
<td className="px-5 py-3 font-medium" style={{ color: "var(--bb-text)" }}>{el}</td>
|
<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" 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)" }}>{style}</td>
|
||||||
<td className="px-5 py-3" style={{ color: "var(--bb-text-muted)" }}>{pos}</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
))}
|
))}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</Section>
|
|
||||||
|
|
||||||
{/* Цветовые варианты */}
|
{/* Пример из фото */}
|
||||||
<Section
|
<div
|
||||||
title="Применение вариантов"
|
className="mt-4 rounded-xl border p-4 flex items-start gap-3"
|
||||||
subtitle="Выбор варианта зависит от должности сотрудника."
|
style={{ borderColor: "var(--bb-border)", background: "var(--bb-sidebar-bg)" }}
|
||||||
>
|
>
|
||||||
<div className="grid grid-cols-1 gap-4 sm:grid-cols-2">
|
<div
|
||||||
{[
|
className="w-1.5 self-stretch rounded-full shrink-0"
|
||||||
{
|
style={{ background: "var(--brand-053m)" }}
|
||||||
variant: "Светлый (бежевый)",
|
/>
|
||||||
color: "#c4a882",
|
<div>
|
||||||
usage: "Медицинский персонал, санитарки, технический персонал",
|
<p className="text-xs font-medium mb-1" style={{ color: "var(--bb-text-muted)" }}>
|
||||||
oracal: "081M",
|
Пример из брендбука
|
||||||
},
|
</p>
|
||||||
{
|
<p className="text-sm font-semibold" style={{ color: "var(--bb-text)" }}>
|
||||||
variant: "Тёмный (серо-голубой)",
|
Лебединская Елена Александровна
|
||||||
color: "#5b7b87",
|
</p>
|
||||||
usage: "Административный персонал, менеджеры, главный врач",
|
<p className="text-xs mt-0.5" style={{ color: "var(--bb-text-muted)" }}>
|
||||||
oracal: "073M",
|
врач оториноларинголог · ведущий хирург · кандидат медицинских наук
|
||||||
},
|
</p>
|
||||||
].map(item => (
|
</div>
|
||||||
<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>
|
</div>
|
||||||
</Section>
|
</Section>
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 103 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 135 KiB |
Reference in New Issue
Block a user