ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 50s
ci / ts / ts (packages + web) (push) Successful in 43s
ci / docker / docker (образы собираются — их сервер собирает сам при обновлении) (push) Successful in 27s
ci / mobile / mobile (Metro-бандл Android) (push) Successful in 1m22s
- core: AuthSession keeps the access token in memory, refreshes it once for all parallel requests (single-flight) and retries them; refresh races between tabs are retried, reuse signs out; ApiError carries problem+json codes and field errors - web: TanStack Router with guards — guests go to /login, the bootstrap admin to /setup/admin, temporary passwords to /setup/password, admin pages by role - login, setup screens, Classic shell (top bar, role-based sidebar, empty player), settings: name, theme, language, password, devices - users admin: search, role filter, create with a one-time temporary password, reset, block, role change, delete as the policy allows; audit log for admins - ru/en strings for auth, admin and error codes; language and theme are saved in the profile Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
27 lines
907 B
TypeScript
27 lines
907 B
TypeScript
import type { ReactNode } from 'react';
|
|
|
|
import { Logo } from '../shared/ui/ui';
|
|
import { LanguageSwitch } from '../widgets/LanguageSwitch';
|
|
import s from './auth.module.css';
|
|
|
|
/** Экран без каркаса: декоративный фон волны и стеклянная карточка по центру. */
|
|
export function AuthLayout({ children, footer }: { children: ReactNode; footer?: ReactNode }) {
|
|
return (
|
|
<div className={s.screen}>
|
|
<div className={s.backdrop} aria-hidden>
|
|
<span className={s.blob1} />
|
|
<span className={s.blob2} />
|
|
<span className={s.blob3} />
|
|
</div>
|
|
<header className={s.top}>
|
|
<Logo />
|
|
<LanguageSwitch />
|
|
</header>
|
|
<main className={s.center}>
|
|
<section className={s.card}>{children}</section>
|
|
{footer && <div className={s.footer}>{footer}</div>}
|
|
</main>
|
|
</div>
|
|
);
|
|
}
|