aboutsummaryrefslogtreecommitdiff
path: root/scripts
Commit message (Collapse)AuthorAgeFilesLines
* refactor(theme-studio): drop the too-similar-colors warning boxCraig Jennings33 hours5-56/+6
| | | | The warning box under the palette wasn't useful there; the same ΔE info is reachable per-chip via the nearest-ΔE tooltip and inline contrast. Remove renderPaletteWarnings, the #palwarn element, its CSS, and the #deltatest gate. paletteWarnings still runs for the per-chip nearest distance.
* refactor(theme-studio): extract a groundPair() helperCraig Jennings34 hours4-68/+76
| | | | The literal {bg:MAP['bg'],fg:MAP['p']} repeated 32 times across app.js, palette-actions.js, and the browser gates. Replace it with a groundPair() helper. Named groundPair, not ground, to avoid colliding with the local ground bindings destructured from columnsFromPalette. No behavior change; node tests and browser gates are the safety net.
* feat(theme-studio): 2D gallery color picker for the assignment dropdownsCraig Jennings35 hours6-33/+234
| | | | | | | | | | - The color dropdown opens a grid, not a long list. - The grid mirrors the palette: ground strip, then a row per family. - Members run dark to light, with the current color outlined. - A default chip clears the assignment. - A (gone) cell shows a color no longer in the palette. - The trigger and step buttons stay the same. - All three tiers share the one dropdown.
* feat(theme-studio): show view-area > element usages on palette tile hoverCraig Jennings36 hours5-8/+106
| | | | I added paletteUsages, which enumerates every place a color is assigned, grouped by view area (the view dropdown's names: color/code assignments, ui faces, each package app) and the element within it. renderPalette builds the per-area scopes once and appends the list to each used tile's hover title, under the existing name/hex/nearest-deltaE line. Node tests and a #usagetest gate cover it.
* style(theme-studio): thin the barber-pole flag borderCraig Jennings37 hours2-6/+6
|
* style(theme-studio): make the unused and gone flags a two-color barber-pole ↵Craig Jennings37 hours2-6/+20
| | | | | | border The single-color dashed outline blended in. I replaced it with a ring of two alternating contrasting colors, drawn as a masked repeating gradient so it overlays without shifting layout. Unused tiles and columns use gold and black; gone assignments use red and white, keeping the two states distinct at a glance.
* feat(theme-studio): flag gone color assignments with a borderCraig Jennings37 hours4-2/+38
| | | | An assignment pointing at a color no longer in the palette showed only as "(gone)" on hover. I added a distinct solid border to the swatch whenever its current value resolves to "(gone)", so a broken assignment reads at a glance. The solid red outline is set apart from the dashed unused-tile flag, keeping the two palette-state cues distinguishable. A #gonetest gate covers the flagged and unflagged cases.
* feat(theme-studio): flag unused palette tiles and columnsCraig Jennings37 hours6-8/+105
| | | | | | I added usedPaletteHexes, a reverse lookup over the syntax, ui, and package assignments (plus the ground endpoints) that resolves each reference to a hex. renderPalette outlines a tile whose color is referenced nowhere and outlines a whole column when none of its colors are used, so dead colors stand out for pruning before a theme ships. The check is biased safe: an unresolvable reference marks nothing, so a color that is actually used is never flagged. Node tests cover the lookup. A #unusedtest gate covers the tile and column flags.
* feat(theme-studio): add a palette display toggle for base colors vs full spansCraig Jennings37 hours4-4/+62
| | | | I added an arrow control to the palette that collapses every column to its base color (right arrow) or expands to the full spans (down arrow), to conserve vertical space. Ground steps collapse too, leaving bg and fg. A #paltoggletest gate covers the collapse and the expand.
* refactor(theme-studio): rename preview samples and match cluster button sizesCraig Jennings37 hours3-14/+14
| | | | | | I renamed the preview personas to Christine (was Alice) and Evan (was Eve), trimming the mu4e header spacing so those rows stay aligned. I shrank the style cluster buttons from 26x24 to the 17x15 box-button size, so the two clusters match and the assignment row returns to roughly its pre-cluster height.
* fix(theme-studio): clamp generated palette spans to the bg/fg boundsCraig Jennings37 hours5-20/+67
| | | | | | Spanning a color generated steps toward pure black and white, so a column could produce colors darker than bg or lighter than fg. I changed regenColumn to ramp the dark side toward the darker ground endpoint and the light side toward the lighter one, bounded by bg and fg. Pure black/white duplicates are still skipped, and callers that pass no ground fall back to the old black/white ramp. Node tests cover the bounded span and the no-ground fallback. The #counttest gate asserts the regenerated column stays within the bg/fg bounds.
* refactor(theme-studio): drop dead bindings and CSS left by the cluster workCraig Jennings38 hours4-8/+6
|
* feat(theme-studio): reflow the B/I/U/S style buttons into a 2x2 clusterCraig Jennings38 hours4-6/+30
| | | | | | The four style buttons sat in a horizontal row, the widest part of the style column. I wrapped them in the same 2x2 grid the box control uses, so they form a square (still multi-toggle, since bold and italic combine). The column narrows to roughly half its width across all three tiers. A #styletest gate confirms the four buttons live in a .stylecluster.
* feat(theme-studio): compact the box control into a 2x2 button clusterCraig Jennings38 hours4-22/+92
| | | | | | | | The box control was a wide select plus a color swatch, pinning the box column at 166px. I replaced the select with a 2x2 cluster of radio buttons for the four styles: blank (no box), □ (line), ▼ (pressed), ▲ (raised). The color swatch now shows only while a box style is active, so the no-box case stays narrow. The column drops to 76px across all three tiers. A #boxtest gate covers the cluster: four buttons, radio selection, and the swatch hiding when no box is set. #beveltest now drives the style through the cluster button instead of the removed select. The same cluster shape sets up the B/I/U/S style column next.
* refactor(theme-studio): drop the per-row reset column from package facesCraig Jennings39 hours4-10/+10
| | | | | | Package faces was the only tier with a per-row reset button, in its own column. The syntax and ui tiers rely on the bulk reset alone, and the column cost horizontal space the table needs. I removed the per-row cell and its header, so the bulk reset (next to "lock all") is the single reset path now, matching the other tiers. A #viewtest assertion confirms the package rows carry no per-row reset button. The two weren't equivalent: the per-row button reset one face to its default, the bulk reset clears every unlocked face in the app. Losing single-face reset is the accepted tradeoff.
* refactor(theme-studio): collapse assignment views into one dropdown panelCraig Jennings39 hours4-14/+104
| | | | | | The assignment area was three stacked sections (color/code, ui faces, package faces), and package faces carried its own application selector. I merged them into one panel driven by a single dropdown: color/code assignments, ui faces, then a non-selectable "package faces" optgroup holding every app in order. Picking an entry swaps the left table and right preview, so only one view shows at a time. curApp now reads the selected app from that dropdown, and the old appsel is gone. A #viewtest browser gate locks in the dropdown order, the optgroup, and the one-view-at-a-time switching.
* chore(theme-studio): label highlighted preview line (process highlights)Craig Jennings39 hours2-2/+2
|
* refactor(themes): retire dupre, fall back to modus-vivendiCraig Jennings45 hours1-4/+4
| | | | WIP, the theme-studio export, is the active theme. dupre was only the fallback and a structural reference. Move the fallback to the built-in modus-vivendi, guaranteed present everywhere this config loads. Delete the three dupre files plus its test and palette assets, and fix the stale comments that pointed at dupre-faces.el for the auto-dim and org-keyword faces (those moved to org-faces-config.el). Repoint the dupre-clear-theme spec's palette reference to git history.
* docs: move specs to docs/specs/ with lifecycle-status filenamesCraig Jennings46 hours2-2/+2
| | | | | | Separate the 27 formal specs from working notes. Specs move to docs/specs/, notes stay in docs/design/. Each spec carries its lifecycle in the filename (-spec, -spec-doing, -spec-implemented, -spec-superseded) plus an authoritative ID and STATUS property drawer. The status came from checking each spec against the code, not the doc's own field: 6 implemented, 8 in progress, 12 not started, 1 superseded. Inbound links become org-id links so future status renames don't break them; code-comment paths repoint to docs/specs/. Working notes, inventories, reviews, and brainstorms stay in docs/design/.
* chore(theme-studio): refresh WIP theme export and deployed themeCraig Jennings48 hours1-351/+382
| | | | Latest theme-studio tuning pass: updated theme.json export and the regenerated themes/WIP-theme.el it deploys.
* feat(theme-studio): add org-faces app for agenda keyword and priority colorsCraig Jennings2 days5-3/+75
| | | | Surface the org-faces-config.el header-row faces as their own theme-studio app, placed beside elfeed and mu4e so it reads as a custom layer rather than built-in org. The seed mirrors the module defaults exactly across all 28 faces (10 keywords, 4 priorities, and their dim variants), so the editor opens on the live colors. The preview shows a focused agenda block and an auto-dim block covering every face.
* refactor(theme-studio): derive the gate list and sentinel the samples splitCraig Jennings2 days3-2/+7
| | | | | | run-tests.sh built its browser-gate list by hand, so a new gate could go unrun or a removed one stay listed (that drift hid the #familytest alias). It now derives the list from the gate blocks in browser-gates.js. generate.py split samples.py on the first "cols=" substring to import only the data section, which would truncate at the wrong place if "cols=" ever appeared earlier. Both sides now use an explicit THEME_STUDIO_DATA_END marker.
* refactor(theme-studio): extract the shared package-preview wrapperCraig Jennings2 days2-40/+46
| | | | The 20 line-based renderXxxPreview functions each ended with a byte-identical monospace-pre wrapper. They now build their L array and return previewLines(L), so the wrapper lives in one place and can't drift across the family.
* refactor(theme-studio): spec-table the bespoke apps, guard the palette dedupCraig Jennings2 days1-23/+28
| | | | The bespoke APPS dict was 21 hand-repeated lines of the same shape. It's now a (key, label, preview, FACES, prefix, SEED) spec list turned into the dict by one comprehension, so adding an app is one row. add_palette_color's dedup set tolerates a palette row with no name slot instead of indexing past its end.
* chore(theme-studio): remove dead code and clear a type warningCraig Jennings2 days8-199/+7
| | | | | | | | | - ramp (app-core.js) and its test-ramp.mjs: superseded by regenColumn, no production caller. - optList (app-core.js) and its tests: superseded by paletteOptionList. - ITALIC in generate.py: computed, never read (ITALIC_MAP is the live one). - a stray empty string in MU4E_FACES that .split() silently dropped. - the dead #familytest alias in the columntest gate, which HASHES never listed. - widen face_rows to Sequence[str], clearing the list-invariance warnings on the APPS calls.
* fix(theme-studio): make broken browser gates fail instead of silently passingCraig Jennings2 days3-9/+17
| | | | | | run-tests.sh scored each browser gate by grepping the dumped DOM for the gate name and taking the first match. A gate that throws before setting its verdict left its own inlined source as the first match, and that source, "GATENAME '+(ok?'PASS':'FAIL')", contains the literal PASS, so the run reported green for a gate that never produced a verdict. The matcher now requires a resolved "GATENAME PASS" or "GATENAME FAIL". That exposed two gates that had been throwing unnoticed. baseedittest still referenced fam after the variable was renamed to column, so it ReferenceError'd. columntest read getComputedStyle on a palette chip captured before a re-render detached it, so the match returned null and threw. baseedittest now uses column, and columntest re-queries the live chip by its selection index.
* fix(theme-studio): hold the package preview heightCraig Jennings2 days2-2/+2
| | | | Selecting a compact package (auto-dim, with a 2-row face table and a short preview) collapsed the package section and shortened the page. A 60vh floor on the preview keeps the section sized to the largest of the columns, the preview, or that floor, so switching packages no longer shrinks the page.
* fix(theme-studio): name exported themes from the source filenameCraig Jennings2 days2-5/+7
| | | | The converter took the theme name from the JSON's internal name field, so every draft whose field read "theme" overwrote theme-theme.el. It now uses the JSON file's basename, so WIP.json becomes WIP-theme.el and each draft lands under its own name. The reload target derives the load name from the basename too, and a regression test pins it: the filename wins over the internal field.
* feat(theme-studio): auto-dim split previewCraig Jennings3 days8-5/+142
| | | | | | | | auto-dim-other-buffers is a package face, not a theme face, so build-inventory.el (it scans only elpa/straight packages) never listed it and the studio couldn't theme it. This adds it as a bespoke app. The preview is a vertical split: the focused window on the left in real syntax colors, the same code on the right collapsed to the single auto-dim-other-buffers face, the way Emacs renders a non-selected window. Both panes follow the language selector. A trailing row shows auto-dim-other-buffers-hide, whose foreground matches the background so it vanishes when dimmed. A #autodimtest gate covers the split, the uniform recolor, and language sync.
* fix(theme-studio): keep dropdown color names legibleCraig Jennings3 days3-3/+32
| | | | | | The color-picker popup colored each row's name and hex for contrast against the swatch, but the rows sit on the popup's fixed dark background. A mid or dark swatch (the blues past blue-1) got near-black text that vanished on the dark popup. The text now inherits the popup foreground for every real palette color. Only the solid "default" row, whose background is the color itself, still contrasts against its own fill. I moved the decision into dropdownRowTextColor with unit coverage, including a dark-swatch regression case.
* chore(theme-studio): drop scratch theme JSONs, ignore working artifactsCraig Jennings3 days5-43430/+0
| | | | Remove the distinguished-revised, distinguished-test, dupre-rebuild, dupre-revised, and sterling2 experiment snapshots, and ignore WIP.json and themes/theme-theme.el so working scratch stays out of the tree.
* feat(theme-studio): make targets for the build-theme converterCraig Jennings3 days1-1/+34
| | | | theme-studio-theme converts a Theme Studio JSON export to themes/<name>-theme.el. theme-studio-theme-load disables the custom themes and loads one in the running Emacs. theme-studio-theme-reload chains the two. Each delegates to the scripts/theme-studio/Makefile and errors clearly when its required JSON or THEME argument is missing.
* feat(theme-studio): palette generator and preview fidelityCraig Jennings3 days15-503/+2953
| | | | | | | | | | Two strands land together because the generated theme-studio.html bundles every source file into one page and can't be split cleanly. The palette generator is a preview-first panel: palette-generator-core.js plans the palette and palette-generator-ui.js draws it. Generated colors stay inspectable and tunable through the existing selector, and committing one creates a normal base column. It adds source-mode and scheme controls, a configurable accent count, and color names from color-names.json. For preview fidelity, syntax and UI colors now resolve through the real Emacs inherit chains, so the preview matches how Emacs renders the theme. resolveSyntaxFg pins dec to ty (Emacs has no decorator face) and otherwise follows comment-delimiter to comment, doc to string, property to variable, function-call to function-name. resolveUiAttr walks mode-line-inactive to mode-line and line-number-current-line to line-number. The decorator label now reads "decorator to type" to match the type face Emacs uses for it. Design recorded in the two theme-studio specs under docs/.
* Update theme studio palette workflowCraig Jennings3 days28-1792/+51998
|
* Add theme studio box color controlsCraig Jennings4 days5-32/+75
|
* Shorten theme studio reset erase labelsCraig Jennings4 days5-33/+32
|
* Clarify theme studio reset and erase actionsCraig Jennings4 days5-38/+83
|
* Add theme studio face color step arrowsCraig Jennings4 days7-30/+158
|
* Preview selected theme studio chip while pickingCraig Jennings4 days4-12/+40
|
* Change theme studio spans to endpoint divisionsCraig Jennings4 days6-35/+72
|
* Remove theme studio save buttonCraig Jennings4 days4-29/+10
|
* Fix theme studio span endpoint tilesCraig Jennings4 days7-31/+57
|
* Sort theme studio dropdown colors by lightnessCraig Jennings4 days4-8/+38
|
* Fix theme studio ground endpoint editCraig Jennings4 days3-6/+28
|
* Fix theme studio fg endpoint selectionCraig Jennings4 days3-6/+30
|
* Refine theme studio tile name editingCraig Jennings4 days5-8/+43
|
* Make theme studio column delete saferCraig Jennings4 days5-10/+31
|
* Add theme studio Rust and Zig samplesCraig Jennings4 days5-4/+95
|
* Add theme studio column deleteCraig Jennings4 days7-12/+103
|
* Refactor theme studio palette testsCraig Jennings4 days9-679/+835
|