diff --git a/DECISIONS.md b/DECISIONS.md index 4870990..44eb2b2 100644 --- a/DECISIONS.md +++ b/DECISIONS.md @@ -1267,6 +1267,53 @@ map) → TDD → implement → SemVer + docs. --- +## ADR-032 — Visual refresh: one charm-reader layout, light + dark themes + +**Status:** Proposed (2026-06-12). Issue #17. **Draft for review — no code yet.** Follows the +sketch-first explore step (3 throwaway mockups in `docs/sketches/`, screenshotted for review). + +**Context / decision.** The UI is flat. From the mockups, directions **B (light reader + charm)** +and **C (dark cozy terminal)** are the SAME layout — readable sans body, monospace meta, charm +palette accents, lipgloss-style bordered cards — in two palettes. Direction A (full-monospace TUI) +is dropped as too heavy to read long summaries. Decision: ship that one layout with **both a light +theme (B) and a dark theme (C)**, user-toggleable, defaulting to the OS preference. + +**Requirements.** +- R1: one set of markup/structure; the two themes are pure palette (CSS variables), no duplicate templates. +- R2: a **theme toggle** persisted across visits; default to `prefers-color-scheme` when no choice stored. +- R3: charm language in both — mint/purple/pink accents, mono meta + section labels, lipgloss + bordered/gradient cards, the (fixed) ASCII tapir; readable sans body. +- R4: style the existing pieces — list, compact card, **expanded card incl. the already-present + video embed (ADR-031/summaryBody)**, detail page, chat dock, the queue note, the charm spinner. +- R5: WCAG-AA contrast for body text in BOTH themes; keep `prefers-reduced-motion` (already honoured). +- R6: stay HTMX+Templ; no CSS framework. + +**Architecture.** +1. **Palette as CSS variables.** `:root` holds the light (B) tokens; `:root[data-theme="dark"]` + holds the dark (C) tokens; a `prefers-color-scheme: dark` media block sets the dark tokens when + no explicit `data-theme` is set. All component CSS references variables only (R1). The existing + `CharmMint/Purple/Pink/Cream/Dim` Go consts remain the source for the spinner's inline colours. +2. **Theme toggle** = a small inline script (a dozen lines, no framework) in `Layout`: on load, + apply stored theme (localStorage) or fall through to the media query; a header toggle button + flips `data-theme` on `` and stores it. This is the one new bit of JS; everything else + stays server-rendered + HTMX. (Considered: cookie + server-render — rejected, a full round-trip + per toggle is clunky for a pure presentation flip.) +3. **Scope = the `styleTag` CSS in `view.go`** (the single style source) plus tiny class hooks in + the templ where needed; content/structure are unchanged, so existing view tests keep passing. + +**Verification.** The deployed UI is behind auth (web-shot can't log in), so visual review is via +the mockups now + a styled full-set mockup screenshot before merge, then a live eyeball on device. +Automated tests stay structural/behavioural (theme tokens present, toggle persists, expanded card +embeds the video, no-JS still renders a readable default) — colours are not unit-tested. + +**Reversibility.** A CSS theme swap + one small script + a few class hooks; revert `styleTag` to +roll back. No schema, no structural change. + +**Next steps (gated):** on approval → BDD (`docs/use-cases/visual_theme.feature` + coverage map) +→ TDD → implement → SemVer + docs. + +--- + ## Rejected alternatives Approaches considered during the 2026-06-02 planning + grill session and **deliberately not diff --git a/docs/sketches/a-tui-panels.html b/docs/sketches/a-tui-panels.html new file mode 100644 index 0000000..eb7b708 --- /dev/null +++ b/docs/sketches/a-tui-panels.html @@ -0,0 +1,63 @@ + + +tapir — A · TUI panels +
+
+
  ▄█▓▓█▄  ∩
+ █▓( ◕ ◕ )▓█──┘
+ tapir · watch less, know more + 261 in queue +
+

Tapir fetches captions slowly on purpose, to respect YouTube's limits — new summaries land gradually.

+ +
How the Attention Economy Rewires Your Brain
+
youtube · 2026-06-11 · 18 min ready
+
A tour of the incentive loops behind infinite feeds and three concrete ways to claw back focus…
+ +
+
Postgres 18 — What's Actually New
collapse ↑
+
youtube · 2026-06-10 · 42 min · phi4-mini
+

