@tenphi/glaze 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +109 -71
- package/dist/index.cjs +76 -43
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +23 -13
- package/dist/index.d.mts +23 -13
- package/dist/index.mjs +76 -43
- package/dist/index.mjs.map +1 -1
- package/package.json +16 -23
package/dist/index.mjs
CHANGED
|
@@ -493,7 +493,7 @@ function formatOklch(h, s, l) {
|
|
|
493
493
|
*
|
|
494
494
|
* Finds the closest OKHSL lightness that satisfies a WCAG 2 contrast target
|
|
495
495
|
* against a base color. Used by glaze when resolving dependent colors
|
|
496
|
-
* with `
|
|
496
|
+
* with `contrast`.
|
|
497
497
|
*/
|
|
498
498
|
const CONTRAST_PRESETS = {
|
|
499
499
|
AA: 4.5,
|
|
@@ -631,8 +631,8 @@ function coarseScan(h, s, lo, hi, yBase, target, epsilon, maxIter) {
|
|
|
631
631
|
* against a base color, staying as close to `preferredLightness` as possible.
|
|
632
632
|
*/
|
|
633
633
|
function findLightnessForContrast(options) {
|
|
634
|
-
const { hue, saturation, preferredLightness, baseLinearRgb,
|
|
635
|
-
const target = resolveMinContrast(
|
|
634
|
+
const { hue, saturation, preferredLightness, baseLinearRgb, contrast: contrastInput, lightnessRange = [0, 1], epsilon = 1e-4, maxIterations = 14 } = options;
|
|
635
|
+
const target = resolveMinContrast(contrastInput);
|
|
636
636
|
const yBase = relativeLuminanceFromLinearRgb(baseLinearRgb);
|
|
637
637
|
const crPref = contrastRatioFromLuminance(cachedLuminance(hue, saturation, preferredLightness), yBase);
|
|
638
638
|
if (crPref >= target) return {
|
|
@@ -713,9 +713,10 @@ function validateColorDefs(defs) {
|
|
|
713
713
|
const names = new Set(Object.keys(defs));
|
|
714
714
|
for (const [name, def] of Object.entries(defs)) {
|
|
715
715
|
if (def.contrast !== void 0 && !def.base) throw new Error(`glaze: color "${name}" has "contrast" without "base".`);
|
|
716
|
-
if (def.
|
|
716
|
+
if (def.lightness !== void 0 && !isAbsoluteLightness(def.lightness) && !def.base) throw new Error(`glaze: color "${name}" has relative "lightness" without "base".`);
|
|
717
|
+
if (isAbsoluteLightness(def.lightness) && def.base !== void 0) console.warn(`glaze: color "${name}" has absolute "lightness" and "base". Absolute lightness takes precedence.`);
|
|
717
718
|
if (def.base && !names.has(def.base)) throw new Error(`glaze: color "${name}" references non-existent base "${def.base}".`);
|
|
718
|
-
if (def.
|
|
719
|
+
if (!isAbsoluteLightness(def.lightness) && def.base === void 0) throw new Error(`glaze: color "${name}" must have either absolute "lightness" (root) or "base" (dependent).`);
|
|
719
720
|
}
|
|
720
721
|
const visited = /* @__PURE__ */ new Set();
|
|
721
722
|
const inStack = /* @__PURE__ */ new Set();
|
|
@@ -724,7 +725,7 @@ function validateColorDefs(defs) {
|
|
|
724
725
|
if (visited.has(name)) return;
|
|
725
726
|
inStack.add(name);
|
|
726
727
|
const def = defs[name];
|
|
727
|
-
if (def.base && def.
|
|
728
|
+
if (def.base && !isAbsoluteLightness(def.lightness)) dfs(def.base);
|
|
728
729
|
inStack.delete(name);
|
|
729
730
|
visited.add(name);
|
|
730
731
|
}
|
|
@@ -737,7 +738,7 @@ function topoSort(defs) {
|
|
|
737
738
|
if (visited.has(name)) return;
|
|
738
739
|
visited.add(name);
|
|
739
740
|
const def = defs[name];
|
|
740
|
-
if (def.base && def.
|
|
741
|
+
if (def.base && !isAbsoluteLightness(def.lightness)) visit(def.base);
|
|
741
742
|
result.push(name);
|
|
742
743
|
}
|
|
743
744
|
for (const name of Object.keys(defs)) visit(name);
|
|
@@ -753,44 +754,75 @@ function mapSaturationDark(s, mode) {
|
|
|
753
754
|
if (mode === "static") return s;
|
|
754
755
|
return s * (1 - globalConfig.darkDesaturation);
|
|
755
756
|
}
|
|
757
|
+
function clamp(v, min, max) {
|
|
758
|
+
return Math.max(min, Math.min(max, v));
|
|
759
|
+
}
|
|
756
760
|
/**
|
|
757
|
-
*
|
|
761
|
+
* Parse a value that can be absolute (number) or relative (signed string).
|
|
762
|
+
* Returns the numeric value and whether it's relative.
|
|
758
763
|
*/
|
|
759
|
-
function
|
|
760
|
-
if (
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
+
function parseRelativeOrAbsolute(value) {
|
|
765
|
+
if (typeof value === "number") return {
|
|
766
|
+
value,
|
|
767
|
+
relative: false
|
|
768
|
+
};
|
|
769
|
+
return {
|
|
770
|
+
value: parseFloat(value),
|
|
771
|
+
relative: true
|
|
772
|
+
};
|
|
764
773
|
}
|
|
765
|
-
|
|
766
|
-
|
|
774
|
+
/**
|
|
775
|
+
* Compute the effective hue for a color, given the theme seed hue
|
|
776
|
+
* and an optional per-color hue override.
|
|
777
|
+
*/
|
|
778
|
+
function resolveEffectiveHue(seedHue, defHue) {
|
|
779
|
+
if (defHue === void 0) return seedHue;
|
|
780
|
+
const parsed = parseRelativeOrAbsolute(defHue);
|
|
781
|
+
if (parsed.relative) return ((seedHue + parsed.value) % 360 + 360) % 360;
|
|
782
|
+
return (parsed.value % 360 + 360) % 360;
|
|
783
|
+
}
|
|
784
|
+
/**
|
|
785
|
+
* Check whether a lightness value represents an absolute root definition
|
|
786
|
+
* (i.e. a number, not a relative string).
|
|
787
|
+
*/
|
|
788
|
+
function isAbsoluteLightness(lightness) {
|
|
789
|
+
if (lightness === void 0) return false;
|
|
790
|
+
return typeof (Array.isArray(lightness) ? lightness[0] : lightness) === "number";
|
|
767
791
|
}
|
|
768
792
|
function resolveRootColor(_name, def, _ctx, isHighContrast) {
|
|
769
|
-
const rawL = def.
|
|
793
|
+
const rawL = def.lightness;
|
|
770
794
|
return {
|
|
771
|
-
lightL: clamp(isHighContrast ? pairHC(rawL) : pairNormal(rawL), 0, 100),
|
|
772
|
-
|
|
795
|
+
lightL: clamp(parseRelativeOrAbsolute(isHighContrast ? pairHC(rawL) : pairNormal(rawL)).value, 0, 100),
|
|
796
|
+
satFactor: clamp(def.saturation ?? 1, 0, 1)
|
|
773
797
|
};
|
|
774
798
|
}
|
|
775
|
-
function resolveDependentColor(name, def, ctx, isHighContrast, isDark) {
|
|
799
|
+
function resolveDependentColor(name, def, ctx, isHighContrast, isDark, effectiveHue) {
|
|
776
800
|
const baseName = def.base;
|
|
777
801
|
const baseResolved = ctx.resolved.get(baseName);
|
|
778
802
|
if (!baseResolved) throw new Error(`glaze: base "${baseName}" not yet resolved for "${name}".`);
|
|
779
803
|
const mode = def.mode ?? "auto";
|
|
780
|
-
const
|
|
804
|
+
const satFactor = clamp(def.saturation ?? 1, 0, 1);
|
|
781
805
|
let baseL;
|
|
782
806
|
if (isDark && isHighContrast) baseL = baseResolved.darkContrast.l * 100;
|
|
783
807
|
else if (isDark) baseL = baseResolved.dark.l * 100;
|
|
784
808
|
else if (isHighContrast) baseL = baseResolved.lightContrast.l * 100;
|
|
785
809
|
else baseL = baseResolved.light.l * 100;
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
if (
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
810
|
+
let preferredL;
|
|
811
|
+
const rawLightness = def.lightness;
|
|
812
|
+
if (rawLightness === void 0) preferredL = baseL;
|
|
813
|
+
else {
|
|
814
|
+
const parsed = parseRelativeOrAbsolute(isHighContrast ? pairHC(rawLightness) : pairNormal(rawLightness));
|
|
815
|
+
if (parsed.relative) {
|
|
816
|
+
let delta = parsed.value;
|
|
817
|
+
if (isDark && mode === "auto") delta = -delta;
|
|
818
|
+
preferredL = clamp(baseL + delta, 0, 100);
|
|
819
|
+
} else if (isDark) preferredL = mapLightnessDark(parsed.value, mode);
|
|
820
|
+
else preferredL = clamp(parsed.value, 0, 100);
|
|
821
|
+
}
|
|
822
|
+
const rawContrast = def.contrast;
|
|
823
|
+
if (rawContrast !== void 0) {
|
|
824
|
+
const minCr = isHighContrast ? pairHC(rawContrast) : pairNormal(rawContrast);
|
|
825
|
+
const effectiveSat = isDark ? mapSaturationDark(satFactor * ctx.saturation / 100, mode) : satFactor * ctx.saturation / 100;
|
|
794
826
|
let baseH;
|
|
795
827
|
let baseS;
|
|
796
828
|
let baseLNorm;
|
|
@@ -814,48 +846,49 @@ function resolveDependentColor(name, def, ctx, isHighContrast, isDark) {
|
|
|
814
846
|
const baseLinearRgb = okhslToLinearSrgb(baseH, baseS, baseLNorm);
|
|
815
847
|
return {
|
|
816
848
|
l: findLightnessForContrast({
|
|
817
|
-
hue:
|
|
849
|
+
hue: effectiveHue,
|
|
818
850
|
saturation: effectiveSat,
|
|
819
851
|
preferredLightness: preferredL / 100,
|
|
820
852
|
baseLinearRgb,
|
|
821
|
-
|
|
853
|
+
contrast: minCr
|
|
822
854
|
}).lightness * 100,
|
|
823
|
-
|
|
855
|
+
satFactor
|
|
824
856
|
};
|
|
825
857
|
}
|
|
826
858
|
return {
|
|
827
859
|
l: clamp(preferredL, 0, 100),
|
|
828
|
-
|
|
860
|
+
satFactor
|
|
829
861
|
};
|
|
830
862
|
}
|
|
831
863
|
function resolveColorForScheme(name, def, ctx, isDark, isHighContrast) {
|
|
832
864
|
const mode = def.mode ?? "auto";
|
|
833
|
-
const isRoot = def.
|
|
865
|
+
const isRoot = isAbsoluteLightness(def.lightness) && !def.base;
|
|
866
|
+
const effectiveHue = resolveEffectiveHue(ctx.hue, def.hue);
|
|
834
867
|
let lightL;
|
|
835
|
-
let
|
|
868
|
+
let satFactor;
|
|
836
869
|
if (isRoot) {
|
|
837
870
|
const root = resolveRootColor(name, def, ctx, isHighContrast);
|
|
838
871
|
lightL = root.lightL;
|
|
839
|
-
|
|
872
|
+
satFactor = root.satFactor;
|
|
840
873
|
} else {
|
|
841
|
-
const dep = resolveDependentColor(name, def, ctx, isHighContrast, isDark);
|
|
874
|
+
const dep = resolveDependentColor(name, def, ctx, isHighContrast, isDark, effectiveHue);
|
|
842
875
|
lightL = dep.l;
|
|
843
|
-
|
|
876
|
+
satFactor = dep.satFactor;
|
|
844
877
|
}
|
|
845
878
|
let finalL;
|
|
846
879
|
let finalSat;
|
|
847
880
|
if (isDark && isRoot) {
|
|
848
881
|
finalL = mapLightnessDark(lightL, mode);
|
|
849
|
-
finalSat = mapSaturationDark(
|
|
882
|
+
finalSat = mapSaturationDark(satFactor * ctx.saturation / 100, mode);
|
|
850
883
|
} else if (isDark && !isRoot) {
|
|
851
884
|
finalL = lightL;
|
|
852
|
-
finalSat = mapSaturationDark(
|
|
885
|
+
finalSat = mapSaturationDark(satFactor * ctx.saturation / 100, mode);
|
|
853
886
|
} else {
|
|
854
887
|
finalL = lightL;
|
|
855
|
-
finalSat =
|
|
888
|
+
finalSat = satFactor * ctx.saturation / 100;
|
|
856
889
|
}
|
|
857
890
|
return {
|
|
858
|
-
h:
|
|
891
|
+
h: effectiveHue,
|
|
859
892
|
s: clamp(finalSat, 0, 1),
|
|
860
893
|
l: clamp(finalL / 100, 0, 1)
|
|
861
894
|
};
|
|
@@ -1062,8 +1095,8 @@ function createPalette(themes) {
|
|
|
1062
1095
|
}
|
|
1063
1096
|
function createColorToken(input) {
|
|
1064
1097
|
const defs = { __color__: {
|
|
1065
|
-
|
|
1066
|
-
|
|
1098
|
+
lightness: input.lightness,
|
|
1099
|
+
saturation: input.saturationFactor,
|
|
1067
1100
|
mode: input.mode
|
|
1068
1101
|
} };
|
|
1069
1102
|
return {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/okhsl-color-math.ts","../src/contrast-solver.ts","../src/glaze.ts"],"sourcesContent":["/**\n * OKHSL color math primitives for the glaze theme generator.\n *\n * Provides bidirectional OKHSL ↔ sRGB conversion, relative luminance\n * computation for WCAG 2 contrast calculations, and multi-format output\n * (okhsl, rgb, hsl, oklch).\n */\n\ntype Vec3 = [number, number, number];\n\n// ============================================================================\n// Matrices (from texel-color / Björn Ottosson's reference)\n// ============================================================================\n\nconst OKLab_to_LMS_M: Vec3[] = [\n [1.0, 0.3963377773761749, 0.2158037573099136],\n [1.0, -0.1055613458156586, -0.0638541728258133],\n [1.0, -0.0894841775298119, -1.2914855480194092],\n];\n\nconst LMS_to_linear_sRGB_M: Vec3[] = [\n [4.076741636075959, -3.307711539258062, 0.2309699031821041],\n [-1.2684379732850313, 2.6097573492876878, -0.3413193760026569],\n [-0.004196076138675526, -0.703418617935936, 1.7076146940746113],\n];\n\nconst linear_sRGB_to_LMS_M: Vec3[] = [\n [0.4122214708, 0.5363325363, 0.0514459929],\n [0.2119034982, 0.6806995451, 0.1073969566],\n [0.0883024619, 0.2817188376, 0.6299787005],\n];\n\nconst LMS_to_OKLab_M: Vec3[] = [\n [0.2104542553, 0.793617785, -0.0040720468],\n [1.9779984951, -2.428592205, 0.4505937099],\n [0.0259040371, 0.7827717662, -0.808675766],\n];\n\nconst OKLab_to_linear_sRGB_coefficients: [\n [[number, number], number[]],\n [[number, number], number[]],\n [[number, number], number[]],\n] = [\n [\n [-1.8817030993265873, -0.8093650129914302],\n [1.19086277, 1.76576728, 0.59662641, 0.75515197, 0.56771245],\n ],\n [\n [1.8144407988010998, -1.194452667805235],\n [0.73956515, -0.45954404, 0.08285427, 0.12541073, -0.14503204],\n ],\n [\n [0.13110757611180954, 1.813339709266608],\n [1.35733652, -0.00915799, -1.1513021, -0.50559606, 0.00692167],\n ],\n];\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst TAU = 2 * Math.PI;\nconst K1 = 0.206;\nconst K2 = 0.03;\nconst K3 = (1.0 + K1) / (1.0 + K2);\nconst EPSILON = 1e-10;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst constrainAngle = (angle: number): number => ((angle % 360) + 360) % 360;\nconst toe = (x: number): number =>\n 0.5 *\n (K3 * x - K1 + Math.sqrt((K3 * x - K1) * (K3 * x - K1) + 4 * K2 * K3 * x));\nconst toeInv = (x: number): number => (x ** 2 + K1 * x) / (K3 * (x + K2));\nconst dot3 = (a: Vec3, b: Vec3): number =>\n a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\nconst dotXY = (a: [number, number], b: [number, number]): number =>\n a[0] * b[0] + a[1] * b[1];\nconst transform = (input: Vec3, matrix: Vec3[]): Vec3 => [\n dot3(input, matrix[0]),\n dot3(input, matrix[1]),\n dot3(input, matrix[2]),\n];\nconst cubed3 = (lms: Vec3): Vec3 => [lms[0] ** 3, lms[1] ** 3, lms[2] ** 3];\nconst cbrt3 = (lms: Vec3): Vec3 => [\n Math.cbrt(lms[0]),\n Math.cbrt(lms[1]),\n Math.cbrt(lms[2]),\n];\nconst clampVal = (v: number, min: number, max: number): number =>\n Math.max(min, Math.min(max, v));\n\n// ============================================================================\n// Internal OKHSL pipeline\n// ============================================================================\n\nconst OKLabToLinearSRGB = (lab: Vec3): Vec3 => {\n const lms = transform(lab, OKLab_to_LMS_M);\n return transform(cubed3(lms), LMS_to_linear_sRGB_M);\n};\n\nconst computeMaxSaturationOKLC = (a: number, b: number): number => {\n const okCoeff = OKLab_to_linear_sRGB_coefficients;\n const lmsToRgb = LMS_to_linear_sRGB_M;\n const tmp2: [number, number] = [a, b];\n const tmp3: Vec3 = [0, a, b];\n\n let chnlCoeff: number[];\n let chnlLMS: Vec3;\n\n if (dotXY(okCoeff[0][0], tmp2) > 1) {\n chnlCoeff = okCoeff[0][1];\n chnlLMS = lmsToRgb[0];\n } else if (dotXY(okCoeff[1][0], tmp2) > 1) {\n chnlCoeff = okCoeff[1][1];\n chnlLMS = lmsToRgb[1];\n } else {\n chnlCoeff = okCoeff[2][1];\n chnlLMS = lmsToRgb[2];\n }\n\n const [k0, k1, k2, k3, k4] = chnlCoeff;\n const [wl, wm, ws] = chnlLMS;\n\n let sat = k0 + k1 * a + k2 * b + k3 * (a * a) + k4 * a * b;\n\n const dotYZ = (mat: Vec3, vec: Vec3): number =>\n mat[1] * vec[1] + mat[2] * vec[2];\n\n const kl = dotYZ(OKLab_to_LMS_M[0], tmp3);\n const km = dotYZ(OKLab_to_LMS_M[1], tmp3);\n const ks = dotYZ(OKLab_to_LMS_M[2], tmp3);\n\n const l_ = 1.0 + sat * kl;\n const m_ = 1.0 + sat * km;\n const s_ = 1.0 + sat * ks;\n\n const l = l_ ** 3;\n const m = m_ ** 3;\n const s = s_ ** 3;\n\n const lds = 3.0 * kl * l_ * l_;\n const mds = 3.0 * km * m_ * m_;\n const sds = 3.0 * ks * s_ * s_;\n\n const lds2 = 6.0 * kl * kl * l_;\n const mds2 = 6.0 * km * km * m_;\n const sds2 = 6.0 * ks * ks * s_;\n\n const f = wl * l + wm * m + ws * s;\n const f1 = wl * lds + wm * mds + ws * sds;\n const f2 = wl * lds2 + wm * mds2 + ws * sds2;\n\n sat = sat - (f * f1) / (f1 * f1 - 0.5 * f * f2);\n\n return sat;\n};\n\nconst findCuspOKLCH = (a: number, b: number): [number, number] => {\n const S_cusp = computeMaxSaturationOKLC(a, b);\n const lab: Vec3 = [1, S_cusp * a, S_cusp * b];\n const rgb_at_max = OKLabToLinearSRGB(lab);\n const L_cusp = Math.cbrt(\n 1 /\n Math.max(\n Math.max(rgb_at_max[0], rgb_at_max[1]),\n Math.max(rgb_at_max[2], 0.0),\n ),\n );\n return [L_cusp, L_cusp * S_cusp];\n};\n\nconst findGamutIntersectionOKLCH = (\n a: number,\n b: number,\n l1: number,\n c1: number,\n l0: number,\n cusp: [number, number],\n): number => {\n const lmsToRgb = LMS_to_linear_sRGB_M;\n const tmp3: Vec3 = [0, a, b];\n const floatMax = Number.MAX_VALUE;\n\n let t: number;\n\n const dotYZ = (mat: Vec3, vec: Vec3): number =>\n mat[1] * vec[1] + mat[2] * vec[2];\n const dotXYZ = (vec: Vec3, x: number, y: number, z: number): number =>\n vec[0] * x + vec[1] * y + vec[2] * z;\n\n if ((l1 - l0) * cusp[1] - (cusp[0] - l0) * c1 <= 0.0) {\n const denom = c1 * cusp[0] + cusp[1] * (l0 - l1);\n t = denom === 0 ? 0 : (cusp[1] * l0) / denom;\n } else {\n const denom = c1 * (cusp[0] - 1.0) + cusp[1] * (l0 - l1);\n t = denom === 0 ? 0 : (cusp[1] * (l0 - 1.0)) / denom;\n\n const dl = l1 - l0;\n const dc = c1;\n const kl = dotYZ(OKLab_to_LMS_M[0], tmp3);\n const km = dotYZ(OKLab_to_LMS_M[1], tmp3);\n const ks = dotYZ(OKLab_to_LMS_M[2], tmp3);\n\n const L = l0 * (1.0 - t) + t * l1;\n const C = t * c1;\n\n const l_ = L + C * kl;\n const m_ = L + C * km;\n const s_ = L + C * ks;\n\n const l = l_ ** 3;\n const m = m_ ** 3;\n const s = s_ ** 3;\n\n const ldt = 3 * (dl + dc * kl) * l_ * l_;\n const mdt = 3 * (dl + dc * km) * m_ * m_;\n const sdt = 3 * (dl + dc * ks) * s_ * s_;\n\n const ldt2 = 6 * (dl + dc * kl) ** 2 * l_;\n const mdt2 = 6 * (dl + dc * km) ** 2 * m_;\n const sdt2 = 6 * (dl + dc * ks) ** 2 * s_;\n\n const r_ = dotXYZ(lmsToRgb[0], l, m, s) - 1;\n const r1 = dotXYZ(lmsToRgb[0], ldt, mdt, sdt);\n const r2 = dotXYZ(lmsToRgb[0], ldt2, mdt2, sdt2);\n const ur = r1 / (r1 * r1 - 0.5 * r_ * r2);\n let tr = -r_ * ur;\n\n const g_ = dotXYZ(lmsToRgb[1], l, m, s) - 1;\n const g1 = dotXYZ(lmsToRgb[1], ldt, mdt, sdt);\n const g2 = dotXYZ(lmsToRgb[1], ldt2, mdt2, sdt2);\n const ug = g1 / (g1 * g1 - 0.5 * g_ * g2);\n let tg = -g_ * ug;\n\n const b_ = dotXYZ(lmsToRgb[2], l, m, s) - 1;\n const b1 = dotXYZ(lmsToRgb[2], ldt, mdt, sdt);\n const b2 = dotXYZ(lmsToRgb[2], ldt2, mdt2, sdt2);\n const ub = b1 / (b1 * b1 - 0.5 * b_ * b2);\n let tb = -b_ * ub;\n\n tr = ur >= 0.0 ? tr : floatMax;\n tg = ug >= 0.0 ? tg : floatMax;\n tb = ub >= 0.0 ? tb : floatMax;\n\n t += Math.min(tr, Math.min(tg, tb));\n }\n\n return t;\n};\n\nconst computeSt = (cusp: [number, number]): [number, number] => [\n cusp[1] / cusp[0],\n cusp[1] / (1 - cusp[0]),\n];\n\nconst computeStMid = (a: number, b: number): [number, number] => [\n 0.11516993 +\n 1.0 /\n (7.4477897 +\n 4.1590124 * b +\n a *\n (-2.19557347 +\n 1.75198401 * b +\n a *\n (-2.13704948 -\n 10.02301043 * b +\n a * (-4.24894561 + 5.38770819 * b + 4.69891013 * a)))),\n 0.11239642 +\n 1.0 /\n (1.6132032 -\n 0.68124379 * b +\n a *\n (0.40370612 +\n 0.90148123 * b +\n a *\n (-0.27087943 +\n 0.6122399 * b +\n a * (0.00299215 - 0.45399568 * b - 0.14661872 * a)))),\n];\n\nconst getCs = (\n L: number,\n a: number,\n b: number,\n cusp: [number, number],\n): [number, number, number] => {\n const cMax = findGamutIntersectionOKLCH(a, b, L, 1, L, cusp);\n const stMax = computeSt(cusp);\n const k = cMax / Math.min(L * stMax[0], (1 - L) * stMax[1]);\n const stMid = computeStMid(a, b);\n let ca = L * stMid[0];\n let cb = (1.0 - L) * stMid[1];\n const cMid =\n 0.9 * k * Math.sqrt(Math.sqrt(1.0 / (1.0 / ca ** 4 + 1.0 / cb ** 4)));\n ca = L * 0.4;\n cb = (1.0 - L) * 0.8;\n const c0 = Math.sqrt(1.0 / (1.0 / ca ** 2 + 1.0 / cb ** 2));\n return [c0, cMid, cMax];\n};\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Convert OKHSL (h: 0–360, s: 0–1, l: 0–1) to linear sRGB.\n * Channels may exceed [0, 1] near gamut boundaries — caller must clamp if needed.\n */\nexport function okhslToLinearSrgb(\n h: number,\n s: number,\n l: number,\n): [number, number, number] {\n const L = toeInv(l);\n let a = 0;\n let b = 0;\n\n const hNorm = constrainAngle(h) / 360.0;\n\n if (L !== 0.0 && L !== 1.0 && s !== 0) {\n const a_ = Math.cos(TAU * hNorm);\n const b_ = Math.sin(TAU * hNorm);\n\n const cusp = findCuspOKLCH(a_, b_);\n const Cs = getCs(L, a_, b_, cusp);\n const [c0, cMid, cMax] = Cs;\n\n const mid = 0.8;\n const midInv = 1.25;\n let t: number, k0: number, k1: number, k2: number;\n\n if (s < mid) {\n t = midInv * s;\n k0 = 0.0;\n k1 = mid * c0;\n k2 = 1.0 - k1 / cMid;\n } else {\n t = 5 * (s - 0.8);\n k0 = cMid;\n k1 = (0.2 * cMid ** 2 * 1.25 ** 2) / c0;\n k2 = 1.0 - k1 / (cMax - cMid);\n }\n\n const c = k0 + (t * k1) / (1.0 - k2 * t);\n a = c * a_;\n b = c * b_;\n }\n\n return OKLabToLinearSRGB([L, a, b]);\n}\n\n/**\n * Compute relative luminance Y from linear sRGB channels.\n * Per WCAG 2: Y = 0.2126·R + 0.7152·G + 0.0722·B\n */\nexport function relativeLuminanceFromLinearRgb(\n rgb: [number, number, number],\n): number {\n return 0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2];\n}\n\n/**\n * WCAG 2 contrast ratio from two luminance values.\n */\nexport function contrastRatioFromLuminance(yA: number, yB: number): number {\n const lighter = Math.max(yA, yB);\n const darker = Math.min(yA, yB);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\nconst sRGBLinearToGamma = (val: number): number => {\n const sign = val < 0 ? -1 : 1;\n const abs = Math.abs(val);\n return abs > 0.0031308\n ? sign * (1.055 * Math.pow(abs, 1 / 2.4) - 0.055)\n : 12.92 * val;\n};\n\nconst sRGBGammaToLinear = (val: number): number => {\n const sign = val < 0 ? -1 : 1;\n const abs = Math.abs(val);\n return abs <= 0.04045\n ? val / 12.92\n : sign * Math.pow((abs + 0.055) / 1.055, 2.4);\n};\n\n/**\n * Convert OKHSL to gamma-encoded sRGB (clamped to 0–1).\n */\nexport function okhslToSrgb(\n h: number,\n s: number,\n l: number,\n): [number, number, number] {\n const lin = okhslToLinearSrgb(h, s, l);\n return [\n Math.max(0, Math.min(1, sRGBLinearToGamma(lin[0]))),\n Math.max(0, Math.min(1, sRGBLinearToGamma(lin[1]))),\n Math.max(0, Math.min(1, sRGBLinearToGamma(lin[2]))),\n ];\n}\n\n/**\n * Convert OKHSL (h: 0–360, s: 0–1, l: 0–1) to OKLab [L, a, b].\n */\nexport function okhslToOklab(\n h: number,\n s: number,\n l: number,\n): [number, number, number] {\n const L = toeInv(l);\n let a = 0;\n let b = 0;\n\n const hNorm = constrainAngle(h) / 360.0;\n\n if (L !== 0.0 && L !== 1.0 && s !== 0) {\n const a_ = Math.cos(TAU * hNorm);\n const b_ = Math.sin(TAU * hNorm);\n\n const cusp = findCuspOKLCH(a_, b_);\n const Cs = getCs(L, a_, b_, cusp);\n const [c0, cMid, cMax] = Cs;\n\n const mid = 0.8;\n const midInv = 1.25;\n let t: number, k0: number, k1: number, k2: number;\n\n if (s < mid) {\n t = midInv * s;\n k0 = 0.0;\n k1 = mid * c0;\n k2 = 1.0 - k1 / cMid;\n } else {\n t = 5 * (s - 0.8);\n k0 = cMid;\n k1 = (0.2 * cMid ** 2 * 1.25 ** 2) / c0;\n k2 = 1.0 - k1 / (cMax - cMid);\n }\n\n const c = k0 + (t * k1) / (1.0 - k2 * t);\n a = c * a_;\n b = c * b_;\n }\n\n return [L, a, b];\n}\n\n// ============================================================================\n// Reverse pipeline: sRGB → OKHSL\n// ============================================================================\n\nconst linearSrgbToOklab = (rgb: Vec3): Vec3 => {\n const lms = transform(rgb, linear_sRGB_to_LMS_M);\n const lms_ = cbrt3(lms);\n return transform(lms_, LMS_to_OKLab_M);\n};\n\nconst oklabToOkhsl = (lab: Vec3): Vec3 => {\n const L = lab[0];\n const a = lab[1];\n const b = lab[2];\n\n const C = Math.sqrt(a * a + b * b);\n\n if (C < EPSILON) {\n return [0, 0, toe(L)];\n }\n\n const a_ = a / C;\n const b_ = b / C;\n\n let h = Math.atan2(b, a) * (180 / Math.PI);\n h = constrainAngle(h);\n\n const cusp = findCuspOKLCH(a_, b_);\n const Cs = getCs(L, a_, b_, cusp);\n const [c0, cMid, cMax] = Cs;\n\n const mid = 0.8;\n const midInv = 1.25;\n\n let s: number;\n\n if (C < cMid) {\n const k1 = mid * c0;\n const k2 = 1.0 - k1 / cMid;\n const t = C / (k1 + C * k2);\n s = t / midInv;\n } else {\n const k0 = cMid;\n const k1 = (0.2 * cMid ** 2 * 1.25 ** 2) / c0;\n const k2 = 1.0 - k1 / (cMax - cMid);\n const cDiff = C - k0;\n const t = cDiff / (k1 + cDiff * k2);\n s = mid + t / 5;\n }\n\n const l = toe(L);\n\n return [h, clampVal(s, 0, 1), clampVal(l, 0, 1)];\n};\n\n/**\n * Convert gamma-encoded sRGB (0–1 per channel) to OKHSL.\n * Returns [h, s, l] where h: 0–360, s: 0–1, l: 0–1.\n */\nexport function srgbToOkhsl(\n rgb: [number, number, number],\n): [number, number, number] {\n const linear: Vec3 = [\n sRGBGammaToLinear(rgb[0]),\n sRGBGammaToLinear(rgb[1]),\n sRGBGammaToLinear(rgb[2]),\n ];\n const oklab = linearSrgbToOklab(linear);\n return oklabToOkhsl(oklab) as [number, number, number];\n}\n\n/**\n * Parse a hex color string (#rgb or #rrggbb) to sRGB [r, g, b] in 0–1 range.\n * Returns null if the string is not a valid hex color.\n */\nexport function parseHex(hex: string): [number, number, number] | null {\n const h = hex.startsWith('#') ? hex.slice(1) : hex;\n\n if (h.length === 3) {\n const r = parseInt(h[0] + h[0], 16);\n const g = parseInt(h[1] + h[1], 16);\n const b = parseInt(h[2] + h[2], 16);\n if (isNaN(r) || isNaN(g) || isNaN(b)) return null;\n return [r / 255, g / 255, b / 255];\n }\n\n if (h.length === 6) {\n const r = parseInt(h.slice(0, 2), 16);\n const g = parseInt(h.slice(2, 4), 16);\n const b = parseInt(h.slice(4, 6), 16);\n if (isNaN(r) || isNaN(g) || isNaN(b)) return null;\n return [r / 255, g / 255, b / 255];\n }\n\n return null;\n}\n\n// ============================================================================\n// Format functions\n// ============================================================================\n\n/**\n * Format OKHSL values as a CSS `okhsl(H S% L%)` string.\n * h: 0–360, s: 0–100, l: 0–100 (percentage scale for s and l).\n */\nexport function formatOkhsl(h: number, s: number, l: number): string {\n return `okhsl(${h.toFixed(1)} ${s.toFixed(1)}% ${l.toFixed(1)}%)`;\n}\n\n/**\n * Format OKHSL values as a CSS `rgb(R, G, B)` string with fractional 0–255 values.\n * h: 0–360, s: 0–100, l: 0–100 (percentage scale for s and l).\n */\nexport function formatRgb(h: number, s: number, l: number): string {\n const [r, g, b] = okhslToSrgb(h, s / 100, l / 100);\n return `rgb(${(r * 255).toFixed(3)}, ${(g * 255).toFixed(3)}, ${(b * 255).toFixed(3)})`;\n}\n\n/**\n * Format OKHSL values as a CSS `hsl(H, S%, L%)` string.\n * h: 0–360, s: 0–100, l: 0–100 (percentage scale for s and l).\n */\nexport function formatHsl(h: number, s: number, l: number): string {\n const [r, g, b] = okhslToSrgb(h, s / 100, l / 100);\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n\n let hh = 0;\n let ss = 0;\n const ll = (max + min) / 2;\n\n if (delta > 0) {\n ss = ll > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n\n if (max === r) {\n hh = ((g - b) / delta + (g < b ? 6 : 0)) * 60;\n } else if (max === g) {\n hh = ((b - r) / delta + 2) * 60;\n } else {\n hh = ((r - g) / delta + 4) * 60;\n }\n }\n\n return `hsl(${hh.toFixed(1)}, ${(ss * 100).toFixed(1)}%, ${(ll * 100).toFixed(1)}%)`;\n}\n\n/**\n * Format OKHSL values as a CSS `oklch(L% C H)` string.\n * h: 0–360, s: 0–100, l: 0–100 (percentage scale for s and l).\n */\nexport function formatOklch(h: number, s: number, l: number): string {\n const [L, a, b] = okhslToOklab(h, s / 100, l / 100);\n const C = Math.sqrt(a * a + b * b);\n let hh = Math.atan2(b, a) * (180 / Math.PI);\n hh = constrainAngle(hh);\n\n return `oklch(${(L * 100).toFixed(1)}% ${C.toFixed(4)} ${hh.toFixed(1)})`;\n}\n","/**\n * OKHSL Contrast Solver\n *\n * Finds the closest OKHSL lightness that satisfies a WCAG 2 contrast target\n * against a base color. Used by glaze when resolving dependent colors\n * with `ensureContrast`.\n */\n\nimport {\n okhslToLinearSrgb,\n relativeLuminanceFromLinearRgb,\n contrastRatioFromLuminance,\n} from './okhsl-color-math';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ContrastPreset = 'AA' | 'AAA' | 'AA-large' | 'AAA-large';\nexport type MinContrast = number | ContrastPreset;\n\nexport interface FindLightnessForContrastOptions {\n /** Hue of the candidate color (0–360). */\n hue: number;\n /** Saturation of the candidate color (0–1). */\n saturation: number;\n /** Preferred lightness of the candidate (0–1). */\n preferredLightness: number;\n\n /** Base/reference color as linear sRGB (channels may be outside 0–1 before clamp). */\n baseLinearRgb: [number, number, number];\n\n /** Ensures the WCAG contrast ratio meets a target floor. */\n ensureContrast: MinContrast;\n\n /** Search bounds for lightness. Default: [0, 1]. */\n lightnessRange?: [number, number];\n /** Convergence threshold. Default: 1e-4. */\n epsilon?: number;\n /** Maximum binary-search iterations per branch. Default: 14. */\n maxIterations?: number;\n}\n\nexport interface FindLightnessForContrastResult {\n /** Chosen lightness in 0–1. */\n lightness: number;\n /** Achieved WCAG contrast ratio. */\n contrast: number;\n /** Whether the target was reached. */\n met: boolean;\n /** Which branch was selected. */\n branch: 'lighter' | 'darker' | 'preferred';\n}\n\n// ============================================================================\n// Preset mapping\n// ============================================================================\n\nconst CONTRAST_PRESETS: Record<ContrastPreset, number> = {\n AA: 4.5,\n AAA: 7,\n 'AA-large': 3,\n 'AAA-large': 4.5,\n};\n\nexport function resolveMinContrast(value: MinContrast): number {\n if (typeof value === 'number') {\n return Math.max(1, value);\n }\n return CONTRAST_PRESETS[value];\n}\n\n// ============================================================================\n// LRU luminance cache\n// ============================================================================\n\nconst CACHE_SIZE = 512;\nconst luminanceCache = new Map<string, number>();\nconst cacheOrder: string[] = [];\n\nfunction cachedLuminance(h: number, s: number, l: number): number {\n const lRounded = Math.round(l * 10000) / 10000;\n const key = `${h}|${s}|${lRounded}`;\n\n const cached = luminanceCache.get(key);\n if (cached !== undefined) return cached;\n\n const linearRgb = okhslToLinearSrgb(h, s, lRounded);\n const y = relativeLuminanceFromLinearRgb(linearRgb);\n\n if (luminanceCache.size >= CACHE_SIZE) {\n const evict = cacheOrder.shift()!;\n luminanceCache.delete(evict);\n }\n luminanceCache.set(key, y);\n cacheOrder.push(key);\n\n return y;\n}\n\n// ============================================================================\n// Solver\n// ============================================================================\n\ninterface BranchResult {\n lightness: number;\n contrast: number;\n met: boolean;\n}\n\n/**\n * Binary search one branch [lo, hi] for the nearest passing lightness to `preferred`.\n */\nfunction searchBranch(\n h: number,\n s: number,\n lo: number,\n hi: number,\n yBase: number,\n target: number,\n epsilon: number,\n maxIter: number,\n preferred: number,\n): BranchResult {\n const yLo = cachedLuminance(h, s, lo);\n const yHi = cachedLuminance(h, s, hi);\n const crLo = contrastRatioFromLuminance(yLo, yBase);\n const crHi = contrastRatioFromLuminance(yHi, yBase);\n\n if (crLo < target && crHi < target) {\n if (crLo >= crHi) {\n return { lightness: lo, contrast: crLo, met: false };\n }\n return { lightness: hi, contrast: crHi, met: false };\n }\n\n let low = lo;\n let high = hi;\n\n for (let i = 0; i < maxIter; i++) {\n if (high - low < epsilon) break;\n\n const mid = (low + high) / 2;\n const yMid = cachedLuminance(h, s, mid);\n const crMid = contrastRatioFromLuminance(yMid, yBase);\n\n if (crMid >= target) {\n if (mid < preferred) {\n low = mid;\n } else {\n high = mid;\n }\n } else {\n if (mid < preferred) {\n high = mid;\n } else {\n low = mid;\n }\n }\n }\n\n const yLow = cachedLuminance(h, s, low);\n const yHigh = cachedLuminance(h, s, high);\n const crLow = contrastRatioFromLuminance(yLow, yBase);\n const crHigh = contrastRatioFromLuminance(yHigh, yBase);\n\n const lowPasses = crLow >= target;\n const highPasses = crHigh >= target;\n\n if (lowPasses && highPasses) {\n if (Math.abs(low - preferred) <= Math.abs(high - preferred)) {\n return { lightness: low, contrast: crLow, met: true };\n }\n return { lightness: high, contrast: crHigh, met: true };\n }\n if (lowPasses) return { lightness: low, contrast: crLow, met: true };\n if (highPasses) return { lightness: high, contrast: crHigh, met: true };\n\n return coarseScan(h, s, lo, hi, yBase, target, epsilon, maxIter);\n}\n\n/**\n * Fallback coarse scan when binary search is unstable near gamut edges.\n */\nfunction coarseScan(\n h: number,\n s: number,\n lo: number,\n hi: number,\n yBase: number,\n target: number,\n epsilon: number,\n maxIter: number,\n): BranchResult {\n const STEPS = 64;\n const step = (hi - lo) / STEPS;\n let bestL = lo;\n let bestCr = 0;\n let bestMet = false;\n\n for (let i = 0; i <= STEPS; i++) {\n const l = lo + step * i;\n const y = cachedLuminance(h, s, l);\n const cr = contrastRatioFromLuminance(y, yBase);\n\n if (cr >= target && !bestMet) {\n bestL = l;\n bestCr = cr;\n bestMet = true;\n } else if (cr >= target && bestMet) {\n bestL = l;\n bestCr = cr;\n } else if (!bestMet && cr > bestCr) {\n bestL = l;\n bestCr = cr;\n }\n }\n\n if (bestMet && bestL > lo + step) {\n let rLo = bestL - step;\n let rHi = bestL;\n for (let i = 0; i < maxIter; i++) {\n if (rHi - rLo < epsilon) break;\n const mid = (rLo + rHi) / 2;\n const y = cachedLuminance(h, s, mid);\n const cr = contrastRatioFromLuminance(y, yBase);\n if (cr >= target) {\n rHi = mid;\n bestL = mid;\n bestCr = cr;\n } else {\n rLo = mid;\n }\n }\n }\n\n return { lightness: bestL, contrast: bestCr, met: bestMet };\n}\n\n/**\n * Find the OKHSL lightness that satisfies a WCAG 2 contrast target\n * against a base color, staying as close to `preferredLightness` as possible.\n */\nexport function findLightnessForContrast(\n options: FindLightnessForContrastOptions,\n): FindLightnessForContrastResult {\n const {\n hue,\n saturation,\n preferredLightness,\n baseLinearRgb,\n ensureContrast: ensureContrastInput,\n lightnessRange = [0, 1],\n epsilon = 1e-4,\n maxIterations = 14,\n } = options;\n\n const target = resolveMinContrast(ensureContrastInput);\n const yBase = relativeLuminanceFromLinearRgb(baseLinearRgb);\n\n const yPref = cachedLuminance(hue, saturation, preferredLightness);\n const crPref = contrastRatioFromLuminance(yPref, yBase);\n\n if (crPref >= target) {\n return {\n lightness: preferredLightness,\n contrast: crPref,\n met: true,\n branch: 'preferred',\n };\n }\n\n const [minL, maxL] = lightnessRange;\n\n const darkerResult =\n preferredLightness > minL\n ? searchBranch(\n hue,\n saturation,\n minL,\n preferredLightness,\n yBase,\n target,\n epsilon,\n maxIterations,\n preferredLightness,\n )\n : null;\n\n const lighterResult =\n preferredLightness < maxL\n ? searchBranch(\n hue,\n saturation,\n preferredLightness,\n maxL,\n yBase,\n target,\n epsilon,\n maxIterations,\n preferredLightness,\n )\n : null;\n\n const darkerPasses = darkerResult?.met ?? false;\n const lighterPasses = lighterResult?.met ?? false;\n\n if (darkerPasses && lighterPasses) {\n const darkerDist = Math.abs(darkerResult!.lightness - preferredLightness);\n const lighterDist = Math.abs(lighterResult!.lightness - preferredLightness);\n if (darkerDist <= lighterDist) {\n return { ...darkerResult!, branch: 'darker' };\n }\n return { ...lighterResult!, branch: 'lighter' };\n }\n\n if (darkerPasses) {\n return { ...darkerResult!, branch: 'darker' };\n }\n\n if (lighterPasses) {\n return { ...lighterResult!, branch: 'lighter' };\n }\n\n const candidates: (BranchResult & { branch: 'darker' | 'lighter' })[] = [];\n if (darkerResult) candidates.push({ ...darkerResult, branch: 'darker' });\n if (lighterResult) candidates.push({ ...lighterResult, branch: 'lighter' });\n\n if (candidates.length === 0) {\n return {\n lightness: preferredLightness,\n contrast: crPref,\n met: false,\n branch: 'preferred',\n };\n }\n\n candidates.sort((a, b) => b.contrast - a.contrast);\n return candidates[0];\n}\n","/**\n * Glaze — OKHSL-based color theme generator.\n *\n * Generates robust light, dark, and high-contrast colors from a hue/saturation\n * seed, preserving contrast for UI pairs via explicit dependencies.\n */\n\nimport {\n okhslToLinearSrgb,\n formatOkhsl,\n formatRgb,\n formatHsl,\n formatOklch,\n srgbToOkhsl,\n parseHex,\n} from './okhsl-color-math';\nimport { findLightnessForContrast } from './contrast-solver';\nimport type {\n HCPair,\n AdaptationMode,\n ColorDef,\n ColorMap,\n ResolvedColor,\n ResolvedColorVariant,\n GlazeColorFormat,\n GlazeConfig,\n GlazeConfigResolved,\n GlazeOutputModes,\n GlazeTheme,\n GlazeThemeExport,\n GlazeExtendOptions,\n GlazeTokenOptions,\n GlazeJsonOptions,\n GlazeColorInput,\n GlazeColorToken,\n} from './types';\n\n// ============================================================================\n// Global configuration\n// ============================================================================\n\nlet globalConfig: GlazeConfigResolved = {\n darkLightness: [10, 90],\n darkDesaturation: 0.1,\n states: {\n dark: '@dark',\n highContrast: '@high-contrast',\n },\n modes: {\n dark: true,\n highContrast: false,\n },\n};\n\n// ============================================================================\n// HCPair helpers\n// ============================================================================\n\nfunction pairNormal<T>(p: HCPair<T>): T {\n return Array.isArray(p) ? p[0] : p;\n}\n\nfunction pairHC<T>(p: HCPair<T>): T {\n return Array.isArray(p) ? p[1] : p;\n}\n\n// ============================================================================\n// Validation\n// ============================================================================\n\nfunction validateColorDefs(defs: ColorMap): void {\n const names = new Set(Object.keys(defs));\n\n for (const [name, def] of Object.entries(defs)) {\n if (def.contrast !== undefined && !def.base) {\n throw new Error(`glaze: color \"${name}\" has \"contrast\" without \"base\".`);\n }\n\n if (def.l !== undefined && def.base !== undefined) {\n console.warn(\n `glaze: color \"${name}\" has both \"l\" and \"base\". \"l\" takes precedence.`,\n );\n }\n\n if (def.base && !names.has(def.base)) {\n throw new Error(\n `glaze: color \"${name}\" references non-existent base \"${def.base}\".`,\n );\n }\n\n if (def.l === undefined && def.base === undefined) {\n throw new Error(\n `glaze: color \"${name}\" must have either \"l\" (root) or \"base\" + \"contrast\" (dependent).`,\n );\n }\n }\n\n // Check for circular references\n const visited = new Set<string>();\n const inStack = new Set<string>();\n\n function dfs(name: string): void {\n if (inStack.has(name)) {\n throw new Error(\n `glaze: circular base reference detected involving \"${name}\".`,\n );\n }\n if (visited.has(name)) return;\n\n inStack.add(name);\n const def = defs[name];\n if (def.base && def.l === undefined) {\n dfs(def.base);\n }\n inStack.delete(name);\n visited.add(name);\n }\n\n for (const name of names) {\n dfs(name);\n }\n}\n\n// ============================================================================\n// Topological sort\n// ============================================================================\n\nfunction topoSort(defs: ColorMap): string[] {\n const result: string[] = [];\n const visited = new Set<string>();\n\n function visit(name: string): void {\n if (visited.has(name)) return;\n visited.add(name);\n\n const def = defs[name];\n if (def.base && def.l === undefined) {\n visit(def.base);\n }\n\n result.push(name);\n }\n\n for (const name of Object.keys(defs)) {\n visit(name);\n }\n\n return result;\n}\n\n// ============================================================================\n// Dark scheme mapping\n// ============================================================================\n\nfunction mapLightnessDark(l: number, mode: AdaptationMode): number {\n if (mode === 'static') return l;\n\n const [lo, hi] = globalConfig.darkLightness;\n\n if (mode === 'fixed') {\n return (l * (hi - lo)) / 100 + lo;\n }\n\n // auto — inverted\n return ((100 - l) * (hi - lo)) / 100 + lo;\n}\n\nfunction mapSaturationDark(s: number, mode: AdaptationMode): number {\n if (mode === 'static') return s;\n return s * (1 - globalConfig.darkDesaturation);\n}\n\n// ============================================================================\n// Contrast sign resolution\n// ============================================================================\n\n/**\n * Resolve the effective lightness from a contrast delta.\n */\nfunction resolveContrastLightness(\n baseLightness: number,\n contrast: number,\n): number {\n if (contrast < 0) {\n return clamp(baseLightness + contrast, 0, 100);\n }\n\n const candidate = baseLightness + contrast;\n if (candidate > 100) {\n return clamp(baseLightness - contrast, 0, 100);\n }\n return clamp(candidate, 0, 100);\n}\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, v));\n}\n\n// ============================================================================\n// Color resolution engine\n// ============================================================================\n\ninterface ResolveContext {\n hue: number;\n saturation: number;\n defs: ColorMap;\n resolved: Map<string, ResolvedColor>;\n}\n\nfunction resolveRootColor(\n _name: string,\n def: ColorDef,\n _ctx: ResolveContext,\n isHighContrast: boolean,\n): { lightL: number; sat: number } {\n const rawL = def.l!;\n const lightL = clamp(\n isHighContrast ? pairHC(rawL) : pairNormal(rawL),\n 0,\n 100,\n );\n const sat = clamp(def.sat ?? 1, 0, 1);\n return { lightL, sat };\n}\n\nfunction resolveDependentColor(\n name: string,\n def: ColorDef,\n ctx: ResolveContext,\n isHighContrast: boolean,\n isDark: boolean,\n): { l: number; sat: number } {\n const baseName = def.base!;\n const baseResolved = ctx.resolved.get(baseName);\n if (!baseResolved) {\n throw new Error(\n `glaze: base \"${baseName}\" not yet resolved for \"${name}\".`,\n );\n }\n\n const mode = def.mode ?? 'auto';\n const sat = clamp(def.sat ?? 1, 0, 1);\n\n let baseL: number;\n if (isDark && isHighContrast) {\n baseL = baseResolved.darkContrast.l * 100;\n } else if (isDark) {\n baseL = baseResolved.dark.l * 100;\n } else if (isHighContrast) {\n baseL = baseResolved.lightContrast.l * 100;\n } else {\n baseL = baseResolved.light.l * 100;\n }\n\n const rawContrast = def.contrast ?? 0;\n let contrast = isHighContrast ? pairHC(rawContrast) : pairNormal(rawContrast);\n\n if (isDark && mode === 'auto') {\n contrast = -contrast;\n }\n\n const preferredL = resolveContrastLightness(baseL, contrast);\n\n const rawEnsureContrast = def.ensureContrast;\n if (rawEnsureContrast !== undefined) {\n const minCr = isHighContrast\n ? pairHC(rawEnsureContrast)\n : pairNormal(rawEnsureContrast);\n\n const effectiveSat = isDark\n ? mapSaturationDark((sat * ctx.saturation) / 100, mode)\n : (sat * ctx.saturation) / 100;\n\n let baseH: number;\n let baseS: number;\n let baseLNorm: number;\n if (isDark && isHighContrast) {\n baseH = baseResolved.darkContrast.h;\n baseS = baseResolved.darkContrast.s;\n baseLNorm = baseResolved.darkContrast.l;\n } else if (isDark) {\n baseH = baseResolved.dark.h;\n baseS = baseResolved.dark.s;\n baseLNorm = baseResolved.dark.l;\n } else if (isHighContrast) {\n baseH = baseResolved.lightContrast.h;\n baseS = baseResolved.lightContrast.s;\n baseLNorm = baseResolved.lightContrast.l;\n } else {\n baseH = baseResolved.light.h;\n baseS = baseResolved.light.s;\n baseLNorm = baseResolved.light.l;\n }\n\n const baseLinearRgb = okhslToLinearSrgb(baseH, baseS, baseLNorm);\n\n const result = findLightnessForContrast({\n hue: ctx.hue,\n saturation: effectiveSat,\n preferredLightness: preferredL / 100,\n baseLinearRgb,\n ensureContrast: minCr,\n });\n\n return { l: result.lightness * 100, sat };\n }\n\n return { l: clamp(preferredL, 0, 100), sat };\n}\n\nfunction resolveColorForScheme(\n name: string,\n def: ColorDef,\n ctx: ResolveContext,\n isDark: boolean,\n isHighContrast: boolean,\n): ResolvedColorVariant {\n const mode = def.mode ?? 'auto';\n const isRoot = def.l !== undefined;\n\n let lightL: number;\n let sat: number;\n\n if (isRoot) {\n const root = resolveRootColor(name, def, ctx, isHighContrast);\n lightL = root.lightL;\n sat = root.sat;\n } else {\n const dep = resolveDependentColor(name, def, ctx, isHighContrast, isDark);\n lightL = dep.l;\n sat = dep.sat;\n }\n\n let finalL: number;\n let finalSat: number;\n\n if (isDark && isRoot) {\n finalL = mapLightnessDark(lightL, mode);\n finalSat = mapSaturationDark((sat * ctx.saturation) / 100, mode);\n } else if (isDark && !isRoot) {\n finalL = lightL;\n finalSat = mapSaturationDark((sat * ctx.saturation) / 100, mode);\n } else {\n finalL = lightL;\n finalSat = (sat * ctx.saturation) / 100;\n }\n\n return {\n h: ctx.hue,\n s: clamp(finalSat, 0, 1),\n l: clamp(finalL / 100, 0, 1),\n };\n}\n\nfunction resolveAllColors(\n hue: number,\n saturation: number,\n defs: ColorMap,\n): Map<string, ResolvedColor> {\n validateColorDefs(defs);\n const order = topoSort(defs);\n\n const ctx: ResolveContext = {\n hue,\n saturation,\n defs,\n resolved: new Map(),\n };\n\n // Pass 1: Light normal\n const lightMap = new Map<string, ResolvedColorVariant>();\n for (const name of order) {\n const variant = resolveColorForScheme(name, defs[name], ctx, false, false);\n lightMap.set(name, variant);\n ctx.resolved.set(name, {\n name,\n light: variant,\n dark: variant,\n lightContrast: variant,\n darkContrast: variant,\n mode: defs[name].mode ?? 'auto',\n });\n }\n\n // Pass 2: Light high-contrast\n const lightHCMap = new Map<string, ResolvedColorVariant>();\n for (const name of order) {\n ctx.resolved.set(name, {\n ...ctx.resolved.get(name)!,\n lightContrast: lightMap.get(name)!,\n });\n }\n for (const name of order) {\n const variant = resolveColorForScheme(name, defs[name], ctx, false, true);\n lightHCMap.set(name, variant);\n ctx.resolved.set(name, {\n ...ctx.resolved.get(name)!,\n lightContrast: variant,\n });\n }\n\n // Pass 3: Dark normal\n const darkMap = new Map<string, ResolvedColorVariant>();\n for (const name of order) {\n ctx.resolved.set(name, {\n name,\n light: lightMap.get(name)!,\n dark: lightMap.get(name)!,\n lightContrast: lightHCMap.get(name)!,\n darkContrast: lightHCMap.get(name)!,\n mode: defs[name].mode ?? 'auto',\n });\n }\n for (const name of order) {\n const variant = resolveColorForScheme(name, defs[name], ctx, true, false);\n darkMap.set(name, variant);\n ctx.resolved.set(name, {\n ...ctx.resolved.get(name)!,\n dark: variant,\n });\n }\n\n // Pass 4: Dark high-contrast\n const darkHCMap = new Map<string, ResolvedColorVariant>();\n for (const name of order) {\n ctx.resolved.set(name, {\n ...ctx.resolved.get(name)!,\n darkContrast: darkMap.get(name)!,\n });\n }\n for (const name of order) {\n const variant = resolveColorForScheme(name, defs[name], ctx, true, true);\n darkHCMap.set(name, variant);\n ctx.resolved.set(name, {\n ...ctx.resolved.get(name)!,\n darkContrast: variant,\n });\n }\n\n // Build final result\n const result = new Map<string, ResolvedColor>();\n for (const name of order) {\n result.set(name, {\n name,\n light: lightMap.get(name)!,\n dark: darkMap.get(name)!,\n lightContrast: lightHCMap.get(name)!,\n darkContrast: darkHCMap.get(name)!,\n mode: defs[name].mode ?? 'auto',\n });\n }\n\n return result;\n}\n\n// ============================================================================\n// Token formatting\n// ============================================================================\n\nconst formatters: Record<\n GlazeColorFormat,\n (h: number, s: number, l: number) => string\n> = {\n okhsl: formatOkhsl,\n rgb: formatRgb,\n hsl: formatHsl,\n oklch: formatOklch,\n};\n\nfunction formatVariant(\n v: ResolvedColorVariant,\n format: GlazeColorFormat = 'okhsl',\n): string {\n return formatters[format](v.h, v.s * 100, v.l * 100);\n}\n\nfunction resolveModes(override?: GlazeOutputModes): Required<GlazeOutputModes> {\n return {\n dark: override?.dark ?? globalConfig.modes.dark,\n highContrast: override?.highContrast ?? globalConfig.modes.highContrast,\n };\n}\n\nfunction buildTokenMap(\n resolved: Map<string, ResolvedColor>,\n prefix: string,\n states: { dark: string; highContrast: string },\n modes: Required<GlazeOutputModes>,\n format: GlazeColorFormat = 'okhsl',\n): Record<string, Record<string, string>> {\n const tokens: Record<string, Record<string, string>> = {};\n\n for (const [name, color] of resolved) {\n const key = `#${prefix}${name}`;\n const entry: Record<string, string> = {\n '': formatVariant(color.light, format),\n };\n\n if (modes.dark) {\n entry[states.dark] = formatVariant(color.dark, format);\n }\n if (modes.highContrast) {\n entry[states.highContrast] = formatVariant(color.lightContrast, format);\n }\n if (modes.dark && modes.highContrast) {\n entry[`${states.dark} & ${states.highContrast}`] = formatVariant(\n color.darkContrast,\n format,\n );\n }\n\n tokens[key] = entry;\n }\n\n return tokens;\n}\n\nfunction buildJsonMap(\n resolved: Map<string, ResolvedColor>,\n modes: Required<GlazeOutputModes>,\n format: GlazeColorFormat = 'okhsl',\n): Record<string, Record<string, string>> {\n const result: Record<string, Record<string, string>> = {};\n\n for (const [name, color] of resolved) {\n const entry: Record<string, string> = {\n light: formatVariant(color.light, format),\n };\n\n if (modes.dark) {\n entry.dark = formatVariant(color.dark, format);\n }\n if (modes.highContrast) {\n entry.lightContrast = formatVariant(color.lightContrast, format);\n }\n if (modes.dark && modes.highContrast) {\n entry.darkContrast = formatVariant(color.darkContrast, format);\n }\n\n result[name] = entry;\n }\n\n return result;\n}\n\n// ============================================================================\n// Theme implementation\n// ============================================================================\n\nfunction createTheme(\n hue: number,\n saturation: number,\n initialColors?: ColorMap,\n): GlazeTheme {\n let colorDefs: ColorMap = initialColors ? { ...initialColors } : {};\n\n const theme: GlazeTheme = {\n get hue() {\n return hue;\n },\n get saturation() {\n return saturation;\n },\n\n colors(defs: ColorMap): void {\n colorDefs = { ...colorDefs, ...defs };\n },\n\n color(name: string, def?: ColorDef): ColorDef | undefined | void {\n if (def === undefined) {\n return colorDefs[name];\n }\n colorDefs[name] = def;\n },\n\n remove(names: string | string[]): void {\n const list = Array.isArray(names) ? names : [names];\n for (const name of list) {\n delete colorDefs[name];\n }\n },\n\n has(name: string): boolean {\n return name in colorDefs;\n },\n\n list(): string[] {\n return Object.keys(colorDefs);\n },\n\n reset(): void {\n colorDefs = {};\n },\n\n export(): GlazeThemeExport {\n return {\n hue,\n saturation,\n colors: { ...colorDefs },\n };\n },\n\n extend(options: GlazeExtendOptions): GlazeTheme {\n const newHue = options.hue ?? hue;\n const newSat = options.saturation ?? saturation;\n const mergedColors = options.colors\n ? { ...colorDefs, ...options.colors }\n : { ...colorDefs };\n\n return createTheme(newHue, newSat, mergedColors);\n },\n\n resolve(): Map<string, ResolvedColor> {\n return resolveAllColors(hue, saturation, colorDefs);\n },\n\n tokens(\n options?: GlazeTokenOptions,\n ): Record<string, Record<string, string>> {\n const resolved = resolveAllColors(hue, saturation, colorDefs);\n const states = {\n dark: options?.states?.dark ?? globalConfig.states.dark,\n highContrast:\n options?.states?.highContrast ?? globalConfig.states.highContrast,\n };\n const modes = resolveModes(options?.modes);\n return buildTokenMap(resolved, '', states, modes, options?.format);\n },\n\n json(options?: GlazeJsonOptions): Record<string, Record<string, string>> {\n const resolved = resolveAllColors(hue, saturation, colorDefs);\n const modes = resolveModes(options?.modes);\n return buildJsonMap(resolved, modes, options?.format);\n },\n } as GlazeTheme;\n\n return theme;\n}\n\n// ============================================================================\n// Palette\n// ============================================================================\n\ntype PaletteInput = Record<string, GlazeTheme>;\n\nfunction createPalette(themes: PaletteInput) {\n return {\n tokens(\n options?: GlazeTokenOptions,\n ): Record<string, Record<string, string>> {\n const states = {\n dark: options?.states?.dark ?? globalConfig.states.dark,\n highContrast:\n options?.states?.highContrast ?? globalConfig.states.highContrast,\n };\n const modes = resolveModes(options?.modes);\n\n const allTokens: Record<string, Record<string, string>> = {};\n\n for (const [themeName, theme] of Object.entries(themes)) {\n const resolved = theme.resolve();\n\n let prefix = '';\n if (options?.prefix === true) {\n prefix = `${themeName}-`;\n } else if (\n typeof options?.prefix === 'object' &&\n options.prefix !== null\n ) {\n prefix = options.prefix[themeName] ?? `${themeName}-`;\n }\n\n const tokens = buildTokenMap(\n resolved,\n prefix,\n states,\n modes,\n options?.format,\n );\n Object.assign(allTokens, tokens);\n }\n\n return allTokens;\n },\n\n json(\n options?: GlazeJsonOptions & {\n prefix?: boolean | Record<string, string>;\n },\n ): Record<string, Record<string, Record<string, string>>> {\n const modes = resolveModes(options?.modes);\n\n const result: Record<string, Record<string, Record<string, string>>> = {};\n\n for (const [themeName, theme] of Object.entries(themes)) {\n const resolved = theme.resolve();\n result[themeName] = buildJsonMap(resolved, modes, options?.format);\n }\n\n return result;\n },\n };\n}\n\n// ============================================================================\n// Standalone color token\n// ============================================================================\n\nfunction createColorToken(input: GlazeColorInput): GlazeColorToken {\n const colorDef: ColorDef = {\n l: input.l,\n sat: input.sat,\n mode: input.mode,\n };\n\n const defs: ColorMap = { __color__: colorDef };\n\n return {\n resolve(): ResolvedColor {\n const resolved = resolveAllColors(input.hue, input.saturation, defs);\n return resolved.get('__color__')!;\n },\n\n token(options?: GlazeTokenOptions): Record<string, string> {\n const resolved = resolveAllColors(input.hue, input.saturation, defs);\n const states = {\n dark: options?.states?.dark ?? globalConfig.states.dark,\n highContrast:\n options?.states?.highContrast ?? globalConfig.states.highContrast,\n };\n const modes = resolveModes(options?.modes);\n const tokenMap = buildTokenMap(\n resolved,\n '',\n states,\n modes,\n options?.format,\n );\n return tokenMap['#__color__'];\n },\n\n json(options?: GlazeJsonOptions): Record<string, string> {\n const resolved = resolveAllColors(input.hue, input.saturation, defs);\n const modes = resolveModes(options?.modes);\n const jsonMap = buildJsonMap(resolved, modes, options?.format);\n return jsonMap['__color__'];\n },\n };\n}\n\n// ============================================================================\n// Public API: glaze()\n// ============================================================================\n\n/**\n * Create a single-hue glaze theme.\n *\n * @example\n * ```ts\n * const primary = glaze({ hue: 280, saturation: 80 });\n * // or shorthand:\n * const primary = glaze(280, 80);\n * ```\n */\nexport function glaze(\n hueOrOptions: number | { hue: number; saturation: number },\n saturation?: number,\n): GlazeTheme {\n if (typeof hueOrOptions === 'number') {\n return createTheme(hueOrOptions, saturation ?? 100);\n }\n return createTheme(hueOrOptions.hue, hueOrOptions.saturation);\n}\n\n/**\n * Configure global glaze settings.\n */\nglaze.configure = function configure(config: GlazeConfig): void {\n globalConfig = {\n darkLightness: config.darkLightness ?? globalConfig.darkLightness,\n darkDesaturation: config.darkDesaturation ?? globalConfig.darkDesaturation,\n states: {\n dark: config.states?.dark ?? globalConfig.states.dark,\n highContrast:\n config.states?.highContrast ?? globalConfig.states.highContrast,\n },\n modes: {\n dark: config.modes?.dark ?? globalConfig.modes.dark,\n highContrast:\n config.modes?.highContrast ?? globalConfig.modes.highContrast,\n },\n };\n};\n\n/**\n * Compose multiple themes into a palette.\n */\nglaze.palette = function palette(themes: PaletteInput) {\n return createPalette(themes);\n};\n\n/**\n * Create a theme from a serialized export.\n */\nglaze.from = function from(data: GlazeThemeExport): GlazeTheme {\n return createTheme(data.hue, data.saturation, data.colors);\n};\n\n/**\n * Create a standalone single-color token.\n */\nglaze.color = function color(input: GlazeColorInput): GlazeColorToken {\n return createColorToken(input);\n};\n\n/**\n * Create a theme from a hex color string.\n * Extracts hue and saturation from the color.\n */\nglaze.fromHex = function fromHex(hex: string): GlazeTheme {\n const rgb = parseHex(hex);\n if (!rgb) {\n throw new Error(`glaze: invalid hex color \"${hex}\".`);\n }\n const [h, s] = srgbToOkhsl(rgb);\n return createTheme(h, s * 100);\n};\n\n/**\n * Create a theme from RGB values (0–255).\n * Extracts hue and saturation from the color.\n */\nglaze.fromRgb = function fromRgb(r: number, g: number, b: number): GlazeTheme {\n const [h, s] = srgbToOkhsl([r / 255, g / 255, b / 255]);\n return createTheme(h, s * 100);\n};\n\n/**\n * Get the current global configuration (for testing/debugging).\n */\nglaze.getConfig = function getConfig(): GlazeConfigResolved {\n return { ...globalConfig };\n};\n\n/**\n * Reset global configuration to defaults.\n */\nglaze.resetConfig = function resetConfig(): void {\n globalConfig = {\n darkLightness: [10, 90],\n darkDesaturation: 0.1,\n states: {\n dark: '@dark',\n highContrast: '@high-contrast',\n },\n modes: {\n dark: true,\n highContrast: false,\n },\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/okhsl-color-math.ts","../src/contrast-solver.ts","../src/glaze.ts"],"sourcesContent":["/**\n * OKHSL color math primitives for the glaze theme generator.\n *\n * Provides bidirectional OKHSL ↔ sRGB conversion, relative luminance\n * computation for WCAG 2 contrast calculations, and multi-format output\n * (okhsl, rgb, hsl, oklch).\n */\n\ntype Vec3 = [number, number, number];\n\n// ============================================================================\n// Matrices (from texel-color / Björn Ottosson's reference)\n// ============================================================================\n\nconst OKLab_to_LMS_M: Vec3[] = [\n [1.0, 0.3963377773761749, 0.2158037573099136],\n [1.0, -0.1055613458156586, -0.0638541728258133],\n [1.0, -0.0894841775298119, -1.2914855480194092],\n];\n\nconst LMS_to_linear_sRGB_M: Vec3[] = [\n [4.076741636075959, -3.307711539258062, 0.2309699031821041],\n [-1.2684379732850313, 2.6097573492876878, -0.3413193760026569],\n [-0.004196076138675526, -0.703418617935936, 1.7076146940746113],\n];\n\nconst linear_sRGB_to_LMS_M: Vec3[] = [\n [0.4122214708, 0.5363325363, 0.0514459929],\n [0.2119034982, 0.6806995451, 0.1073969566],\n [0.0883024619, 0.2817188376, 0.6299787005],\n];\n\nconst LMS_to_OKLab_M: Vec3[] = [\n [0.2104542553, 0.793617785, -0.0040720468],\n [1.9779984951, -2.428592205, 0.4505937099],\n [0.0259040371, 0.7827717662, -0.808675766],\n];\n\nconst OKLab_to_linear_sRGB_coefficients: [\n [[number, number], number[]],\n [[number, number], number[]],\n [[number, number], number[]],\n] = [\n [\n [-1.8817030993265873, -0.8093650129914302],\n [1.19086277, 1.76576728, 0.59662641, 0.75515197, 0.56771245],\n ],\n [\n [1.8144407988010998, -1.194452667805235],\n [0.73956515, -0.45954404, 0.08285427, 0.12541073, -0.14503204],\n ],\n [\n [0.13110757611180954, 1.813339709266608],\n [1.35733652, -0.00915799, -1.1513021, -0.50559606, 0.00692167],\n ],\n];\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst TAU = 2 * Math.PI;\nconst K1 = 0.206;\nconst K2 = 0.03;\nconst K3 = (1.0 + K1) / (1.0 + K2);\nconst EPSILON = 1e-10;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst constrainAngle = (angle: number): number => ((angle % 360) + 360) % 360;\nconst toe = (x: number): number =>\n 0.5 *\n (K3 * x - K1 + Math.sqrt((K3 * x - K1) * (K3 * x - K1) + 4 * K2 * K3 * x));\nconst toeInv = (x: number): number => (x ** 2 + K1 * x) / (K3 * (x + K2));\nconst dot3 = (a: Vec3, b: Vec3): number =>\n a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\nconst dotXY = (a: [number, number], b: [number, number]): number =>\n a[0] * b[0] + a[1] * b[1];\nconst transform = (input: Vec3, matrix: Vec3[]): Vec3 => [\n dot3(input, matrix[0]),\n dot3(input, matrix[1]),\n dot3(input, matrix[2]),\n];\nconst cubed3 = (lms: Vec3): Vec3 => [lms[0] ** 3, lms[1] ** 3, lms[2] ** 3];\nconst cbrt3 = (lms: Vec3): Vec3 => [\n Math.cbrt(lms[0]),\n Math.cbrt(lms[1]),\n Math.cbrt(lms[2]),\n];\nconst clampVal = (v: number, min: number, max: number): number =>\n Math.max(min, Math.min(max, v));\n\n// ============================================================================\n// Internal OKHSL pipeline\n// ============================================================================\n\nconst OKLabToLinearSRGB = (lab: Vec3): Vec3 => {\n const lms = transform(lab, OKLab_to_LMS_M);\n return transform(cubed3(lms), LMS_to_linear_sRGB_M);\n};\n\nconst computeMaxSaturationOKLC = (a: number, b: number): number => {\n const okCoeff = OKLab_to_linear_sRGB_coefficients;\n const lmsToRgb = LMS_to_linear_sRGB_M;\n const tmp2: [number, number] = [a, b];\n const tmp3: Vec3 = [0, a, b];\n\n let chnlCoeff: number[];\n let chnlLMS: Vec3;\n\n if (dotXY(okCoeff[0][0], tmp2) > 1) {\n chnlCoeff = okCoeff[0][1];\n chnlLMS = lmsToRgb[0];\n } else if (dotXY(okCoeff[1][0], tmp2) > 1) {\n chnlCoeff = okCoeff[1][1];\n chnlLMS = lmsToRgb[1];\n } else {\n chnlCoeff = okCoeff[2][1];\n chnlLMS = lmsToRgb[2];\n }\n\n const [k0, k1, k2, k3, k4] = chnlCoeff;\n const [wl, wm, ws] = chnlLMS;\n\n let sat = k0 + k1 * a + k2 * b + k3 * (a * a) + k4 * a * b;\n\n const dotYZ = (mat: Vec3, vec: Vec3): number =>\n mat[1] * vec[1] + mat[2] * vec[2];\n\n const kl = dotYZ(OKLab_to_LMS_M[0], tmp3);\n const km = dotYZ(OKLab_to_LMS_M[1], tmp3);\n const ks = dotYZ(OKLab_to_LMS_M[2], tmp3);\n\n const l_ = 1.0 + sat * kl;\n const m_ = 1.0 + sat * km;\n const s_ = 1.0 + sat * ks;\n\n const l = l_ ** 3;\n const m = m_ ** 3;\n const s = s_ ** 3;\n\n const lds = 3.0 * kl * l_ * l_;\n const mds = 3.0 * km * m_ * m_;\n const sds = 3.0 * ks * s_ * s_;\n\n const lds2 = 6.0 * kl * kl * l_;\n const mds2 = 6.0 * km * km * m_;\n const sds2 = 6.0 * ks * ks * s_;\n\n const f = wl * l + wm * m + ws * s;\n const f1 = wl * lds + wm * mds + ws * sds;\n const f2 = wl * lds2 + wm * mds2 + ws * sds2;\n\n sat = sat - (f * f1) / (f1 * f1 - 0.5 * f * f2);\n\n return sat;\n};\n\nconst findCuspOKLCH = (a: number, b: number): [number, number] => {\n const S_cusp = computeMaxSaturationOKLC(a, b);\n const lab: Vec3 = [1, S_cusp * a, S_cusp * b];\n const rgb_at_max = OKLabToLinearSRGB(lab);\n const L_cusp = Math.cbrt(\n 1 /\n Math.max(\n Math.max(rgb_at_max[0], rgb_at_max[1]),\n Math.max(rgb_at_max[2], 0.0),\n ),\n );\n return [L_cusp, L_cusp * S_cusp];\n};\n\nconst findGamutIntersectionOKLCH = (\n a: number,\n b: number,\n l1: number,\n c1: number,\n l0: number,\n cusp: [number, number],\n): number => {\n const lmsToRgb = LMS_to_linear_sRGB_M;\n const tmp3: Vec3 = [0, a, b];\n const floatMax = Number.MAX_VALUE;\n\n let t: number;\n\n const dotYZ = (mat: Vec3, vec: Vec3): number =>\n mat[1] * vec[1] + mat[2] * vec[2];\n const dotXYZ = (vec: Vec3, x: number, y: number, z: number): number =>\n vec[0] * x + vec[1] * y + vec[2] * z;\n\n if ((l1 - l0) * cusp[1] - (cusp[0] - l0) * c1 <= 0.0) {\n const denom = c1 * cusp[0] + cusp[1] * (l0 - l1);\n t = denom === 0 ? 0 : (cusp[1] * l0) / denom;\n } else {\n const denom = c1 * (cusp[0] - 1.0) + cusp[1] * (l0 - l1);\n t = denom === 0 ? 0 : (cusp[1] * (l0 - 1.0)) / denom;\n\n const dl = l1 - l0;\n const dc = c1;\n const kl = dotYZ(OKLab_to_LMS_M[0], tmp3);\n const km = dotYZ(OKLab_to_LMS_M[1], tmp3);\n const ks = dotYZ(OKLab_to_LMS_M[2], tmp3);\n\n const L = l0 * (1.0 - t) + t * l1;\n const C = t * c1;\n\n const l_ = L + C * kl;\n const m_ = L + C * km;\n const s_ = L + C * ks;\n\n const l = l_ ** 3;\n const m = m_ ** 3;\n const s = s_ ** 3;\n\n const ldt = 3 * (dl + dc * kl) * l_ * l_;\n const mdt = 3 * (dl + dc * km) * m_ * m_;\n const sdt = 3 * (dl + dc * ks) * s_ * s_;\n\n const ldt2 = 6 * (dl + dc * kl) ** 2 * l_;\n const mdt2 = 6 * (dl + dc * km) ** 2 * m_;\n const sdt2 = 6 * (dl + dc * ks) ** 2 * s_;\n\n const r_ = dotXYZ(lmsToRgb[0], l, m, s) - 1;\n const r1 = dotXYZ(lmsToRgb[0], ldt, mdt, sdt);\n const r2 = dotXYZ(lmsToRgb[0], ldt2, mdt2, sdt2);\n const ur = r1 / (r1 * r1 - 0.5 * r_ * r2);\n let tr = -r_ * ur;\n\n const g_ = dotXYZ(lmsToRgb[1], l, m, s) - 1;\n const g1 = dotXYZ(lmsToRgb[1], ldt, mdt, sdt);\n const g2 = dotXYZ(lmsToRgb[1], ldt2, mdt2, sdt2);\n const ug = g1 / (g1 * g1 - 0.5 * g_ * g2);\n let tg = -g_ * ug;\n\n const b_ = dotXYZ(lmsToRgb[2], l, m, s) - 1;\n const b1 = dotXYZ(lmsToRgb[2], ldt, mdt, sdt);\n const b2 = dotXYZ(lmsToRgb[2], ldt2, mdt2, sdt2);\n const ub = b1 / (b1 * b1 - 0.5 * b_ * b2);\n let tb = -b_ * ub;\n\n tr = ur >= 0.0 ? tr : floatMax;\n tg = ug >= 0.0 ? tg : floatMax;\n tb = ub >= 0.0 ? tb : floatMax;\n\n t += Math.min(tr, Math.min(tg, tb));\n }\n\n return t;\n};\n\nconst computeSt = (cusp: [number, number]): [number, number] => [\n cusp[1] / cusp[0],\n cusp[1] / (1 - cusp[0]),\n];\n\nconst computeStMid = (a: number, b: number): [number, number] => [\n 0.11516993 +\n 1.0 /\n (7.4477897 +\n 4.1590124 * b +\n a *\n (-2.19557347 +\n 1.75198401 * b +\n a *\n (-2.13704948 -\n 10.02301043 * b +\n a * (-4.24894561 + 5.38770819 * b + 4.69891013 * a)))),\n 0.11239642 +\n 1.0 /\n (1.6132032 -\n 0.68124379 * b +\n a *\n (0.40370612 +\n 0.90148123 * b +\n a *\n (-0.27087943 +\n 0.6122399 * b +\n a * (0.00299215 - 0.45399568 * b - 0.14661872 * a)))),\n];\n\nconst getCs = (\n L: number,\n a: number,\n b: number,\n cusp: [number, number],\n): [number, number, number] => {\n const cMax = findGamutIntersectionOKLCH(a, b, L, 1, L, cusp);\n const stMax = computeSt(cusp);\n const k = cMax / Math.min(L * stMax[0], (1 - L) * stMax[1]);\n const stMid = computeStMid(a, b);\n let ca = L * stMid[0];\n let cb = (1.0 - L) * stMid[1];\n const cMid =\n 0.9 * k * Math.sqrt(Math.sqrt(1.0 / (1.0 / ca ** 4 + 1.0 / cb ** 4)));\n ca = L * 0.4;\n cb = (1.0 - L) * 0.8;\n const c0 = Math.sqrt(1.0 / (1.0 / ca ** 2 + 1.0 / cb ** 2));\n return [c0, cMid, cMax];\n};\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Convert OKHSL (h: 0–360, s: 0–1, l: 0–1) to linear sRGB.\n * Channels may exceed [0, 1] near gamut boundaries — caller must clamp if needed.\n */\nexport function okhslToLinearSrgb(\n h: number,\n s: number,\n l: number,\n): [number, number, number] {\n const L = toeInv(l);\n let a = 0;\n let b = 0;\n\n const hNorm = constrainAngle(h) / 360.0;\n\n if (L !== 0.0 && L !== 1.0 && s !== 0) {\n const a_ = Math.cos(TAU * hNorm);\n const b_ = Math.sin(TAU * hNorm);\n\n const cusp = findCuspOKLCH(a_, b_);\n const Cs = getCs(L, a_, b_, cusp);\n const [c0, cMid, cMax] = Cs;\n\n const mid = 0.8;\n const midInv = 1.25;\n let t: number, k0: number, k1: number, k2: number;\n\n if (s < mid) {\n t = midInv * s;\n k0 = 0.0;\n k1 = mid * c0;\n k2 = 1.0 - k1 / cMid;\n } else {\n t = 5 * (s - 0.8);\n k0 = cMid;\n k1 = (0.2 * cMid ** 2 * 1.25 ** 2) / c0;\n k2 = 1.0 - k1 / (cMax - cMid);\n }\n\n const c = k0 + (t * k1) / (1.0 - k2 * t);\n a = c * a_;\n b = c * b_;\n }\n\n return OKLabToLinearSRGB([L, a, b]);\n}\n\n/**\n * Compute relative luminance Y from linear sRGB channels.\n * Per WCAG 2: Y = 0.2126·R + 0.7152·G + 0.0722·B\n */\nexport function relativeLuminanceFromLinearRgb(\n rgb: [number, number, number],\n): number {\n return 0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2];\n}\n\n/**\n * WCAG 2 contrast ratio from two luminance values.\n */\nexport function contrastRatioFromLuminance(yA: number, yB: number): number {\n const lighter = Math.max(yA, yB);\n const darker = Math.min(yA, yB);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\nconst sRGBLinearToGamma = (val: number): number => {\n const sign = val < 0 ? -1 : 1;\n const abs = Math.abs(val);\n return abs > 0.0031308\n ? sign * (1.055 * Math.pow(abs, 1 / 2.4) - 0.055)\n : 12.92 * val;\n};\n\nconst sRGBGammaToLinear = (val: number): number => {\n const sign = val < 0 ? -1 : 1;\n const abs = Math.abs(val);\n return abs <= 0.04045\n ? val / 12.92\n : sign * Math.pow((abs + 0.055) / 1.055, 2.4);\n};\n\n/**\n * Convert OKHSL to gamma-encoded sRGB (clamped to 0–1).\n */\nexport function okhslToSrgb(\n h: number,\n s: number,\n l: number,\n): [number, number, number] {\n const lin = okhslToLinearSrgb(h, s, l);\n return [\n Math.max(0, Math.min(1, sRGBLinearToGamma(lin[0]))),\n Math.max(0, Math.min(1, sRGBLinearToGamma(lin[1]))),\n Math.max(0, Math.min(1, sRGBLinearToGamma(lin[2]))),\n ];\n}\n\n/**\n * Convert OKHSL (h: 0–360, s: 0–1, l: 0–1) to OKLab [L, a, b].\n */\nexport function okhslToOklab(\n h: number,\n s: number,\n l: number,\n): [number, number, number] {\n const L = toeInv(l);\n let a = 0;\n let b = 0;\n\n const hNorm = constrainAngle(h) / 360.0;\n\n if (L !== 0.0 && L !== 1.0 && s !== 0) {\n const a_ = Math.cos(TAU * hNorm);\n const b_ = Math.sin(TAU * hNorm);\n\n const cusp = findCuspOKLCH(a_, b_);\n const Cs = getCs(L, a_, b_, cusp);\n const [c0, cMid, cMax] = Cs;\n\n const mid = 0.8;\n const midInv = 1.25;\n let t: number, k0: number, k1: number, k2: number;\n\n if (s < mid) {\n t = midInv * s;\n k0 = 0.0;\n k1 = mid * c0;\n k2 = 1.0 - k1 / cMid;\n } else {\n t = 5 * (s - 0.8);\n k0 = cMid;\n k1 = (0.2 * cMid ** 2 * 1.25 ** 2) / c0;\n k2 = 1.0 - k1 / (cMax - cMid);\n }\n\n const c = k0 + (t * k1) / (1.0 - k2 * t);\n a = c * a_;\n b = c * b_;\n }\n\n return [L, a, b];\n}\n\n// ============================================================================\n// Reverse pipeline: sRGB → OKHSL\n// ============================================================================\n\nconst linearSrgbToOklab = (rgb: Vec3): Vec3 => {\n const lms = transform(rgb, linear_sRGB_to_LMS_M);\n const lms_ = cbrt3(lms);\n return transform(lms_, LMS_to_OKLab_M);\n};\n\nconst oklabToOkhsl = (lab: Vec3): Vec3 => {\n const L = lab[0];\n const a = lab[1];\n const b = lab[2];\n\n const C = Math.sqrt(a * a + b * b);\n\n if (C < EPSILON) {\n return [0, 0, toe(L)];\n }\n\n const a_ = a / C;\n const b_ = b / C;\n\n let h = Math.atan2(b, a) * (180 / Math.PI);\n h = constrainAngle(h);\n\n const cusp = findCuspOKLCH(a_, b_);\n const Cs = getCs(L, a_, b_, cusp);\n const [c0, cMid, cMax] = Cs;\n\n const mid = 0.8;\n const midInv = 1.25;\n\n let s: number;\n\n if (C < cMid) {\n const k1 = mid * c0;\n const k2 = 1.0 - k1 / cMid;\n const t = C / (k1 + C * k2);\n s = t / midInv;\n } else {\n const k0 = cMid;\n const k1 = (0.2 * cMid ** 2 * 1.25 ** 2) / c0;\n const k2 = 1.0 - k1 / (cMax - cMid);\n const cDiff = C - k0;\n const t = cDiff / (k1 + cDiff * k2);\n s = mid + t / 5;\n }\n\n const l = toe(L);\n\n return [h, clampVal(s, 0, 1), clampVal(l, 0, 1)];\n};\n\n/**\n * Convert gamma-encoded sRGB (0–1 per channel) to OKHSL.\n * Returns [h, s, l] where h: 0–360, s: 0–1, l: 0–1.\n */\nexport function srgbToOkhsl(\n rgb: [number, number, number],\n): [number, number, number] {\n const linear: Vec3 = [\n sRGBGammaToLinear(rgb[0]),\n sRGBGammaToLinear(rgb[1]),\n sRGBGammaToLinear(rgb[2]),\n ];\n const oklab = linearSrgbToOklab(linear);\n return oklabToOkhsl(oklab) as [number, number, number];\n}\n\n/**\n * Parse a hex color string (#rgb or #rrggbb) to sRGB [r, g, b] in 0–1 range.\n * Returns null if the string is not a valid hex color.\n */\nexport function parseHex(hex: string): [number, number, number] | null {\n const h = hex.startsWith('#') ? hex.slice(1) : hex;\n\n if (h.length === 3) {\n const r = parseInt(h[0] + h[0], 16);\n const g = parseInt(h[1] + h[1], 16);\n const b = parseInt(h[2] + h[2], 16);\n if (isNaN(r) || isNaN(g) || isNaN(b)) return null;\n return [r / 255, g / 255, b / 255];\n }\n\n if (h.length === 6) {\n const r = parseInt(h.slice(0, 2), 16);\n const g = parseInt(h.slice(2, 4), 16);\n const b = parseInt(h.slice(4, 6), 16);\n if (isNaN(r) || isNaN(g) || isNaN(b)) return null;\n return [r / 255, g / 255, b / 255];\n }\n\n return null;\n}\n\n// ============================================================================\n// Format functions\n// ============================================================================\n\n/**\n * Format OKHSL values as a CSS `okhsl(H S% L%)` string.\n * h: 0–360, s: 0–100, l: 0–100 (percentage scale for s and l).\n */\nexport function formatOkhsl(h: number, s: number, l: number): string {\n return `okhsl(${h.toFixed(1)} ${s.toFixed(1)}% ${l.toFixed(1)}%)`;\n}\n\n/**\n * Format OKHSL values as a CSS `rgb(R, G, B)` string with fractional 0–255 values.\n * h: 0–360, s: 0–100, l: 0–100 (percentage scale for s and l).\n */\nexport function formatRgb(h: number, s: number, l: number): string {\n const [r, g, b] = okhslToSrgb(h, s / 100, l / 100);\n return `rgb(${(r * 255).toFixed(3)}, ${(g * 255).toFixed(3)}, ${(b * 255).toFixed(3)})`;\n}\n\n/**\n * Format OKHSL values as a CSS `hsl(H, S%, L%)` string.\n * h: 0–360, s: 0–100, l: 0–100 (percentage scale for s and l).\n */\nexport function formatHsl(h: number, s: number, l: number): string {\n const [r, g, b] = okhslToSrgb(h, s / 100, l / 100);\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n\n let hh = 0;\n let ss = 0;\n const ll = (max + min) / 2;\n\n if (delta > 0) {\n ss = ll > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n\n if (max === r) {\n hh = ((g - b) / delta + (g < b ? 6 : 0)) * 60;\n } else if (max === g) {\n hh = ((b - r) / delta + 2) * 60;\n } else {\n hh = ((r - g) / delta + 4) * 60;\n }\n }\n\n return `hsl(${hh.toFixed(1)}, ${(ss * 100).toFixed(1)}%, ${(ll * 100).toFixed(1)}%)`;\n}\n\n/**\n * Format OKHSL values as a CSS `oklch(L% C H)` string.\n * h: 0–360, s: 0–100, l: 0–100 (percentage scale for s and l).\n */\nexport function formatOklch(h: number, s: number, l: number): string {\n const [L, a, b] = okhslToOklab(h, s / 100, l / 100);\n const C = Math.sqrt(a * a + b * b);\n let hh = Math.atan2(b, a) * (180 / Math.PI);\n hh = constrainAngle(hh);\n\n return `oklch(${(L * 100).toFixed(1)}% ${C.toFixed(4)} ${hh.toFixed(1)})`;\n}\n","/**\n * OKHSL Contrast Solver\n *\n * Finds the closest OKHSL lightness that satisfies a WCAG 2 contrast target\n * against a base color. Used by glaze when resolving dependent colors\n * with `contrast`.\n */\n\nimport {\n okhslToLinearSrgb,\n relativeLuminanceFromLinearRgb,\n contrastRatioFromLuminance,\n} from './okhsl-color-math';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ContrastPreset = 'AA' | 'AAA' | 'AA-large' | 'AAA-large';\nexport type MinContrast = number | ContrastPreset;\n\nexport interface FindLightnessForContrastOptions {\n /** Hue of the candidate color (0–360). */\n hue: number;\n /** Saturation of the candidate color (0–1). */\n saturation: number;\n /** Preferred lightness of the candidate (0–1). */\n preferredLightness: number;\n\n /** Base/reference color as linear sRGB (channels may be outside 0–1 before clamp). */\n baseLinearRgb: [number, number, number];\n\n /** WCAG contrast ratio target floor. */\n contrast: MinContrast;\n\n /** Search bounds for lightness. Default: [0, 1]. */\n lightnessRange?: [number, number];\n /** Convergence threshold. Default: 1e-4. */\n epsilon?: number;\n /** Maximum binary-search iterations per branch. Default: 14. */\n maxIterations?: number;\n}\n\nexport interface FindLightnessForContrastResult {\n /** Chosen lightness in 0–1. */\n lightness: number;\n /** Achieved WCAG contrast ratio. */\n contrast: number;\n /** Whether the target was reached. */\n met: boolean;\n /** Which branch was selected. */\n branch: 'lighter' | 'darker' | 'preferred';\n}\n\n// ============================================================================\n// Preset mapping\n// ============================================================================\n\nconst CONTRAST_PRESETS: Record<ContrastPreset, number> = {\n AA: 4.5,\n AAA: 7,\n 'AA-large': 3,\n 'AAA-large': 4.5,\n};\n\nexport function resolveMinContrast(value: MinContrast): number {\n if (typeof value === 'number') {\n return Math.max(1, value);\n }\n return CONTRAST_PRESETS[value];\n}\n\n// ============================================================================\n// LRU luminance cache\n// ============================================================================\n\nconst CACHE_SIZE = 512;\nconst luminanceCache = new Map<string, number>();\nconst cacheOrder: string[] = [];\n\nfunction cachedLuminance(h: number, s: number, l: number): number {\n const lRounded = Math.round(l * 10000) / 10000;\n const key = `${h}|${s}|${lRounded}`;\n\n const cached = luminanceCache.get(key);\n if (cached !== undefined) return cached;\n\n const linearRgb = okhslToLinearSrgb(h, s, lRounded);\n const y = relativeLuminanceFromLinearRgb(linearRgb);\n\n if (luminanceCache.size >= CACHE_SIZE) {\n const evict = cacheOrder.shift()!;\n luminanceCache.delete(evict);\n }\n luminanceCache.set(key, y);\n cacheOrder.push(key);\n\n return y;\n}\n\n// ============================================================================\n// Solver\n// ============================================================================\n\ninterface BranchResult {\n lightness: number;\n contrast: number;\n met: boolean;\n}\n\n/**\n * Binary search one branch [lo, hi] for the nearest passing lightness to `preferred`.\n */\nfunction searchBranch(\n h: number,\n s: number,\n lo: number,\n hi: number,\n yBase: number,\n target: number,\n epsilon: number,\n maxIter: number,\n preferred: number,\n): BranchResult {\n const yLo = cachedLuminance(h, s, lo);\n const yHi = cachedLuminance(h, s, hi);\n const crLo = contrastRatioFromLuminance(yLo, yBase);\n const crHi = contrastRatioFromLuminance(yHi, yBase);\n\n if (crLo < target && crHi < target) {\n if (crLo >= crHi) {\n return { lightness: lo, contrast: crLo, met: false };\n }\n return { lightness: hi, contrast: crHi, met: false };\n }\n\n let low = lo;\n let high = hi;\n\n for (let i = 0; i < maxIter; i++) {\n if (high - low < epsilon) break;\n\n const mid = (low + high) / 2;\n const yMid = cachedLuminance(h, s, mid);\n const crMid = contrastRatioFromLuminance(yMid, yBase);\n\n if (crMid >= target) {\n if (mid < preferred) {\n low = mid;\n } else {\n high = mid;\n }\n } else {\n if (mid < preferred) {\n high = mid;\n } else {\n low = mid;\n }\n }\n }\n\n const yLow = cachedLuminance(h, s, low);\n const yHigh = cachedLuminance(h, s, high);\n const crLow = contrastRatioFromLuminance(yLow, yBase);\n const crHigh = contrastRatioFromLuminance(yHigh, yBase);\n\n const lowPasses = crLow >= target;\n const highPasses = crHigh >= target;\n\n if (lowPasses && highPasses) {\n if (Math.abs(low - preferred) <= Math.abs(high - preferred)) {\n return { lightness: low, contrast: crLow, met: true };\n }\n return { lightness: high, contrast: crHigh, met: true };\n }\n if (lowPasses) return { lightness: low, contrast: crLow, met: true };\n if (highPasses) return { lightness: high, contrast: crHigh, met: true };\n\n return coarseScan(h, s, lo, hi, yBase, target, epsilon, maxIter);\n}\n\n/**\n * Fallback coarse scan when binary search is unstable near gamut edges.\n */\nfunction coarseScan(\n h: number,\n s: number,\n lo: number,\n hi: number,\n yBase: number,\n target: number,\n epsilon: number,\n maxIter: number,\n): BranchResult {\n const STEPS = 64;\n const step = (hi - lo) / STEPS;\n let bestL = lo;\n let bestCr = 0;\n let bestMet = false;\n\n for (let i = 0; i <= STEPS; i++) {\n const l = lo + step * i;\n const y = cachedLuminance(h, s, l);\n const cr = contrastRatioFromLuminance(y, yBase);\n\n if (cr >= target && !bestMet) {\n bestL = l;\n bestCr = cr;\n bestMet = true;\n } else if (cr >= target && bestMet) {\n bestL = l;\n bestCr = cr;\n } else if (!bestMet && cr > bestCr) {\n bestL = l;\n bestCr = cr;\n }\n }\n\n if (bestMet && bestL > lo + step) {\n let rLo = bestL - step;\n let rHi = bestL;\n for (let i = 0; i < maxIter; i++) {\n if (rHi - rLo < epsilon) break;\n const mid = (rLo + rHi) / 2;\n const y = cachedLuminance(h, s, mid);\n const cr = contrastRatioFromLuminance(y, yBase);\n if (cr >= target) {\n rHi = mid;\n bestL = mid;\n bestCr = cr;\n } else {\n rLo = mid;\n }\n }\n }\n\n return { lightness: bestL, contrast: bestCr, met: bestMet };\n}\n\n/**\n * Find the OKHSL lightness that satisfies a WCAG 2 contrast target\n * against a base color, staying as close to `preferredLightness` as possible.\n */\nexport function findLightnessForContrast(\n options: FindLightnessForContrastOptions,\n): FindLightnessForContrastResult {\n const {\n hue,\n saturation,\n preferredLightness,\n baseLinearRgb,\n contrast: contrastInput,\n lightnessRange = [0, 1],\n epsilon = 1e-4,\n maxIterations = 14,\n } = options;\n\n const target = resolveMinContrast(contrastInput);\n const yBase = relativeLuminanceFromLinearRgb(baseLinearRgb);\n\n const yPref = cachedLuminance(hue, saturation, preferredLightness);\n const crPref = contrastRatioFromLuminance(yPref, yBase);\n\n if (crPref >= target) {\n return {\n lightness: preferredLightness,\n contrast: crPref,\n met: true,\n branch: 'preferred',\n };\n }\n\n const [minL, maxL] = lightnessRange;\n\n const darkerResult =\n preferredLightness > minL\n ? searchBranch(\n hue,\n saturation,\n minL,\n preferredLightness,\n yBase,\n target,\n epsilon,\n maxIterations,\n preferredLightness,\n )\n : null;\n\n const lighterResult =\n preferredLightness < maxL\n ? searchBranch(\n hue,\n saturation,\n preferredLightness,\n maxL,\n yBase,\n target,\n epsilon,\n maxIterations,\n preferredLightness,\n )\n : null;\n\n const darkerPasses = darkerResult?.met ?? false;\n const lighterPasses = lighterResult?.met ?? false;\n\n if (darkerPasses && lighterPasses) {\n const darkerDist = Math.abs(darkerResult!.lightness - preferredLightness);\n const lighterDist = Math.abs(lighterResult!.lightness - preferredLightness);\n if (darkerDist <= lighterDist) {\n return { ...darkerResult!, branch: 'darker' };\n }\n return { ...lighterResult!, branch: 'lighter' };\n }\n\n if (darkerPasses) {\n return { ...darkerResult!, branch: 'darker' };\n }\n\n if (lighterPasses) {\n return { ...lighterResult!, branch: 'lighter' };\n }\n\n const candidates: (BranchResult & { branch: 'darker' | 'lighter' })[] = [];\n if (darkerResult) candidates.push({ ...darkerResult, branch: 'darker' });\n if (lighterResult) candidates.push({ ...lighterResult, branch: 'lighter' });\n\n if (candidates.length === 0) {\n return {\n lightness: preferredLightness,\n contrast: crPref,\n met: false,\n branch: 'preferred',\n };\n }\n\n candidates.sort((a, b) => b.contrast - a.contrast);\n return candidates[0];\n}\n","/**\n * Glaze — OKHSL-based color theme generator.\n *\n * Generates robust light, dark, and high-contrast colors from a hue/saturation\n * seed, preserving contrast for UI pairs via explicit dependencies.\n */\n\nimport {\n okhslToLinearSrgb,\n formatOkhsl,\n formatRgb,\n formatHsl,\n formatOklch,\n srgbToOkhsl,\n parseHex,\n} from './okhsl-color-math';\nimport { findLightnessForContrast } from './contrast-solver';\nimport type {\n HCPair,\n AdaptationMode,\n RelativeValue,\n ColorDef,\n ColorMap,\n ResolvedColor,\n ResolvedColorVariant,\n GlazeColorFormat,\n GlazeConfig,\n GlazeConfigResolved,\n GlazeOutputModes,\n GlazeTheme,\n GlazeThemeExport,\n GlazeExtendOptions,\n GlazeTokenOptions,\n GlazeJsonOptions,\n GlazeColorInput,\n GlazeColorToken,\n} from './types';\n\n// ============================================================================\n// Global configuration\n// ============================================================================\n\nlet globalConfig: GlazeConfigResolved = {\n darkLightness: [10, 90],\n darkDesaturation: 0.1,\n states: {\n dark: '@dark',\n highContrast: '@high-contrast',\n },\n modes: {\n dark: true,\n highContrast: false,\n },\n};\n\n// ============================================================================\n// HCPair helpers\n// ============================================================================\n\nfunction pairNormal<T>(p: HCPair<T>): T {\n return Array.isArray(p) ? p[0] : p;\n}\n\nfunction pairHC<T>(p: HCPair<T>): T {\n return Array.isArray(p) ? p[1] : p;\n}\n\n// ============================================================================\n// Validation\n// ============================================================================\n\nfunction validateColorDefs(defs: ColorMap): void {\n const names = new Set(Object.keys(defs));\n\n for (const [name, def] of Object.entries(defs)) {\n if (def.contrast !== undefined && !def.base) {\n throw new Error(`glaze: color \"${name}\" has \"contrast\" without \"base\".`);\n }\n\n // Relative lightness requires base\n if (\n def.lightness !== undefined &&\n !isAbsoluteLightness(def.lightness) &&\n !def.base\n ) {\n throw new Error(\n `glaze: color \"${name}\" has relative \"lightness\" without \"base\".`,\n );\n }\n\n if (isAbsoluteLightness(def.lightness) && def.base !== undefined) {\n console.warn(\n `glaze: color \"${name}\" has absolute \"lightness\" and \"base\". Absolute lightness takes precedence.`,\n );\n }\n\n if (def.base && !names.has(def.base)) {\n throw new Error(\n `glaze: color \"${name}\" references non-existent base \"${def.base}\".`,\n );\n }\n\n if (!isAbsoluteLightness(def.lightness) && def.base === undefined) {\n throw new Error(\n `glaze: color \"${name}\" must have either absolute \"lightness\" (root) or \"base\" (dependent).`,\n );\n }\n }\n\n // Check for circular references\n const visited = new Set<string>();\n const inStack = new Set<string>();\n\n function dfs(name: string): void {\n if (inStack.has(name)) {\n throw new Error(\n `glaze: circular base reference detected involving \"${name}\".`,\n );\n }\n if (visited.has(name)) return;\n\n inStack.add(name);\n const def = defs[name];\n if (def.base && !isAbsoluteLightness(def.lightness)) {\n dfs(def.base);\n }\n inStack.delete(name);\n visited.add(name);\n }\n\n for (const name of names) {\n dfs(name);\n }\n}\n\n// ============================================================================\n// Topological sort\n// ============================================================================\n\nfunction topoSort(defs: ColorMap): string[] {\n const result: string[] = [];\n const visited = new Set<string>();\n\n function visit(name: string): void {\n if (visited.has(name)) return;\n visited.add(name);\n\n const def = defs[name];\n if (def.base && !isAbsoluteLightness(def.lightness)) {\n visit(def.base);\n }\n\n result.push(name);\n }\n\n for (const name of Object.keys(defs)) {\n visit(name);\n }\n\n return result;\n}\n\n// ============================================================================\n// Dark scheme mapping\n// ============================================================================\n\nfunction mapLightnessDark(l: number, mode: AdaptationMode): number {\n if (mode === 'static') return l;\n\n const [lo, hi] = globalConfig.darkLightness;\n\n if (mode === 'fixed') {\n return (l * (hi - lo)) / 100 + lo;\n }\n\n // auto — inverted\n return ((100 - l) * (hi - lo)) / 100 + lo;\n}\n\nfunction mapSaturationDark(s: number, mode: AdaptationMode): number {\n if (mode === 'static') return s;\n return s * (1 - globalConfig.darkDesaturation);\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, v));\n}\n\n/**\n * Parse a value that can be absolute (number) or relative (signed string).\n * Returns the numeric value and whether it's relative.\n */\nfunction parseRelativeOrAbsolute(value: number | RelativeValue): {\n value: number;\n relative: boolean;\n} {\n if (typeof value === 'number') {\n return { value, relative: false };\n }\n return { value: parseFloat(value), relative: true };\n}\n\n/**\n * Compute the effective hue for a color, given the theme seed hue\n * and an optional per-color hue override.\n */\nfunction resolveEffectiveHue(\n seedHue: number,\n defHue: number | RelativeValue | undefined,\n): number {\n if (defHue === undefined) return seedHue;\n const parsed = parseRelativeOrAbsolute(defHue);\n if (parsed.relative) {\n return (((seedHue + parsed.value) % 360) + 360) % 360;\n }\n return ((parsed.value % 360) + 360) % 360;\n}\n\n/**\n * Check whether a lightness value represents an absolute root definition\n * (i.e. a number, not a relative string).\n */\nfunction isAbsoluteLightness(\n lightness: HCPair<number | RelativeValue> | undefined,\n): boolean {\n if (lightness === undefined) return false;\n const normal = Array.isArray(lightness) ? lightness[0] : lightness;\n return typeof normal === 'number';\n}\n\n// ============================================================================\n// Color resolution engine\n// ============================================================================\n\ninterface ResolveContext {\n hue: number;\n saturation: number;\n defs: ColorMap;\n resolved: Map<string, ResolvedColor>;\n}\n\nfunction resolveRootColor(\n _name: string,\n def: ColorDef,\n _ctx: ResolveContext,\n isHighContrast: boolean,\n): { lightL: number; satFactor: number } {\n const rawL = def.lightness!;\n const rawValue = isHighContrast ? pairHC(rawL) : pairNormal(rawL);\n const parsed = parseRelativeOrAbsolute(rawValue);\n const lightL = clamp(parsed.value, 0, 100);\n const satFactor = clamp(def.saturation ?? 1, 0, 1);\n return { lightL, satFactor };\n}\n\nfunction resolveDependentColor(\n name: string,\n def: ColorDef,\n ctx: ResolveContext,\n isHighContrast: boolean,\n isDark: boolean,\n effectiveHue: number,\n): { l: number; satFactor: number } {\n const baseName = def.base!;\n const baseResolved = ctx.resolved.get(baseName);\n if (!baseResolved) {\n throw new Error(\n `glaze: base \"${baseName}\" not yet resolved for \"${name}\".`,\n );\n }\n\n const mode = def.mode ?? 'auto';\n const satFactor = clamp(def.saturation ?? 1, 0, 1);\n\n let baseL: number;\n if (isDark && isHighContrast) {\n baseL = baseResolved.darkContrast.l * 100;\n } else if (isDark) {\n baseL = baseResolved.dark.l * 100;\n } else if (isHighContrast) {\n baseL = baseResolved.lightContrast.l * 100;\n } else {\n baseL = baseResolved.light.l * 100;\n }\n\n // Resolve preferred lightness from the lightness prop\n let preferredL: number;\n const rawLightness = def.lightness;\n\n if (rawLightness === undefined) {\n // No lightness specified — inherit base lightness (delta 0)\n preferredL = baseL;\n } else {\n const rawValue = isHighContrast\n ? pairHC(rawLightness)\n : pairNormal(rawLightness);\n const parsed = parseRelativeOrAbsolute(rawValue);\n\n if (parsed.relative) {\n // Relative: signed delta from base\n let delta = parsed.value;\n if (isDark && mode === 'auto') {\n delta = -delta;\n }\n preferredL = clamp(baseL + delta, 0, 100);\n } else {\n // Absolute: dark-map independently when isDark\n if (isDark) {\n preferredL = mapLightnessDark(parsed.value, mode);\n } else {\n preferredL = clamp(parsed.value, 0, 100);\n }\n }\n }\n\n // Apply WCAG contrast solver if contrast floor is specified\n const rawContrast = def.contrast;\n if (rawContrast !== undefined) {\n const minCr = isHighContrast\n ? pairHC(rawContrast)\n : pairNormal(rawContrast);\n\n const effectiveSat = isDark\n ? mapSaturationDark((satFactor * ctx.saturation) / 100, mode)\n : (satFactor * ctx.saturation) / 100;\n\n let baseH: number;\n let baseS: number;\n let baseLNorm: number;\n if (isDark && isHighContrast) {\n baseH = baseResolved.darkContrast.h;\n baseS = baseResolved.darkContrast.s;\n baseLNorm = baseResolved.darkContrast.l;\n } else if (isDark) {\n baseH = baseResolved.dark.h;\n baseS = baseResolved.dark.s;\n baseLNorm = baseResolved.dark.l;\n } else if (isHighContrast) {\n baseH = baseResolved.lightContrast.h;\n baseS = baseResolved.lightContrast.s;\n baseLNorm = baseResolved.lightContrast.l;\n } else {\n baseH = baseResolved.light.h;\n baseS = baseResolved.light.s;\n baseLNorm = baseResolved.light.l;\n }\n\n const baseLinearRgb = okhslToLinearSrgb(baseH, baseS, baseLNorm);\n\n const result = findLightnessForContrast({\n hue: effectiveHue,\n saturation: effectiveSat,\n preferredLightness: preferredL / 100,\n baseLinearRgb,\n contrast: minCr,\n });\n\n return { l: result.lightness * 100, satFactor };\n }\n\n return { l: clamp(preferredL, 0, 100), satFactor };\n}\n\nfunction resolveColorForScheme(\n name: string,\n def: ColorDef,\n ctx: ResolveContext,\n isDark: boolean,\n isHighContrast: boolean,\n): ResolvedColorVariant {\n const mode = def.mode ?? 'auto';\n const isRoot = isAbsoluteLightness(def.lightness) && !def.base;\n const effectiveHue = resolveEffectiveHue(ctx.hue, def.hue);\n\n let lightL: number;\n let satFactor: number;\n\n if (isRoot) {\n const root = resolveRootColor(name, def, ctx, isHighContrast);\n lightL = root.lightL;\n satFactor = root.satFactor;\n } else {\n const dep = resolveDependentColor(\n name,\n def,\n ctx,\n isHighContrast,\n isDark,\n effectiveHue,\n );\n lightL = dep.l;\n satFactor = dep.satFactor;\n }\n\n let finalL: number;\n let finalSat: number;\n\n if (isDark && isRoot) {\n finalL = mapLightnessDark(lightL, mode);\n finalSat = mapSaturationDark((satFactor * ctx.saturation) / 100, mode);\n } else if (isDark && !isRoot) {\n finalL = lightL;\n finalSat = mapSaturationDark((satFactor * ctx.saturation) / 100, mode);\n } else {\n finalL = lightL;\n finalSat = (satFactor * ctx.saturation) / 100;\n }\n\n return {\n h: effectiveHue,\n s: clamp(finalSat, 0, 1),\n l: clamp(finalL / 100, 0, 1),\n };\n}\n\nfunction resolveAllColors(\n hue: number,\n saturation: number,\n defs: ColorMap,\n): Map<string, ResolvedColor> {\n validateColorDefs(defs);\n const order = topoSort(defs);\n\n const ctx: ResolveContext = {\n hue,\n saturation,\n defs,\n resolved: new Map(),\n };\n\n // Pass 1: Light normal\n const lightMap = new Map<string, ResolvedColorVariant>();\n for (const name of order) {\n const variant = resolveColorForScheme(name, defs[name], ctx, false, false);\n lightMap.set(name, variant);\n ctx.resolved.set(name, {\n name,\n light: variant,\n dark: variant,\n lightContrast: variant,\n darkContrast: variant,\n mode: defs[name].mode ?? 'auto',\n });\n }\n\n // Pass 2: Light high-contrast\n const lightHCMap = new Map<string, ResolvedColorVariant>();\n for (const name of order) {\n ctx.resolved.set(name, {\n ...ctx.resolved.get(name)!,\n lightContrast: lightMap.get(name)!,\n });\n }\n for (const name of order) {\n const variant = resolveColorForScheme(name, defs[name], ctx, false, true);\n lightHCMap.set(name, variant);\n ctx.resolved.set(name, {\n ...ctx.resolved.get(name)!,\n lightContrast: variant,\n });\n }\n\n // Pass 3: Dark normal\n const darkMap = new Map<string, ResolvedColorVariant>();\n for (const name of order) {\n ctx.resolved.set(name, {\n name,\n light: lightMap.get(name)!,\n dark: lightMap.get(name)!,\n lightContrast: lightHCMap.get(name)!,\n darkContrast: lightHCMap.get(name)!,\n mode: defs[name].mode ?? 'auto',\n });\n }\n for (const name of order) {\n const variant = resolveColorForScheme(name, defs[name], ctx, true, false);\n darkMap.set(name, variant);\n ctx.resolved.set(name, {\n ...ctx.resolved.get(name)!,\n dark: variant,\n });\n }\n\n // Pass 4: Dark high-contrast\n const darkHCMap = new Map<string, ResolvedColorVariant>();\n for (const name of order) {\n ctx.resolved.set(name, {\n ...ctx.resolved.get(name)!,\n darkContrast: darkMap.get(name)!,\n });\n }\n for (const name of order) {\n const variant = resolveColorForScheme(name, defs[name], ctx, true, true);\n darkHCMap.set(name, variant);\n ctx.resolved.set(name, {\n ...ctx.resolved.get(name)!,\n darkContrast: variant,\n });\n }\n\n // Build final result\n const result = new Map<string, ResolvedColor>();\n for (const name of order) {\n result.set(name, {\n name,\n light: lightMap.get(name)!,\n dark: darkMap.get(name)!,\n lightContrast: lightHCMap.get(name)!,\n darkContrast: darkHCMap.get(name)!,\n mode: defs[name].mode ?? 'auto',\n });\n }\n\n return result;\n}\n\n// ============================================================================\n// Token formatting\n// ============================================================================\n\nconst formatters: Record<\n GlazeColorFormat,\n (h: number, s: number, l: number) => string\n> = {\n okhsl: formatOkhsl,\n rgb: formatRgb,\n hsl: formatHsl,\n oklch: formatOklch,\n};\n\nfunction formatVariant(\n v: ResolvedColorVariant,\n format: GlazeColorFormat = 'okhsl',\n): string {\n return formatters[format](v.h, v.s * 100, v.l * 100);\n}\n\nfunction resolveModes(override?: GlazeOutputModes): Required<GlazeOutputModes> {\n return {\n dark: override?.dark ?? globalConfig.modes.dark,\n highContrast: override?.highContrast ?? globalConfig.modes.highContrast,\n };\n}\n\nfunction buildTokenMap(\n resolved: Map<string, ResolvedColor>,\n prefix: string,\n states: { dark: string; highContrast: string },\n modes: Required<GlazeOutputModes>,\n format: GlazeColorFormat = 'okhsl',\n): Record<string, Record<string, string>> {\n const tokens: Record<string, Record<string, string>> = {};\n\n for (const [name, color] of resolved) {\n const key = `#${prefix}${name}`;\n const entry: Record<string, string> = {\n '': formatVariant(color.light, format),\n };\n\n if (modes.dark) {\n entry[states.dark] = formatVariant(color.dark, format);\n }\n if (modes.highContrast) {\n entry[states.highContrast] = formatVariant(color.lightContrast, format);\n }\n if (modes.dark && modes.highContrast) {\n entry[`${states.dark} & ${states.highContrast}`] = formatVariant(\n color.darkContrast,\n format,\n );\n }\n\n tokens[key] = entry;\n }\n\n return tokens;\n}\n\nfunction buildJsonMap(\n resolved: Map<string, ResolvedColor>,\n modes: Required<GlazeOutputModes>,\n format: GlazeColorFormat = 'okhsl',\n): Record<string, Record<string, string>> {\n const result: Record<string, Record<string, string>> = {};\n\n for (const [name, color] of resolved) {\n const entry: Record<string, string> = {\n light: formatVariant(color.light, format),\n };\n\n if (modes.dark) {\n entry.dark = formatVariant(color.dark, format);\n }\n if (modes.highContrast) {\n entry.lightContrast = formatVariant(color.lightContrast, format);\n }\n if (modes.dark && modes.highContrast) {\n entry.darkContrast = formatVariant(color.darkContrast, format);\n }\n\n result[name] = entry;\n }\n\n return result;\n}\n\n// ============================================================================\n// Theme implementation\n// ============================================================================\n\nfunction createTheme(\n hue: number,\n saturation: number,\n initialColors?: ColorMap,\n): GlazeTheme {\n let colorDefs: ColorMap = initialColors ? { ...initialColors } : {};\n\n const theme: GlazeTheme = {\n get hue() {\n return hue;\n },\n get saturation() {\n return saturation;\n },\n\n colors(defs: ColorMap): void {\n colorDefs = { ...colorDefs, ...defs };\n },\n\n color(name: string, def?: ColorDef): ColorDef | undefined | void {\n if (def === undefined) {\n return colorDefs[name];\n }\n colorDefs[name] = def;\n },\n\n remove(names: string | string[]): void {\n const list = Array.isArray(names) ? names : [names];\n for (const name of list) {\n delete colorDefs[name];\n }\n },\n\n has(name: string): boolean {\n return name in colorDefs;\n },\n\n list(): string[] {\n return Object.keys(colorDefs);\n },\n\n reset(): void {\n colorDefs = {};\n },\n\n export(): GlazeThemeExport {\n return {\n hue,\n saturation,\n colors: { ...colorDefs },\n };\n },\n\n extend(options: GlazeExtendOptions): GlazeTheme {\n const newHue = options.hue ?? hue;\n const newSat = options.saturation ?? saturation;\n const mergedColors = options.colors\n ? { ...colorDefs, ...options.colors }\n : { ...colorDefs };\n\n return createTheme(newHue, newSat, mergedColors);\n },\n\n resolve(): Map<string, ResolvedColor> {\n return resolveAllColors(hue, saturation, colorDefs);\n },\n\n tokens(\n options?: GlazeTokenOptions,\n ): Record<string, Record<string, string>> {\n const resolved = resolveAllColors(hue, saturation, colorDefs);\n const states = {\n dark: options?.states?.dark ?? globalConfig.states.dark,\n highContrast:\n options?.states?.highContrast ?? globalConfig.states.highContrast,\n };\n const modes = resolveModes(options?.modes);\n return buildTokenMap(resolved, '', states, modes, options?.format);\n },\n\n json(options?: GlazeJsonOptions): Record<string, Record<string, string>> {\n const resolved = resolveAllColors(hue, saturation, colorDefs);\n const modes = resolveModes(options?.modes);\n return buildJsonMap(resolved, modes, options?.format);\n },\n } as GlazeTheme;\n\n return theme;\n}\n\n// ============================================================================\n// Palette\n// ============================================================================\n\ntype PaletteInput = Record<string, GlazeTheme>;\n\nfunction createPalette(themes: PaletteInput) {\n return {\n tokens(\n options?: GlazeTokenOptions,\n ): Record<string, Record<string, string>> {\n const states = {\n dark: options?.states?.dark ?? globalConfig.states.dark,\n highContrast:\n options?.states?.highContrast ?? globalConfig.states.highContrast,\n };\n const modes = resolveModes(options?.modes);\n\n const allTokens: Record<string, Record<string, string>> = {};\n\n for (const [themeName, theme] of Object.entries(themes)) {\n const resolved = theme.resolve();\n\n let prefix = '';\n if (options?.prefix === true) {\n prefix = `${themeName}-`;\n } else if (\n typeof options?.prefix === 'object' &&\n options.prefix !== null\n ) {\n prefix = options.prefix[themeName] ?? `${themeName}-`;\n }\n\n const tokens = buildTokenMap(\n resolved,\n prefix,\n states,\n modes,\n options?.format,\n );\n Object.assign(allTokens, tokens);\n }\n\n return allTokens;\n },\n\n json(\n options?: GlazeJsonOptions & {\n prefix?: boolean | Record<string, string>;\n },\n ): Record<string, Record<string, Record<string, string>>> {\n const modes = resolveModes(options?.modes);\n\n const result: Record<string, Record<string, Record<string, string>>> = {};\n\n for (const [themeName, theme] of Object.entries(themes)) {\n const resolved = theme.resolve();\n result[themeName] = buildJsonMap(resolved, modes, options?.format);\n }\n\n return result;\n },\n };\n}\n\n// ============================================================================\n// Standalone color token\n// ============================================================================\n\nfunction createColorToken(input: GlazeColorInput): GlazeColorToken {\n const colorDef: ColorDef = {\n lightness: input.lightness,\n saturation: input.saturationFactor,\n mode: input.mode,\n };\n\n const defs: ColorMap = { __color__: colorDef };\n\n return {\n resolve(): ResolvedColor {\n const resolved = resolveAllColors(input.hue, input.saturation, defs);\n return resolved.get('__color__')!;\n },\n\n token(options?: GlazeTokenOptions): Record<string, string> {\n const resolved = resolveAllColors(input.hue, input.saturation, defs);\n const states = {\n dark: options?.states?.dark ?? globalConfig.states.dark,\n highContrast:\n options?.states?.highContrast ?? globalConfig.states.highContrast,\n };\n const modes = resolveModes(options?.modes);\n const tokenMap = buildTokenMap(\n resolved,\n '',\n states,\n modes,\n options?.format,\n );\n return tokenMap['#__color__'];\n },\n\n json(options?: GlazeJsonOptions): Record<string, string> {\n const resolved = resolveAllColors(input.hue, input.saturation, defs);\n const modes = resolveModes(options?.modes);\n const jsonMap = buildJsonMap(resolved, modes, options?.format);\n return jsonMap['__color__'];\n },\n };\n}\n\n// ============================================================================\n// Public API: glaze()\n// ============================================================================\n\n/**\n * Create a single-hue glaze theme.\n *\n * @example\n * ```ts\n * const primary = glaze({ hue: 280, saturation: 80 });\n * // or shorthand:\n * const primary = glaze(280, 80);\n * ```\n */\nexport function glaze(\n hueOrOptions: number | { hue: number; saturation: number },\n saturation?: number,\n): GlazeTheme {\n if (typeof hueOrOptions === 'number') {\n return createTheme(hueOrOptions, saturation ?? 100);\n }\n return createTheme(hueOrOptions.hue, hueOrOptions.saturation);\n}\n\n/**\n * Configure global glaze settings.\n */\nglaze.configure = function configure(config: GlazeConfig): void {\n globalConfig = {\n darkLightness: config.darkLightness ?? globalConfig.darkLightness,\n darkDesaturation: config.darkDesaturation ?? globalConfig.darkDesaturation,\n states: {\n dark: config.states?.dark ?? globalConfig.states.dark,\n highContrast:\n config.states?.highContrast ?? globalConfig.states.highContrast,\n },\n modes: {\n dark: config.modes?.dark ?? globalConfig.modes.dark,\n highContrast:\n config.modes?.highContrast ?? globalConfig.modes.highContrast,\n },\n };\n};\n\n/**\n * Compose multiple themes into a palette.\n */\nglaze.palette = function palette(themes: PaletteInput) {\n return createPalette(themes);\n};\n\n/**\n * Create a theme from a serialized export.\n */\nglaze.from = function from(data: GlazeThemeExport): GlazeTheme {\n return createTheme(data.hue, data.saturation, data.colors);\n};\n\n/**\n * Create a standalone single-color token.\n */\nglaze.color = function color(input: GlazeColorInput): GlazeColorToken {\n return createColorToken(input);\n};\n\n/**\n * Create a theme from a hex color string.\n * Extracts hue and saturation from the color.\n */\nglaze.fromHex = function fromHex(hex: string): GlazeTheme {\n const rgb = parseHex(hex);\n if (!rgb) {\n throw new Error(`glaze: invalid hex color \"${hex}\".`);\n }\n const [h, s] = srgbToOkhsl(rgb);\n return createTheme(h, s * 100);\n};\n\n/**\n * Create a theme from RGB values (0–255).\n * Extracts hue and saturation from the color.\n */\nglaze.fromRgb = function fromRgb(r: number, g: number, b: number): GlazeTheme {\n const [h, s] = srgbToOkhsl([r / 255, g / 255, b / 255]);\n return createTheme(h, s * 100);\n};\n\n/**\n * Get the current global configuration (for testing/debugging).\n */\nglaze.getConfig = function getConfig(): GlazeConfigResolved {\n return { ...globalConfig };\n};\n\n/**\n * Reset global configuration to defaults.\n */\nglaze.resetConfig = function resetConfig(): void {\n globalConfig = {\n darkLightness: [10, 90],\n darkDesaturation: 0.1,\n states: {\n dark: '@dark',\n highContrast: '@high-contrast',\n },\n modes: {\n dark: true,\n highContrast: false,\n },\n };\n};\n"],"mappings":"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"}
|