aboutsummaryrefslogtreecommitdiff
path: root/scripts/theme-studio
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-06-13 18:03:03 -0500
committerCraig Jennings <c@cjennings.net>2026-06-13 18:03:03 -0500
commit0495b16fb940e0f573d4655f0a392d5159bcdeff (patch)
treef1ba16c4ceab71f1823f2cc1cff915a1c99d7905 /scripts/theme-studio
parent237ab428f5f2c719f4c6cf2624c7e223c16945e6 (diff)
downloaddotemacs-0495b16fb940e0f573d4655f0a392d5159bcdeff.tar.gz
dotemacs-0495b16fb940e0f573d4655f0a392d5159bcdeff.zip
Fix theme studio ground endpoint edit
Diffstat (limited to 'scripts/theme-studio')
-rw-r--r--scripts/theme-studio/app.js7
-rw-r--r--scripts/theme-studio/browser-gates.js10
-rw-r--r--scripts/theme-studio/theme-studio.html17
3 files changed, 28 insertions, 6 deletions
diff --git a/scripts/theme-studio/app.js b/scripts/theme-studio/app.js
index 7f674a24..3c4df190 100644
--- a/scripts/theme-studio/app.js
+++ b/scripts/theme-studio/app.js
@@ -166,14 +166,15 @@ function updateColor(){
const newHex=curHex();
const newName=(document.getElementById('newname').value.trim())||PALETTE[i][1];
if(PALETTE.some((p,j)=>j!==i&&p[1].toLowerCase()===newName.toLowerCase())){notify('another color is already named "'+newName+'" — names must be unique',true);return;}
+ const isGroundEdit=oldRole==='bg'||oldRole==='fg';
// If the edited color is a column base with a ramp, recolor the whole column: regenerate from the new base at the same count.
const columns=columnsFromPalette(PALETTE,{bg:MAP['bg'],fg:MAP['p']}).columns;
- const column=columns.find(f=>f.base.toLowerCase()===oldHex.toLowerCase());
+ const column=isGroundEdit?null:columns.find(f=>f.base.toLowerCase()===oldHex.toLowerCase());
const count=column?Math.max(0,...rankByLightness(column.members.map(m=>m.hex),column.base).map(m=>Math.abs(m.offset))):0;
- const columnId=PALETTE[i][2]||columnStem(PALETTE[i][1]);
+ const columnId=isGroundEdit?'ground':(PALETTE[i][2]||columnStem(PALETTE[i][1]));
PALETTE[i]=[newHex,newName,columnId];
const duplicateOldHex=PALETTE.some((p,j)=>j!==i&&p[0].toLowerCase()===oldHex.toLowerCase());
- if(oldRole==='bg'||oldRole==='fg')repointHex(oldHex,newHex);
+ if(isGroundEdit)repointHex(oldHex,newHex);
else if(!duplicateOldHex&&oldHex!==MAP['bg']&&oldHex!==MAP['p'])repointHex(oldHex,newHex);
if(column&&count>0){
const oldHexes=column.members.map(m=>m.hex.toLowerCase()===oldHex.toLowerCase()?newHex:m.hex);
diff --git a/scripts/theme-studio/browser-gates.js b/scripts/theme-studio/browser-gates.js
index b22eee97..a82514d7 100644
--- a/scripts/theme-studio/browser-gates.js
+++ b/scripts/theme-studio/browser-gates.js
@@ -439,6 +439,16 @@ if(location.hash==='#baseedittest'){let ok=true;const notes=[];const A=(c,n)=>{i
document.getElementById('newhexstr').value='#101010';document.getElementById('newname').value='ground';
updateColor();
A(MAP['bg'].toLowerCase()==='#101010','editing the bg swatch wrote the bg assignment, got '+MAP['bg']);
+ // fg edit: even when a normal column shares the old fg hex, editing fg must not regenerate that column as fg-*.
+ MAP['bg']='#0d0b0a';MAP['p']='#e0e0e0';
+ PALETTE=[['#0d0b0a','bg','ground'],['#e0e0e0','fg','ground'],['#c0c0c0','silver-1','silver'],['#e0e0e0','silver','silver'],['#f4f4f4','silver+1','silver']];
+ selectedIdx=PALETTE.findIndex(p=>p[1]==='fg');
+ document.getElementById('newhexstr').value='#d8d8d8';document.getElementById('newname').value='fg';
+ updateColor();
+ A(MAP['p'].toLowerCase()==='#d8d8d8','editing the fg swatch wrote the fg assignment, got '+MAP['p']);
+ A(PALETTE.some(p=>p[1]==='silver'&&p[2]==='silver'),'editing fg does not rename a same-hex normal column base');
+ A(!PALETTE.some(p=>/^fg[+-]\d+$/.test(p[1])),'editing fg does not generate fg span tiles from a same-hex normal column');
+ A(PALETTE.find(p=>p[1]==='fg')[2]==='ground','editing fg preserves the ground column id');
PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);selectedIdx=saveSel;renderPalette();
document.title='BASEEDITTEST '+(ok?'PASS':'FAIL');
const d=document.createElement('div');d.id='baseedittest';d.textContent='BASEEDITTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);}
diff --git a/scripts/theme-studio/theme-studio.html b/scripts/theme-studio/theme-studio.html
index 8674efc0..b980f800 100644
--- a/scripts/theme-studio/theme-studio.html
+++ b/scripts/theme-studio/theme-studio.html
@@ -1103,14 +1103,15 @@ function updateColor(){
const newHex=curHex();
const newName=(document.getElementById('newname').value.trim())||PALETTE[i][1];
if(PALETTE.some((p,j)=>j!==i&&p[1].toLowerCase()===newName.toLowerCase())){notify('another color is already named "'+newName+'" — names must be unique',true);return;}
+ const isGroundEdit=oldRole==='bg'||oldRole==='fg';
// If the edited color is a column base with a ramp, recolor the whole column: regenerate from the new base at the same count.
const columns=columnsFromPalette(PALETTE,{bg:MAP['bg'],fg:MAP['p']}).columns;
- const column=columns.find(f=>f.base.toLowerCase()===oldHex.toLowerCase());
+ const column=isGroundEdit?null:columns.find(f=>f.base.toLowerCase()===oldHex.toLowerCase());
const count=column?Math.max(0,...rankByLightness(column.members.map(m=>m.hex),column.base).map(m=>Math.abs(m.offset))):0;
- const columnId=PALETTE[i][2]||columnStem(PALETTE[i][1]);
+ const columnId=isGroundEdit?'ground':(PALETTE[i][2]||columnStem(PALETTE[i][1]));
PALETTE[i]=[newHex,newName,columnId];
const duplicateOldHex=PALETTE.some((p,j)=>j!==i&&p[0].toLowerCase()===oldHex.toLowerCase());
- if(oldRole==='bg'||oldRole==='fg')repointHex(oldHex,newHex);
+ if(isGroundEdit)repointHex(oldHex,newHex);
else if(!duplicateOldHex&&oldHex!==MAP['bg']&&oldHex!==MAP['p'])repointHex(oldHex,newHex);
if(column&&count>0){
const oldHexes=column.members.map(m=>m.hex.toLowerCase()===oldHex.toLowerCase()?newHex:m.hex);
@@ -2194,6 +2195,16 @@ if(location.hash==='#baseedittest'){let ok=true;const notes=[];const A=(c,n)=>{i
document.getElementById('newhexstr').value='#101010';document.getElementById('newname').value='ground';
updateColor();
A(MAP['bg'].toLowerCase()==='#101010','editing the bg swatch wrote the bg assignment, got '+MAP['bg']);
+ // fg edit: even when a normal column shares the old fg hex, editing fg must not regenerate that column as fg-*.
+ MAP['bg']='#0d0b0a';MAP['p']='#e0e0e0';
+ PALETTE=[['#0d0b0a','bg','ground'],['#e0e0e0','fg','ground'],['#c0c0c0','silver-1','silver'],['#e0e0e0','silver','silver'],['#f4f4f4','silver+1','silver']];
+ selectedIdx=PALETTE.findIndex(p=>p[1]==='fg');
+ document.getElementById('newhexstr').value='#d8d8d8';document.getElementById('newname').value='fg';
+ updateColor();
+ A(MAP['p'].toLowerCase()==='#d8d8d8','editing the fg swatch wrote the fg assignment, got '+MAP['p']);
+ A(PALETTE.some(p=>p[1]==='silver'&&p[2]==='silver'),'editing fg does not rename a same-hex normal column base');
+ A(!PALETTE.some(p=>/^fg[+-]\d+$/.test(p[1])),'editing fg does not generate fg span tiles from a same-hex normal column');
+ A(PALETTE.find(p=>p[1]==='fg')[2]==='ground','editing fg preserves the ground column id');
PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);selectedIdx=saveSel;renderPalette();
document.title='BASEEDITTEST '+(ok?'PASS':'FAIL');
const d=document.createElement('div');d.id='baseedittest';d.textContent='BASEEDITTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);}