diff --git a/.planning/phases/14-auth-pages/14-UI-SPEC.md b/.planning/phases/14-auth-pages/14-UI-SPEC.md new file mode 100644 index 0000000..b9b2812 --- /dev/null +++ b/.planning/phases/14-auth-pages/14-UI-SPEC.md @@ -0,0 +1,395 @@ +--- +phase: 14 +slug: auth-pages +status: draft +shadcn_initialized: false +preset: none +created: 2026-05-16 +--- + +# Phase 14 — UI Design Contract + +> Visual and interaction contract for the auth-pages restyle. Generated by gsd-ui-researcher. +> Source of truth for: gsd-planner, gsd-executor, gsd-ui-auditor. + +--- + +## Design System + +| Property | Value | +|----------|-------| +| Tool | none (custom CSS + design tokens) | +| Preset | not applicable | +| Component library | Phase 13 design system (`@ui.Input`, `@ui.FormField`, `@ui.Button`, `@ui.Card`) | +| Icon library | none (Google SVG inline; no general icon library in use) | +| Font | ui-sans-serif system stack (body); "Roboto", Arial (Google button label only) | + +**Source:** CONTEXT.md decisions D-FI01, D-FI02, D-FI03; CLAUDE.md tech stack; `backend/internal/web/ui/base.css`. + +No shadcn gate applies — this is a Go + HTMX project with a custom CSS design system, not React/Next.js/Vite. + +--- + +## Page Structure Contract + +### AuthLayout shell + +AuthLayout replaces `@Layout(...)` for both `/login` and `/signup`. It renders a standalone HTML document with no navigation header or footer. + +| Layer | CSS class | Description | +|-------|-----------|-------------| +| Outer shell | `.login-screen` | Full-viewport flex center; `background: var(--gradient-shell)`; `overflow: hidden; position: relative` | +| Animated background | `.background-layer` | `position: absolute; inset: 0; overflow: hidden; pointer-events: none` — contains 35 logo elements | +| Card wrapper | `.card-wrap` | `max-width: 32rem; width: 100%; position: relative; z-index: 1` | +| Card glow | `.card-glow` | `background: var(--gradient-card-glow); border-radius: 1rem; filter: blur(24px); position: absolute; inset: 0; z-index: -1` — decorative only | +| Card shell | `.auth-card-shell` | `backdrop-filter: blur(12px); background: var(--color-surface-card); border: 1px solid var(--color-border-default); border-radius: 1rem; box-shadow: var(--shadow-auth-card); padding: 1.25rem; position: relative` | + +**Background gradient for `.login-screen`:** use `var(--gradient-shell)` which resolves to: +``` +linear-gradient(135deg, var(--overlay-brand-muted), transparent 30%), +linear-gradient(160deg, var(--overlay-dark-soft), transparent 42%), +linear-gradient(to bottom right, var(--overlay-dark-border), var(--color-surface-page), var(--overlay-brand-faint)) +``` +This is already defined as a token in `base.css`. Do not hardcode color stops. + +**Source:** D-L01, D-L02; go-backend `.login-screen` + `.auth-card-shell` CSS (lines 1063-1179 of `go-backend/static/styles.css`). + +### Element order within `.auth-card-shell` + +``` +1. .auth-card-topbar — (empty in Phase 14; reserved placeholder div, no back-link or theme toggle) +2. .brand-header — logo image: +3. .title-group —

page title +4. .auth-body — wraps: Google button → divider → form → nav link + ├── Google button (.gsi-material-button as or