Takeaways

    +
  • Async I/O cuts cold-cache read latency materially on NVMe.
  • +
  • Skip-scan makes more multicolumn indexes usable without rewrites.
  • +
  • Upgrade path is smooth; test the new planner stats first.
+

Highlights

    +
  • Async I/O subsystem (effective_io_concurrency now matters more).
  • +
  • B-tree skip scan for leading-column gaps.
  • +
  • Better partition-wise joins.
+

Summary

Postgres 18 is an incremental but meaningful release: the headline is the new asynchronous I/O path, with skip-scan and planner improvements close behind. For most homelabs the upgrade is low-risk and worth it for the read-latency wins.

+
+
+ +
RAG is dead, right?? — Conference Talk
+
youtube · 2026-06-09 · 31 min queued
+
diff --git a/docs/sketches/b-reader-charm.html b/docs/sketches/b-reader-charm.html new file mode 100644 index 0000000..0bf7391 --- /dev/null +++ b/docs/sketches/b-reader-charm.html @@ -0,0 +1,62 @@ + + +tapir — B · reader + charm accents +
+
+
  ▄█▓▓█▄  ∩
+ █▓( ◕ ◕ )▓█──┘
+ tapir.watch less, know more + 261 in queue +
+

Tapir fetches captions slowly on purpose, to respect YouTube's limits — new summaries land gradually.

+ +
How the Attention Economy Rewires Your Brain
+
youtube · 2026-06-11 · 18 min ready
+
A tour of the incentive loops behind infinite feeds and three concrete ways to claw back focus…
+ +
+
Postgres 18 — What's Actually New
collapse ↑
+
youtube · 2026-06-10 · 42 min · phi4-mini
+

Takeaways

    +
  • Async I/O cuts cold-cache read latency materially on NVMe.
  • +
  • Skip-scan makes more multicolumn indexes usable without rewrites.
  • +
  • Upgrade path is smooth; test the new planner stats first.
+

Highlights

    +
  • Async I/O subsystem (effective_io_concurrency now matters more).
  • +
  • B-tree skip scan for leading-column gaps.
  • +
  • Better partition-wise joins.
+

Summary

Postgres 18 is an incremental but meaningful release: the headline is the new asynchronous I/O path, with skip-scan and planner improvements close behind. For most homelabs the upgrade is low-risk and worth it for the read-latency wins.

+
+
+ +
RAG is dead, right?? — Conference Talk
+
youtube · 2026-06-09 · 31 min queued
+
diff --git a/docs/sketches/c-cozy-terminal.html b/docs/sketches/c-cozy-terminal.html new file mode 100644 index 0000000..fd1cdae --- /dev/null +++ b/docs/sketches/c-cozy-terminal.html @@ -0,0 +1,65 @@ + + +tapir — C · cozy terminal +
+
+
  ▄█▓▓█▄  ∩
+ █▓( ◕ ◕ )▓█──┘
+ tapir_watch less, know more + 261 in queue +
+

Tapir fetches captions slowly on purpose, to respect YouTube's limits — new summaries land gradually.

+ +
How the Attention Economy Rewires Your Brain
+
youtube · 2026-06-11 · 18 min ready
+
A tour of the incentive loops behind infinite feeds and three concrete ways to claw back focus…
+ +
+
Postgres 18 — What's Actually New
collapse ↑
+
youtube · 2026-06-10 · 42 min · phi4-mini
+

Takeaways

    +
  • Async I/O cuts cold-cache read latency materially on NVMe.
  • +
  • Skip-scan makes more multicolumn indexes usable without rewrites.
  • +
  • Upgrade path is smooth; test the new planner stats first.
+

Highlights

    +
  • Async I/O subsystem (effective_io_concurrency now matters more).
  • +
  • B-tree skip scan for leading-column gaps.
  • +
  • Better partition-wise joins.
+

Summary

Postgres 18 is an incremental but meaningful release: the headline is the new asynchronous I/O path, with skip-scan and planner improvements close behind. For most homelabs the upgrade is low-risk and worth it for the read-latency wins.

+
answers only from this video's transcript
+
+ +
RAG is dead, right?? — Conference Talk
+
youtube · 2026-06-09 · 31 min queued
+