aboutsummaryrefslogtreecommitdiff
path: root/scripts/theme-studio/app-core.js
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/theme-studio/app-core.js')
-rw-r--r--scripts/theme-studio/app-core.js38
1 files changed, 1 insertions, 37 deletions
diff --git a/scripts/theme-studio/app-core.js b/scripts/theme-studio/app-core.js
index d99e5e364..23f73961b 100644
--- a/scripts/theme-studio/app-core.js
+++ b/scripts/theme-studio/app-core.js
@@ -89,46 +89,10 @@ function dropdownRowTextColor(hex,shown,textOnFn){
return shown?textOnFn(shown):'';
}
-// Standard swatch-dropdown option list: a default entry, then the palette. When
-// cur is set but no longer in the palette, surface it as a "(gone)" entry first.
-function optList(cur,palette){const have=cur===''||palette.some(p=>p[0]===cur);return [['','— default —'],...(have?palette:[[cur,'(gone)'],...palette])];}
-
// Turn a theme name into a safe filename slug: collapse runs of disallowed
// characters to a single dash, trim leading/trailing dashes, fall back to 'theme'.
function slugify(name){return name.replace(/[^A-Za-z0-9._-]+/g,'-').replace(/^-+|-+$/g,'')||'theme';}
-// Generate a tonal ramp from one base color: 2n steps at offsets -n..-1 and
-// +1..+n (the base itself is excluded — it already lives in the palette),
-// ordered darkest -> lightest. Holds the OKLCH hue, steps lightness by stepL per
-// stop, and eases chroma toward the extremes (quadratic in |offset|/n, so only
-// the farthest step loses most of its color). Every step is gamut-clamped and
-// carries its own clamped flag. Returns {steps:[{hex,clamped,offset}], adjusted}
-// where adjusted names any knob clamped/rounded into range, or {steps:[],
-// error:'bad-hex'} for an unparseable base. Pure — opts are clamped, never thrown.
-function ramp(baseHex,opts){
- const hex=typeof baseHex==='string'?normHex(baseHex):null;
- if(!hex)return {steps:[],error:'bad-hex'};
- const o=opts||{},adjusted=[];
- const knob=(name,def,lo,hi,isInt)=>{
- const v=o[name];
- if(typeof v!=='number'||!isFinite(v))return def;
- const r=isInt?Math.round(v):v,c=Math.min(hi,Math.max(lo,r));
- if(c!==v)adjusted.push(name);
- return c;
- };
- const n=knob('n',2,1,4,true),stepL=knob('stepL',0.08,0.04,0.12,false),chromaEase=knob('chromaEase',0.5,0,1,false);
- const {L:L0,C:C0,H:H0}=oklab2oklch(srgb2oklab(hex));
- const steps=[];
- for(let off=-n;off<=n;off++){
- if(off===0)continue;
- const L=Math.min(1,Math.max(0,L0+off*stepL));
- const t=Math.abs(off)/n,C=C0*(1-chromaEase*t*t);
- const {hex:h,clamped}=oklch2hex(L,C,H0);
- steps.push({hex:h,clamped,offset:off});
- }
- return {steps,adjusted};
-}
-
// --- background-contrast safety (palette-ramps spec, Phase 3) ----------------
// An overlay background sits behind many foregrounds at once, so its real
// constraint is the worst-case contrast over the whole set, not one fg/bg pair.
@@ -378,4 +342,4 @@ function spanNeighborHex(cur,palette,ground,dir){
return null;
}
-export { nameToHex, normalizePkgFace, buildPkgmap, packagesForExport, mergePackagesInto, effResolve, resolveSyntaxFg, resolveUiAttr, dropdownRowTextColor, optList, paletteOptionList, spanNeighborHex, slugify, ramp, fgSetFor, floor, lMax, COVERED_FACES, columnsFromPalette, regenColumn, rankByLightness, stepRepointPlan, sortColumns, sortColumnMembers, groundRoleOfEntry, groundColumnMembersFromPalette, clearPalettePlan, deletePaletteColumnPlan, areAllLocked, lockToggleLabel, toggleLockSet };
+export { nameToHex, normalizePkgFace, buildPkgmap, packagesForExport, mergePackagesInto, effResolve, resolveSyntaxFg, resolveUiAttr, dropdownRowTextColor, paletteOptionList, spanNeighborHex, slugify, fgSetFor, floor, lMax, COVERED_FACES, columnsFromPalette, regenColumn, rankByLightness, stepRepointPlan, sortColumns, sortColumnMembers, groundRoleOfEntry, groundColumnMembersFromPalette, clearPalettePlan, deletePaletteColumnPlan, areAllLocked, lockToggleLabel, toggleLockSet };