`AppFooter` — версия инстанса из публичного `/api/health` (не требует авторизации, поэтому работает и на экранах входа; поля `version` может не быть — тогда версия не показывается) плюс копирайт с ТЕКУЩИМ годом и ссылкой на профиль автора. Подключён во все раскладки: `page-shell` (календарь, админка, профиль, мои конференции), `AuthLayout` (вход, регистрация, подтверждение email), `join-shell` и `lobby-shell`. В комнате конференции футера нет — там полноэкранное видео. Прежний футер админки (`.admin-footer`) удалён вместе со стилем — дубля не осталось. В брендовой панели экранов auth строка «© 2026 VidConf · self-hosted» ужата до «self-hosted»: год там был захардкожен, а два копирайта на одном экране — дубль.
60 lines
2.7 KiB
TypeScript
60 lines
2.7 KiB
TypeScript
import type { ReactNode } from 'react'
|
||
import { AppFooter } from '@/components/layout/AppFooter'
|
||
import { LogoMark } from '@/components/ui/LogoMark'
|
||
import { ThemeToggle } from '@/components/ui/ThemeToggle'
|
||
import '@/styles/auth.css'
|
||
|
||
/**
|
||
* Общая двухколоночная разметка экранов auth (бренд-панель + форма),
|
||
* см. design/mockups/auth.html. Переключатель темы — плавающей плашкой в
|
||
* правом верхнем углу (см. design/mockups/dark/login.html): у экрана нет
|
||
* общего топбара, панель бренда и форма — раздельные колонки.
|
||
*/
|
||
export function AuthLayout({ children }: { children: ReactNode }) {
|
||
return (
|
||
<div className="layout">
|
||
<ThemeToggle className="theme-toggle--floating" />
|
||
|
||
<aside className="brand-panel">
|
||
<div className="brand-mark">
|
||
<LogoMark /> VidConf
|
||
</div>
|
||
<div className="brand-copy">
|
||
<p className="eyebrow">[ SELF-HOSTED ВИДЕОКОНФЕРЕНЦИИ ]</p>
|
||
<h1 className="brand-headline">
|
||
Ваши встречи.
|
||
<br />
|
||
Ваша инфраструктура.
|
||
</h1>
|
||
<p className="brand-sub">
|
||
Видео, записи и AI-саммари обрабатываются на ваших серверах - данные не уходят за пределы вашей
|
||
инфраструктуры. Гости подключаются по ссылке или номеру, без регистрации.
|
||
</p>
|
||
<div className="brand-stats">
|
||
<div className="stat-glass">
|
||
<strong>100%</strong>
|
||
<span>данных - в вашем контуре</span>
|
||
</div>
|
||
<div className="stat-glass">
|
||
<strong>AI-саммари</strong>
|
||
<span>на почту после встречи</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<p className="hint-msg" style={{ position: 'relative', zIndex: 1 }}>
|
||
self-hosted
|
||
</p>
|
||
</aside>
|
||
|
||
{/* Копирайт с годом и версией инстанса — общий `AppFooter` (он же на всех
|
||
остальных страницах). Из брендовой панели строку «© 2026 VidConf ·
|
||
self-hosted» при этом ужали до «self-hosted»: год там был
|
||
захардкожен, а два копирайта на одном экране — дубль. */}
|
||
<main className="form-panel">
|
||
{children}
|
||
<AppFooter />
|
||
</main>
|
||
</div>
|
||
)
|
||
}
|