Design pass (all themes + chat UI), model picker, reduce-motion toggle

- Aero: blue gradients back on the active segment and every primary
  (Review due, the card's Study button, the composer's send button); a
  frosted backing behind the page heading and the All decks label; a
  bottom-weighted rail tint; chat header/composer/welcome panels; calmer
  orbs; stronger card veil + a stronger blur bake.
- Dark/Light: a dedicated --track token makes progress bars read (the
  first attempt shifted --surface-sunken and the pixel scan caught the
  sheet-contrast regression); brighter dark secondary text; darker light
  segmented labels and difficulty tints; stronger light card border and
  shadow.
- Chat UI: friendly model chip ("Gemma 4 31B") with the raw name in a
  tooltip, larger chips, plain centered disclaimer, vertically centered
  welcome panel, distinct chat-plus icon for new chat.
- Chat models: every chat-capable model from the server's /api/tags is
  selectable (favourites first, search field when long, live-list
  validation in the route); default CHAT_MODEL_DEFAULT or gemma4:31b.
- Reduce motion: Settings toggle (default off) that parks the scene,
  collapses CSS animations and drives framer-motion's calm mode.
- Folders hint, "New" badge on fresh decks.

Contrast: 0 findings, axe clean, mobile 126/126, chat 102/102, wizard
95/95, regression 44/44, i18n 13/13, native 33/33.
Version 0.4.6, SW -> freezmo-v71.
This commit is contained in:
Martin Dvořák 2026-10-14 05:06:02 +00:00
commit 6635b5d405
29 changed files with 468 additions and 90 deletions

View file

@ -1411,6 +1411,43 @@ Things I chose while building, with the reasoning:
pre-blurred wallpaper — the scene is clearly visible through the glass, and the
pixel-contrast scan still passes.
80. **Chat UI pass: glass chrome, one composer panel, friendlier chips.** The chat header was a flat
blue strip and the composer area floated on the wallpaper; both are glass surfaces now (the
composer is one flat frosted panel behind input + chips + note). The disclaimer is plain
centered text in Aero too (`AiDisclaimer plain`), the welcome block + suggestions sit on a soft
frosted panel and are vertically centered between header and composer, the model chip shows a
friendly name ("Gemma 4 31B") with the raw name in a tooltip, the chips are bigger with a
stronger rim, the send button is the filled primary (blue in every theme, clearly dimmed only
while empty/offline), and the header's "+" is a chat-plus icon so it no longer reads as the
rail's "new deck". (The review also asked for the light/dark toggle to come back to the Aero
header/rail — that stays out: Aero is switched from Settings by the owner's earlier rule.)
79. **Any model the server offers is selectable in chat, default `gemma4:31b`.** The picker used
to be the server's allowlist only. The health check now appends every chat-capable model from
the server's `/api/tags` (favourites first, embeddings filtered, 120 cap), the picker gained a
search field when the list is long, and the chat route accepts a model that is in the
favourites *or* in the live listing (one tags fetch for non-favourites, so nothing selectable
is rejected). The default is `CHAT_MODEL_DEFAULT` (env) or `gemma4:31b`; when a server doesn't
have the default, the client falls back to the first available model.
78. **Reduce motion: a Settings toggle, default off.** It mirrors the OS preference — an
`html.reduce-motion` class (applied pre-paint by the boot script) parks the scene and collapses
CSS animations/transitions, and `MotionPreference` wraps the app in framer-motion's
`MotionConfig reducedMotion="always"`, so every JS animation calms too. Stored in
`freezmo.reduce-motion.v1`; pinned in the mobile suite (126 checks).
77. **The Aero review pass (tabs, primaries, panels, tints).** The active segment keeps the blue
gradient in Aero again (it had been glassed), and so does every `btn-primary`/`grad-ice` — the
"Review due" action, the card's Study button (now the filled primary) and the composer's send
button included. New Aero surfaces: a frosted backing behind the page heading, a chip behind
the "All decks" label, a bottom-weighted tint on the rail (its lower rows sit over grass), and
a dedicated `--track` token so progress bars read in every theme without shifting the shared
surfaces (the first attempt moved `--surface-sunken` and broke sheet contrast — the pixel scan
caught it). Difficulty labels got darker, the inactive segmented labels use the full text
token, the card border/shadow are a touch stronger in light, orbs are calmer in light and
dark, the folders list nudges "create a folder", and a fresh deck shows a "New" badge instead
of the gray "Not played yet".
76. **A dropped connection says so.** A user's run failed with the wizard's generic "check your
Ollama settings" card, and it could not be replicated on the owner's machine with the same key
— because the key and model were never the problem. A raw error (a mid-run socket drop, a