<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs/scripts/theme-selector, branch main</title>
<subtitle>My Emacs configuration
</subtitle>
<id>https://git.cjennings.net/dotemacs/atom?h=main</id>
<link rel='self' href='https://git.cjennings.net/dotemacs/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/'/>
<updated>2026-06-08T13:57:05+00:00</updated>
<entry>
<title>refactor(theme-studio): rename theme-selector to theme-studio</title>
<updated>2026-06-08T13:57:05+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-08T13:56:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=7f57c6467054f6762a40b683d6585ee0a2b5527c'/>
<id>urn:sha1:7f57c6467054f6762a40b683d6585ee0a2b5527c</id>
<content type='text'>
The tool authors themes from scratch -- palette, faces across every tier, live preview, export to a loadable deftheme. It never selects among existing themes, so "selector" mis-described it. Renamed the directory, the generated HTML and its title, the design spec, and every reference in the code, README, tests, and todo. No behavior change.
</content>
</entry>
<entry>
<title>feat(theme-selector): sortable package and UI face tables</title>
<updated>2026-06-08T11:44:56+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-08T11:44:56+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=3e8d5651a3fddcf4afccd46a382ab12d915bbd8c'/>
<id>urn:sha1:3e8d5651a3fddcf4afccd46a382ab12d915bbd8c</id>
<content type='text'>
The package table (face, fg, bg, inherit, size, contrast) and the UI table (face, foreground, background) now sort on a header click, like the code/color assignments table. A generic comparator reads a select value, a numeric input, or cell text (numeric when it leads with a number, so size and contrast sort by value). The sort is remembered per table and re-applied after a rebuild, so editing a face no longer resets the order.
</content>
</entry>
<entry>
<title>feat(theme-selector): remember the imported/saved file so save overwrites it</title>
<updated>2026-06-08T11:42:07+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-08T11:42:07+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=9bdaf852df922e863307512b043ed75dd930a671'/>
<id>urn:sha1:9bdaf852df922e863307512b043ed75dd930a671</id>
<content type='text'>
Import now goes through showOpenFilePicker and keeps the returned file handle, and the rename handler no longer drops the handle on every keystroke. Once a theme has been imported or saved, save writes back to that same file (the first write asks once for permission, then overwrites silently); the save button title reflects whether it will overwrite or prompt for a location. Browsers without the File System Access API fall back to the hidden file input and a download-style save, as before.
</content>
</entry>
<entry>
<title>feat(theme-selector): bold/italic/underline/strike controls on the UI face table</title>
<updated>2026-06-08T11:39:38+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-08T11:39:38+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=7f655fe4de2419164aee592eaa27d2e8751d1cb3'/>
<id>urn:sha1:7f655fe4de2419164aee592eaa27d2e8751d1cb3</id>
<content type='text'>
The UI face table gains a style column with the same B/I/U/S toggle buttons the package table has, so built-in UI faces reach parity. Each toggle updates the per-face preview cell and the live mock buffer (mode-line, minibuffer-prompt, link, error/warning/success now reflect weight, slant, and decoration). The link face is seeded underlined to match the built-in default, and the converter already reads these fields off the ui objects, so they export and convert without further change.
</content>
</entry>
<entry>
<title>docs(theme-selector): document underline and strike in the theme.json contract</title>
<updated>2026-06-08T11:35:06+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-08T11:35:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=cd24eedbf4871dd5ecd91a228bcff586c6494f92'/>
<id>urn:sha1:cd24eedbf4871dd5ecd91a228bcff586c6494f92</id>
<content type='text'>
Record the two new face booleans in the README contract and the spec's state-and-export-policy block, including that the converter writes them as :underline t and :strike-through t.
</content>
</entry>
<entry>
<title>feat(theme-selector): converter writes :underline and :strike-through</title>
<updated>2026-06-08T11:34:06+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-08T11:34:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=39fcd5112b29139f4cf41e5101dc474f89169ebd'/>
<id>urn:sha1:39fcd5112b29139f4cf41e5101dc474f89169ebd</id>
<content type='text'>
build-theme/--attrs takes underline and strike flags and emits :underline t and :strike-through t in canonical order (after slant, before height). The UI and package spec builders read the two new fields off each face object; syntax and default faces pass nil since they never carry them. Two new ERT tests plus updated ordering cases; an end-to-end convert confirms a shr-link face round-trips to :underline t and shr-strike-through to :strike-through t. 22/22 green.
</content>
</entry>
<entry>
<title>feat(theme-selector): underline and strikethrough on package faces</title>
<updated>2026-06-08T11:31:31+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-08T11:31:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=f150c3f4ec5ad95f49ee2e94e095b11594c4d18c'/>
<id>urn:sha1:f150c3f4ec5ad95f49ee2e94e095b11594c4d18c</id>
<content type='text'>
Package faces gain underline and strike toggles alongside bold and italic. Each face object carries the two new booleans, the face table shows U and S buttons (the S button itself renders struck through, U underlined), the preview applies text-decoration so links underline and strike faces strike for real, and theme.json round-trips both fields. Link and strike-through faces across shr, mu4e, erc, slack, and telega are seeded with the right decoration so they look correct by default. The schema self-test still passes, so old exports without the fields import unchanged.
</content>
</entry>
<entry>
<title>feat(theme-selector): split C and C++ code samples, add Java</title>
<updated>2026-06-08T11:25:48+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-08T11:25:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=759cb702e76c789949f351e17768541586377006'/>
<id>urn:sha1:759cb702e76c789949f351e17768541586377006</id>
<content type='text'>
The combined C/C++ preview is now a dedicated C sample and a dedicated C++ sample, plus a new Java sample. Each is tokenized to exercise every syntax category the language actually has: C++ hits all 19 (including [[nodiscard]] attributes, a std::regex raw string, and a Doxygen doc comment); C hits 18 (no regex literal exists in C); Java hits 17 (no preprocessor and no global builtins). C also gained a doc comment and a __attribute__ decorator over the old combined sample.
</content>
</entry>
<entry>
<title>feat(theme-selector): bespoke shr preview (themes nov, eww, and HTML mail)</title>
<updated>2026-06-08T11:20:00+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-08T11:20:00+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=768c5d6a54adf87c124bdf7d754437261a0c3d23'/>
<id>urn:sha1:768c5d6a54adf87c124bdf7d754437261a0c3d23</id>
<content type='text'>
nov defines no faces of its own; it renders EPUBs entirely through shr, the built-in HTML renderer also behind eww, elfeed's article view, and HTML mail. Rather than a hollow nov entry, this exposes shr directly: a rendered-document preview (chapter title, section headings, body text, links, inline code, mark, strike-through, superscript, abbreviation, image slice) covering all 15 shr faces. Theming it themes every HTML reader at once. The body font (variable-pitch) stays a font-config concern and body color follows the default face, so nov needs nothing beyond shr.
</content>
</entry>
<entry>
<title>feat(theme-selector): bespoke previews for slack and telega</title>
<updated>2026-06-08T11:12:03+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-08T11:12:03+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=7db1bd536d8c526542ddf4a6813603b6f396a519'/>
<id>urn:sha1:7db1bd536d8c526542ddf4a6813603b6f396a519</id>
<content type='text'>
slack covers all 57 faces (a channel buffer with mrkdwn formatting, mentions, reactions, attachments, block-kit elements, dialogs, user and search rows, and modeline indicators). telega covers all 91 (root and chat-list rows, message entities, reactions, the full box-button matrix, describe/enckey/palette samplers, and webpage rendering). README updated to nineteen bespoke previews. Each verified by a headless DOM dump.
</content>
</entry>
</feed>
