From 6329b0aefc3aafd973447bc7a7d87a0e40479719 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Mon, 8 Jun 2026 00:18:14 -0500 Subject: feat(theme-selector): add package-face state and schema (tier-3 phase 1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I laid the tier-3 foundation: an APPS registry (org starter for now) and a PKGMAP holding {fg,bg,bold,italic,inherit,source} per face. Pure helpers seed PKGMAP from APPS defaults, build the export per the state policy, and merge an import back in. Export gains a packages key when any package face is present, and import reads it while old JSON with no packages key still loads cleanly onto the seeded defaults. No UI yet — that's phase 3. A #selftest harness, guarded by the URL hash so it never shows in normal use, runs seed to export to import and checks the round-trip, old-JSON merge, and inherit/source survival. Headless Chrome reports PASS, which is how I verified the schema end-to-end against the real emitted code rather than a copy. --- scripts/theme-selector/generate.py | 49 ++++++++++++++++++++++++++++-- scripts/theme-selector/theme-selector.html | 25 +++++++++++++-- 2 files changed, 69 insertions(+), 5 deletions(-) (limited to 'scripts/theme-selector') diff --git a/scripts/theme-selector/generate.py b/scripts/theme-selector/generate.py index c15d63a1..2f63deb8 100644 --- a/scripts/theme-selector/generate.py +++ b/scripts/theme-selector/generate.py @@ -38,6 +38,28 @@ UIMAP={"cursor":{"fg":None,"bg":"#a9b2bb"},"region":{"fg":None,"bg":"#264364"}, "show-paren-mismatch":{"fg":"#0d0b0a","bg":"#cb6b4d"},"link":{"fg":"#67809c","bg":None}, "error":{"fg":"#cb6b4d","bg":None},"warning":{"fg":"#e8bd30","bg":None}, "success":{"fg":"#5d9b86","bg":None},"vertical-border":{"fg":"#2f343a","bg":None}} +# Tier-3 package faces. Phase 1 ships the schema + an org starter; Phase 2 fills +# the complete org/magit/elfeed sets. Defaults reference palette names. +APPS={"org-mode":{"label":"org-mode","preview":"org","faces":[ + ["org-document-title","document title",{"fg":"gold","bold":True}], + ["org-level-1","heading 1",{"fg":"blue","bold":True}], + ["org-level-2","heading 2",{"fg":"gold"}], + ["org-level-3","heading 3",{"fg":"regal"}], + ["org-todo","TODO keyword",{"fg":"terracotta","bold":True}], + ["org-done","DONE keyword",{"fg":"sage","bold":True}], + ["org-link","link",{"fg":"blue"}], + ["org-code","inline code",{"fg":"terracotta"}], + ["org-verbatim","verbatim",{"fg":"steel"}], + ["org-block","src block body",{"fg":"white","bg":"bg-dim"}], + ["org-block-begin-line","block delim",{"fg":"pewter","bg":"bg-dim"}], + ["org-table","table",{"fg":"steel"}], + ["org-date","timestamp",{"fg":"steel"}], + ["org-tag","tag",{"fg":"tan"}], + ["org-special-keyword","keyword/drawer",{"fg":"pewter"}], + ["org-meta-line","#+meta line",{"fg":"pewter"}], + ["org-checkbox","checkbox",{"fg":"gold"}], + ["org-headline-done","done headline",{"fg":"pewter"}] +]}} HTML = """theme-selector