- Next 16.4 и Payload 3.91 в одном приложении, PostgreSQL с UUID, TypeScript 6, ESLint 9, Prettier, Vitest - Payload: администраторы с ролями, multi-tenant по сайтам, локализация en/ru/de/fr/es, интерфейс админки ru/en, языки сайта (sites.locales) - Коллекции sites, domains, currencies, countries, locations, tags, tariffs, payment-systems (manual), media и начальные данные (pnpm seed) - Proxy: хост → домен, язык и валюта, внутренние маршруты по хосту; /admin и /api закрыты на доменах брендов - Токены и темы брендов, оболочки сайта и кабинета, переключатели языка, валюты и темы, заглушки страниц - /svc/health, юнит systemd veilix-dev.service - Документация: решения D-022…D-024, команды в CLAUDE.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
53 lines
1.8 KiB
TypeScript
53 lines
1.8 KiB
TypeScript
/** Знак «Слои»: два перекрывающихся скруглённых квадрата, цвета — из токенов бренда */
|
|
const MARK = {
|
|
// шапка сайта
|
|
lg: { box: 28, square: 21, radius: 7, offset: 3, blur: true },
|
|
// карточка входа
|
|
card: { box: 26, square: 19, radius: 6, offset: 3, blur: false },
|
|
// подвал сайта и кабинет
|
|
md: { box: 24, square: 18, radius: 6, offset: 3, blur: false },
|
|
} as const
|
|
|
|
const TEXT_SIZE = { lg: 'text-[17px]', card: 'text-base', md: 'text-[15px]' } as const
|
|
|
|
export function LogoMark({ size }: { size: keyof typeof MARK }) {
|
|
const { box, square, radius, offset, blur } = MARK[size]
|
|
return (
|
|
<span aria-hidden className="relative block flex-none" style={{ width: box, height: box }}>
|
|
<span
|
|
className="absolute left-0 block"
|
|
style={{
|
|
top: offset,
|
|
width: square,
|
|
height: square,
|
|
borderRadius: radius,
|
|
background:
|
|
'linear-gradient(140deg, var(--accent), color-mix(in oklab, var(--accent) 55%, var(--glow-3)))',
|
|
}}
|
|
/>
|
|
<span
|
|
className="absolute right-0 block border bg-veil"
|
|
style={{
|
|
bottom: offset,
|
|
width: square,
|
|
height: square,
|
|
borderRadius: radius,
|
|
borderColor: 'color-mix(in oklab, var(--accent) 35%, transparent)',
|
|
backdropFilter: blur ? 'blur(2px)' : undefined,
|
|
}}
|
|
/>
|
|
</span>
|
|
)
|
|
}
|
|
|
|
/** Надпись логотипа: Unbounded 600 */
|
|
export function LogoText({ children, size }: { children: string; size: keyof typeof TEXT_SIZE }) {
|
|
return (
|
|
<span
|
|
className={`font-logo font-semibold tracking-[-0.02em] whitespace-nowrap ${TEXT_SIZE[size]}`}
|
|
>
|
|
{children}
|
|
</span>
|
|
)
|
|
}
|