From c74c60dcb6df932c6002668f79c363a07cd60238 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sat, 13 Jun 2026 15:48:59 -0500 Subject: Treat legacy color names as base columns --- scripts/theme-studio/app-core.js | 2 +- scripts/theme-studio/generate.py | 5 ++++- scripts/theme-studio/test-columns.mjs | 15 +++++++++++++++ scripts/theme-studio/test_generate.py | 6 ++++++ scripts/theme-studio/theme-studio.html | 4 ++-- 5 files changed, 28 insertions(+), 4 deletions(-) (limited to 'scripts') diff --git a/scripts/theme-studio/app-core.js b/scripts/theme-studio/app-core.js index df3f0c35..b3542bf7 100644 --- a/scripts/theme-studio/app-core.js +++ b/scripts/theme-studio/app-core.js @@ -136,7 +136,7 @@ function lMax(hue,chroma,fgSet,target){ function oklchOf(hex){return oklab2oklch(srgb2oklab(hex));} function nameOfHex(palette,hex){const p=palette.find(p=>p[0].toLowerCase()===hex.toLowerCase());return p?p[1]:null;} -function columnStem(name){return (name||'color').replace(/[+-]\d+$/,'');} +function columnStem(name){name=name||'color';return /^color-\d+$/.test(name)?name:name.replace(/[+-]\d+$/,'');} function columnOffset(name){const m=(name||'').match(/([+-]\d+)$/);return m?parseInt(m[1],10):0;} function columnIdOf(entry){return (entry&&entry[2])||columnStem(entry&&entry[1]);} diff --git a/scripts/theme-studio/generate.py b/scripts/theme-studio/generate.py index 66ee3304..6d1a8eb0 100644 --- a/scripts/theme-studio/generate.py +++ b/scripts/theme-studio/generate.py @@ -48,7 +48,10 @@ MAP={k:'' for k in COLS}; MAP['bg']='#000000'; MAP['p']='#ffffff' BOLD={k:False for k in COLS} ITALIC_MAP={k:False for k in COLS} def column_id(name): - return re.sub(r'[+-]\d+$', '', name or 'color') + name = name or 'color' + if re.fullmatch(r'color-\d+', name): + return name + return re.sub(r'[+-]\d+$', '', name) def normalize_palette(palette): return [[p[0], p[1] if len(p) > 1 else 'color', p[2] if len(p) > 2 else column_id(p[1] if len(p) > 1 else 'color')] diff --git a/scripts/theme-studio/test-columns.mjs b/scripts/theme-studio/test-columns.mjs index 50a208a3..6079966a 100644 --- a/scripts/theme-studio/test-columns.mjs +++ b/scripts/theme-studio/test-columns.mjs @@ -42,6 +42,21 @@ test('columnsFromPalette: Boundary - legacy two-field entries fall back to name assert.ok(columnOf(columns, 'green')); }); +test('columnsFromPalette: Boundary - legacy color-N entries become separate base columns', () => { + const pal = [['#111111', 'color-22'], ['#222222', 'color-23'], ['#333333', 'color-129']]; + const { columns } = columnsFromPalette(pal, { bg: '#000000', fg: '#ffffff' }); + assert.deepEqual(columns.map(f => f.column), ['color-22', 'color-23', 'color-129']); + assert.deepEqual(columns.map(f => f.members.map(m => m.name)), [['color-22'], ['color-23'], ['color-129']]); +}); + +test('columnsFromPalette: Boundary - explicit color-N column ids are preserved', () => { + const pal = [['#111111', 'color-22', 'captured'], ['#222222', 'color-23', 'captured']]; + const { columns } = columnsFromPalette(pal, { bg: '#000000', fg: '#ffffff' }); + assert.equal(columns.length, 1); + assert.equal(columns[0].column, 'captured'); + assert.deepEqual(columns[0].members.map(m => m.name), ['color-22', 'color-23']); +}); + test('columnsFromPalette: Normal - palette order controls column order', () => { const pal = [['#67809c', 'blue'], ['#e8bd30', 'gold'], ['#5d9b86', 'green']]; const { columns } = columnsFromPalette(pal, { bg: '#000000', fg: '#ffffff' }); diff --git a/scripts/theme-studio/test_generate.py b/scripts/theme-studio/test_generate.py index 16ed07f1..675d6cae 100644 --- a/scripts/theme-studio/test_generate.py +++ b/scripts/theme-studio/test_generate.py @@ -165,6 +165,12 @@ class FaceSpecDefaults(unittest.TestCase): "box": None, }) + def test_generated_color_names_are_base_columns_when_legacy(self): + self.assertEqual(generate.column_id("color-22"), "color-22") + self.assertEqual(generate.column_id("color-129"), "color-129") + self.assertEqual(generate.column_id("blue-1"), "blue") + self.assertEqual(generate.column_id("blue+1"), "blue") + class DefaultFaceAdapter(unittest.TestCase): def setUp(self): diff --git a/scripts/theme-studio/theme-studio.html b/scripts/theme-studio/theme-studio.html index b7408573..9ed1ee74 100644 --- a/scripts/theme-studio/theme-studio.html +++ b/scripts/theme-studio/theme-studio.html @@ -178,7 +178,7 @@