| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
| |
tab-bar, tab-line, line-number, and line-number-current-line join mode-line in the chrome height seeds (apply_modeline_height_default generalized to apply_chrome_height_defaults), each pinned at absolute 130 so no bar or gutter tracks a buffer's enlarged default face. header-line and mode-line-inactive stay unseeded on purpose: both inherit mode-line, so the pin reaches them through the chain and their own value would duplicate state. The line-number pair is seeded individually because the generated theme's explicit specs leave their :inherit unspecified at runtime.
header-line, tab-bar, and tab-line also join the UI faces table, so all chrome heights are editable through the size column; the mock-completeness gate exempts the three faces the mock deliberately doesn't draw. WIP.json reconciled and the theme regenerated; every chrome face resolves :height 130 in the live daemon, pins and inherit chains both.
|
| |
|
|
|
|
| |
heightCssValue maps a face's height to CSS from its stored kind: a relative multiplier renders as em, an absolute 1/10pt value as true pt, with legacy objects falling back to integer/fractional inference. uiCss feeds it to the mock editor, so the mode-line, mode-line-inactive, and line-number bars visibly thicken with an absolute height while the buffer text stays put; paintUI scales the UI row's sample text; the package-preview span builder swaps its em-only sizing for the same kind-aware value.
faceCss now accepts a unit-carrying string for fontSize alongside the existing em number.
|
| |
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
| |
JSON collapses 2.0 to 2 on save, so a height's number type can't say whether it's a fixed 1/10pt value or a relative multiplier. The face model now carries an explicit heightMode field (abs/rel) through seed, save/load, and export. build-theme.el coerces :height from the kind: abs exports an integer, rel a float, so a relative 2.0 renders as 2.0, never 2.
Faces saved before the field existed infer the kind once on load (JS: integer to abs, fractional to rel; Python keeps the authored type, so a float 2.0 seed stays relative) and persist it on the next save. The mode-line seed carries abs explicitly, and WIP.json's eight seeded heights are stamped with their kinds. Regenerating the theme from the stamped WIP.json produces an identical WIP-theme.el, so the round-trip holds.
|
| |
|
|
|
|
|
|
|
|
|
| |
mode-line's :height was unspecified, so a buffer that remaps its default
face larger (the nov reading view) inflated its modeline with it. Seed an
absolute 130 (1/10pt) on mode-line — build_uimap gains
apply_modeline_height_default, mirroring the hover-box default — and set
it in WIP.json. Also drop the stray :height 2 from mode-line-inactive
(a JSON integral-float collapse that rendered inactive bars at 0.2pt);
inactive now inherits mode-line's height. Theme regenerated and loaded
live; the editable-height spec covers making this tunable in the studio.
|
| | |
|
| |
|
|
| |
ansi-color carried a bespoke spec and a full seed palette but its renderer was never written, so it silently fell back to the generic face list. Added renderAnsiColorPreview — a compilation/shell buffer exercising all 16 SGR palette faces, the faces eat and vterm color faces inherit from — and registered it. Last generic app in the ecosystem-coverage scope.
|
| |
|
|
| |
ghostel (the terminal behind the agent buffers) gets an eat-style scene through its own 16 ANSI color faces plus the default surface and the two fake-cursor faces; all-the-icons a dired listing where each file's leading marker carries its color face across the 8 hues, their light/dark variants, and the -alt accents. Both are pinned not-loaded apps whose only visibility is the studio preview, so they carry the highest realism bar. Face names are literal, not constructed, to satisfy the coverage gate.
|
| |
|
|
|
|
| |
nerd-icons-completion
tmr shows the list view and tmr-tabulated-view with every column face; wttrin the weather buffer with staleness header, key hints, and the stale modeline lighter; alert one line per severity; org-superstar the bullet swap across levels plus list items; nerd-icons-completion folder icons in the dir face. Phase 4 of the preview run — all 13 small-scene apps now sit in the face-coverage gate.
|
| |
|
|
|
|
| |
flyspell-correct
highlight-indent-guides shows both methods (character glyphs, column bands) plus the responsive top/stack variants at a marked point; yasnippet a mid-expansion snippet with the active field and the debug overlay; prescient primary/secondary match highlights; flyspell-correct the word under correction with its menu. All four join the face-coverage gate.
|
| |
|
|
| |
emms shows its three UIs (browser tree, playlist, metaplaylist); org-roam the backlinks buffer plus the dailies calendar mark; hl-todo comment keywords and the flymake diagnostic; symbol-overlay all eight pin faces on one defun plus the at-point default. All four join the face-coverage gate.
|
| |
|
|
| |
One C-x b consult-buffer scene drawn jointly by vertico, marginalia, consult, embark, and orderless; each app's preview shows the shared session with its own faces at work, then extends it with the states only it owns (vertico multiline, marginalia's full annotation catalog, consult line/grep/async, embark act + collect, orderless component cycling). All five join the face-coverage gate, so every one of their 72 faces appears verbatim in the renderers.
|
| |
|
|
| |
The web-mode preview is one mixed document: markup with every tag/attr variant, an inline CSS part, a generic template block (engine-agnostic on purpose), and a script part carrying a JSON island, JSX depths, nested template literals, SQL-in-a-string, a PHP preprocessor island, and JSDoc annotations. The realism gate now covers it, so all 81 faces are exercised. SAMPLES gains an HTML language, which also enriches the syntax and auto-dim previews.
|
| |
|
|
| |
Five daily-driver apps leave the generic face-name list: company (a completion popup with every row variant, inline ghost preview, tooltip search, and the echo frontend), company-box (the icons variant), transient (a magit-commit-style panel exercising every key class), magit-section (status-buffer headings with child counts and the highlighted section), and rainbow-delimiters (buffer-honest nesting depths 1-9 plus the cycle past 9 and both error faces). A new test gates realism: every face of each covered app must appear verbatim in its renderer, so a scene can't silently skip faces.
|
| |
|
|
| |
PINNED_PACKAGE_FACES is the curated record of packages retired from the config (ghostel, all-the-icons). A pinned package survives inventory regeneration, shows a 'not loaded' label + hover in the app dropdown, and keeps refreshing its face list from the live inventory while that still carries it. An attempted live regen made the fragility concrete: today's daemon session was missing 142 faces from lazily-loaded packages, so regen-from-live is inherently lossy and the pin is the only durable record.
|
| | |
|
| |
|
|
| |
Two speedrun-enabling pieces. A #preview=<app>&theme=<json> hash handler plus screenshot-previews.sh shoot any app's face table and live preview headlessly under a real theme (WIP.json by default), so preview work can be verified without a human clicking through the studio. The README gains the coverage policy: the studio themes popular packages even when uninstalled, pinning their faces rather than dropping them, and unloaded packages' previews matter more, not less.
|
| |
|
|
| |
The nine ai-term faces (the bypass-banner accent plus one per Claude Code /color name) join the studio as a bespoke app, seeded with their dupre hues. The preview mirrors what they paint: the banner line and a mock input box per session color. Tuning one here recolors live agents on their next redraw.
|
| |
|
|
|
|
| |
Add the font-lock faces the syntax tier didn't cover (warning, doc-markup, negation-char, and the two regexp-grouping faces) as their own editable categories: warn, dmark, neg, rxgb, rxgc. Each maps 1:1 to its face, seeds from the stock defaults, and is exercised in the code-sample preview via a TODO comment, a docstring substitution, a string regexp, and a C negation.
Injected only the five new faces into the default-faces snapshot rather than regenerating it wholesale. A full recapture pulls in unrelated package-inventory drift.
|
| | |
|
| |
|
|
| |
The nov reading view app gains six faces: a heading and link accent for each of the sepia, dark, and light palettes, seeded to match the module defaults. The book-page preview now draws each page's title in its palette's heading face and an inline phrase in its link face, iterating only the base palette faces so the structural faces color a page rather than getting blank pages of their own.
|
| |
|
|
| |
The nov-reading app fell back to the generic preview (face names in their own colors), which doesn't show what a palette looks like. I added a renderer that draws a real book page per palette: a mock page of Hawthorne's "Dr. Heidegger's Experiment" in sepia, dark, and light, with a small-caps byline, a drop cap, and justified serif prose. Each page takes its background and foreground from its palette face, so tuning a palette repaints its page.
|
| |
|
|
|
|
|
|
| |
EPUB reading prefs were scattered: a hardcoded Merriweather/180 font-remap in calibredb-epub-config's nov hook, no color control (the old sepia foreground had been stripped), and a frame-global EBook fontaine preset as the only way to size up. That preset resized the font in every buffer in the frame, not just the book.
I pulled the reading view into its own layer, modules/nov-reading.el, on top of stock nov (no fork). It owns three things, all buffer-local: a reading palette (sepia/dark/light, each a face the dupre theme owns, sepia the default), the serif typography (family plus a defcustom base height replacing the hardcoded 180), and page font sizing (+/- bump the size live, = resets to the base). Width moves to { }. calibredb-epub-config keeps the library and width/centering layout. Its nov hook now calls into the layer.
The three palette faces register as a nov-reading app in theme-studio (face_data.py), so they're tunable there like any other app. I dropped the EBook fontaine preset, since reading size is buffer-local now.
|
| |
|
|
| |
wttrin loads from an unversioned local checkout (elpa/wttrin/), which the inventory regex already learned to capture (ffa458a6). This long-lived daemon's wttrin face attribution was scrambled by the session's theme reloading, so rather than regenerate the whole inventory from a disturbed daemon I added wttrin's four file-loaded faces from a clean batch load and regenerated the studio. wttrin is now a previewable app, and all studio gates stay green.
|
| |
|
|
| |
The theme-studio and browser-choice generators now stamp their output with a header that names the authoritative source and says to regenerate rather than hand-edit. I regenerated both files to match. I also deleted six obvious "describe the next form" comments, replaced two stale placeholders in titlecase.el and an incomplete FIXME in org-checklist.el with real rationale, and condensed early-init's header and Commentary.
|
| |
|
|
|
|
| |
The added and removed line backgrounds in Claude Code diffs read too bright. I added eat-term-color-22 (added green) and eat-term-color-52 (removed red) to the WIP theme at about half their former brightness: #005F00 to #002f00, #5F0000 to #2f0000. EAT uses each face's foreground as the palette value for both text and background paint, so darkening the foreground darkens the diff background.
The green index is confirmed. The red is the symmetric counterpart. The brighter within-line word-highlight shades are different indices, left until I sample them live.
|
| |
|
|
| |
build-inventory.el grouped faces by their defining file and pulled the package name only from versioned directories (/elpa/PKG-VERSION/). Locally-developed packages live in unversioned directories (/elpa/PKG/), so every one of them was silently excluded from the studio. Make the version suffix optional so unversioned checkouts are captured too. Verified against a clean wttrin load: wttrin-key resolves to /elpa/wttrin/wttrin.elc and the regex extracts "wttrin". The inventory itself needs regenerating in a clean Emacs to pick these up.
|
| |
|
|
| |
Gold completing-read folders against the silver file and dirvish icons. The nerd-icons-config override is what lets this face win over the global dir advice.
|
| |
|
|
| |
The committed report was dated 2026-06-18 and 457 faces behind the current set (1293 to 1750 tracked, 43 to 51 package groups). Regenerated from current face data.
|
| |
|
|
| |
Region background to #424f5e, highlight distant-foreground, a few ui face locks, plus a sweep of the nerd-icons color palette (the d/l/alt variants) and several dirvish faces (file-modes, free-space, hl-line, inactive).
|
| |
|
|
| |
The preview was a flat catalog dumping every face on labeled lines. It's now a believable two-pane dirvish: an active directory listing (the real nerd-icon glyph and color per file type, dir-entry counts, file sizes, the hl-line on the selected row, a dimmed backup) beside an ls-l preview of the selected dir. Faces that don't fit a calm listing (vc, git, subtree, media, proc, narrow, emerge) moved to a labeled extras strip below, so all 38 dirvish faces stay covered. Glyphs and colors mirror what nerd-icons actually emits per type.
|
| | |
|
| |
|
|
| |
The bright-magenta face was self-referential, so it resolved to no color and difftastic's bright-magenta string literals rendered near-black. Point it at ansi-color-magenta like the other bright faces. Also a broader WIP ansi/palette pass.
|
| |
|
|
| |
Remove the dead ghostel app from theme-studio: the GHOSTEL_FACES/SEED data, the registry row, the renderGhostelPreview previewer, and the package_seed test, then regenerate the tool. ansi-color stays since eat inherits it. Rename testutil-ghostel-buffers to testutil-terminal-buffers and drop make-fake-ghostel-buffer; the toggle-filter test now uses the eat fixture, since agents are eat. Fix the comments that still called the agent buffers ghostel (they're eat now) in eat-config and the ai-term and auto-dim test docstrings. I also package-deleted the unused ghostel ELPA package. Full suite green; the remaining ghostel mentions are accurate migration history.
|
| | |
|
| | |
|
| |
|
|
| |
Expand each command's output to realistic length. The eza listing now shows a full directory of nine entries, git status shows staged, unstaged, deleted, and untracked files, git log shows nine commits with a merge graph, and make test shows seven results plus a failure detail and a totals line. One-line results read as toy output; this looks like a real terminal.
|
| |
|
|
| |
Replace the thin EAT preview with four realistic blocks above a reference key: an eza --color listing (the widest dircolors palette), git status, git log --oneline --decorate, and a make test run. Together they exercise all 16 ANSI colors in context plus the bold, faint, and prompt-annotation faces. The palette swatch, attribute, and annotation rows sit below as a key. All 24 exposed EAT faces now appear in the preview.
|
| |
|
|
| |
Add a display-label override for the emms inventory app (emacs multimedia system), and lowercase all the acronym-expansion labels (eat, lsp, shr, emms) so they match the lowercase package-name labels and the package ids. The hovers keep normal capitalization since they are descriptions, not labels.
|
| |
|
|
| |
Clean the app labels and move the "what reuses this" context into the app dropdown's tooltip, so the labels stay short. The foundational face sets name their consumers on hover: ansi-color (vterm, eshell, compilation, ghostel, eat), shr (eww, nov, mu4e/message), gnus (mu4e article view), and dired (dirvish). Labels now carry only the name plus any acronym expansion. A small APP_HOVERS dict in face_data.py feeds an app "hover" field that sets the dropdown's title on selection.
|
| |
|
|
| |
Match the EAT format: lsp-mode -> Language Server Protocol (LSP), shr -> Simple HTML Renderer (SHR).
|
| |
|
|
| |
The EAT faces had no entries in face-docs.json, so their studio hovers showed nothing. Merge in the 24 exposed EAT faces' docstrings. The named color faces are aliases whose first docstring line is alias boilerplate, so this uses the descriptive line ("Face used to render red color text") instead. A full re-dump was avoided because it would drop 85 unrelated erc background-color entries not currently loaded; this is a targeted merge that only adds.
|
| | |
|
| |
|
|
| |
Add EAT as a theme-studio app so its faces become editable in the studio: the 16 named ANSI palette faces, the SGR attribute faces (bold, faint, italic, slow/fast blink), and the three shell-prompt annotation faces. renderEatPreview draws a sample terminal with the palette rows, colored ls output, and the prompt annotations, so editing a face updates the preview live. No seed colors are set, so the faces sit at their own defaults until themed, consistent with the vanilla pass. Mirrors the existing ghostel terminal app.
|
| |
|
|
| |
The dashboard preview rendered the project/bookmark/recent rows as plain text, so editing dashboard-items-face didn't recolor them. Wrap those rows in dashboard-items-face so the preview reflects the face. It inherits widget-button (unspecified) while unset, so the rows stay bare until the face is themed -- this only makes the preview responsive. Completes the dashboard preview's face coverage.
|
| |
|
|
| |
Emacs draws the cursor as a rectangle: its foreground colors the glyph sitting on it and its background is the cursor color, but weight/slant/underline/strike and box are no-ops on it. The UI table now shows only the fg and bg swatches for the cursor row and mutes the style and box cells to a dash, so the studio stops presenting controls Emacs drops. New #cursorrowtest gate; styletest/boxtest retargeted off cursor (it was UI_FACES[0], their generic subject) onto the first styled face.
|
| | |
|
| |
|
|
|
|
|
|
| |
previewFaceAttrs
I split the custom dropdown, detail-editor, and expander factories out of app.js into controls.js (205 lines), spliced back at a CONTROLS_J token by generate.py. The token sits at the exact extraction point, so the assembled page is byte-identical and every gate passes unchanged. app.js drops from 927 to 721 lines.
I also removed previewFaceAttrs (function, export, and test). It was test-only dead code whose docstring stalely claimed the gate calls it. The gate uses assertPreviewFaces instead.
|
| |
|
|
|
|
|
|
| |
These are behavior-preserving cleanups from the refactor/simplify assessment, all test-verified.
I merged syncMockHeight and syncPkgHeight into one syncPaneHeight(tableId, paneId), inlined the two single-use displayHex/displayName closures, dropped a pkgbody guard that buildPkgTable already does, and had paintUI call worstCellHtml instead of rebuilding the covered-contrast cell. I deleted the dead generatorHues "manual" branch (a copy of the fallback) and locateInfoLine (orphaned when I removed the preview info line earlier today). The two nerd-icons loaders now share _load_nerd_icons_artifact, with a sentinel so a null-file edge keeps its exact behavior. face_coverage.classify reads through named locals now, guarded by a new characterization test.
Two assessment findings were wrong and skipped after I checked them against the code: LOCATE_REG is live (read by previewSpan), and normalizePaletteEntryCore doesn't exist.
|
| |
|
|
| |
The gold viewnav style was scoped to .pkgbar, so the arrows on the .langbar selectors (language and preview) fell back to default gray. I broadened the rule to .langbar and added a dimmed-gold disabled state for the single-pane preview.
|