@tenphi/glaze 0.9.1 → 0.9.2

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/dist/index.cjs CHANGED
@@ -1415,10 +1415,14 @@ function createTheme(hue, saturation, initialColors) {
1415
1415
  };
1416
1416
  },
1417
1417
  extend(options) {
1418
- return createTheme(options.hue ?? hue, options.saturation ?? saturation, options.colors ? {
1419
- ...colorDefs,
1418
+ const newHue = options.hue ?? hue;
1419
+ const newSat = options.saturation ?? saturation;
1420
+ const inheritedColors = {};
1421
+ for (const [name, def] of Object.entries(colorDefs)) if (def.inherit !== false) inheritedColors[name] = def;
1422
+ return createTheme(newHue, newSat, options.colors ? {
1423
+ ...inheritedColors,
1420
1424
  ...options.colors
1421
- } : { ...colorDefs });
1425
+ } : { ...inheritedColors });
1422
1426
  },
1423
1427
  resolve() {
1424
1428
  return resolveAllColors(hue, saturation, colorDefs);
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["fmt"],"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.1254107, 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 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 * 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 return OKLabToLinearSRGB(okhslToOklab(h, s, l));\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\nexport const 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\nexport const 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 * Compute WCAG 2 relative luminance from linear sRGB, matching the browser\n * rendering pipeline: gamma-encode, clamp to sRGB gamut [0,1], then linearize.\n * This avoids over/under-estimating luminance for out-of-gamut OKHSL colors.\n */\nexport function gamutClampedLuminance(\n linearRgb: [number, number, number],\n): number {\n const r = sRGBGammaToLinear(\n Math.max(0, Math.min(1, sRGBLinearToGamma(linearRgb[0]))),\n );\n const g = sRGBGammaToLinear(\n Math.max(0, Math.min(1, sRGBLinearToGamma(linearRgb[1]))),\n );\n const b = sRGBGammaToLinear(\n Math.max(0, Math.min(1, sRGBLinearToGamma(linearRgb[2]))),\n );\n return 0.2126 * r + 0.7152 * g + 0.0722 * 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\nfunction fmt(value: number, decimals: number): string {\n return parseFloat(value.toFixed(decimals)).toString();\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(${fmt(h, 2)} ${fmt(s, 2)}% ${fmt(l, 2)}%)`;\n}\n\n/**\n * Format OKHSL values as a CSS `rgb(R G B)` string.\n * Uses 2 decimal places to avoid 8-bit quantization contrast loss.\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(${parseFloat((r * 255).toFixed(2))} ${parseFloat((g * 255).toFixed(2))} ${parseFloat((b * 255).toFixed(2))})`;\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(${fmt(hh, 2)} ${fmt(ss * 100, 2)}% ${fmt(ll * 100, 2)}%)`;\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(${fmt(L, 4)} ${fmt(C, 4)} ${fmt(hh, 2)})`;\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 contrastRatioFromLuminance,\n gamutClampedLuminance,\n} from './okhsl-color-math';\n\nexport type LinearRgb = [number, number, number];\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 = gamutClampedLuminance(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 // Overshoot absorbs rounding in the OKHSL pipeline and OKLCH formatting\n const searchTarget = target * 1.007;\n const yBase = gamutClampedLuminance(baseLinearRgb);\n\n const yPref = cachedLuminance(hue, saturation, preferredLightness);\n const crPref = contrastRatioFromLuminance(yPref, yBase);\n\n if (crPref >= searchTarget) {\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 searchTarget,\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 searchTarget,\n epsilon,\n maxIterations,\n preferredLightness,\n )\n : null;\n\n // Re-check met against the original target (not the bumped searchTarget)\n if (darkerResult) darkerResult.met = darkerResult.contrast >= target;\n if (lighterResult) lighterResult.met = lighterResult.contrast >= target;\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// ============================================================================\n// Mix contrast solver\n// ============================================================================\n\nexport interface FindValueForMixContrastOptions {\n /** Preferred mix parameter (0–1). */\n preferredValue: number;\n /** Base color as linear sRGB. */\n baseLinearRgb: LinearRgb;\n /** Target color as linear sRGB. */\n targetLinearRgb: LinearRgb;\n /** WCAG contrast target. */\n contrast: MinContrast;\n /**\n * Compute the luminance of the mixed color at parameter t.\n * For opaque: luminance of OKHSL-interpolated color.\n * For transparent: luminance of alpha-composited color over base.\n */\n luminanceAtValue: (t: number) => number;\n /** Convergence threshold. Default: 1e-4. */\n epsilon?: number;\n /** Maximum binary-search iterations per branch. Default: 20. */\n maxIterations?: number;\n}\n\nexport interface FindValueForMixContrastResult {\n /** Chosen mix parameter (0–1). */\n value: number;\n /** Achieved WCAG contrast ratio. */\n contrast: number;\n /** Whether the target was reached. */\n met: boolean;\n}\n\n/**\n * Binary-search one branch [lo, hi] for the nearest passing mix value\n * to `preferred`.\n */\nfunction searchMixBranch(\n lo: number,\n hi: number,\n yBase: number,\n target: number,\n epsilon: number,\n maxIter: number,\n preferred: number,\n luminanceAt: (t: number) => number,\n): BranchResult {\n const crLo = contrastRatioFromLuminance(luminanceAt(lo), yBase);\n const crHi = contrastRatioFromLuminance(luminanceAt(hi), 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 crMid = contrastRatioFromLuminance(luminanceAt(mid), yBase);\n\n if (crMid >= target) {\n if (mid < preferred) low = mid;\n else high = mid;\n } else {\n if (mid < preferred) high = mid;\n else low = mid;\n }\n }\n\n const crLow = contrastRatioFromLuminance(luminanceAt(low), yBase);\n const crHigh = contrastRatioFromLuminance(luminanceAt(high), 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 crLow >= crHigh\n ? { lightness: low, contrast: crLow, met: false }\n : { lightness: high, contrast: crHigh, met: false };\n}\n\n/**\n * Find the mix parameter (ratio or opacity) that satisfies a WCAG 2 contrast\n * target against a base color, staying as close to `preferredValue` as possible.\n */\nexport function findValueForMixContrast(\n options: FindValueForMixContrastOptions,\n): FindValueForMixContrastResult {\n const {\n preferredValue,\n baseLinearRgb,\n contrast: contrastInput,\n luminanceAtValue,\n epsilon = 1e-4,\n maxIterations = 20,\n } = options;\n\n const target = resolveMinContrast(contrastInput);\n const searchTarget = target * 1.01;\n const yBase = gamutClampedLuminance(baseLinearRgb);\n\n const yPref = luminanceAtValue(preferredValue);\n const crPref = contrastRatioFromLuminance(yPref, yBase);\n\n if (crPref >= searchTarget) {\n return { value: preferredValue, contrast: crPref, met: true };\n }\n\n const darkerResult =\n preferredValue > 0\n ? searchMixBranch(\n 0,\n preferredValue,\n yBase,\n searchTarget,\n epsilon,\n maxIterations,\n preferredValue,\n luminanceAtValue,\n )\n : null;\n\n const lighterResult =\n preferredValue < 1\n ? searchMixBranch(\n preferredValue,\n 1,\n yBase,\n searchTarget,\n epsilon,\n maxIterations,\n preferredValue,\n luminanceAtValue,\n )\n : null;\n\n if (darkerResult) darkerResult.met = darkerResult.contrast >= target;\n if (lighterResult) lighterResult.met = lighterResult.contrast >= target;\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 - preferredValue);\n const lighterDist = Math.abs(lighterResult!.lightness - preferredValue);\n if (darkerDist <= lighterDist) {\n return {\n value: darkerResult!.lightness,\n contrast: darkerResult!.contrast,\n met: true,\n };\n }\n return {\n value: lighterResult!.lightness,\n contrast: lighterResult!.contrast,\n met: true,\n };\n }\n\n if (darkerPasses) {\n return {\n value: darkerResult!.lightness,\n contrast: darkerResult!.contrast,\n met: true,\n };\n }\n\n if (lighterPasses) {\n return {\n value: lighterResult!.lightness,\n contrast: lighterResult!.contrast,\n met: true,\n };\n }\n\n const candidates: (BranchResult & { branch: string })[] = [];\n if (darkerResult) candidates.push({ ...darkerResult, branch: 'lower' });\n if (lighterResult) candidates.push({ ...lighterResult, branch: 'upper' });\n\n if (candidates.length === 0) {\n return { value: preferredValue, contrast: crPref, met: false };\n }\n\n candidates.sort((a, b) => b.contrast - a.contrast);\n return {\n value: candidates[0].lightness,\n contrast: candidates[0].contrast,\n met: candidates[0].met,\n };\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 sRGBLinearToGamma,\n gamutClampedLuminance,\n formatOkhsl,\n formatRgb,\n formatHsl,\n formatOklch,\n srgbToOkhsl,\n parseHex,\n} from './okhsl-color-math';\nimport {\n findLightnessForContrast,\n findValueForMixContrast,\n} from './contrast-solver';\nimport type { LinearRgb } from './contrast-solver';\nimport type {\n HCPair,\n AdaptationMode,\n RelativeValue,\n RegularColorDef,\n ShadowColorDef,\n ShadowTuning,\n MixColorDef,\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 GlazeCssOptions,\n GlazeCssResult,\n GlazePaletteOptions,\n GlazePaletteExportOptions,\n GlazeColorInput,\n GlazeColorToken,\n GlazeShadowInput,\n OkhslColor,\n} from './types';\n\n// ============================================================================\n// Global configuration\n// ============================================================================\n\nlet globalConfig: GlazeConfigResolved = {\n lightLightness: [10, 100],\n darkLightness: [15, 95],\n darkDesaturation: 0.1,\n darkCurve: 0.5,\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// Shadow helpers\n// ============================================================================\n\nfunction isShadowDef(def: ColorDef): def is ShadowColorDef {\n return (def as ShadowColorDef).type === 'shadow';\n}\n\nfunction isMixDef(def: ColorDef): def is MixColorDef {\n return (def as MixColorDef).type === 'mix';\n}\n\nconst DEFAULT_SHADOW_TUNING: Required<ShadowTuning> = {\n saturationFactor: 0.18,\n maxSaturation: 0.25,\n lightnessFactor: 0.25,\n lightnessBounds: [0.05, 0.2],\n minGapTarget: 0.05,\n alphaMax: 1.0,\n bgHueBlend: 0.2,\n};\n\nfunction resolveShadowTuning(perColor?: ShadowTuning): Required<ShadowTuning> {\n return {\n ...DEFAULT_SHADOW_TUNING,\n ...globalConfig.shadowTuning,\n ...perColor,\n lightnessBounds:\n perColor?.lightnessBounds ??\n globalConfig.shadowTuning?.lightnessBounds ??\n DEFAULT_SHADOW_TUNING.lightnessBounds,\n };\n}\n\nfunction circularLerp(a: number, b: number, t: number): number {\n let diff = b - a;\n if (diff > 180) diff -= 360;\n else if (diff < -180) diff += 360;\n return (((a + diff * t) % 360) + 360) % 360;\n}\n\n/**\n * Compute the canonical max-contrast reference t value for normalization.\n * Uses bg.l=1, fg.l=0, intensity=100 — the theoretical maximum.\n * This is a fixed constant per tuning configuration, ensuring uniform\n * scaling across all bg/fg pairs at low intensities.\n */\nfunction computeRefT(tuning: Required<ShadowTuning>): number {\n const EPSILON = 1e-6;\n let lShRef = clamp(\n tuning.lightnessFactor,\n tuning.lightnessBounds[0],\n tuning.lightnessBounds[1],\n );\n lShRef = Math.max(Math.min(lShRef, 1 - tuning.minGapTarget), 0);\n const gapRef = Math.max(1 - lShRef, EPSILON);\n return 1 / gapRef;\n}\n\nfunction computeShadow(\n bg: ResolvedColorVariant,\n fg: ResolvedColorVariant | undefined,\n intensity: number,\n tuning: Required<ShadowTuning>,\n): ResolvedColorVariant {\n const EPSILON = 1e-6;\n const clampedIntensity = clamp(intensity, 0, 100);\n const contrastWeight = fg ? Math.abs(bg.l - fg.l) : 1;\n const deltaL = (clampedIntensity / 100) * contrastWeight;\n\n const h = fg ? circularLerp(fg.h, bg.h, tuning.bgHueBlend) : bg.h;\n const s = fg\n ? Math.min(fg.s * tuning.saturationFactor, tuning.maxSaturation)\n : 0;\n\n let lSh = clamp(\n bg.l * tuning.lightnessFactor,\n tuning.lightnessBounds[0],\n tuning.lightnessBounds[1],\n );\n lSh = Math.max(Math.min(lSh, bg.l - tuning.minGapTarget), 0);\n\n const gap = Math.max(bg.l - lSh, EPSILON);\n const t = deltaL / gap;\n\n const tRef = computeRefT(tuning);\n const norm = Math.tanh(tRef / tuning.alphaMax);\n const alpha = Math.min(\n (tuning.alphaMax * Math.tanh(t / tuning.alphaMax)) / norm,\n tuning.alphaMax,\n );\n\n return { h, s, l: lSh, alpha };\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 (isShadowDef(def)) {\n if (!names.has(def.bg)) {\n throw new Error(\n `glaze: shadow \"${name}\" references non-existent bg \"${def.bg}\".`,\n );\n }\n if (isShadowDef(defs[def.bg])) {\n throw new Error(\n `glaze: shadow \"${name}\" bg \"${def.bg}\" references another shadow color.`,\n );\n }\n if (def.fg !== undefined) {\n if (!names.has(def.fg)) {\n throw new Error(\n `glaze: shadow \"${name}\" references non-existent fg \"${def.fg}\".`,\n );\n }\n if (isShadowDef(defs[def.fg])) {\n throw new Error(\n `glaze: shadow \"${name}\" fg \"${def.fg}\" references another shadow color.`,\n );\n }\n }\n continue;\n }\n\n if (isMixDef(def)) {\n if (!names.has(def.base)) {\n throw new Error(\n `glaze: mix \"${name}\" references non-existent base \"${def.base}\".`,\n );\n }\n if (!names.has(def.target)) {\n throw new Error(\n `glaze: mix \"${name}\" references non-existent target \"${def.target}\".`,\n );\n }\n if (isShadowDef(defs[def.base])) {\n throw new Error(\n `glaze: mix \"${name}\" base \"${def.base}\" references a shadow color.`,\n );\n }\n if (isShadowDef(defs[def.target])) {\n throw new Error(\n `glaze: mix \"${name}\" target \"${def.target}\" references a shadow color.`,\n );\n }\n continue;\n }\n\n const regDef = def as RegularColorDef;\n\n if (regDef.contrast !== undefined && !regDef.base) {\n throw new Error(`glaze: color \"${name}\" has \"contrast\" without \"base\".`);\n }\n\n if (\n regDef.lightness !== undefined &&\n !isAbsoluteLightness(regDef.lightness) &&\n !regDef.base\n ) {\n throw new Error(\n `glaze: color \"${name}\" has relative \"lightness\" without \"base\".`,\n );\n }\n\n if (regDef.base && !names.has(regDef.base)) {\n throw new Error(\n `glaze: color \"${name}\" references non-existent base \"${regDef.base}\".`,\n );\n }\n\n if (regDef.base && isShadowDef(defs[regDef.base])) {\n throw new Error(\n `glaze: color \"${name}\" base \"${regDef.base}\" references a shadow color.`,\n );\n }\n\n if (!isAbsoluteLightness(regDef.lightness) && regDef.base === undefined) {\n throw new Error(\n `glaze: color \"${name}\" must have either absolute \"lightness\" (root) or \"base\" (dependent).`,\n );\n }\n\n if (regDef.contrast !== undefined && regDef.opacity !== undefined) {\n console.warn(\n `glaze: color \"${name}\" has both \"contrast\" and \"opacity\". Opacity makes perceived lightness unpredictable.`,\n );\n }\n }\n\n // Check for circular references (follows base, bg, fg edges)\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 (isShadowDef(def)) {\n dfs(def.bg);\n if (def.fg) dfs(def.fg);\n } else if (isMixDef(def)) {\n dfs(def.base);\n dfs(def.target);\n } else {\n const regDef = def as RegularColorDef;\n if (regDef.base) {\n dfs(regDef.base);\n }\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 (isShadowDef(def)) {\n visit(def.bg);\n if (def.fg) visit(def.fg);\n } else if (isMixDef(def)) {\n visit(def.base);\n visit(def.target);\n } else {\n const regDef = def as RegularColorDef;\n if (regDef.base) {\n visit(regDef.base);\n }\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// Lightness window selection\n// ============================================================================\n\nfunction lightnessWindow(\n isHighContrast: boolean,\n kind: 'light' | 'dark',\n): [number, number] {\n if (isHighContrast) return [0, 100];\n return kind === 'dark'\n ? globalConfig.darkLightness\n : globalConfig.lightLightness;\n}\n\n// ============================================================================\n// Light scheme mapping\n// ============================================================================\n\nfunction mapLightnessLight(\n l: number,\n mode: AdaptationMode,\n isHighContrast: boolean,\n): number {\n if (mode === 'static') return l;\n const [lo, hi] = lightnessWindow(isHighContrast, 'light');\n return (l * (hi - lo)) / 100 + lo;\n}\n\n// ============================================================================\n// Dark scheme mapping\n// ============================================================================\n\nfunction mobiusCurve(t: number, beta: number): number {\n if (beta >= 1) return t;\n return t / (t + beta * (1 - t));\n}\n\nfunction mapLightnessDark(\n l: number,\n mode: AdaptationMode,\n isHighContrast: boolean,\n): number {\n if (mode === 'static') return l;\n\n const beta = isHighContrast\n ? pairHC(globalConfig.darkCurve)\n : pairNormal(globalConfig.darkCurve);\n const [darkLo, darkHi] = lightnessWindow(isHighContrast, 'dark');\n\n if (mode === 'fixed') {\n return (l * (darkHi - darkLo)) / 100 + darkLo;\n }\n\n const [lightLo, lightHi] = lightnessWindow(isHighContrast, 'light');\n const lightL = (l * (lightHi - lightLo)) / 100 + lightLo;\n const t = (lightHi - lightL) / (lightHi - lightLo);\n return darkLo + (darkHi - darkLo) * mobiusCurve(t, beta);\n}\n\nfunction lightMappedToDark(lightL: number, isHighContrast: boolean): number {\n const beta = isHighContrast\n ? pairHC(globalConfig.darkCurve)\n : pairNormal(globalConfig.darkCurve);\n const [lightLo, lightHi] = lightnessWindow(isHighContrast, 'light');\n const [darkLo, darkHi] = lightnessWindow(isHighContrast, 'dark');\n const clamped = clamp(lightL, lightLo, lightHi);\n const t = (lightHi - clamped) / (lightHi - lightLo);\n return darkLo + (darkHi - darkLo) * mobiusCurve(t, beta);\n}\n\nfunction mapSaturationDark(s: number, mode: AdaptationMode): number {\n if (mode === 'static') return s;\n return s * (1 - globalConfig.darkDesaturation);\n}\n\nfunction schemeLightnessRange(\n isDark: boolean,\n mode: AdaptationMode,\n isHighContrast: boolean,\n): [number, number] {\n if (mode === 'static') return [0, 1];\n const [lo, hi] = lightnessWindow(isHighContrast, isDark ? 'dark' : 'light');\n return [lo / 100, hi / 100];\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: RegularColorDef,\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: RegularColorDef,\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 const baseVariant = getSchemeVariant(baseResolved, isDark, isHighContrast);\n const baseL = baseVariant.l * 100;\n\n let preferredL: number;\n const rawLightness = def.lightness;\n\n if (rawLightness === undefined) {\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 const delta = parsed.value;\n if (isDark && mode === 'auto') {\n const baseLightVariant = getSchemeVariant(\n baseResolved,\n false,\n isHighContrast,\n );\n const absoluteLightL = clamp(baseLightVariant.l * 100 + delta, 0, 100);\n preferredL = lightMappedToDark(absoluteLightL, isHighContrast);\n } else {\n preferredL = clamp(baseL + delta, 0, 100);\n }\n } else {\n if (isDark) {\n preferredL = mapLightnessDark(parsed.value, mode, isHighContrast);\n } else {\n preferredL = mapLightnessLight(parsed.value, mode, isHighContrast);\n }\n }\n }\n\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 const baseLinearRgb = okhslToLinearSrgb(\n baseVariant.h,\n baseVariant.s,\n baseVariant.l,\n );\n\n const windowRange = schemeLightnessRange(isDark, mode, isHighContrast);\n\n const result = findLightnessForContrast({\n hue: effectiveHue,\n saturation: effectiveSat,\n preferredLightness: clamp(\n preferredL / 100,\n windowRange[0],\n windowRange[1],\n ),\n baseLinearRgb,\n contrast: minCr,\n lightnessRange: [0, 1],\n });\n\n return { l: result.lightness * 100, satFactor };\n }\n\n return { l: clamp(preferredL, 0, 100), satFactor };\n}\n\nfunction getSchemeVariant(\n color: ResolvedColor,\n isDark: boolean,\n isHighContrast: boolean,\n): ResolvedColorVariant {\n if (isDark && isHighContrast) return color.darkContrast;\n if (isDark) return color.dark;\n if (isHighContrast) return color.lightContrast;\n return color.light;\n}\n\nfunction resolveColorForScheme(\n name: string,\n def: ColorDef,\n ctx: ResolveContext,\n isDark: boolean,\n isHighContrast: boolean,\n): ResolvedColorVariant {\n if (isShadowDef(def)) {\n return resolveShadowForScheme(def, ctx, isDark, isHighContrast);\n }\n\n if (isMixDef(def)) {\n return resolveMixForScheme(def, ctx, isDark, isHighContrast);\n }\n\n const regDef = def as RegularColorDef;\n const mode = regDef.mode ?? 'auto';\n const isRoot = isAbsoluteLightness(regDef.lightness) && !regDef.base;\n const effectiveHue = resolveEffectiveHue(ctx.hue, regDef.hue);\n\n let lightL: number;\n let satFactor: number;\n\n if (isRoot) {\n const root = resolveRootColor(name, regDef, ctx, isHighContrast);\n lightL = root.lightL;\n satFactor = root.satFactor;\n } else {\n const dep = resolveDependentColor(\n name,\n regDef,\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, isHighContrast);\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 if (isRoot) {\n finalL = mapLightnessLight(lightL, mode, isHighContrast);\n finalSat = (satFactor * ctx.saturation) / 100;\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 alpha: regDef.opacity ?? 1,\n };\n}\n\nfunction resolveShadowForScheme(\n def: ShadowColorDef,\n ctx: ResolveContext,\n isDark: boolean,\n isHighContrast: boolean,\n): ResolvedColorVariant {\n const bgResolved = ctx.resolved.get(def.bg)!;\n const bgVariant = getSchemeVariant(bgResolved, isDark, isHighContrast);\n\n let fgVariant: ResolvedColorVariant | undefined;\n if (def.fg) {\n const fgResolved = ctx.resolved.get(def.fg)!;\n fgVariant = getSchemeVariant(fgResolved, isDark, isHighContrast);\n }\n\n const intensity = isHighContrast\n ? pairHC(def.intensity)\n : pairNormal(def.intensity);\n\n const tuning = resolveShadowTuning(def.tuning);\n return computeShadow(bgVariant, fgVariant, intensity, tuning);\n}\n\nfunction variantToLinearRgb(v: ResolvedColorVariant): LinearRgb {\n return okhslToLinearSrgb(v.h, v.s, v.l);\n}\n\n/**\n * Resolve hue for OKHSL mixing, handling achromatic colors.\n * When one color has no saturation, its hue is meaningless —\n * use the hue from the color that has saturation (matches CSS\n * color-mix \"missing component\" behavior).\n */\nfunction mixHue(\n base: ResolvedColorVariant,\n target: ResolvedColorVariant,\n t: number,\n): number {\n const SAT_EPSILON = 1e-6;\n const baseHasSat = base.s > SAT_EPSILON;\n const targetHasSat = target.s > SAT_EPSILON;\n\n if (baseHasSat && targetHasSat) return circularLerp(base.h, target.h, t);\n if (targetHasSat) return target.h;\n return base.h;\n}\n\nfunction linearSrgbLerp(\n base: LinearRgb,\n target: LinearRgb,\n t: number,\n): LinearRgb {\n return [\n base[0] + (target[0] - base[0]) * t,\n base[1] + (target[1] - base[1]) * t,\n base[2] + (target[2] - base[2]) * t,\n ];\n}\n\nfunction linearRgbToVariant(rgb: LinearRgb): ResolvedColorVariant {\n const gamma: [number, number, number] = [\n Math.max(0, Math.min(1, sRGBLinearToGamma(rgb[0]))),\n Math.max(0, Math.min(1, sRGBLinearToGamma(rgb[1]))),\n Math.max(0, Math.min(1, sRGBLinearToGamma(rgb[2]))),\n ];\n const [h, s, l] = srgbToOkhsl(gamma);\n return { h, s, l, alpha: 1 };\n}\n\nfunction resolveMixForScheme(\n def: MixColorDef,\n ctx: ResolveContext,\n isDark: boolean,\n isHighContrast: boolean,\n): ResolvedColorVariant {\n const baseResolved = ctx.resolved.get(def.base)!;\n const targetResolved = ctx.resolved.get(def.target)!;\n const baseVariant = getSchemeVariant(baseResolved, isDark, isHighContrast);\n const targetVariant = getSchemeVariant(\n targetResolved,\n isDark,\n isHighContrast,\n );\n\n const rawValue = isHighContrast ? pairHC(def.value) : pairNormal(def.value);\n let t = clamp(rawValue, 0, 100) / 100;\n\n const blend = def.blend ?? 'opaque';\n const space = def.space ?? 'okhsl';\n const baseLinear = variantToLinearRgb(baseVariant);\n const targetLinear = variantToLinearRgb(targetVariant);\n\n if (def.contrast !== undefined) {\n const minCr = isHighContrast\n ? pairHC(def.contrast)\n : pairNormal(def.contrast);\n\n let luminanceAt: (v: number) => number;\n\n if (blend === 'transparent') {\n luminanceAt = (v: number) =>\n gamutClampedLuminance(linearSrgbLerp(baseLinear, targetLinear, v));\n } else if (space === 'srgb') {\n luminanceAt = (v: number) =>\n gamutClampedLuminance(linearSrgbLerp(baseLinear, targetLinear, v));\n } else {\n luminanceAt = (v: number) => {\n const h = mixHue(baseVariant, targetVariant, v);\n const s = baseVariant.s + (targetVariant.s - baseVariant.s) * v;\n const l = baseVariant.l + (targetVariant.l - baseVariant.l) * v;\n return gamutClampedLuminance(okhslToLinearSrgb(h, s, l));\n };\n }\n\n const result = findValueForMixContrast({\n preferredValue: t,\n baseLinearRgb: baseLinear,\n targetLinearRgb: targetLinear,\n contrast: minCr,\n luminanceAtValue: luminanceAt,\n });\n t = result.value;\n }\n\n if (blend === 'transparent') {\n return {\n h: targetVariant.h,\n s: targetVariant.s,\n l: targetVariant.l,\n alpha: clamp(t, 0, 1),\n };\n }\n\n if (space === 'srgb') {\n const mixed = linearSrgbLerp(baseLinear, targetLinear, t);\n return linearRgbToVariant(mixed);\n }\n\n return {\n h: mixHue(baseVariant, targetVariant, t),\n s: clamp(baseVariant.s + (targetVariant.s - baseVariant.s) * t, 0, 1),\n l: clamp(baseVariant.l + (targetVariant.l - baseVariant.l) * t, 0, 1),\n alpha: 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 function defMode(def: ColorDef): AdaptationMode | undefined {\n if (isShadowDef(def) || isMixDef(def)) return undefined;\n return (def as RegularColorDef).mode ?? 'auto';\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: defMode(defs[name]),\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: defMode(defs[name]),\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: defMode(defs[name]),\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 fmt(value: number, decimals: number): string {\n return parseFloat(value.toFixed(decimals)).toString();\n}\n\nfunction formatVariant(\n v: ResolvedColorVariant,\n format: GlazeColorFormat = 'okhsl',\n): string {\n const base = formatters[format](v.h, v.s * 100, v.l * 100);\n if (v.alpha >= 1) return base;\n const closing = base.lastIndexOf(')');\n return `${base.slice(0, closing)} / ${fmt(v.alpha, 4)})`;\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 buildFlatTokenMap(\n resolved: Map<string, ResolvedColor>,\n prefix: string,\n modes: Required<GlazeOutputModes>,\n format: GlazeColorFormat = 'okhsl',\n): Record<string, Record<string, string>> {\n const result: Record<string, Record<string, string>> = {\n light: {},\n };\n\n if (modes.dark) {\n result.dark = {};\n }\n if (modes.highContrast) {\n result.lightContrast = {};\n }\n if (modes.dark && modes.highContrast) {\n result.darkContrast = {};\n }\n\n for (const [name, color] of resolved) {\n const key = `${prefix}${name}`;\n\n result.light[key] = formatVariant(color.light, format);\n\n if (modes.dark) {\n result.dark[key] = formatVariant(color.dark, format);\n }\n if (modes.highContrast) {\n result.lightContrast[key] = formatVariant(color.lightContrast, format);\n }\n if (modes.dark && modes.highContrast) {\n result.darkContrast[key] = formatVariant(color.darkContrast, format);\n }\n }\n\n return result;\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\nfunction buildCssMap(\n resolved: Map<string, ResolvedColor>,\n prefix: string,\n suffix: string,\n format: GlazeColorFormat,\n): GlazeCssResult {\n const lines: Record<keyof GlazeCssResult, string[]> = {\n light: [],\n dark: [],\n lightContrast: [],\n darkContrast: [],\n };\n\n for (const [name, color] of resolved) {\n const prop = `--${prefix}${name}${suffix}`;\n lines.light.push(`${prop}: ${formatVariant(color.light, format)};`);\n lines.dark.push(`${prop}: ${formatVariant(color.dark, format)};`);\n lines.lightContrast.push(\n `${prop}: ${formatVariant(color.lightContrast, format)};`,\n );\n lines.darkContrast.push(\n `${prop}: ${formatVariant(color.darkContrast, format)};`,\n );\n }\n\n return {\n light: lines.light.join('\\n'),\n dark: lines.dark.join('\\n'),\n lightContrast: lines.lightContrast.join('\\n'),\n darkContrast: lines.darkContrast.join('\\n'),\n };\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(options?: GlazeJsonOptions): Record<string, Record<string, string>> {\n const resolved = resolveAllColors(hue, saturation, colorDefs);\n const modes = resolveModes(options?.modes);\n return buildFlatTokenMap(resolved, '', modes, options?.format);\n },\n\n tasty(options?: GlazeTokenOptions): 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\n css(options?: GlazeCssOptions): GlazeCssResult {\n const resolved = resolveAllColors(hue, saturation, colorDefs);\n return buildCssMap(\n resolved,\n '',\n options?.suffix ?? '-color',\n options?.format ?? 'rgb',\n );\n },\n } as GlazeTheme;\n\n return theme;\n}\n\n// ============================================================================\n// Palette\n// ============================================================================\n\ntype PaletteInput = Record<string, GlazeTheme>;\n\nfunction resolvePrefix(\n options: { prefix?: boolean | Record<string, string> } | undefined,\n themeName: string,\n defaultPrefix = false,\n): string {\n const prefix = options?.prefix ?? defaultPrefix;\n if (prefix === true) {\n return `${themeName}-`;\n }\n if (typeof prefix === 'object' && prefix !== null) {\n return prefix[themeName] ?? `${themeName}-`;\n }\n return '';\n}\n\nfunction validatePrimaryTheme(\n primary: string | undefined,\n themes: PaletteInput,\n): void {\n if (primary !== undefined && !(primary in themes)) {\n const available = Object.keys(themes).join(', ');\n throw new Error(\n `glaze: primary theme \"${primary}\" not found in palette. Available: ${available}.`,\n );\n }\n}\n\n/**\n * Resolve the effective primary for an export call.\n * `false` disables, a string overrides, `undefined` inherits from palette.\n */\nfunction resolveEffectivePrimary(\n exportPrimary: string | false | undefined,\n palettePrimary: string | undefined,\n): string | undefined {\n if (exportPrimary === false) return undefined;\n return exportPrimary ?? palettePrimary;\n}\n\n/**\n * Filter a resolved color map, skipping keys already in `seen`.\n * Warns on collision and keeps the first-written value (first-write-wins).\n * Returns a new map containing only non-colliding entries.\n */\nfunction filterCollisions(\n resolved: Map<string, ResolvedColor>,\n prefix: string,\n seen: Map<string, string>,\n themeName: string,\n isPrimary?: boolean,\n): Map<string, ResolvedColor> {\n const filtered = new Map<string, ResolvedColor>();\n const label = isPrimary ? `${themeName} (primary)` : themeName;\n\n for (const [name, color] of resolved) {\n const key = `${prefix}${name}`;\n if (seen.has(key)) {\n console.warn(\n `glaze: token \"${key}\" from theme \"${label}\" collides with theme \"${seen.get(key)}\" — skipping.`,\n );\n continue;\n }\n seen.set(key, label);\n filtered.set(name, color);\n }\n return filtered;\n}\n\nfunction createPalette(\n themes: PaletteInput,\n paletteOptions?: GlazePaletteOptions,\n) {\n validatePrimaryTheme(paletteOptions?.primary, themes);\n\n return {\n tokens(\n options?: GlazeJsonOptions & GlazePaletteExportOptions,\n ): Record<string, Record<string, string>> {\n const effectivePrimary = resolveEffectivePrimary(\n options?.primary,\n paletteOptions?.primary,\n );\n if (options?.primary !== undefined) {\n validatePrimaryTheme(effectivePrimary, themes);\n }\n const modes = resolveModes(options?.modes);\n const allTokens: Record<string, Record<string, string>> = {};\n const seen = new Map<string, string>();\n\n for (const [themeName, theme] of Object.entries(themes)) {\n const resolved = theme.resolve();\n const prefix = resolvePrefix(options, themeName, true);\n const filtered = filterCollisions(resolved, prefix, seen, themeName);\n const tokens = buildFlatTokenMap(\n filtered,\n prefix,\n modes,\n options?.format,\n );\n\n for (const variant of Object.keys(tokens)) {\n if (!allTokens[variant]) {\n allTokens[variant] = {};\n }\n Object.assign(allTokens[variant], tokens[variant]);\n }\n\n if (themeName === effectivePrimary) {\n const primaryFiltered = filterCollisions(\n resolved,\n '',\n seen,\n themeName,\n true,\n );\n const unprefixed = buildFlatTokenMap(\n primaryFiltered,\n '',\n modes,\n options?.format,\n );\n for (const variant of Object.keys(unprefixed)) {\n Object.assign(allTokens[variant]!, unprefixed[variant]);\n }\n }\n }\n\n return allTokens;\n },\n\n tasty(\n options?: GlazeTokenOptions & GlazePaletteExportOptions,\n ): Record<string, Record<string, string>> {\n const effectivePrimary = resolveEffectivePrimary(\n options?.primary,\n paletteOptions?.primary,\n );\n if (options?.primary !== undefined) {\n validatePrimaryTheme(effectivePrimary, themes);\n }\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 const seen = new Map<string, string>();\n\n for (const [themeName, theme] of Object.entries(themes)) {\n const resolved = theme.resolve();\n const prefix = resolvePrefix(options, themeName, true);\n const filtered = filterCollisions(resolved, prefix, seen, themeName);\n const tokens = buildTokenMap(\n filtered,\n prefix,\n states,\n modes,\n options?.format,\n );\n Object.assign(allTokens, tokens);\n\n if (themeName === effectivePrimary) {\n const primaryFiltered = filterCollisions(\n resolved,\n '',\n seen,\n themeName,\n true,\n );\n const unprefixed = buildTokenMap(\n primaryFiltered,\n '',\n states,\n modes,\n options?.format,\n );\n Object.assign(allTokens, unprefixed);\n }\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 css(options?: GlazeCssOptions & GlazePaletteExportOptions): GlazeCssResult {\n const effectivePrimary = resolveEffectivePrimary(\n options?.primary,\n paletteOptions?.primary,\n );\n if (options?.primary !== undefined) {\n validatePrimaryTheme(effectivePrimary, themes);\n }\n const suffix = options?.suffix ?? '-color';\n const format = options?.format ?? 'rgb';\n\n const allLines: Record<keyof GlazeCssResult, string[]> = {\n light: [],\n dark: [],\n lightContrast: [],\n darkContrast: [],\n };\n const seen = new Map<string, string>();\n\n for (const [themeName, theme] of Object.entries(themes)) {\n const resolved = theme.resolve();\n const prefix = resolvePrefix(options, themeName, true);\n const filtered = filterCollisions(resolved, prefix, seen, themeName);\n\n const css = buildCssMap(filtered, prefix, suffix, format);\n\n for (const key of [\n 'light',\n 'dark',\n 'lightContrast',\n 'darkContrast',\n ] as const) {\n if (css[key]) {\n allLines[key].push(css[key]);\n }\n }\n\n if (themeName === effectivePrimary) {\n const primaryFiltered = filterCollisions(\n resolved,\n '',\n seen,\n themeName,\n true,\n );\n const unprefixed = buildCssMap(primaryFiltered, '', suffix, format);\n for (const key of [\n 'light',\n 'dark',\n 'lightContrast',\n 'darkContrast',\n ] as const) {\n if (unprefixed[key]) {\n allLines[key].push(unprefixed[key]);\n }\n }\n }\n }\n\n return {\n light: allLines.light.join('\\n'),\n dark: allLines.dark.join('\\n'),\n lightContrast: allLines.lightContrast.join('\\n'),\n darkContrast: allLines.darkContrast.join('\\n'),\n };\n },\n };\n}\n\n// ============================================================================\n// Standalone color token\n// ============================================================================\n\nfunction createColorToken(input: GlazeColorInput): GlazeColorToken {\n const colorDef: RegularColorDef = {\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 tasty(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 lightLightness: config.lightLightness ?? globalConfig.lightLightness,\n darkLightness: config.darkLightness ?? globalConfig.darkLightness,\n darkDesaturation: config.darkDesaturation ?? globalConfig.darkDesaturation,\n darkCurve: config.darkCurve ?? globalConfig.darkCurve,\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 shadowTuning: config.shadowTuning ?? globalConfig.shadowTuning,\n };\n};\n\n/**\n * Compose multiple themes into a palette.\n */\nglaze.palette = function palette(\n themes: PaletteInput,\n options?: GlazePaletteOptions,\n) {\n return createPalette(themes, options);\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 * Compute a shadow color from a bg/fg pair and intensity.\n */\nglaze.shadow = function shadow(input: GlazeShadowInput): ResolvedColorVariant {\n const bg = parseOkhslInput(input.bg);\n const fg = input.fg ? parseOkhslInput(input.fg) : undefined;\n const tuning = resolveShadowTuning(input.tuning);\n return computeShadow(\n { ...bg, alpha: 1 },\n fg ? { ...fg, alpha: 1 } : undefined,\n input.intensity,\n tuning,\n );\n};\n\n/**\n * Format a resolved color variant as a CSS string.\n */\nglaze.format = function format(\n variant: ResolvedColorVariant,\n colorFormat?: GlazeColorFormat,\n): string {\n return formatVariant(variant, colorFormat);\n};\n\nfunction parseOkhslInput(input: string | OkhslColor): OkhslColor {\n if (typeof input === 'string') {\n const rgb = parseHex(input);\n if (!rgb) throw new Error(`glaze: invalid hex color \"${input}\".`);\n const [h, s, l] = srgbToOkhsl(rgb);\n return { h, s, l };\n }\n return 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 lightLightness: [10, 100],\n darkLightness: [15, 95],\n darkDesaturation: 0.1,\n darkCurve: 0.5,\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.cjs","names":["fmt"],"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.1254107, 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 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 * 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 return OKLabToLinearSRGB(okhslToOklab(h, s, l));\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\nexport const 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\nexport const 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 * Compute WCAG 2 relative luminance from linear sRGB, matching the browser\n * rendering pipeline: gamma-encode, clamp to sRGB gamut [0,1], then linearize.\n * This avoids over/under-estimating luminance for out-of-gamut OKHSL colors.\n */\nexport function gamutClampedLuminance(\n linearRgb: [number, number, number],\n): number {\n const r = sRGBGammaToLinear(\n Math.max(0, Math.min(1, sRGBLinearToGamma(linearRgb[0]))),\n );\n const g = sRGBGammaToLinear(\n Math.max(0, Math.min(1, sRGBLinearToGamma(linearRgb[1]))),\n );\n const b = sRGBGammaToLinear(\n Math.max(0, Math.min(1, sRGBLinearToGamma(linearRgb[2]))),\n );\n return 0.2126 * r + 0.7152 * g + 0.0722 * 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\nfunction fmt(value: number, decimals: number): string {\n return parseFloat(value.toFixed(decimals)).toString();\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(${fmt(h, 2)} ${fmt(s, 2)}% ${fmt(l, 2)}%)`;\n}\n\n/**\n * Format OKHSL values as a CSS `rgb(R G B)` string.\n * Uses 2 decimal places to avoid 8-bit quantization contrast loss.\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(${parseFloat((r * 255).toFixed(2))} ${parseFloat((g * 255).toFixed(2))} ${parseFloat((b * 255).toFixed(2))})`;\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(${fmt(hh, 2)} ${fmt(ss * 100, 2)}% ${fmt(ll * 100, 2)}%)`;\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(${fmt(L, 4)} ${fmt(C, 4)} ${fmt(hh, 2)})`;\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 contrastRatioFromLuminance,\n gamutClampedLuminance,\n} from './okhsl-color-math';\n\nexport type LinearRgb = [number, number, number];\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 = gamutClampedLuminance(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 // Overshoot absorbs rounding in the OKHSL pipeline and OKLCH formatting\n const searchTarget = target * 1.007;\n const yBase = gamutClampedLuminance(baseLinearRgb);\n\n const yPref = cachedLuminance(hue, saturation, preferredLightness);\n const crPref = contrastRatioFromLuminance(yPref, yBase);\n\n if (crPref >= searchTarget) {\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 searchTarget,\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 searchTarget,\n epsilon,\n maxIterations,\n preferredLightness,\n )\n : null;\n\n // Re-check met against the original target (not the bumped searchTarget)\n if (darkerResult) darkerResult.met = darkerResult.contrast >= target;\n if (lighterResult) lighterResult.met = lighterResult.contrast >= target;\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// ============================================================================\n// Mix contrast solver\n// ============================================================================\n\nexport interface FindValueForMixContrastOptions {\n /** Preferred mix parameter (0–1). */\n preferredValue: number;\n /** Base color as linear sRGB. */\n baseLinearRgb: LinearRgb;\n /** Target color as linear sRGB. */\n targetLinearRgb: LinearRgb;\n /** WCAG contrast target. */\n contrast: MinContrast;\n /**\n * Compute the luminance of the mixed color at parameter t.\n * For opaque: luminance of OKHSL-interpolated color.\n * For transparent: luminance of alpha-composited color over base.\n */\n luminanceAtValue: (t: number) => number;\n /** Convergence threshold. Default: 1e-4. */\n epsilon?: number;\n /** Maximum binary-search iterations per branch. Default: 20. */\n maxIterations?: number;\n}\n\nexport interface FindValueForMixContrastResult {\n /** Chosen mix parameter (0–1). */\n value: number;\n /** Achieved WCAG contrast ratio. */\n contrast: number;\n /** Whether the target was reached. */\n met: boolean;\n}\n\n/**\n * Binary-search one branch [lo, hi] for the nearest passing mix value\n * to `preferred`.\n */\nfunction searchMixBranch(\n lo: number,\n hi: number,\n yBase: number,\n target: number,\n epsilon: number,\n maxIter: number,\n preferred: number,\n luminanceAt: (t: number) => number,\n): BranchResult {\n const crLo = contrastRatioFromLuminance(luminanceAt(lo), yBase);\n const crHi = contrastRatioFromLuminance(luminanceAt(hi), 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 crMid = contrastRatioFromLuminance(luminanceAt(mid), yBase);\n\n if (crMid >= target) {\n if (mid < preferred) low = mid;\n else high = mid;\n } else {\n if (mid < preferred) high = mid;\n else low = mid;\n }\n }\n\n const crLow = contrastRatioFromLuminance(luminanceAt(low), yBase);\n const crHigh = contrastRatioFromLuminance(luminanceAt(high), 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 crLow >= crHigh\n ? { lightness: low, contrast: crLow, met: false }\n : { lightness: high, contrast: crHigh, met: false };\n}\n\n/**\n * Find the mix parameter (ratio or opacity) that satisfies a WCAG 2 contrast\n * target against a base color, staying as close to `preferredValue` as possible.\n */\nexport function findValueForMixContrast(\n options: FindValueForMixContrastOptions,\n): FindValueForMixContrastResult {\n const {\n preferredValue,\n baseLinearRgb,\n contrast: contrastInput,\n luminanceAtValue,\n epsilon = 1e-4,\n maxIterations = 20,\n } = options;\n\n const target = resolveMinContrast(contrastInput);\n const searchTarget = target * 1.01;\n const yBase = gamutClampedLuminance(baseLinearRgb);\n\n const yPref = luminanceAtValue(preferredValue);\n const crPref = contrastRatioFromLuminance(yPref, yBase);\n\n if (crPref >= searchTarget) {\n return { value: preferredValue, contrast: crPref, met: true };\n }\n\n const darkerResult =\n preferredValue > 0\n ? searchMixBranch(\n 0,\n preferredValue,\n yBase,\n searchTarget,\n epsilon,\n maxIterations,\n preferredValue,\n luminanceAtValue,\n )\n : null;\n\n const lighterResult =\n preferredValue < 1\n ? searchMixBranch(\n preferredValue,\n 1,\n yBase,\n searchTarget,\n epsilon,\n maxIterations,\n preferredValue,\n luminanceAtValue,\n )\n : null;\n\n if (darkerResult) darkerResult.met = darkerResult.contrast >= target;\n if (lighterResult) lighterResult.met = lighterResult.contrast >= target;\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 - preferredValue);\n const lighterDist = Math.abs(lighterResult!.lightness - preferredValue);\n if (darkerDist <= lighterDist) {\n return {\n value: darkerResult!.lightness,\n contrast: darkerResult!.contrast,\n met: true,\n };\n }\n return {\n value: lighterResult!.lightness,\n contrast: lighterResult!.contrast,\n met: true,\n };\n }\n\n if (darkerPasses) {\n return {\n value: darkerResult!.lightness,\n contrast: darkerResult!.contrast,\n met: true,\n };\n }\n\n if (lighterPasses) {\n return {\n value: lighterResult!.lightness,\n contrast: lighterResult!.contrast,\n met: true,\n };\n }\n\n const candidates: (BranchResult & { branch: string })[] = [];\n if (darkerResult) candidates.push({ ...darkerResult, branch: 'lower' });\n if (lighterResult) candidates.push({ ...lighterResult, branch: 'upper' });\n\n if (candidates.length === 0) {\n return { value: preferredValue, contrast: crPref, met: false };\n }\n\n candidates.sort((a, b) => b.contrast - a.contrast);\n return {\n value: candidates[0].lightness,\n contrast: candidates[0].contrast,\n met: candidates[0].met,\n };\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 sRGBLinearToGamma,\n gamutClampedLuminance,\n formatOkhsl,\n formatRgb,\n formatHsl,\n formatOklch,\n srgbToOkhsl,\n parseHex,\n} from './okhsl-color-math';\nimport {\n findLightnessForContrast,\n findValueForMixContrast,\n} from './contrast-solver';\nimport type { LinearRgb } from './contrast-solver';\nimport type {\n HCPair,\n AdaptationMode,\n RelativeValue,\n RegularColorDef,\n ShadowColorDef,\n ShadowTuning,\n MixColorDef,\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 GlazeCssOptions,\n GlazeCssResult,\n GlazePaletteOptions,\n GlazePaletteExportOptions,\n GlazeColorInput,\n GlazeColorToken,\n GlazeShadowInput,\n OkhslColor,\n} from './types';\n\n// ============================================================================\n// Global configuration\n// ============================================================================\n\nlet globalConfig: GlazeConfigResolved = {\n lightLightness: [10, 100],\n darkLightness: [15, 95],\n darkDesaturation: 0.1,\n darkCurve: 0.5,\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// Shadow helpers\n// ============================================================================\n\nfunction isShadowDef(def: ColorDef): def is ShadowColorDef {\n return (def as ShadowColorDef).type === 'shadow';\n}\n\nfunction isMixDef(def: ColorDef): def is MixColorDef {\n return (def as MixColorDef).type === 'mix';\n}\n\nconst DEFAULT_SHADOW_TUNING: Required<ShadowTuning> = {\n saturationFactor: 0.18,\n maxSaturation: 0.25,\n lightnessFactor: 0.25,\n lightnessBounds: [0.05, 0.2],\n minGapTarget: 0.05,\n alphaMax: 1.0,\n bgHueBlend: 0.2,\n};\n\nfunction resolveShadowTuning(perColor?: ShadowTuning): Required<ShadowTuning> {\n return {\n ...DEFAULT_SHADOW_TUNING,\n ...globalConfig.shadowTuning,\n ...perColor,\n lightnessBounds:\n perColor?.lightnessBounds ??\n globalConfig.shadowTuning?.lightnessBounds ??\n DEFAULT_SHADOW_TUNING.lightnessBounds,\n };\n}\n\nfunction circularLerp(a: number, b: number, t: number): number {\n let diff = b - a;\n if (diff > 180) diff -= 360;\n else if (diff < -180) diff += 360;\n return (((a + diff * t) % 360) + 360) % 360;\n}\n\n/**\n * Compute the canonical max-contrast reference t value for normalization.\n * Uses bg.l=1, fg.l=0, intensity=100 — the theoretical maximum.\n * This is a fixed constant per tuning configuration, ensuring uniform\n * scaling across all bg/fg pairs at low intensities.\n */\nfunction computeRefT(tuning: Required<ShadowTuning>): number {\n const EPSILON = 1e-6;\n let lShRef = clamp(\n tuning.lightnessFactor,\n tuning.lightnessBounds[0],\n tuning.lightnessBounds[1],\n );\n lShRef = Math.max(Math.min(lShRef, 1 - tuning.minGapTarget), 0);\n const gapRef = Math.max(1 - lShRef, EPSILON);\n return 1 / gapRef;\n}\n\nfunction computeShadow(\n bg: ResolvedColorVariant,\n fg: ResolvedColorVariant | undefined,\n intensity: number,\n tuning: Required<ShadowTuning>,\n): ResolvedColorVariant {\n const EPSILON = 1e-6;\n const clampedIntensity = clamp(intensity, 0, 100);\n const contrastWeight = fg ? Math.abs(bg.l - fg.l) : 1;\n const deltaL = (clampedIntensity / 100) * contrastWeight;\n\n const h = fg ? circularLerp(fg.h, bg.h, tuning.bgHueBlend) : bg.h;\n const s = fg\n ? Math.min(fg.s * tuning.saturationFactor, tuning.maxSaturation)\n : 0;\n\n let lSh = clamp(\n bg.l * tuning.lightnessFactor,\n tuning.lightnessBounds[0],\n tuning.lightnessBounds[1],\n );\n lSh = Math.max(Math.min(lSh, bg.l - tuning.minGapTarget), 0);\n\n const gap = Math.max(bg.l - lSh, EPSILON);\n const t = deltaL / gap;\n\n const tRef = computeRefT(tuning);\n const norm = Math.tanh(tRef / tuning.alphaMax);\n const alpha = Math.min(\n (tuning.alphaMax * Math.tanh(t / tuning.alphaMax)) / norm,\n tuning.alphaMax,\n );\n\n return { h, s, l: lSh, alpha };\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 (isShadowDef(def)) {\n if (!names.has(def.bg)) {\n throw new Error(\n `glaze: shadow \"${name}\" references non-existent bg \"${def.bg}\".`,\n );\n }\n if (isShadowDef(defs[def.bg])) {\n throw new Error(\n `glaze: shadow \"${name}\" bg \"${def.bg}\" references another shadow color.`,\n );\n }\n if (def.fg !== undefined) {\n if (!names.has(def.fg)) {\n throw new Error(\n `glaze: shadow \"${name}\" references non-existent fg \"${def.fg}\".`,\n );\n }\n if (isShadowDef(defs[def.fg])) {\n throw new Error(\n `glaze: shadow \"${name}\" fg \"${def.fg}\" references another shadow color.`,\n );\n }\n }\n continue;\n }\n\n if (isMixDef(def)) {\n if (!names.has(def.base)) {\n throw new Error(\n `glaze: mix \"${name}\" references non-existent base \"${def.base}\".`,\n );\n }\n if (!names.has(def.target)) {\n throw new Error(\n `glaze: mix \"${name}\" references non-existent target \"${def.target}\".`,\n );\n }\n if (isShadowDef(defs[def.base])) {\n throw new Error(\n `glaze: mix \"${name}\" base \"${def.base}\" references a shadow color.`,\n );\n }\n if (isShadowDef(defs[def.target])) {\n throw new Error(\n `glaze: mix \"${name}\" target \"${def.target}\" references a shadow color.`,\n );\n }\n continue;\n }\n\n const regDef = def as RegularColorDef;\n\n if (regDef.contrast !== undefined && !regDef.base) {\n throw new Error(`glaze: color \"${name}\" has \"contrast\" without \"base\".`);\n }\n\n if (\n regDef.lightness !== undefined &&\n !isAbsoluteLightness(regDef.lightness) &&\n !regDef.base\n ) {\n throw new Error(\n `glaze: color \"${name}\" has relative \"lightness\" without \"base\".`,\n );\n }\n\n if (regDef.base && !names.has(regDef.base)) {\n throw new Error(\n `glaze: color \"${name}\" references non-existent base \"${regDef.base}\".`,\n );\n }\n\n if (regDef.base && isShadowDef(defs[regDef.base])) {\n throw new Error(\n `glaze: color \"${name}\" base \"${regDef.base}\" references a shadow color.`,\n );\n }\n\n if (!isAbsoluteLightness(regDef.lightness) && regDef.base === undefined) {\n throw new Error(\n `glaze: color \"${name}\" must have either absolute \"lightness\" (root) or \"base\" (dependent).`,\n );\n }\n\n if (regDef.contrast !== undefined && regDef.opacity !== undefined) {\n console.warn(\n `glaze: color \"${name}\" has both \"contrast\" and \"opacity\". Opacity makes perceived lightness unpredictable.`,\n );\n }\n }\n\n // Check for circular references (follows base, bg, fg edges)\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 (isShadowDef(def)) {\n dfs(def.bg);\n if (def.fg) dfs(def.fg);\n } else if (isMixDef(def)) {\n dfs(def.base);\n dfs(def.target);\n } else {\n const regDef = def as RegularColorDef;\n if (regDef.base) {\n dfs(regDef.base);\n }\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 (isShadowDef(def)) {\n visit(def.bg);\n if (def.fg) visit(def.fg);\n } else if (isMixDef(def)) {\n visit(def.base);\n visit(def.target);\n } else {\n const regDef = def as RegularColorDef;\n if (regDef.base) {\n visit(regDef.base);\n }\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// Lightness window selection\n// ============================================================================\n\nfunction lightnessWindow(\n isHighContrast: boolean,\n kind: 'light' | 'dark',\n): [number, number] {\n if (isHighContrast) return [0, 100];\n return kind === 'dark'\n ? globalConfig.darkLightness\n : globalConfig.lightLightness;\n}\n\n// ============================================================================\n// Light scheme mapping\n// ============================================================================\n\nfunction mapLightnessLight(\n l: number,\n mode: AdaptationMode,\n isHighContrast: boolean,\n): number {\n if (mode === 'static') return l;\n const [lo, hi] = lightnessWindow(isHighContrast, 'light');\n return (l * (hi - lo)) / 100 + lo;\n}\n\n// ============================================================================\n// Dark scheme mapping\n// ============================================================================\n\nfunction mobiusCurve(t: number, beta: number): number {\n if (beta >= 1) return t;\n return t / (t + beta * (1 - t));\n}\n\nfunction mapLightnessDark(\n l: number,\n mode: AdaptationMode,\n isHighContrast: boolean,\n): number {\n if (mode === 'static') return l;\n\n const beta = isHighContrast\n ? pairHC(globalConfig.darkCurve)\n : pairNormal(globalConfig.darkCurve);\n const [darkLo, darkHi] = lightnessWindow(isHighContrast, 'dark');\n\n if (mode === 'fixed') {\n return (l * (darkHi - darkLo)) / 100 + darkLo;\n }\n\n const [lightLo, lightHi] = lightnessWindow(isHighContrast, 'light');\n const lightL = (l * (lightHi - lightLo)) / 100 + lightLo;\n const t = (lightHi - lightL) / (lightHi - lightLo);\n return darkLo + (darkHi - darkLo) * mobiusCurve(t, beta);\n}\n\nfunction lightMappedToDark(lightL: number, isHighContrast: boolean): number {\n const beta = isHighContrast\n ? pairHC(globalConfig.darkCurve)\n : pairNormal(globalConfig.darkCurve);\n const [lightLo, lightHi] = lightnessWindow(isHighContrast, 'light');\n const [darkLo, darkHi] = lightnessWindow(isHighContrast, 'dark');\n const clamped = clamp(lightL, lightLo, lightHi);\n const t = (lightHi - clamped) / (lightHi - lightLo);\n return darkLo + (darkHi - darkLo) * mobiusCurve(t, beta);\n}\n\nfunction mapSaturationDark(s: number, mode: AdaptationMode): number {\n if (mode === 'static') return s;\n return s * (1 - globalConfig.darkDesaturation);\n}\n\nfunction schemeLightnessRange(\n isDark: boolean,\n mode: AdaptationMode,\n isHighContrast: boolean,\n): [number, number] {\n if (mode === 'static') return [0, 1];\n const [lo, hi] = lightnessWindow(isHighContrast, isDark ? 'dark' : 'light');\n return [lo / 100, hi / 100];\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: RegularColorDef,\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: RegularColorDef,\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 const baseVariant = getSchemeVariant(baseResolved, isDark, isHighContrast);\n const baseL = baseVariant.l * 100;\n\n let preferredL: number;\n const rawLightness = def.lightness;\n\n if (rawLightness === undefined) {\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 const delta = parsed.value;\n if (isDark && mode === 'auto') {\n const baseLightVariant = getSchemeVariant(\n baseResolved,\n false,\n isHighContrast,\n );\n const absoluteLightL = clamp(baseLightVariant.l * 100 + delta, 0, 100);\n preferredL = lightMappedToDark(absoluteLightL, isHighContrast);\n } else {\n preferredL = clamp(baseL + delta, 0, 100);\n }\n } else {\n if (isDark) {\n preferredL = mapLightnessDark(parsed.value, mode, isHighContrast);\n } else {\n preferredL = mapLightnessLight(parsed.value, mode, isHighContrast);\n }\n }\n }\n\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 const baseLinearRgb = okhslToLinearSrgb(\n baseVariant.h,\n baseVariant.s,\n baseVariant.l,\n );\n\n const windowRange = schemeLightnessRange(isDark, mode, isHighContrast);\n\n const result = findLightnessForContrast({\n hue: effectiveHue,\n saturation: effectiveSat,\n preferredLightness: clamp(\n preferredL / 100,\n windowRange[0],\n windowRange[1],\n ),\n baseLinearRgb,\n contrast: minCr,\n lightnessRange: [0, 1],\n });\n\n return { l: result.lightness * 100, satFactor };\n }\n\n return { l: clamp(preferredL, 0, 100), satFactor };\n}\n\nfunction getSchemeVariant(\n color: ResolvedColor,\n isDark: boolean,\n isHighContrast: boolean,\n): ResolvedColorVariant {\n if (isDark && isHighContrast) return color.darkContrast;\n if (isDark) return color.dark;\n if (isHighContrast) return color.lightContrast;\n return color.light;\n}\n\nfunction resolveColorForScheme(\n name: string,\n def: ColorDef,\n ctx: ResolveContext,\n isDark: boolean,\n isHighContrast: boolean,\n): ResolvedColorVariant {\n if (isShadowDef(def)) {\n return resolveShadowForScheme(def, ctx, isDark, isHighContrast);\n }\n\n if (isMixDef(def)) {\n return resolveMixForScheme(def, ctx, isDark, isHighContrast);\n }\n\n const regDef = def as RegularColorDef;\n const mode = regDef.mode ?? 'auto';\n const isRoot = isAbsoluteLightness(regDef.lightness) && !regDef.base;\n const effectiveHue = resolveEffectiveHue(ctx.hue, regDef.hue);\n\n let lightL: number;\n let satFactor: number;\n\n if (isRoot) {\n const root = resolveRootColor(name, regDef, ctx, isHighContrast);\n lightL = root.lightL;\n satFactor = root.satFactor;\n } else {\n const dep = resolveDependentColor(\n name,\n regDef,\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, isHighContrast);\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 if (isRoot) {\n finalL = mapLightnessLight(lightL, mode, isHighContrast);\n finalSat = (satFactor * ctx.saturation) / 100;\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 alpha: regDef.opacity ?? 1,\n };\n}\n\nfunction resolveShadowForScheme(\n def: ShadowColorDef,\n ctx: ResolveContext,\n isDark: boolean,\n isHighContrast: boolean,\n): ResolvedColorVariant {\n const bgResolved = ctx.resolved.get(def.bg)!;\n const bgVariant = getSchemeVariant(bgResolved, isDark, isHighContrast);\n\n let fgVariant: ResolvedColorVariant | undefined;\n if (def.fg) {\n const fgResolved = ctx.resolved.get(def.fg)!;\n fgVariant = getSchemeVariant(fgResolved, isDark, isHighContrast);\n }\n\n const intensity = isHighContrast\n ? pairHC(def.intensity)\n : pairNormal(def.intensity);\n\n const tuning = resolveShadowTuning(def.tuning);\n return computeShadow(bgVariant, fgVariant, intensity, tuning);\n}\n\nfunction variantToLinearRgb(v: ResolvedColorVariant): LinearRgb {\n return okhslToLinearSrgb(v.h, v.s, v.l);\n}\n\n/**\n * Resolve hue for OKHSL mixing, handling achromatic colors.\n * When one color has no saturation, its hue is meaningless —\n * use the hue from the color that has saturation (matches CSS\n * color-mix \"missing component\" behavior).\n */\nfunction mixHue(\n base: ResolvedColorVariant,\n target: ResolvedColorVariant,\n t: number,\n): number {\n const SAT_EPSILON = 1e-6;\n const baseHasSat = base.s > SAT_EPSILON;\n const targetHasSat = target.s > SAT_EPSILON;\n\n if (baseHasSat && targetHasSat) return circularLerp(base.h, target.h, t);\n if (targetHasSat) return target.h;\n return base.h;\n}\n\nfunction linearSrgbLerp(\n base: LinearRgb,\n target: LinearRgb,\n t: number,\n): LinearRgb {\n return [\n base[0] + (target[0] - base[0]) * t,\n base[1] + (target[1] - base[1]) * t,\n base[2] + (target[2] - base[2]) * t,\n ];\n}\n\nfunction linearRgbToVariant(rgb: LinearRgb): ResolvedColorVariant {\n const gamma: [number, number, number] = [\n Math.max(0, Math.min(1, sRGBLinearToGamma(rgb[0]))),\n Math.max(0, Math.min(1, sRGBLinearToGamma(rgb[1]))),\n Math.max(0, Math.min(1, sRGBLinearToGamma(rgb[2]))),\n ];\n const [h, s, l] = srgbToOkhsl(gamma);\n return { h, s, l, alpha: 1 };\n}\n\nfunction resolveMixForScheme(\n def: MixColorDef,\n ctx: ResolveContext,\n isDark: boolean,\n isHighContrast: boolean,\n): ResolvedColorVariant {\n const baseResolved = ctx.resolved.get(def.base)!;\n const targetResolved = ctx.resolved.get(def.target)!;\n const baseVariant = getSchemeVariant(baseResolved, isDark, isHighContrast);\n const targetVariant = getSchemeVariant(\n targetResolved,\n isDark,\n isHighContrast,\n );\n\n const rawValue = isHighContrast ? pairHC(def.value) : pairNormal(def.value);\n let t = clamp(rawValue, 0, 100) / 100;\n\n const blend = def.blend ?? 'opaque';\n const space = def.space ?? 'okhsl';\n const baseLinear = variantToLinearRgb(baseVariant);\n const targetLinear = variantToLinearRgb(targetVariant);\n\n if (def.contrast !== undefined) {\n const minCr = isHighContrast\n ? pairHC(def.contrast)\n : pairNormal(def.contrast);\n\n let luminanceAt: (v: number) => number;\n\n if (blend === 'transparent') {\n luminanceAt = (v: number) =>\n gamutClampedLuminance(linearSrgbLerp(baseLinear, targetLinear, v));\n } else if (space === 'srgb') {\n luminanceAt = (v: number) =>\n gamutClampedLuminance(linearSrgbLerp(baseLinear, targetLinear, v));\n } else {\n luminanceAt = (v: number) => {\n const h = mixHue(baseVariant, targetVariant, v);\n const s = baseVariant.s + (targetVariant.s - baseVariant.s) * v;\n const l = baseVariant.l + (targetVariant.l - baseVariant.l) * v;\n return gamutClampedLuminance(okhslToLinearSrgb(h, s, l));\n };\n }\n\n const result = findValueForMixContrast({\n preferredValue: t,\n baseLinearRgb: baseLinear,\n targetLinearRgb: targetLinear,\n contrast: minCr,\n luminanceAtValue: luminanceAt,\n });\n t = result.value;\n }\n\n if (blend === 'transparent') {\n return {\n h: targetVariant.h,\n s: targetVariant.s,\n l: targetVariant.l,\n alpha: clamp(t, 0, 1),\n };\n }\n\n if (space === 'srgb') {\n const mixed = linearSrgbLerp(baseLinear, targetLinear, t);\n return linearRgbToVariant(mixed);\n }\n\n return {\n h: mixHue(baseVariant, targetVariant, t),\n s: clamp(baseVariant.s + (targetVariant.s - baseVariant.s) * t, 0, 1),\n l: clamp(baseVariant.l + (targetVariant.l - baseVariant.l) * t, 0, 1),\n alpha: 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 function defMode(def: ColorDef): AdaptationMode | undefined {\n if (isShadowDef(def) || isMixDef(def)) return undefined;\n return (def as RegularColorDef).mode ?? 'auto';\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: defMode(defs[name]),\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: defMode(defs[name]),\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: defMode(defs[name]),\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 fmt(value: number, decimals: number): string {\n return parseFloat(value.toFixed(decimals)).toString();\n}\n\nfunction formatVariant(\n v: ResolvedColorVariant,\n format: GlazeColorFormat = 'okhsl',\n): string {\n const base = formatters[format](v.h, v.s * 100, v.l * 100);\n if (v.alpha >= 1) return base;\n const closing = base.lastIndexOf(')');\n return `${base.slice(0, closing)} / ${fmt(v.alpha, 4)})`;\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 buildFlatTokenMap(\n resolved: Map<string, ResolvedColor>,\n prefix: string,\n modes: Required<GlazeOutputModes>,\n format: GlazeColorFormat = 'okhsl',\n): Record<string, Record<string, string>> {\n const result: Record<string, Record<string, string>> = {\n light: {},\n };\n\n if (modes.dark) {\n result.dark = {};\n }\n if (modes.highContrast) {\n result.lightContrast = {};\n }\n if (modes.dark && modes.highContrast) {\n result.darkContrast = {};\n }\n\n for (const [name, color] of resolved) {\n const key = `${prefix}${name}`;\n\n result.light[key] = formatVariant(color.light, format);\n\n if (modes.dark) {\n result.dark[key] = formatVariant(color.dark, format);\n }\n if (modes.highContrast) {\n result.lightContrast[key] = formatVariant(color.lightContrast, format);\n }\n if (modes.dark && modes.highContrast) {\n result.darkContrast[key] = formatVariant(color.darkContrast, format);\n }\n }\n\n return result;\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\nfunction buildCssMap(\n resolved: Map<string, ResolvedColor>,\n prefix: string,\n suffix: string,\n format: GlazeColorFormat,\n): GlazeCssResult {\n const lines: Record<keyof GlazeCssResult, string[]> = {\n light: [],\n dark: [],\n lightContrast: [],\n darkContrast: [],\n };\n\n for (const [name, color] of resolved) {\n const prop = `--${prefix}${name}${suffix}`;\n lines.light.push(`${prop}: ${formatVariant(color.light, format)};`);\n lines.dark.push(`${prop}: ${formatVariant(color.dark, format)};`);\n lines.lightContrast.push(\n `${prop}: ${formatVariant(color.lightContrast, format)};`,\n );\n lines.darkContrast.push(\n `${prop}: ${formatVariant(color.darkContrast, format)};`,\n );\n }\n\n return {\n light: lines.light.join('\\n'),\n dark: lines.dark.join('\\n'),\n lightContrast: lines.lightContrast.join('\\n'),\n darkContrast: lines.darkContrast.join('\\n'),\n };\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\n const inheritedColors: ColorMap = {};\n for (const [name, def] of Object.entries(colorDefs)) {\n if (def.inherit !== false) {\n inheritedColors[name] = def;\n }\n }\n\n const mergedColors = options.colors\n ? { ...inheritedColors, ...options.colors }\n : { ...inheritedColors };\n\n return createTheme(newHue, newSat, mergedColors);\n },\n\n resolve(): Map<string, ResolvedColor> {\n return resolveAllColors(hue, saturation, colorDefs);\n },\n\n tokens(options?: GlazeJsonOptions): Record<string, Record<string, string>> {\n const resolved = resolveAllColors(hue, saturation, colorDefs);\n const modes = resolveModes(options?.modes);\n return buildFlatTokenMap(resolved, '', modes, options?.format);\n },\n\n tasty(options?: GlazeTokenOptions): 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\n css(options?: GlazeCssOptions): GlazeCssResult {\n const resolved = resolveAllColors(hue, saturation, colorDefs);\n return buildCssMap(\n resolved,\n '',\n options?.suffix ?? '-color',\n options?.format ?? 'rgb',\n );\n },\n } as GlazeTheme;\n\n return theme;\n}\n\n// ============================================================================\n// Palette\n// ============================================================================\n\ntype PaletteInput = Record<string, GlazeTheme>;\n\nfunction resolvePrefix(\n options: { prefix?: boolean | Record<string, string> } | undefined,\n themeName: string,\n defaultPrefix = false,\n): string {\n const prefix = options?.prefix ?? defaultPrefix;\n if (prefix === true) {\n return `${themeName}-`;\n }\n if (typeof prefix === 'object' && prefix !== null) {\n return prefix[themeName] ?? `${themeName}-`;\n }\n return '';\n}\n\nfunction validatePrimaryTheme(\n primary: string | undefined,\n themes: PaletteInput,\n): void {\n if (primary !== undefined && !(primary in themes)) {\n const available = Object.keys(themes).join(', ');\n throw new Error(\n `glaze: primary theme \"${primary}\" not found in palette. Available: ${available}.`,\n );\n }\n}\n\n/**\n * Resolve the effective primary for an export call.\n * `false` disables, a string overrides, `undefined` inherits from palette.\n */\nfunction resolveEffectivePrimary(\n exportPrimary: string | false | undefined,\n palettePrimary: string | undefined,\n): string | undefined {\n if (exportPrimary === false) return undefined;\n return exportPrimary ?? palettePrimary;\n}\n\n/**\n * Filter a resolved color map, skipping keys already in `seen`.\n * Warns on collision and keeps the first-written value (first-write-wins).\n * Returns a new map containing only non-colliding entries.\n */\nfunction filterCollisions(\n resolved: Map<string, ResolvedColor>,\n prefix: string,\n seen: Map<string, string>,\n themeName: string,\n isPrimary?: boolean,\n): Map<string, ResolvedColor> {\n const filtered = new Map<string, ResolvedColor>();\n const label = isPrimary ? `${themeName} (primary)` : themeName;\n\n for (const [name, color] of resolved) {\n const key = `${prefix}${name}`;\n if (seen.has(key)) {\n console.warn(\n `glaze: token \"${key}\" from theme \"${label}\" collides with theme \"${seen.get(key)}\" — skipping.`,\n );\n continue;\n }\n seen.set(key, label);\n filtered.set(name, color);\n }\n return filtered;\n}\n\nfunction createPalette(\n themes: PaletteInput,\n paletteOptions?: GlazePaletteOptions,\n) {\n validatePrimaryTheme(paletteOptions?.primary, themes);\n\n return {\n tokens(\n options?: GlazeJsonOptions & GlazePaletteExportOptions,\n ): Record<string, Record<string, string>> {\n const effectivePrimary = resolveEffectivePrimary(\n options?.primary,\n paletteOptions?.primary,\n );\n if (options?.primary !== undefined) {\n validatePrimaryTheme(effectivePrimary, themes);\n }\n const modes = resolveModes(options?.modes);\n const allTokens: Record<string, Record<string, string>> = {};\n const seen = new Map<string, string>();\n\n for (const [themeName, theme] of Object.entries(themes)) {\n const resolved = theme.resolve();\n const prefix = resolvePrefix(options, themeName, true);\n const filtered = filterCollisions(resolved, prefix, seen, themeName);\n const tokens = buildFlatTokenMap(\n filtered,\n prefix,\n modes,\n options?.format,\n );\n\n for (const variant of Object.keys(tokens)) {\n if (!allTokens[variant]) {\n allTokens[variant] = {};\n }\n Object.assign(allTokens[variant], tokens[variant]);\n }\n\n if (themeName === effectivePrimary) {\n const primaryFiltered = filterCollisions(\n resolved,\n '',\n seen,\n themeName,\n true,\n );\n const unprefixed = buildFlatTokenMap(\n primaryFiltered,\n '',\n modes,\n options?.format,\n );\n for (const variant of Object.keys(unprefixed)) {\n Object.assign(allTokens[variant]!, unprefixed[variant]);\n }\n }\n }\n\n return allTokens;\n },\n\n tasty(\n options?: GlazeTokenOptions & GlazePaletteExportOptions,\n ): Record<string, Record<string, string>> {\n const effectivePrimary = resolveEffectivePrimary(\n options?.primary,\n paletteOptions?.primary,\n );\n if (options?.primary !== undefined) {\n validatePrimaryTheme(effectivePrimary, themes);\n }\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 const seen = new Map<string, string>();\n\n for (const [themeName, theme] of Object.entries(themes)) {\n const resolved = theme.resolve();\n const prefix = resolvePrefix(options, themeName, true);\n const filtered = filterCollisions(resolved, prefix, seen, themeName);\n const tokens = buildTokenMap(\n filtered,\n prefix,\n states,\n modes,\n options?.format,\n );\n Object.assign(allTokens, tokens);\n\n if (themeName === effectivePrimary) {\n const primaryFiltered = filterCollisions(\n resolved,\n '',\n seen,\n themeName,\n true,\n );\n const unprefixed = buildTokenMap(\n primaryFiltered,\n '',\n states,\n modes,\n options?.format,\n );\n Object.assign(allTokens, unprefixed);\n }\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 css(options?: GlazeCssOptions & GlazePaletteExportOptions): GlazeCssResult {\n const effectivePrimary = resolveEffectivePrimary(\n options?.primary,\n paletteOptions?.primary,\n );\n if (options?.primary !== undefined) {\n validatePrimaryTheme(effectivePrimary, themes);\n }\n const suffix = options?.suffix ?? '-color';\n const format = options?.format ?? 'rgb';\n\n const allLines: Record<keyof GlazeCssResult, string[]> = {\n light: [],\n dark: [],\n lightContrast: [],\n darkContrast: [],\n };\n const seen = new Map<string, string>();\n\n for (const [themeName, theme] of Object.entries(themes)) {\n const resolved = theme.resolve();\n const prefix = resolvePrefix(options, themeName, true);\n const filtered = filterCollisions(resolved, prefix, seen, themeName);\n\n const css = buildCssMap(filtered, prefix, suffix, format);\n\n for (const key of [\n 'light',\n 'dark',\n 'lightContrast',\n 'darkContrast',\n ] as const) {\n if (css[key]) {\n allLines[key].push(css[key]);\n }\n }\n\n if (themeName === effectivePrimary) {\n const primaryFiltered = filterCollisions(\n resolved,\n '',\n seen,\n themeName,\n true,\n );\n const unprefixed = buildCssMap(primaryFiltered, '', suffix, format);\n for (const key of [\n 'light',\n 'dark',\n 'lightContrast',\n 'darkContrast',\n ] as const) {\n if (unprefixed[key]) {\n allLines[key].push(unprefixed[key]);\n }\n }\n }\n }\n\n return {\n light: allLines.light.join('\\n'),\n dark: allLines.dark.join('\\n'),\n lightContrast: allLines.lightContrast.join('\\n'),\n darkContrast: allLines.darkContrast.join('\\n'),\n };\n },\n };\n}\n\n// ============================================================================\n// Standalone color token\n// ============================================================================\n\nfunction createColorToken(input: GlazeColorInput): GlazeColorToken {\n const colorDef: RegularColorDef = {\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 tasty(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 lightLightness: config.lightLightness ?? globalConfig.lightLightness,\n darkLightness: config.darkLightness ?? globalConfig.darkLightness,\n darkDesaturation: config.darkDesaturation ?? globalConfig.darkDesaturation,\n darkCurve: config.darkCurve ?? globalConfig.darkCurve,\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 shadowTuning: config.shadowTuning ?? globalConfig.shadowTuning,\n };\n};\n\n/**\n * Compose multiple themes into a palette.\n */\nglaze.palette = function palette(\n themes: PaletteInput,\n options?: GlazePaletteOptions,\n) {\n return createPalette(themes, options);\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 * Compute a shadow color from a bg/fg pair and intensity.\n */\nglaze.shadow = function shadow(input: GlazeShadowInput): ResolvedColorVariant {\n const bg = parseOkhslInput(input.bg);\n const fg = input.fg ? parseOkhslInput(input.fg) : undefined;\n const tuning = resolveShadowTuning(input.tuning);\n return computeShadow(\n { ...bg, alpha: 1 },\n fg ? { ...fg, alpha: 1 } : undefined,\n input.intensity,\n tuning,\n );\n};\n\n/**\n * Format a resolved color variant as a CSS string.\n */\nglaze.format = function format(\n variant: ResolvedColorVariant,\n colorFormat?: GlazeColorFormat,\n): string {\n return formatVariant(variant, colorFormat);\n};\n\nfunction parseOkhslInput(input: string | OkhslColor): OkhslColor {\n if (typeof input === 'string') {\n const rgb = parseHex(input);\n if (!rgb) throw new Error(`glaze: invalid hex color \"${input}\".`);\n const [h, s, l] = srgbToOkhsl(rgb);\n return { h, s, l };\n }\n return 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 lightLightness: [10, 100],\n darkLightness: [15, 95],\n darkDesaturation: 0.1,\n darkCurve: 0.5,\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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"}