<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs/scripts/theme-studio/theme-studio.template.html, 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-07-03T03:40:16+00:00</updated>
<entry>
<title>feat(theme-studio): inline height control on the exposed face rows</title>
<updated>2026-07-03T03:40:16+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-03T03:40:16+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=3581c7d1c05eb514aa5462b1142605541fb64d9e'/>
<id>urn:sha1:3581c7d1c05eb514aa5462b1142605541fb64d9e</id>
<content type='text'>
A new size column in the UI and package tables carries one numeric field plus an abs/rel toggle, exposed per the editable-height spec: chrome faces (mode-line family, line-number family, and header-line/tab-bar/tab-line when they arrive) default to absolute 1/10pt entry with a computed pt hint; the seeded heading faces (org-level-*, document title/info, agenda structure/dates, shr headings, and friends) default to a relative multiplier. Any other face carrying a live height exposes the control dynamically; the long tail gets none.

Absolute entry takes a positive integer only; relative entry clamps into the 0.1-2.0 range the old field used; garbage never reaches the model. The toggle writes heightMode explicitly and clears the number on a flip, since 130 tenth-points and 1.3x mean different things. The kind-unaware height field in the row expander is retired, and a non-default height now marks the size cell instead of the expander toggle.

The seeded set is named statically in app-core.js because the per-row default comes from the captured Emacs snapshot, which carries no heights for those faces. The #preview screenshot hash now accepts @ui/@code view keys so the harness can shoot the UI table.
</content>
</entry>
<entry>
<title>style(theme-studio): unify nav dropdowns to gold-on-dark</title>
<updated>2026-06-24T21:22:48+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-24T21:22:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=9691cf86b6e2a28c90df213bc1d5cd4d5353d94a'/>
<id>urn:sha1:9691cf86b6e2a28c90df213bc1d5cd4d5353d94a</id>
<content type='text'>
The view, language, and preview selects share a navsel class matching their flanking arrow buttons (dark bg, gold bold-mono text), so each select and its arrows read as one control.
</content>
</entry>
<entry>
<title>feat(theme-studio): visible size-nav buttons + 48 pt gallery scale</title>
<updated>2026-06-24T20:47:16+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-24T20:47:16+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=9cd6b911b7e62fe16e1b3a51eaf970fb2dacbc9c'/>
<id>urn:sha1:9cd6b911b7e62fe16e1b3a51eaf970fb2dacbc9c</id>
<content type='text'>
The preview dropdown gets flanking nav buttons, matching the view selector, so the size steps with a click. Left/Right arrows do the same when the dropdown is focused. Both clamp at the ends and disable on a single-pane app.

I extended the size scale to 32 and 48 pt for inspecting a glyph's detail. The cell width scales with the size, so beyond about 48 pt the grid is mostly scrolling.

I removed the separate hover info line beside the dropdown. Each glyph's own title tooltip already shows its face and color, so the line was redundant.

A new computed-style gate confirms the point size renders to the right pixels (24 pt is 32 px), so the pt label isn't lying.
</content>
</entry>
<entry>
<title>feat(theme-studio): nerd-icons gallery as a hue-ordered icon grid</title>
<updated>2026-06-24T20:15:24+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-24T18:44:28+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=566b0439027872e8b7dae32c2022fbe8d9c55b5f'/>
<id>urn:sha1:566b0439027872e8b7dae32c2022fbe8d9c55b5f</id>
<content type='text'>
The nerd-icons pane is now a grid: one row per color face, the rows ordered by hue so families cluster, distinct icons (deduped within a color) drawn in their color with the icon's nerd-font name beneath. A "preview:" dropdown above the grid picks the glyph size in points, with Left/Right arrows to step it. Single-pane apps show it disabled, naming the preview. This replaces the v1 legend in the pane, whose data is still captured for round-trip.

build-nerd-icons-legend.el is now a library. A cj/nerd-icons-write-legend entry point requires nerd-icons only at write time, so the capture logic loads and unit-tests without it. It dedupes icons by name within a face, computes each face's native hue, and orders the groups by hue. Writing the test surfaced a latent bug: face-hsl used (cadr (assoc t spec)), which grabs the first keyword instead of the plist. It only worked because the real faces fall through to the face-foreground branch. I fixed it to a correct t-clause parse.

Coverage: 7 ERT capture tests (dedupe, hue order, lightness tiebreak, name sort, skip rules), 4 Python validator edges, and browser gates for the grid and the size dropdown.

