diff options
| author | Craig Jennings <c@cjennings.net> | 2026-06-16 05:59:55 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-06-16 05:59:55 -0500 |
| commit | b126dafca9f8424907904619e2b3d2d0d78d1635 (patch) | |
| tree | 372eff36cf8666e0fa319615753e351323f108e3 /scripts/theme-studio/app-core.js | |
| parent | d27783bd9ed5441f71762c0a4ac863bc0443ac16 (diff) | |
| download | dotemacs-b126dafca9f8424907904619e2b3d2d0d78d1635.tar.gz dotemacs-b126dafca9f8424907904619e2b3d2d0d78d1635.zip | |
feat(theme-studio): mark per-face setting boxes that differ from default
A non-default height looks identical to the default in the size input, so a stray 1.1 hides in plain sight. I added a small gold corner flag on any per-face setting cell (fg, bg, style, inherit, size, box) whose value differs from the face's seed default. A pure faceBoxNonDefaults helper computes the per-box flags. buildPkgTable resolves fg/bg to hex before comparing, so a palette-name-vs-hex difference doesn't read as a change.
Diffstat (limited to 'scripts/theme-studio/app-core.js')
| -rw-r--r-- | scripts/theme-studio/app-core.js | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/scripts/theme-studio/app-core.js b/scripts/theme-studio/app-core.js index 4df6e8a24..df99a0d37 100644 --- a/scripts/theme-studio/app-core.js +++ b/scripts/theme-studio/app-core.js @@ -417,4 +417,23 @@ function appViewKeysSorted(apps){ String((apps[b]&&apps[b].label)||b), undefined, {sensitivity:'base'})); } -export { nameToHex, normalizePkgFace, buildPkgmap, packagesForExport, mergePackagesInto, effResolve, resolveSyntaxFg, resolveUiAttr, dropdownRowTextColor, paletteOptionList, galleryModel, appViewKeysSorted, spanNeighborHex, slugify, fgSetFor, floor, lMax, COVERED_FACES, columnsFromPalette, usedPaletteHexes, paletteUsages, regenColumn, rankByLightness, stepRepointPlan, sortColumns, sortColumnMembers, groundRoleOfEntry, groundColumnMembersFromPalette, clearPalettePlan, deletePaletteColumnPlan, areAllLocked, lockToggleLabel, toggleLockSet }; +// Which of the six per-face setting boxes (fg, bg, style, inherit, height, box) +// differ from the face's seed default, so the table can mark a non-default box. +// A non-default height looks identical to the default in the number input, so the +// mark is the only at-a-glance signal. cur and def are face objects; the caller +// resolves fg/bg to hex first so a palette-name-vs-hex difference doesn't read as a +// change. The four style attributes collapse to one "style" flag. +function faceBoxNonDefaults(cur,def){ + cur=cur||{}; def=def||{}; + const eq=(a,b)=>(a??null)===(b??null); + return { + fg: !eq(cur.fg,def.fg), + bg: !eq(cur.bg,def.bg), + style: ['bold','italic','underline','strike'].some(a=>!!cur[a]!==!!def[a]), + inherit: !eq(cur.inherit,def.inherit), + height: (cur.height||1)!==(def.height||1), + box: JSON.stringify(cur.box??null)!==JSON.stringify(def.box??null), + }; +} + +export { nameToHex, normalizePkgFace, buildPkgmap, packagesForExport, mergePackagesInto, effResolve, resolveSyntaxFg, resolveUiAttr, dropdownRowTextColor, paletteOptionList, galleryModel, appViewKeysSorted, faceBoxNonDefaults, spanNeighborHex, slugify, fgSetFor, floor, lMax, COVERED_FACES, columnsFromPalette, usedPaletteHexes, paletteUsages, regenColumn, rankByLightness, stepRepointPlan, sortColumns, sortColumnMembers, groundRoleOfEntry, groundColumnMembersFromPalette, clearPalettePlan, deletePaletteColumnPlan, areAllLocked, lockToggleLabel, toggleLockSet }; |
