aboutsummaryrefslogtreecommitdiff
path: root/scripts/theme-studio/app-core.js
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-06-16 05:59:55 -0500
committerCraig Jennings <c@cjennings.net>2026-06-16 05:59:55 -0500
commitb126dafca9f8424907904619e2b3d2d0d78d1635 (patch)
tree372eff36cf8666e0fa319615753e351323f108e3 /scripts/theme-studio/app-core.js
parentd27783bd9ed5441f71762c0a4ac863bc0443ac16 (diff)
downloaddotemacs-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.js21
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 };