` containing `

`
+- Phase 14 uses `logo_dark.png` only — no dark-mode swap (`light-only`/`dark-only` classes deferred per DEFERRED section)
+- `alt="Xtablo"` on each img; parent `.background-layer` carries `aria-hidden="true"`
+
+### Asset requirement
+
+`backend/static/logo_dark.png` must exist before template compiles. Copy from `go-backend/static/logo_dark.png` as part of Phase 14.
+
+### CSS classes to port into `backend/internal/web/ui/auth.css`
+
+From `go-backend/static/styles.css` (extract only, do not import the file directly):
+
+| Class group | Source lines | Purpose |
+|-------------|-------------|---------|
+| `.background-layer` | ~1081 | Absolute full-viewport container |
+| `.background-logo` | ~1088 | Absolute positioning base for each logo |
+| `.logo-asset` | ~1092 | `display: block; object-fit: contain` |
+| `.size-06` through `.size-20` | ~1099–1111 | Logo size scale (rem-based) |
+| `.opacity-02` through `.opacity-05` | ~1113–1116 | Per-element opacity |
+| `.bg-01` through `.bg-35` | ~1118–1155 | Fixed positions (top/left/right/bottom percentages) |
+| All `animate-*` utility classes | ~2883–2930+ | Animation assignments |
+| All `@keyframes` definitions | below animate-* | The actual keyframe definitions for every named animation |
+
+**Source:** D-AB01, D-AB03.
+
+---
+
+## Spacing Scale
+
+Multiples of 4 only. All values from existing token usage in go-backend auth CSS.
+
+| Token | Value | Auth usage |
+|-------|-------|------------|
+| xs | 4px | Divider gap between line and pill |
+| sm | 8px | AnimatedBackground element gaps; `.auth-provider-stack` gap |
+| md | 16px | `.auth-body` flex gap; auth-provider separator margin |
+| lg | 24px | `.auth-card-topbar` margin-bottom; `.title-group` margin-bottom; `.brand-header` margin-bottom |
+| xl | 32px | — |
+| 2xl | 48px | — |
+| card-padding | 20px (1.25rem) | `.auth-card-shell` padding — exception to 4pt grid, matches reference exactly |
+| screen-padding | 32px (2rem 1rem) | `.login-screen` padding |
+
+Exceptions: card-padding at 20px (1.25rem) — matches go-backend reference; screen horizontal padding at 16px (1rem).
+
+---
+
+## Typography
+
+| Role | Size | Weight | Line Height | Usage |
+|------|------|--------|-------------|-------|
+| Auth heading | clamp(1.5rem, 4vw, 1.875rem) | 700 | 1.2 | `.title-group h1` — page title ("Sign in to Xtablo", "Create your account") |
+| Body / label | 14px (0.875rem) | 500 | 1.4 | Field labels, divider pill text, nav link copy |
+| Small / muted | 14px (0.875rem) | 400 | 1.4 | `.signup-copy` nav link paragraph |
+| Google button | 14px (Roboto), letter-spacing 0.25px | 500 | — | `.gsi-material-button-contents` only |
+
+**Rules:**
+- 3 effective sizes: `clamp(1.5rem–1.875rem)` for heading, `0.875rem` for supporting text, `14px` for Google button label.
+- 2 weights: 400 (regular) and 500/700 (semibold/bold) — heading uses 700, labels and links use 500, muted copy uses 400.
+- Body font: inherited from `base.css` (`ui-sans-serif, system-ui, -apple-system, ...`).
+- Google button font: `"Roboto", Arial, sans-serif` scoped to `.gsi-material-button` only.
+
+**Source:** go-backend CSS `.title-group h1`, `.field-stack label`, `.signup-copy`, `.gsi-material-button-contents`.
+
+---
+
+## Color
+
+| Role | Token | Resolved value | Usage |
+|------|-------|----------------|-------|
+| Dominant (60%) | `--color-surface-page` / `--color-surface-card` | `#ffffff` / `rgba(255,255,255,0.8)` | Auth card shell background (glassmorphism) |
+| Secondary (30%) | `--gradient-shell` via `--overlay-brand-muted`, `--overlay-dark-soft`, `--overlay-dark-border`, `--overlay-brand-faint` | See gradient definition above | `.login-screen` full-viewport background |
+| Accent (10%) | `--color-brand-primary` | `#804eec` | Reserved for: `.signup-link` text color (inherited from `--foreground` + hover state via `--accent`); focus rings on inputs (`--color-focus-ring: rgba(124,58,237,0.2)`) |
+| Destructive | `--color-status-danger-*` | `#dc2626` / banner tokens | Error state banners (`@GeneralError`, `@FieldError`) and `.status-error` banner |
+| Muted text | `--color-text-muted` / `--muted-foreground` | `hsl(0 0% 43.5%)` | `.signup-copy`, `.divider-pill`, placeholder text |
+| Google button | `--color-surface-default` bg / `--color-border-google` border / `--color-text-google` text | `#ffffff` / `#747775` / `#1f1f1f` | `.gsi-material-button` only |
+
+**Accent reserved for:**
+- Input focus ring (via `--color-focus-ring`)
+- `.signup-link` hover background (via `--accent` = `var(--color-surface-subtle)`)
+- No use of brand purple on any other auth page element
+
+**Source:** go-backend auth CSS; `backend/internal/web/ui/base.css` token definitions.
+
+---
+
+## Component Contracts
+
+### Brand logo
+
+```
+.brand-header > img.brand-logo
+ src="/static/logo_dark.png"
+ alt="Xtablo"
+ width: 4rem; height: 4rem; object-fit: contain
+```
+
+### Auth card topbar
+
+Empty `
` in Phase 14. No back-link, no theme toggle. Preserve the class for future phases.
+
+### Title group
+
+```
+.title-group > h1
+ Login page: "Sign in to Xtablo"
+ Signup page: "Create your account"
+ font-size: clamp(1.5rem, 4vw, 1.875rem); font-weight: 700; margin: 0; text-align: center
+```
+
+### Google button (`.gsi-material-button`)
+
+Element: `
` (when configured) or `