diff options
| author | Craig Jennings <c@cjennings.net> | 2026-06-08 00:02:56 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-06-08 00:02:56 -0500 |
| commit | fc0622988fc9f947873a99e3b308f945cebce24a (patch) | |
| tree | bf128442961f43526e098c41b93f8c5cc944a6d9 | |
| parent | c403f463a840792fc219623811b73b0f664fe945 (diff) | |
| download | dotemacs-fc0622988fc9f947873a99e3b308f945cebce24a.tar.gz dotemacs-fc0622988fc9f947873a99e3b308f945cebce24a.zip | |
docs(theme-selector): finalize package-faces spec and emit implementation tasks
Craig resolved the last two opens: hybrid-and-split inventory (org/magit/elfeed bespoke first, the generated all-package inventory as a later phase) and the custom color picker built after tier 3. With inheritance already settled, the rubric moves to Ready.
I emitted the phase breakdown into todo.org under Emacs Open Work: one task per implementation phase plus a test-surface task, all marked solo since each builds and self-verifies through node, headless screenshots, and import/export round-trips. A Manual testing task collects the two human judgments that aren't solo: whether the seeded package defaults look right and whether the large org and magit tables stay usable.
| -rw-r--r-- | docs/design/theme-selector-package-faces-spec.org | 16 | ||||
| -rw-r--r-- | todo.org | 41 |
2 files changed, 49 insertions, 8 deletions
diff --git a/docs/design/theme-selector-package-faces-spec.org b/docs/design/theme-selector-package-faces-spec.org index 69241e0a..80a38301 100644 --- a/docs/design/theme-selector-package-faces-spec.org +++ b/docs/design/theme-selector-package-faces-spec.org @@ -9,11 +9,12 @@ for the theme-selector (scripts/theme-selector/) that lets a theme colorize package-specific faces, built one application at a time. v1 apps: org-mode (incl. org-agenda), magit, elfeed. Codex review incorporated (2026-06-07): added implementation phases, acceptance criteria, the package-face inventory source -(hybrid, split), and state/export semantics. Rubric now =Ready with caveats=. -Inheritance resolved (Craig, 2026-06-07): model it, show each face's resolved -color in the table + preview, override what looks bad. Two opens remain for -Craig: confirm hybrid-and-split inventory (vs curated-only v1), and the custom -color picker timing. +(hybrid, split), and state/export semantics. Rubric now =Ready=. +All opens resolved (Craig, 2026-06-07/08): inheritance is modeled (show each +face's resolved color in the table + preview, override what looks bad); inventory +is hybrid-and-split (org/magit/elfeed bespoke first, generated all-package +inventory as a later phase); the custom color picker is built after tier 3. +Implementation tasks live in =todo.org=. * Background — the three tiers @@ -293,8 +294,7 @@ The generated inventory is an *input artifact* to =generate.py= (a committed dat file refreshed by an explicit command), never browser-side discovery. The refresh command's dependency on a loaded Emacs config is documented. -Open for Craig: confirm hybrid-and-split, or keep v1 to curated org/magit/elfeed -only and defer the generated inventory entirely. +Decided (Craig, 2026-06-08): hybrid-and-split, as above. * State and export policy @@ -434,7 +434,7 @@ package-face build, not folded into it, since folding it in widens the blast radius for no dependency benefit. Build it only sooner if package-face editing proves painful with the native swatch. -Open question for Craig: custom picker before tier 3, after it, or vNext. +Decided (Craig, 2026-06-08): after tier 3, as its own task. * Files touched @@ -63,6 +63,47 @@ A full =make test= run (2026-06-07) is green across 516 of 517 files; the only f Build a new theme (working name "dupre-clear", final name TBD) that takes dupre's color identity and rebuilds it Prot's way: contrast-first, targeting WCAG AAA (~7:1 on the ground), where the in-progress dupre revision is mood/depth-first and lands at AA. Same hues (dupre blue, emerald, gold, terracotta, regal violet, mint) brightened to clear the AAA floor; same modus-style role mapping (blue keywords bold, gold functions, violet types, emerald strings, terracotta constants, silver default, warm-grey comments, metallic greys, navy + regal fills). Build the dupre revision first; this reuses its hue choices as the starting point. Full design + methodology + starting palette + open questions in the spec: [[file:docs/design/dupre-clear-theme.org][docs/design/dupre-clear-theme.org]]. Key prerequisite/context: the dupre-redesign entry in =.ai/session-context.org= (the AA palette this brightens). Hardest slot: blue keywords (a deep dupre blue can't be AAA on near-black — decide brighten vs keep-AA-exception vs lift-the-ground). +** TODO [#B] theme-selector tier-3 package faces :feature:theme:theme-selector: +Package-specific face editing in the theme-selector: org/magit/elfeed bespoke (complete face tables + live previews) plus a generated all-package inventory so every installed package is themeable. Spec is Ready, all opens resolved: [[file:docs/design/theme-selector-package-faces-spec.org][docs/design/theme-selector-package-faces-spec.org]]. Phases below run in dependency order; phases 1-5 deliver the three high-value apps, phase 6 opens the long tail, phase 7 documents. The =theme.json= -> =dupre-*.el= converter (Elisp) is a separate downstream task. + +*** TODO [#B] Phase 1 — package state + schema :solo: +Add =PKGMAP= ({app:{face:{fg,bg,bold,italic,inherit,source}}}) and the =APPS= registry; extend export/import with the =packages= key; keep old JSON (no =packages=) importing cleanly. Verify: node-check, =dupre.json= imports clean, =packages= round-trips. Spec phase 1. + +*** TODO [#B] Phase 2 — curated app data (org/magit/elfeed) :solo: +Complete own-defface face lists + seeded defaults modeling org's real inherit cascade, for org (incl. org-agenda), magit, elfeed, in =APPS=. Pure data. Verify: each app lists its full grouped set. Seeded-default aesthetics go to Manual testing. Spec phase 2. + +*** TODO [#B] Phase 3 — package face table UI :solo: +App selector; grouped rows; fg/bg dropdowns + bold/italic + optional inherit (resolved color shown, marked inherited); per-face + per-app reset; text filter; per-fg/bg contrast readout; a generalized face-control helper shared with the ui-faces table (not a =uiSelect= fork). Verify: headless screenshot; reassign / inherit / override / reset behave. Spec phase 3. + +*** TODO [#B] Phase 4 — org preview :solo: +=renderOrgPreview()=: a mock org document painted live from the org package faces + palette, refreshing on change. Verify: screenshot. Fidelity to Manual testing. Spec phase 4. + +*** TODO [#B] Phase 5 — magit + elfeed previews :solo: +Bespoke mocks: a magit status buffer and an elfeed search list, live from their faces. Verify: screenshot. Fidelity to Manual testing. Spec phase 5. + +*** TODO [#B] Phase 6 — generated all-package inventory :solo: +Build step queries Emacs for installed packages' faces grouped by package, writes a data file =generate.py= embeds; the dropdown then lists every package with an editable table + a labeled generic fallback preview. Verify: data file generates, dropdown lists packages, a fallback package edits and round-trips. Spec phase 6. + +*** TODO [#B] Phase 7 — docs + validation :solo: +README: =packages= schema, inheritance behavior, inventory-refresh command and its loaded-config dependency; note =theme-selector.html= is generated. Regenerate HTML. Spec phase 7. + +*** TODO [#B] theme-selector tier 3 — test surface :test:solo: +Fixtures: =dupre.json= (no =packages=) imports clean; =packages= fg/bg/bold/italic/inherit/source round-trip; cleared/default/user export per policy; unknown package/face data preserved-or-warned; inheritance cycle resolves to none. Regression: palette color update propagates to package faces; deleted palette color leaves package refs "(gone)" recoverable. Generated output: =generate.py= rebuilds =theme-selector.html=. Spec: Acceptance criteria. + +** TODO Manual testing and validation :verify:theme-selector: +Exercised once the phases above land. +*** TODO Seeded package-face defaults look right +What we're verifying: the seeded org/magit/elfeed default colors read well before any tuning. +- Open =scripts/theme-selector/theme-selector.html= in Chrome +- Switch the app selector to org-mode, then magit, then elfeed +- Read each preview pane against the dupre ground +Expected: each package's seeded defaults look coherent and legible; nothing is unreadable or jarring. Override anything off in the tool. +*** TODO Large face tables stay usable +What we're verifying: org's ~88-face and magit's ~111-face tables stay navigable. +- Select org-mode and scroll the grouped face table +- Type "agenda" in the filter +- Reassign one face and watch the preview +Expected: rows are grouped, the filter narrows them, and a reassignment updates the preview live. ** TODO [#B] Dashboard keybinding changes :quick: :PROPERTIES: :LAST_REVIEWED: 2026-06-06 |