Locate stays color-level: clicking a color flashes its icons, and clicking an icon flashes its color row. Icons aren't individually editable, so there's nothing per-icon to select.
</content>
</entry>
<entry>
<title>feat(theme-studio): move the box column between style and contrast</title>
<updated>2026-06-20T10:38:58+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-20T10:38:58+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=0e836c108f55ce403ad9fe098033a43d877f9593'/>
<id>urn:sha1:0e836c108f55ce403ad9fe098033a43d877f9593</id>
<content type='text'>
Box now sits at column 5 in all three tables, after style and before contrast, instead of last. The contrast and example/preview columns shift right by one, and the position-based gates follow.
</content>
</entry>
<entry>
<title>feat(theme-studio): expand/collapse-all toggle and disclosure triangles</title>
<updated>2026-06-20T10:16:31+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-20T10:16:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=3fee9c6623f69c37efefac776c832744c6ff4ef0'/>
<id>urn:sha1:3fee9c6623f69c37efefac776c832744c6ff4ef0</id>
<content type='text'>
Each row's expander toggle now shows a disclosure triangle that tracks its state: a right triangle when collapsed, a down triangle when expanded (it was a static ellipsis). A header-level expand-all / collapse-all button per table opens or closes every row's detail at once and follows the aggregate state. The per-row triangles and the header button stay in sync across a table rebuild.
</content>
</entry>
<entry>
<title>feat(theme-studio): move the lock column to the leftmost position</title>
<updated>2026-06-20T09:52:57+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-20T09:52:57+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=da9caea3ee62bd3242dfc4e19dad724a01969c67'/>
<id>urn:sha1:da9caea3ee62bd3242dfc4e19dad724a01969c67</id>
<content type='text'>
Put the lock cell first in all three assignment tables, ahead of the element/face name. The lock and name columns swap, and every column from fg onward is unchanged. The element-name sort moves to column 1, and the sort and index gates follow it.
</content>
</entry>
<entry>
<title>feat(theme-studio): sort the language dropdown and add nav arrows</title>
<updated>2026-06-20T09:33:44+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-20T09:33:44+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=6a2385af4566173df8e9cda28f9dd112545d0cf9'/>
<id>urn:sha1:6a2385af4566173df8e9cda28f9dd112545d0cf9</id>
<content type='text'>
Sort the language list alphabetically and pin Elisp as the default selection. Add the ‹ › arrows flanking the dropdown that step the selection (clamped, no wrap), reusing the view-dropdown's stepViewIndex so you can walk languages without reopening the menu.
</content>
</entry>
<entry>
<title>feat(theme-studio): unify per-row widgets across the assignment tables</title>
<updated>2026-06-20T09:27:47+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-20T09:27:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=a267a113706fc83af9c52268daf8d9d07e468124'/>
<id>urn:sha1:a267a113706fc83af9c52268daf8d9d07e468124</id>
<content type='text'>
The color/code, UI, and package tables now share one per-row widget set, so the editing surface reads the same whatever view is selected.

Column order is the same in all three: element, lock, fg, bg, style, contrast, example, box. Box moves to last in the color/code table, and the package table's inline inherit and size columns fold into the row expander, matching how UI and color/code already carry them.

The UI overlay faces drop the inline PASS/FAIL word and the red FAIL badge on the preview swatch. They show a bare colored worst-case number with the WCAG verdict in the hover, like the other two tables. The orphaned .crerr style goes with it.

The height picker now clamps a typed value into [0.1, 2.0]. A number input only enforces min/max on its stepper arrows, so a typed or pasted value reached the model unchecked. 0.1 is Emacs's own floor (a smaller height errors out), and 2.0 is the studio ceiling. Clearing the field still unsets to the inherited default.

Tests: clampHeight unit tests plus a #heighttest browser gate. The column and contrast gates move to the new positions and the bare-number readout.
</content>
</entry>
<entry>
<title>feat(theme-studio): prev/next arrows to step the view dropdown</title>
<updated>2026-06-16T11:27:08+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-16T11:27:08+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=5551f9e9bccc68dad61edf5d3500cd6149abe05d'/>
<id>urn:sha1:5551f9e9bccc68dad61edf5d3500cd6149abe05d</id>
<content type='text'>
I added left and right arrow buttons flanking the view dropdown. They step the selection to the previous or next item and re-render the faces table and preview, so you can walk the list without reopening the dropdown. A pure stepViewIndex helper clamps the index to the option range, no wrap. stepView sets the selection and calls onViewChange.
</content>
</entry>
</feed>
