T19: app shell + landing/overview + login polish #18

Merged
dzenda merged 3 commits from t19-app-shell into t18-courses 2026-11-14 17:49:57 +01:00
Owner

T19: App shell + landing / overview + login polish (en/cs)

Stacked on #17 (t18-courses) → … → #1. Merge those first.

What

  • AppShell (src/components/AppShell.tsx), used by every page through the root route:
    • Header: FIT-OS brand, main nav when signed in (Overview, Connections, with active state; Calendar and MCP setup are added in T21/T22), language switch, user menu (name, plus username on hover) with sign-out, or a "Sign in with FIT ČVUT" button.
    • Footer: open source (MIT), source link, and "not an official CTU service".
    • Accessibility: a skip-to-content link (focus-visible, above the header), nav landmark labels, lang set during SSR, AA contrast for small text in dark mode.
    • NotFound: a proper localised 404 page, registered as the root notFoundComponent. This removes the TanStack warning in the dev log.
  • /:
    • Signed out: landing with a hero, a "What you get" list (timetable/exams, deadlines, grades, course materials, AI assistant) and a "Private by design" note (read-only, encrypted tokens never shown to the AI, MIT, self-hostable). It matches SPEC §7.
    • Signed in: overview ("Hi, …") with a card linking to Connections. It grows as T20–T22 land.
  • /login: fits the shell and carries the privacy note. /connectors: fits the shell.
  • Full en/cs strings (nav, home, footer, notFound). The catalogue parity test enforces that every key exists in both.

Verified

  • bun run lint && bun run typecheck && bun run test: 231 tests.
  • bun run dev + curl: / (landing, en and cs via Accept-Language), /login and /nope (404 with "Page not found") render during SSR; /connectors redirects to login when anonymous.
  • Preview browser (DOM): header, CTA, 5 features, footer and skip link are present, lang is correct, and there's no horizontal overflow at 1280 px. (Screenshots aren't available in this environment.)

Astra review (gpt-6-astra)

No auth, hydration, escaping or copy defects.

Fixed (both):

  1. (P2) The focused skip link was hidden behind the blurred header → z-50.
  2. (P2) The 12 px footer and privacy text were 4.18:1 in dark mode → dark:text-neutral-400 (≥ 4.5:1). The connectors status text got the same fix.

🤖 Generated with Claude Code

## T19: App shell + landing / overview + login polish (en/cs) **Stacked on #17 (`t18-courses`) → … → #1.** Merge those first. ### What - **`AppShell`** (`src/components/AppShell.tsx`), used by every page through the root route: - **Header:** FIT-OS brand, main nav when signed in (Overview, Connections, with active state; Calendar and MCP setup are added in T21/T22), language switch, user menu (name, plus username on hover) with **sign-out**, or a "Sign in with FIT ČVUT" button. - **Footer:** open source (MIT), source link, and "not an official CTU service". - **Accessibility:** a skip-to-content link (focus-visible, above the header), `nav` landmark labels, `lang` set during SSR, AA contrast for small text in dark mode. - **`NotFound`:** a proper localised 404 page, registered as the root `notFoundComponent`. This removes the TanStack warning in the dev log. - **`/`:** - **Signed out:** landing with a hero, a "What you get" list (timetable/exams, deadlines, grades, course materials, AI assistant) and a "Private by design" note (read-only, encrypted tokens never shown to the AI, MIT, self-hostable). It matches SPEC §7. - **Signed in:** overview ("Hi, …") with a card linking to Connections. It grows as T20–T22 land. - **`/login`:** fits the shell and carries the privacy note. **`/connectors`:** fits the shell. - Full en/cs strings (`nav`, `home`, `footer`, `notFound`). The catalogue parity test enforces that every key exists in both. ### Verified - `bun run lint && bun run typecheck && bun run test`: 231 tests. - `bun run dev` + curl: `/` (landing, en and cs via Accept-Language), `/login` and `/nope` (404 with "Page not found") render during SSR; `/connectors` redirects to login when anonymous. - Preview browser (DOM): header, CTA, 5 features, footer and skip link are present, `lang` is correct, and there's no horizontal overflow at 1280 px. (Screenshots aren't available in this environment.) ### Astra review (gpt-6-astra) No auth, hydration, escaping or copy defects. **Fixed (both):** 1. *(P2)* The focused skip link was hidden behind the blurred header → `z-50`. 2. *(P2)* The 12 px footer and privacy text were 4.18:1 in dark mode → `dark:text-neutral-400` (≥ 4.5:1). The connectors status text got the same fix. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
dzenda merged commit c8d0892a66 into t18-courses 2026-11-14 17:49:57 +01:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
dzenda/os!18
No description provided.