{"version":3,"sources":["../src/converters/index.ts","../src/modules/constants.ts","../src/modules/invariant.ts","../src/modules/css-colors.ts","../src/modules/validators.ts","../src/format-hex.ts","../src/modules/utils.ts","../src/modules/alpha.ts","../src/converters/hex2rgb.ts","../src/converters/rgb2hsl.ts","../src/converters/hex2hsl.ts","../src/modules/gamma.ts","../src/converters/rgb2oklab.ts","../src/converters/hex2oklab.ts","../src/converters/oklab2oklch.ts","../src/converters/rgb2oklch.ts","../src/converters/hex2oklch.ts","../src/modules/hue2rgb.ts","../src/converters/hsl2rgb.ts","../src/converters/rgb2hex.ts","../src/converters/hsl2hex.ts","../src/converters/hsl2oklab.ts","../src/converters/hsl2oklch.ts","../src/converters/oklab2rgb.ts","../src/converters/oklab2hex.ts","../src/converters/oklab2hsl.ts","../src/converters/oklch2oklab.ts","../src/converters/oklch2rgb.ts","../src/converters/oklch2hex.ts","../src/converters/oklch2hsl.ts","../src/format-css.ts","../src/extract-color-parts.ts","../src/modules/parsed-color.ts","../src/convertCSS.ts","../src/apca.ts","../src/brightness-difference.ts","../src/chroma.ts","../src/color-difference.ts","../src/luminance.ts","../src/contrast.ts","../src/compare.ts","../src/modules/updater.ts","../src/darken.ts","../src/delta-e.ts","../src/desaturate.ts","../src/grayscale.ts","../src/rotate.ts","../src/invert.ts","../src/lighten.ts","../src/mix.ts","../src/opacify.ts","../src/opacity.ts","../src/readable-color.ts","../src/saturate.ts","../src/modules/linear-rgb.ts","../src/to-gamut.ts","../src/transparentize.ts","../src/colorizr.ts","../src/get-color-type.ts","../src/is-valid-color.ts","../src/name.ts","../src/parse-css.ts","../src/p3.ts","../src/palette.ts","../src/random.ts","../src/scale.ts","../src/scheme.ts"],"sourcesContent":["export { default as hex2hsl } from '~/converters/hex2hsl';\nexport { default as hex2oklab } from '~/converters/hex2oklab';\nexport { default as hex2oklch } from '~/converters/hex2oklch';\nexport { default as hex2rgb } from '~/converters/hex2rgb';\n\nexport { default as hsl2hex } from '~/converters/hsl2hex';\nexport { default as hsl2oklab } from '~/converters/hsl2oklab';\nexport { default as hsl2oklch } from '~/converters/hsl2oklch';\nexport { default as hsl2rgb } from '~/converters/hsl2rgb';\n\nexport { default as oklab2hex } from '~/converters/oklab2hex';\nexport { default as oklab2hsl } from '~/converters/oklab2hsl';\nexport { default as oklab2oklch } from '~/converters/oklab2oklch';\nexport { default as oklab2rgb } from '~/converters/oklab2rgb';\n\nexport { default as oklch2hex } from '~/converters/oklch2hex';\nexport { default as oklch2hsl } from '~/converters/oklch2hsl';\nexport { default as oklch2oklab } from '~/converters/oklch2oklab';\nexport { default as oklch2rgb } from '~/converters/oklch2rgb';\n\nexport { default as rgb2hex } from '~/converters/rgb2hex';\nexport { default as rgb2hsl } from '~/converters/rgb2hsl';\nexport { default as rgb2oklab } from '~/converters/rgb2oklab';\nexport { default as rgb2oklch } from '~/converters/rgb2oklch';\n","import { ColorKeysTuple, ColorModelKey } from '~/types';\n\nexport const COLOR_KEYS: Record<ColorModelKey, ColorKeysTuple> = {\n  hsl: ['h', 's', 'l'],\n  oklab: ['l', 'a', 'b'],\n  oklch: ['l', 'c', 'h'],\n  rgb: ['r', 'g', 'b'],\n};\nexport const CLMS_TO_OKLAB: number[][] = [\n  [0.210454268309314, 0.7936177747023054, -0.0040720430116193],\n  [1.9779985324311684, -2.4285922420485799, 0.450593709617411],\n  [0.0259040424655478, 0.7827717124575296, -0.8086757549230774],\n];\nexport const DEG2RAD = Math.PI / 180;\nexport const LMS_TO_LRGB: number[][] = [\n  [4.0767416621, -3.3077115913, 0.2309699292],\n  [-1.2684380046, 2.6097574011, -0.3413193965],\n  [-0.0041960863, -0.7034186147, 1.707614701],\n];\nexport const LRGB_TO_LMS: number[][] = [\n  [0.4122214708, 0.5363325363, 0.0514459929],\n  [0.2119034982, 0.6806995451, 0.1073969566],\n  [0.0883024619, 0.2817188376, 0.6299787005],\n];\nexport const OKLAB_TO_CLMS: number[][] = [\n  [1.0, 0.3963377773761749, 0.2158037573099136],\n  [1.0, -0.1055613458156586, -0.0638541728258133],\n  [1.0, -0.0894841775298119, -1.2914855480194092],\n];\nexport const P3_TO_SRGB: number[][] = [\n  [1.2249401762805601, -0.22494017628055996, 0],\n  [-0.042056954709688121, 1.0420569547096883, 0],\n  [-0.019637554590334422, -0.078636045550631792, 1.0982736001409665],\n];\nexport const P3_TO_XYZ: number[][] = [\n  [0.4865709486482162, 0.26566769316909306, 0.1982172852343625],\n  [0.22897456406974884, 0.6917385218365064, 0.079286914093745],\n  [0.0, 0.04511338185890264, 1.043944368900976],\n];\nexport const SRGB_TO_P3: number[][] = [\n  [0.8224270476, 0.1775729524, 0],\n  [0.0331008087, 0.9668991913, 0],\n  [0.0170720188, 0.0723477973, 0.9105801839],\n];\nexport const XYZ_TO_SRGB: number[][] = [\n  [3.2409699419045226, -1.5373831775700939, -0.4986107602930034],\n  [-0.9692436362808796, 1.8759675015077202, 0.0415550574071756],\n  [0.0556300796969936, -0.2039769588889765, 1.0569715142428786],\n];\nexport const GAMUT_EPSILON = 0.000001;\nexport const PRECISION = 5;\nexport const RAD2DEG = 180 / Math.PI;\n\nexport const MESSAGES = {\n  alpha: 'alpha must be a number between 0 and 1',\n  alphaAdjustment: 'alpha must be a number between -1 and 1',\n  amount: 'amount must be a number between 0 and 100',\n  colorRequired: 'color is required',\n  degreesRange: 'degrees must be a number between -360 and 360',\n  hueArgs: 'point, chroma and h are required',\n  hueRange: 'hue must be a number between 0 and 360',\n  input: 'input is required',\n  inputHex: 'input is required and must be a hex',\n  inputNumber: 'input is required and must be a number',\n  inputString: 'input is required and must be a string',\n  invalid: 'invalid input',\n  invalidColor: 'invalid color',\n  invalidCSS: 'invalid CSS string',\n  invalidHex: 'invalid hex',\n  invalidKey: 'invalid key',\n  invalidModel: 'invalid model',\n  invalidRange: 'color value out of range',\n  left: 'left is required and must be a string',\n  lightnessRange: 'lightness must be a number between 0 and 1',\n  options: 'invalid options',\n  paletteSize: 'palette size must be at least 2',\n  ratioRange: 'ratio must be a number between 0 and 1',\n  right: 'right is required and must be a string',\n  threshold: 'threshold must be a number between 0 and 255',\n  thresholdNormalized: 'threshold must be a number between 0 and 1',\n} as const;\n\nexport const MONOCHROMATIC_LIGHTNESS_MAX = 80;\n","/**\n * Assert a condition and throw an error if false.\n *\n * @param condition - The condition to assert.\n * @param message - The error message if condition is false.\n * @throws Error with name 'colorizr' if condition is false.\n */\nexport function invariant(condition: boolean, message: string): asserts condition {\n  if (condition) {\n    return;\n  }\n\n  if (process.env.NODE_ENV !== 'production' && message === undefined) {\n    throw new Error('invariant requires an error message argument');\n  }\n\n  const error = !message\n    ? new Error(\n        'Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.',\n      )\n    : new Error(message);\n\n  error.name = 'colorizr';\n\n  throw error;\n}\n","/**\n * CSS named colors\n */\n\nexport type CSSColor = keyof typeof cssColors;\n\nexport const cssColors = {\n  aliceblue: '#f0f8ff',\n  antiquewhite: '#faebd7',\n  aqua: '#00ffff',\n  aquamarine: '#7fffd4',\n  azure: '#f0ffff',\n  beige: '#f5f5dc',\n  bisque: '#ffe4c4',\n  black: '#000000',\n  blanchedalmond: '#ffebcd',\n  blue: '#0000ff',\n  blueviolet: '#8a2be2',\n  brown: '#a52a2a',\n  burlywood: '#deb887',\n  cadetblue: '#5f9ea0',\n  chartreuse: '#7fff00',\n  chocolate: '#d2691e',\n  coral: '#ff7f50',\n  cornflowerblue: '#6495ed',\n  cornsilk: '#fff8dc',\n  crimson: '#dc143c',\n  cyan: '#00ffff',\n  darkblue: '#00008b',\n  darkcyan: '#008b8b',\n  darkgoldenrod: '#b8860b',\n  darkgray: '#a9a9a9',\n  darkgreen: '#006400',\n  darkkhaki: '#bdb76b',\n  darkmagenta: '#8b008b',\n  darkolivegreen: '#556b2f',\n  darkorange: '#ff8c00',\n  darkorchid: '#9932cc',\n  darkred: '#8b0000',\n  darksalmon: '#e9967a',\n  darkseagreen: '#8fbc8f',\n  darkslateblue: '#483d8b',\n  darkslategray: '#2f4f4f',\n  darkslategrey: '#2f4f4f',\n  darkturquoise: '#00ced1',\n  darkviolet: '#9400d3',\n  deeppink: '#ff1493',\n  deepskyblue: '#00bfff',\n  dimgray: '#696969',\n  dimgrey: '#696969',\n  dodgerblue: '#1e90ff',\n  firebrick: '#b22222',\n  floralwhite: '#fffaf0',\n  forestgreen: '#228b22',\n  fuchsia: '#ff00ff',\n  gainsboro: '#dcdcdc',\n  ghostwhite: '#f8f8ff',\n  gold: '#ffd700',\n  goldenrod: '#daa520',\n  gray: '#808080',\n  grey: '#808080',\n  green: '#008000',\n  greenyellow: '#adff2f',\n  honeydew: '#f0fff0',\n  hotpink: '#ff69b4',\n  indianred: '#cd5c5c',\n  indigo: '#4b0082',\n  ivory: '#fffff0',\n  khaki: '#f0e68c',\n  lavender: '#e6e6fa',\n  lavenderblush: '#fff0f5',\n  lawngreen: '#7cfc00',\n  lemonchiffon: '#fffacd',\n  lightblue: '#add8e6',\n  lightcoral: '#f08080',\n  lightcyan: '#e0ffff',\n  lightgoldenrodyellow: '#fafad2',\n  lightgray: '#d3d3d3',\n  lightgreen: '#90ee90',\n  lightgrey: '#d3d3d3',\n  lightpink: '#ffb6c1',\n  lightsalmon: '#ffa07a',\n  lightseagreen: '#20b2aa',\n  lightskyblue: '#87cefa',\n  lightslategray: '#778899',\n  lightslategrey: '#778899',\n  lightsteelblue: '#b0c4de',\n  lightyellow: '#ffffe0',\n  lime: '#00ff00',\n  limegreen: '#32cd32',\n  linen: '#faf0e6',\n  magenta: '#ff00ff',\n  maroon: '#800000',\n  mediumaquamarine: '#66cdaa',\n  mediumblue: '#0000cd',\n  mediumorchid: '#ba55d3',\n  mediumpurple: '#9370db',\n  mediumseagreen: '#3cb371',\n  mediumslateblue: '#7b68ee',\n  mediumspringgreen: '#00fa9a',\n  mediumturquoise: '#48d1cc',\n  mediumvioletred: '#c71585',\n  midnightblue: '#191970',\n  mintcream: '#f5fffa',\n  mistyrose: '#ffe4e1',\n  moccasin: '#ffe4b5',\n  navajowhite: '#ffdead',\n  navy: '#000080',\n  oldlace: '#fdf5e6',\n  olive: '#808000',\n  olivedrab: '#6b8e23',\n  orange: '#ffa500',\n  orangered: '#ff4500',\n  orchid: '#da70d6',\n  palegoldenrod: '#eee8aa',\n  palegreen: '#98fb98',\n  paleturquoise: '#afeeee',\n  palevioletred: '#db7093',\n  papayawhip: '#ffefd5',\n  peachpuff: '#ffdab9',\n  peru: '#cd853f',\n  pink: '#ffc0cb',\n  plum: '#dda0dd',\n  powderblue: '#b0e0e6',\n  purple: '#800080',\n  rebeccapurple: '#663399',\n  red: '#ff0000',\n  rosybrown: '#bc8f8f',\n  royalblue: '#4169e1',\n  saddlebrown: '#8b4513',\n  salmon: '#fa8072',\n  sandybrown: '#f4a460',\n  seagreen: '#2e8b57',\n  seashell: '#fff5ee',\n  sienna: '#a0522d',\n  silver: '#c0c0c0',\n  skyblue: '#87ceeb',\n  slateblue: '#6a5acd',\n  slategray: '#708090',\n  slategrey: '#708090',\n  snow: '#fffafa',\n  springgreen: '#00ff7f',\n  steelblue: '#4682b4',\n  tan: '#d2b48c',\n  teal: '#008080',\n  thistle: '#d8bfd8',\n  tomato: '#ff6347',\n  turquoise: '#40e0d0',\n  violet: '#ee82ee',\n  wheat: '#f5deb3',\n  white: '#ffffff',\n  whitesmoke: '#f5f5f5',\n  yellow: '#ffff00',\n  yellowgreen: '#9acd32',\n};\n","import { COLOR_KEYS } from '~/modules/constants';\nimport { CSSColor, cssColors } from '~/modules/css-colors';\n\nimport { ColorModel, HEX, HSL, LAB, LCH, PlainObject, RGB } from '~/types';\n\nconst hexRegex = /^#(?:[\\da-f]{3,4}|[\\da-f]{6,8})$/i;\n\nexport function hasValidMatches(input: unknown): input is string[] {\n  return Array.isArray(input) && input.length === 6;\n}\n\nexport function isHex(input: unknown): input is HEX {\n  if (!isString(input)) {\n    return false;\n  }\n\n  return hexRegex.test(input);\n}\n\n/**\n * Check if an object contains HSL values\n * The input must be an object with keys 'h', 's', and 'l'\n * with values between 0 and 360 for hue or 0 and 100 for the others.\n */\nexport function isHSL(input: unknown): input is HSL {\n  if (!isPlainObject(input)) {\n    return false;\n  }\n\n  const entries = Object.entries(input);\n\n  return (\n    !!entries.length &&\n    entries.every(([key, value]) => {\n      if (key === 'h') {\n        return value >= 0 && value <= 360;\n      }\n\n      if (key === 'alpha') {\n        return value >= 0 && value <= 1;\n      }\n\n      return COLOR_KEYS.hsl.includes(key) && value >= 0 && value <= 100;\n    })\n  );\n}\n\n/**\n * Check if an object contains LAB values\n * The input must be an object with keys 'l', 'a', and 'b' with values between -1 and 1.\n */\nexport function isLAB(input: unknown): input is LAB {\n  if (!isPlainObject(input)) {\n    return false;\n  }\n\n  const entries = Object.entries(input);\n\n  return (\n    !!entries.length &&\n    entries.every(([key, value]) => {\n      if (key === 'l') {\n        return value >= 0 && value <= 100;\n      }\n\n      if (key === 'alpha') {\n        return value >= 0 && value <= 1;\n      }\n\n      return COLOR_KEYS.oklab.includes(key) && value >= -1 && value <= 1;\n    })\n  );\n}\n\n/**\n * Check if an object contains LAB values\n * The input must be an object with keys 'l', 'c', and 'h' with values between 0 and 360.\n */\nexport function isLCH(input: unknown): input is LCH {\n  if (!isPlainObject(input)) {\n    return false;\n  }\n\n  const entries = Object.entries(input);\n\n  return (\n    !!entries.length &&\n    entries.every(([key, value]) => {\n      if (key === 'l') {\n        return value >= 0 && value <= 100;\n      }\n\n      if (key === 'alpha') {\n        return value >= 0 && value <= 1;\n      }\n\n      return COLOR_KEYS.oklch.includes(key) && value >= 0 && value <= (key === 'h' ? 360 : 1);\n    })\n  );\n}\n\n/**\n * Check if the input is a CSS named color\n */\nexport function isNamedColor(input: unknown): input is CSSColor {\n  return isString(input) && Object.keys(cssColors).includes(input.toLowerCase());\n}\n\n/**\n * Check if the input is a number and not NaN\n */\nexport function isNumber(input: unknown): input is number {\n  return typeof input === 'number' && !Number.isNaN(input);\n}\n\n/**\n * Check if the input is a number within a specific range (inclusive)\n */\nexport function isNumberInRange(input: unknown, min: number, max: number): input is number {\n  return isNumber(input) && input >= min && input <= max;\n}\n\n/**\n * Check if the input is an object\n */\nexport function isPlainObject(input: unknown): input is PlainObject {\n  if (!input) {\n    return false;\n  }\n\n  const { toString } = Object.prototype;\n  const prototype = Object.getPrototypeOf(input);\n\n  return (\n    toString.call(input) === '[object Object]' &&\n    (prototype === null || prototype === Object.getPrototypeOf({}))\n  );\n}\n\n/**\n * Check if an object contains RGB values.\n * The input must be an object with keys 'r', 'g', and 'b' with values between 0 and 255.\n */\nexport function isRGB(input: unknown): input is RGB {\n  if (!isPlainObject(input)) {\n    return false;\n  }\n\n  const entries = Object.entries(input);\n\n  return (\n    !!entries.length &&\n    entries.every(([key, value]) => {\n      if (key === 'alpha') {\n        return value >= 0 && value <= 1;\n      }\n\n      return COLOR_KEYS.rgb.includes(key) && value >= 0 && value <= 255;\n    })\n  );\n}\n\n/**\n * Check if the input is a string\n */\nexport function isString(input: unknown, validate = true): input is string {\n  const isValid = typeof input === 'string';\n\n  if (validate) {\n    return isValid && !!input.trim().length;\n  }\n\n  return isValid;\n}\n\nexport function isValidColorModel<T extends ColorModel>(input: T): input is T {\n  return isHSL(input) || isRGB(input) || isLAB(input) || isLCH(input);\n}\n","import { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isHex, isString } from '~/modules/validators';\n\nimport { HEX } from '~/types';\n\n/**\n * Normalize a hex color string to 6 or 8 characters.\n *\n * @param input - The hex color string (3, 4, 6, or 8 characters).\n * @returns The normalized hex color string.\n */\nexport default function formatHex(input: string): HEX {\n  invariant(isString(input), MESSAGES.inputString);\n\n  let color = input.startsWith('#') ? input.slice(1) : input;\n\n  invariant(isHex(`#${color}`), MESSAGES.inputHex);\n\n  if (color.length === 3 || color.length === 4) {\n    const values = [...color];\n\n    color = '';\n\n    values.forEach(d => {\n      color += `${d}${d}`;\n    });\n  }\n\n  const hex = `#${color}`;\n\n  invariant(isHex(hex), MESSAGES.invalidHex);\n\n  return hex;\n}\n","import { COLOR_KEYS, MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isHSL, isLAB, isLCH, isNumber, isPlainObject, isRGB } from '~/modules/validators';\n\nimport { ColorModel, ColorModelKey, ConverterParameters, LAB, LCH } from '~/types';\n\n/**\n * Clamp a value between a min and max.\n *\n * @param value - The value to clamp.\n * @param min - The minimum value (default: 0).\n * @param max - The maximum value (default: 100).\n * @returns The clamped value.\n */\nexport function clamp(value: number, min = 0, max = 100): number {\n  return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Constrain the degrees between 0 and 360.\n *\n * @param input - The base degrees value.\n * @param amount - The amount to add to the degrees.\n * @returns The constrained degrees value (0-360).\n */\nexport function constrainDegrees(input: number, amount: number): number {\n  invariant(isNumber(input), MESSAGES.inputNumber);\n\n  return (((input + amount) % 360) + 360) % 360;\n}\n\n/**\n * Normalize OkLab/OkLCH lightness from percentage (0-100) to 0-1 range.\n */\nexport function normalizeOkLightness<T extends { l: number }>(color: T): T {\n  if (color.l > 1) {\n    return { ...color, l: parseFloat((color.l / 100).toPrecision(15)) };\n  }\n\n  return color;\n}\n\n/**\n * Parse the input parameters for converters.\n *\n * @param input - The converter parameters (object or tuple).\n * @param model - The target color model.\n * @returns The parsed color model object.\n */\nexport function parseInput<T extends ColorModel>(\n  input: ConverterParameters<T>,\n  model: ColorModelKey,\n): T {\n  const keys = COLOR_KEYS[model];\n  const validator = {\n    hsl: isHSL,\n    oklab: isLAB,\n    oklch: isLCH,\n    rgb: isRGB,\n  };\n\n  invariant(isPlainObject(input) || Array.isArray(input), MESSAGES.invalid);\n\n  const value = Array.isArray(input)\n    ? ({ [keys[0]]: input[0], [keys[1]]: input[1], [keys[2]]: input[2] } as unknown as T)\n    : input;\n\n  invariant(validator[model](value), `${MESSAGES.invalidColor}: ${model}`);\n\n  return value;\n}\n\n/**\n * Restrict the values to a certain number of digits.\n * When precision is undefined, returns input unchanged (no rounding).\n *\n * @param input - The LAB or LCH color model.\n * @param precision - The number of significant digits. Undefined = no rounding.\n * @param forcePrecision - Whether to use decimal places (true) or significant digits (false).\n * @returns The color model with restricted values.\n */\nexport function restrictValues<T extends LAB | LCH>(\n  input: T,\n  precision?: number,\n  forcePrecision = true,\n): T {\n  if (precision == null) {\n    return input;\n  }\n\n  const output = new Map(Object.entries(input));\n\n  for (const [key, value] of output.entries()) {\n    output.set(key, round(value, precision, forcePrecision));\n  }\n\n  return Object.fromEntries(output) as T;\n}\n\n/**\n * Round decimal numbers.\n *\n * @param input - The number to round.\n * @param precision - The number of digits (default: 2).\n * @param forcePrecision - When true, rounds to N decimal places. When false, rounds to N significant digits.\n * @returns The rounded number.\n */\nexport function round(input: number, precision = 2, forcePrecision = true): number {\n  if (!isNumber(input) || input === 0) {\n    return 0;\n  }\n\n  if (forcePrecision) {\n    const factor = 10 ** precision;\n\n    return Math.round(input * factor) / factor;\n  }\n\n  // Significant digits mode (matches color.js toPrecision behavior):\n  // For |n| >= 1: N significant digits. For |n| < 1: N decimal places.\n  const integer = Math.trunc(input);\n  let digits = 0;\n\n  if (integer) {\n    digits = Math.floor(Math.log10(Math.abs(integer))) + 1;\n  }\n\n  const factor = 10 ** (precision - digits);\n\n  return Math.floor(input * factor + 0.5) / factor;\n}\n\n/**\n * Log a warning in development mode.\n *\n * @param message - The warning message to log.\n */\nexport function warn(message: string): void {\n  if (process.env.NODE_ENV !== 'production') {\n    // eslint-disable-next-line no-console\n    console.warn(`[colorizr] ${message}`);\n  }\n}\n\n/**\n * Pre-computed step keys for each step count (3-20).\n *\n * Based on Tailwind CSS color scale conventions:\n * - Standard keys: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950\n * - 500 is typically the \"base\" color\n * - Lower numbers = lighter, higher numbers = darker (in light mode)\n *\n * Keys are symmetrically distributed to maintain visual balance.\n */\nconst STEP_KEYS: Record<number, number[]> = {\n  3: [100, 500, 900],\n  4: [100, 400, 600, 900],\n  5: [100, 300, 500, 700, 900],\n  6: [100, 200, 400, 600, 800, 900],\n  7: [100, 200, 400, 500, 600, 800, 900],\n  8: [100, 200, 300, 500, 600, 700, 800, 900],\n  9: [100, 200, 300, 400, 500, 600, 700, 800, 900],\n  10: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900],\n  11: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950],\n  12: [50, 100, 150, 200, 300, 400, 500, 600, 700, 800, 900, 950],\n  13: [50, 100, 150, 200, 300, 400, 500, 600, 700, 800, 850, 900, 950],\n  14: [50, 100, 150, 200, 250, 300, 400, 500, 600, 700, 800, 850, 900, 950],\n  15: [50, 100, 150, 200, 250, 300, 400, 500, 600, 700, 750, 800, 850, 900, 950],\n  16: [50, 100, 150, 200, 250, 300, 350, 400, 500, 600, 700, 750, 800, 850, 900, 950],\n  17: [50, 100, 150, 200, 250, 300, 350, 400, 500, 600, 650, 700, 750, 800, 850, 900, 950],\n  18: [50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 600, 650, 700, 750, 800, 850, 900, 950],\n  19: [\n    50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, 900, 950,\n  ],\n  20: [\n    50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, 900, 950,\n    1000,\n  ],\n};\n\n/**\n * Get the step keys for a given step count.\n *\n * @param steps - The number of steps (clamped to 3-20).\n * @returns The array of step keys.\n */\nexport function getScaleStepKeys(steps: number): number[] {\n  const value = clamp(Math.round(steps), 3, 20);\n\n  return STEP_KEYS[value];\n}\n","import { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { round } from '~/modules/utils';\nimport { isHex, isNumber, isNumberInRange, isValidColorModel } from '~/modules/validators';\n\nimport { ColorModel, ConverterParameters, HEX } from '~/types';\n\n/**\n * Add an alpha value to a color model.\n *\n * @param input - The color model object.\n * @param alpha - A number between 0 and 1 (values > 1 are divided by 100).\n * @returns The color model with alpha applied.\n */\nexport function addAlpha<T extends ColorModel>(input: T, alpha?: number): T {\n  invariant(isValidColorModel(input), MESSAGES.invalid);\n\n  const value = normalizeAlpha(alpha);\n\n  if (value === undefined || value === 1) {\n    return input;\n  }\n\n  return { ...input, alpha: value };\n}\n\n/**\n * Add an alpha value to a hex string.\n *\n * @param input - The hex color string.\n * @param alpha - A number between 0 and 1.\n * @returns The hex color string with alpha.\n */\nexport function addAlphaToHex(input: string, alpha: number): HEX {\n  invariant(isHex(input), MESSAGES.inputHex);\n  invariant(isNumberInRange(alpha, 0, 1), MESSAGES.alpha);\n\n  if (alpha >= 1) {\n    return removeAlphaFromHex(input);\n  }\n\n  return `${removeAlphaFromHex(input)}${convertAlphaToHex(alpha)}` as HEX;\n}\n\n/**\n * Convert an alpha value to a hex value.\n *\n * @param input - A number between 0 and 1 (values > 1 are divided by 100).\n * @returns The two-character hex string.\n */\nexport function convertAlphaToHex(input: number): string {\n  invariant(isNumber(input), MESSAGES.inputNumber);\n\n  const alpha = normalizeAlpha(input);\n\n  return Math.round(alpha * 255)\n    .toString(16)\n    .padStart(2, '0');\n}\n\n/**\n * Extract alpha from converter input.\n *\n * @param input - The converter parameters (object or tuple).\n * @returns The alpha value or undefined for tuple inputs.\n */\nexport function extractAlpha<T extends ColorModel>(\n  input: ConverterParameters<T>,\n): number | undefined {\n  if (Array.isArray(input)) {\n    return undefined;\n  }\n\n  return input.alpha;\n}\n\n/**\n * Extract the alpha value from a hex string.\n *\n * @param input - The hex color string.\n * @returns The alpha value (0-1), defaults to 1 if no alpha present.\n */\nexport function extractAlphaFromHex(input: string): number {\n  invariant(isHex(input), MESSAGES.inputString);\n\n  const alpha = input.substring(7, 9);\n\n  if (!alpha) {\n    return 1;\n  }\n\n  return round(parseInt(alpha, 16) / 255);\n}\n\n/**\n * Normalize an alpha value to the 0-1 range.\n * Values > 1 are treated as percentages and divided by 100.\n */\nexport function normalizeAlpha(value: number): number;\nexport function normalizeAlpha(value: number | undefined): number | undefined;\nexport function normalizeAlpha(value: number | undefined): number | undefined {\n  if (value === undefined) {\n    return undefined;\n  }\n\n  return Math.min(1, Math.max(0, value > 1 ? value / 100 : value));\n}\n\n/**\n * Remove the alpha value from a hex string.\n *\n * @param input - The hex color string.\n * @returns The hex color string without alpha.\n */\nexport function removeAlphaFromHex(input: string): HEX {\n  invariant(isHex(input), MESSAGES.inputHex);\n\n  if (input.length === 5) {\n    return input.substring(0, 4) as HEX;\n  }\n\n  return input.substring(0, 7) as HEX;\n}\n","import formatHex from '~/format-hex';\nimport { addAlpha, extractAlphaFromHex } from '~/modules/alpha';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isHex } from '~/modules/validators';\n\nimport { RGB } from '~/types';\n\n/**\n * Convert HEX to RGB.\n *\n * @param input - The hex color string.\n * @returns The RGB color object.\n */\nexport default function hex2rgb(input: string): RGB {\n  invariant(isHex(input), MESSAGES.inputHex);\n\n  const hex = formatHex(input).slice(1);\n  const alpha = extractAlphaFromHex(input);\n\n  return addAlpha(\n    {\n      r: parseInt(hex.charAt(0) + hex.charAt(1), 16),\n      g: parseInt(hex.charAt(2) + hex.charAt(3), 16),\n      b: parseInt(hex.charAt(4) + hex.charAt(5), 16),\n    },\n    alpha,\n  );\n}\n","import { addAlpha, extractAlpha } from '~/modules/alpha';\nimport { clamp, parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, HSL, RGB } from '~/types';\n\n/**\n * Convert RGB to HSL.\n *\n * @param input - The RGB color object or tuple.\n * @returns The HSL color object.\n */\nexport default function rgb2hsl(input: ConverterParameters<RGB>): HSL {\n  const value = parseInput(input, 'rgb');\n  const alpha = extractAlpha(input);\n\n  const rLimit = clamp(value.r, 0, 255) / 255;\n  const gLimit = clamp(value.g, 0, 255) / 255;\n  const bLimit = clamp(value.b, 0, 255) / 255;\n\n  const min = Math.min(rLimit, gLimit, bLimit);\n  const max = Math.max(rLimit, gLimit, bLimit);\n  const delta = max - min;\n\n  let h = 0;\n  let s;\n  const l = (max + min) / 2;\n  let rate;\n\n  switch (max) {\n    case rLimit:\n      rate = !delta ? 0 : (gLimit - bLimit) / delta;\n      h = 60 * rate;\n      break;\n    case gLimit:\n      rate = (bLimit - rLimit) / delta;\n      h = 60 * rate + 120;\n      break;\n    case bLimit:\n      rate = (rLimit - gLimit) / delta;\n      h = 60 * rate + 240;\n      break;\n    /* v8 ignore next 2  -- @preserve */\n    default:\n      break;\n  }\n\n  if (h < 0) {\n    h = 360 + h;\n  }\n\n  if (min === max) {\n    s = 0;\n  } else {\n    s = l < 0.5 ? delta / (2 * l) : delta / (2 - 2 * l);\n  }\n\n  return addAlpha(\n    {\n      h: Math.abs(+(h % 360).toFixed(2)),\n      s: +(s * 100).toFixed(2),\n      l: +(l * 100).toFixed(2),\n    },\n    alpha,\n  );\n}\n","import hex2rgb from '~/converters/hex2rgb';\nimport rgb2hsl from '~/converters/rgb2hsl';\nimport { addAlpha, extractAlphaFromHex } from '~/modules/alpha';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isHex } from '~/modules/validators';\n\nimport { HSL } from '~/types';\n\n/**\n * Convert HEX to HSL.\n *\n * @param input - The hex color string.\n * @returns The HSL color object.\n */\nexport default function hex2hsl(input: string): HSL {\n  invariant(isHex(input), MESSAGES.inputHex);\n\n  const alpha = extractAlphaFromHex(input);\n\n  return addAlpha(rgb2hsl(hex2rgb(input)), alpha);\n}\n","export function srgbGammaDecode(input: number): number {\n  const abs = Math.abs(input);\n\n  if (abs < 0.04045) {\n    return input / 12.92;\n  }\n\n  return (Math.sign(input) || 1) * ((abs + 0.055) / 1.055) ** 2.4;\n}\n\nexport function srgbGammaEncode(input: number): number {\n  const abs = Math.abs(input);\n  const sign = input < 0 ? -1 : 1;\n\n  if (abs > 0.0031308) {\n    return sign * (abs ** (1 / 2.4) * 1.055 - 0.055);\n  }\n\n  return input * 12.92;\n}\n","import { addAlpha, extractAlpha } from '~/modules/alpha';\nimport { CLMS_TO_OKLAB, LRGB_TO_LMS } from '~/modules/constants';\nimport { srgbGammaDecode } from '~/modules/gamma';\nimport { parseInput, restrictValues } from '~/modules/utils';\n\nimport { ConverterParameters, LAB, RGB } from '~/types';\n\nconst { cbrt } = Math;\n\n/**\n * Convert RGB to OkLab.\n *\n * @param input - The RGB color object or tuple.\n * @param precision - The number of decimal places for the result.\n * @returns The OkLab color object.\n */\nexport default function rgb2oklab(input: ConverterParameters<RGB>, precision?: number): LAB {\n  const value = parseInput(input, 'rgb');\n  const alpha = extractAlpha(input);\n\n  const [lr, lg, lb] = [\n    srgbGammaDecode(value.r / 255),\n    srgbGammaDecode(value.g / 255),\n    srgbGammaDecode(value.b / 255),\n  ];\n  const l = cbrt(LRGB_TO_LMS[0][0] * lr + LRGB_TO_LMS[0][1] * lg + LRGB_TO_LMS[0][2] * lb);\n  const m = cbrt(LRGB_TO_LMS[1][0] * lr + LRGB_TO_LMS[1][1] * lg + LRGB_TO_LMS[1][2] * lb);\n  const s = cbrt(LRGB_TO_LMS[2][0] * lr + LRGB_TO_LMS[2][1] * lg + LRGB_TO_LMS[2][2] * lb);\n\n  const lab = restrictValues(\n    {\n      l: CLMS_TO_OKLAB[0][0] * l + CLMS_TO_OKLAB[0][1] * m + CLMS_TO_OKLAB[0][2] * s,\n      a: CLMS_TO_OKLAB[1][0] * l + CLMS_TO_OKLAB[1][1] * m + CLMS_TO_OKLAB[1][2] * s,\n      b: CLMS_TO_OKLAB[2][0] * l + CLMS_TO_OKLAB[2][1] * m + CLMS_TO_OKLAB[2][2] * s,\n    },\n    precision,\n  );\n\n  return addAlpha(lab, alpha);\n}\n","import hex2rgb from '~/converters/hex2rgb';\nimport rgb2oklab from '~/converters/rgb2oklab';\nimport { addAlpha, extractAlphaFromHex } from '~/modules/alpha';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isHex } from '~/modules/validators';\n\nimport { LAB } from '~/types';\n\n/**\n * Convert HEX to OkLab.\n *\n * @param input - The hex color string.\n * @param precision - The number of decimal places for the result.\n * @returns The OkLab color object.\n */\nexport default function hex2oklab(input: string, precision?: number): LAB {\n  invariant(isHex(input), MESSAGES.inputHex);\n\n  const alpha = extractAlphaFromHex(input);\n\n  return addAlpha(rgb2oklab(hex2rgb(input), precision), alpha);\n}\n","import { addAlpha, extractAlpha } from '~/modules/alpha';\nimport { RAD2DEG } from '~/modules/constants';\nimport { parseInput, restrictValues } from '~/modules/utils';\n\nimport { ConverterParameters, LAB, LCH } from '~/types';\n\nconst { atan2, sqrt } = Math;\n\n/**\n * Convert OkLab to OkLCH.\n *\n * @param input - The OkLab color object or tuple.\n * @param precision - The number of decimal places for the result.\n * @returns The OkLCH color object.\n */\nexport default function oklab2oklch(input: ConverterParameters<LAB>, precision?: number): LCH {\n  const { l, a, b } = parseInput(input, 'oklab');\n  const alpha = extractAlpha(input);\n\n  const c = sqrt(a ** 2 + b ** 2);\n  let h = (atan2(b, a) * RAD2DEG + 360) % 360;\n\n  if (c < 1e-6) {\n    h = 0;\n  }\n\n  return addAlpha(restrictValues({ l, c, h }, precision), alpha);\n}\n","import oklab2oklch from '~/converters/oklab2oklch';\nimport rgb2oklab from '~/converters/rgb2oklab';\nimport { addAlpha, extractAlpha } from '~/modules/alpha';\nimport { parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, LCH, RGB } from '~/types';\n\n/**\n * Convert RGB to OkLCH.\n *\n * @param input - The RGB color object or tuple.\n * @param precision - The number of decimal places for the result.\n * @returns The OkLCH color object.\n */\nexport default function rgb2oklch(input: ConverterParameters<RGB>, precision?: number): LCH {\n  const value = parseInput(input, 'rgb');\n  const alpha = extractAlpha(input);\n\n  return addAlpha(oklab2oklch(rgb2oklab(value), precision), alpha);\n}\n","import hex2rgb from '~/converters/hex2rgb';\nimport rgb2oklch from '~/converters/rgb2oklch';\nimport { addAlpha, extractAlphaFromHex } from '~/modules/alpha';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isHex } from '~/modules/validators';\n\nimport { LCH } from '~/types';\n\n/**\n * Convert HEX to OkLCH.\n *\n * @param input - The hex color string.\n * @param precision - The number of decimal places for the result.\n * @returns The OkLCH color object.\n */\nexport default function hex2oklch(input: string, precision?: number): LCH {\n  invariant(isHex(input), MESSAGES.inputHex);\n\n  const alpha = extractAlphaFromHex(input);\n\n  return addAlpha(rgb2oklch(hex2rgb(input), precision), alpha);\n}\n","import { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isNumber } from '~/modules/validators';\n\n/**\n * Convert hue to RGB using chroma and median point.\n *\n * @param point - The median point value.\n * @param chroma - The chroma value.\n * @param h - The hue value (0-1).\n * @returns The RGB component value.\n */\nexport default function hue2rgb(point: number, chroma: number, h: number): number {\n  invariant(isNumber(point) && isNumber(chroma) && isNumber(h), MESSAGES.hueArgs);\n  let hue = h;\n\n  if (hue < 0) {\n    hue += 1;\n  }\n\n  if (hue > 1) {\n    hue -= 1;\n  }\n\n  if (hue < 1 / 6) {\n    return point + (chroma - point) * 6 * hue;\n  }\n\n  if (hue < 1 / 2) {\n    return chroma;\n  }\n\n  if (hue < 2 / 3) {\n    return point + (chroma - point) * (2 / 3 - hue) * 6;\n  }\n\n  return point;\n}\n","import { addAlpha, extractAlpha } from '~/modules/alpha';\nimport hue2rgb from '~/modules/hue2rgb';\nimport { parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, HSL, RGB } from '~/types';\n\n/**\n * Convert HSL to RGB.\n *\n * @param input - The HSL color object or tuple.\n * @returns The RGB color object.\n */\nexport default function hsl2rgb(input: ConverterParameters<HSL>): RGB {\n  const value = parseInput(input, 'hsl');\n  const alpha = extractAlpha(input);\n\n  const h = value.h / 360;\n  const s = value.s / 100;\n  const l = value.l / 100;\n\n  let r;\n  let g;\n  let b;\n\n  let point;\n  let chroma;\n\n  if (s < 0.0001) {\n    r = l;\n    g = l;\n    b = l;\n  } else {\n    chroma = l < 0.5 ? l * (1 + s) : l + s - l * s;\n    point = 2 * l - chroma;\n\n    r = hue2rgb(point, chroma, h + 1 / 3);\n    g = hue2rgb(point, chroma, h);\n    b = hue2rgb(point, chroma, h - 1 / 3);\n  }\n\n  return addAlpha(\n    {\n      r: Math.round(r * 255),\n      g: Math.round(g * 255),\n      b: Math.round(b * 255),\n    },\n    alpha,\n  );\n}\n","import { addAlphaToHex, extractAlpha } from '~/modules/alpha';\nimport { parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, HEX, RGB } from '~/types';\n\n/**\n * Convert RGB to HEX.\n *\n * @param input - The RGB color object or tuple.\n * @returns The hex color string.\n */\nexport default function rgb2hex(input: ConverterParameters<RGB>): HEX {\n  const rgb = parseInput(input, 'rgb');\n  const alpha = extractAlpha(input);\n\n  const hex: HEX = `#${[rgb.r, rgb.g, rgb.b]\n    .map(d => `0${Math.floor(d).toString(16)}`.slice(-2))\n    .join('')}`;\n\n  return alpha !== undefined && alpha < 1 ? addAlphaToHex(hex, alpha) : hex;\n}\n","import hsl2rgb from '~/converters/hsl2rgb';\nimport rgb2hex from '~/converters/rgb2hex';\nimport { addAlphaToHex, extractAlpha } from '~/modules/alpha';\nimport { parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, HEX, HSL } from '~/types';\n\n/**\n * Convert HSL to HEX.\n *\n * @param input - The HSL color object or tuple.\n * @returns The hex color string.\n */\nexport default function hsl2hex(input: ConverterParameters<HSL>): HEX {\n  const value = parseInput(input, 'hsl');\n  const alpha = extractAlpha(input);\n\n  const hex = rgb2hex(hsl2rgb(value));\n\n  return alpha !== undefined && alpha < 1 ? addAlphaToHex(hex, alpha) : hex;\n}\n","import hsl2rgb from '~/converters/hsl2rgb';\nimport rgb2oklab from '~/converters/rgb2oklab';\nimport { addAlpha, extractAlpha } from '~/modules/alpha';\nimport { parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, HSL, LAB } from '~/types';\n\n/**\n * Convert HSL to OkLab.\n *\n * @param input - The HSL color object or tuple.\n * @param precision - The number of decimal places for the result.\n * @returns The OkLab color object.\n */\nexport default function hsl2oklab(input: ConverterParameters<HSL>, precision?: number): LAB {\n  const value = parseInput(input, 'hsl');\n  const alpha = extractAlpha(input);\n\n  return addAlpha(rgb2oklab(hsl2rgb(value), precision), alpha);\n}\n","import hsl2rgb from '~/converters/hsl2rgb';\nimport rgb2oklch from '~/converters/rgb2oklch';\nimport { addAlpha, extractAlpha } from '~/modules/alpha';\nimport { parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, HSL, LCH } from '~/types';\n\n/**\n * Convert HSL to OkLCH.\n *\n * @param input - The HSL color object or tuple.\n * @param precision - The number of decimal places for the result.\n * @returns The OkLCH color object.\n */\nexport default function hsl2oklch(input: ConverterParameters<HSL>, precision?: number): LCH {\n  const value = parseInput(input, 'hsl');\n  const alpha = extractAlpha(input);\n\n  return addAlpha(rgb2oklch(hsl2rgb(value), precision), alpha);\n}\n","import { addAlpha, extractAlpha } from '~/modules/alpha';\nimport { LMS_TO_LRGB, OKLAB_TO_CLMS } from '~/modules/constants';\nimport { srgbGammaEncode } from '~/modules/gamma';\nimport { clamp, parseInput, round } from '~/modules/utils';\n\nimport { ConverterParameters, LAB, RGB } from '~/types';\n\n/**\n * Convert OkLab to RGB.\n *\n * @param input - The OkLab color object or tuple.\n * @param precision - The number of decimal places for the result.\n * @returns The RGB color object.\n */\nexport default function oklab2rgb(input: ConverterParameters<LAB>, precision = 0): RGB {\n  const { l: L, a: A, b: B } = parseInput(input, 'oklab');\n  const alpha = extractAlpha(input);\n\n  const l = (OKLAB_TO_CLMS[0][0] * L + OKLAB_TO_CLMS[0][1] * A + OKLAB_TO_CLMS[0][2] * B) ** 3;\n  const m = (OKLAB_TO_CLMS[1][0] * L + OKLAB_TO_CLMS[1][1] * A + OKLAB_TO_CLMS[1][2] * B) ** 3;\n  const s = (OKLAB_TO_CLMS[2][0] * L + OKLAB_TO_CLMS[2][1] * A + OKLAB_TO_CLMS[2][2] * B) ** 3;\n\n  const r =\n    255 * srgbGammaEncode(LMS_TO_LRGB[0][0] * l + LMS_TO_LRGB[0][1] * m + LMS_TO_LRGB[0][2] * s);\n  const g =\n    255 * srgbGammaEncode(LMS_TO_LRGB[1][0] * l + LMS_TO_LRGB[1][1] * m + LMS_TO_LRGB[1][2] * s);\n  const b =\n    255 * srgbGammaEncode(LMS_TO_LRGB[2][0] * l + LMS_TO_LRGB[2][1] * m + LMS_TO_LRGB[2][2] * s);\n\n  return addAlpha(\n    {\n      r: clamp(round(r, precision), 0, 255),\n      g: clamp(round(g, precision), 0, 255),\n      b: clamp(round(b, precision), 0, 255),\n    },\n    alpha,\n  );\n}\n","import oklab2rgb from '~/converters/oklab2rgb';\nimport rgb2hex from '~/converters/rgb2hex';\nimport { addAlphaToHex, extractAlpha } from '~/modules/alpha';\nimport { parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, HEX, LAB } from '~/types';\n\n/**\n * Convert OkLab to HEX.\n *\n * @param input - The OkLab color object or tuple.\n * @returns The hex color string.\n */\nexport default function oklab2hex(input: ConverterParameters<LAB>): HEX {\n  const value = parseInput(input, 'oklab');\n  const alpha = extractAlpha(input);\n\n  const hex = rgb2hex(oklab2rgb(value));\n\n  return alpha !== undefined && alpha < 1 ? addAlphaToHex(hex, alpha) : hex;\n}\n","import oklab2rgb from '~/converters/oklab2rgb';\nimport rgb2hsl from '~/converters/rgb2hsl';\nimport { addAlpha, extractAlpha } from '~/modules/alpha';\nimport { parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, HSL, LAB } from '~/types';\n\n/**\n * Convert OkLab to HSL.\n *\n * @param input - The OkLab color object or tuple.\n * @returns The HSL color object.\n */\nexport default function oklab2hsl(input: ConverterParameters<LAB>): HSL {\n  const value = parseInput(input, 'oklab');\n  const alpha = extractAlpha(input);\n\n  return addAlpha(rgb2hsl(oklab2rgb(value)), alpha);\n}\n","/* eslint-disable prefer-const */\nimport { addAlpha, extractAlpha } from '~/modules/alpha';\nimport { DEG2RAD } from '~/modules/constants';\nimport { parseInput, restrictValues } from '~/modules/utils';\n\nimport { ConverterParameters, LAB, LCH } from '~/types';\n\nconst { sin, cos } = Math;\n\n/**\n * Convert OkLCH to OkLab.\n *\n * @param input - The OkLCH color object or tuple.\n * @param precision - The number of decimal places for the result.\n * @returns The OkLab color object.\n */\nexport default function oklch2oklab(input: ConverterParameters<LCH>, precision?: number): LAB {\n  let { l, c, h } = parseInput(input, 'oklch');\n  const alpha = extractAlpha(input);\n\n  /* v8 ignore next 3  -- @preserve */\n  if (Number.isNaN(h) || h < 0) {\n    h = 0;\n  }\n\n  return addAlpha(\n    restrictValues({ l, a: c * cos(h * DEG2RAD), b: c * sin(h * DEG2RAD) }, precision),\n    alpha,\n  );\n}\n","import oklab2rgb from '~/converters/oklab2rgb';\nimport oklch2oklab from '~/converters/oklch2oklab';\nimport { addAlpha, extractAlpha } from '~/modules/alpha';\nimport { parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, LCH, RGB } from '~/types';\n\n/**\n * Convert OkLCH to RGB.\n *\n * @param input - The OkLCH color object or tuple.\n * @param precision - The number of decimal places for the result.\n * @returns The RGB color object.\n */\nexport default function oklch2rgb(input: ConverterParameters<LCH>, precision = 0): RGB {\n  const value = parseInput(input, 'oklch');\n  const alpha = extractAlpha(input);\n\n  return addAlpha(oklab2rgb(oklch2oklab(value), precision), alpha);\n}\n","import oklch2rgb from '~/converters/oklch2rgb';\nimport rgb2hex from '~/converters/rgb2hex';\nimport { addAlphaToHex, extractAlpha } from '~/modules/alpha';\nimport { parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, HEX, LCH } from '~/types';\n\n/**\n * Convert OkLCH to HEX.\n *\n * @param input - The OkLCH color object or tuple.\n * @returns The hex color string.\n */\nexport default function oklch2hex(input: ConverterParameters<LCH>): HEX {\n  const value = parseInput(input, 'oklch');\n  const alpha = extractAlpha(input);\n\n  const hex = rgb2hex(oklch2rgb(value));\n\n  return alpha !== undefined && alpha < 1 ? addAlphaToHex(hex, alpha) : hex;\n}\n","import oklch2rgb from '~/converters/oklch2rgb';\nimport rgb2hsl from '~/converters/rgb2hsl';\nimport { addAlpha, extractAlpha } from '~/modules/alpha';\nimport { parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, HSL, LCH } from '~/types';\n\n/**\n * Convert OkLCH to HSL.\n *\n * @param input - The OkLCH color object or tuple.\n * @returns The HSL color object.\n */\nexport default function oklch2hsl(input: ConverterParameters<LCH>): HSL {\n  const value = parseInput(input, 'oklch');\n  const alpha = extractAlpha(input);\n\n  return addAlpha(rgb2hsl(oklch2rgb(value)), alpha);\n}\n","/* eslint-disable sonarjs/no-redundant-assignments */\nimport * as converters from '~/converters';\nimport { convertAlphaToHex, normalizeAlpha, removeAlphaFromHex } from '~/modules/alpha';\nimport { MESSAGES, PRECISION } from '~/modules/constants';\nimport { CSSColor, cssColors } from '~/modules/css-colors';\nimport { invariant } from '~/modules/invariant';\nimport { restrictValues, round } from '~/modules/utils';\nimport {\n  isHex,\n  isHSL,\n  isLAB,\n  isLCH,\n  isNamedColor,\n  isNumber,\n  isRGB,\n  isString,\n  isValidColorModel,\n} from '~/modules/validators';\n\nimport { ColorModel, ColorReturn, ColorType, ColorValue } from '~/types';\n\nexport interface FormatCSSOptions {\n  /**\n   * The alpha value of the color (0-1).\n   */\n  alpha?: number;\n  /**\n   * Output color format.\n   */\n  format?: ColorType;\n  /**\n   * The number of digits of the output.\n   * @default 5\n   */\n  precision?: number;\n  /**\n   * The separator between the values.\n   *\n   * oklab and oklch always use space as a separator.\n   * @default ' '\n   */\n  separator?: string;\n}\n\nfunction getColorModel<T extends ColorModel | string>(input: T): ColorType {\n  if (isHex(input) || isNamedColor(input)) {\n    return 'hex';\n  }\n\n  if (isHSL(input)) {\n    return 'hsl';\n  }\n\n  if (isLAB(input)) {\n    return 'oklab';\n  }\n\n  if (isLCH(input)) {\n    return 'oklch';\n  }\n\n  if (isRGB(input)) {\n    return 'rgb';\n  }\n\n  throw new Error(MESSAGES.invalid);\n}\n\nfunction getColorValue<TInput extends ColorModel | string, TOutput extends ColorType>(\n  input: TInput,\n  output: TOutput,\n): ColorReturn<TOutput> {\n  const value = isNamedColor(input) ? cssColors[input.toLowerCase() as CSSColor] : input;\n  const from = getColorModel(value);\n\n  if (from === output) {\n    return value as ColorReturn<TOutput>;\n  }\n\n  const converterKey = `${from}2${output}` as keyof typeof converters;\n  const converter = (converters as Record<string, (x: any) => any>)[converterKey];\n\n  if (!converter) {\n    throw new Error(`Converter not found for ${from} to ${output}`);\n  }\n\n  return converter(value);\n}\n\n/**\n * Format a color model to a CSS color string.\n *\n * @param input - The color model or hex string.\n * @param formatOrOptions - Output format or formatting options object.\n * @returns The formatted CSS color string.\n */\nexport default function formatCSS<T extends ColorValue>(\n  input: T,\n  formatOrOptions?: ColorType | FormatCSSOptions,\n): string {\n  invariant(isHex(input) || isValidColorModel(input), MESSAGES.invalid);\n\n  const {\n    alpha,\n    format,\n    precision = PRECISION,\n    separator: baseSeparator = ' ',\n  } = isString(formatOrOptions, false) ? { format: formatOrOptions } : (formatOrOptions ?? {});\n\n  const colorFormat = format || getColorModel(input);\n  const normalizedAlpha = isNumber(alpha) ? normalizeAlpha(alpha) : undefined;\n  const opacity =\n    normalizedAlpha !== undefined && normalizedAlpha !== 1\n      ? `${round(normalizedAlpha * 100)}%`\n      : null;\n  let params = [];\n  let separator = baseSeparator;\n\n  switch (colorFormat) {\n    case 'hsl': {\n      const { h, s, l } = getColorValue(input, 'hsl');\n\n      params = [h, `${s}%`, `${l}%`];\n      break;\n    }\n    case 'oklab': {\n      separator = ' ';\n      const { l, a, b } = restrictValues(getColorValue(input, 'oklab'), precision, false);\n\n      params = [`${round(l * 100, precision, false)}%`, a, b];\n      break;\n    }\n    case 'oklch': {\n      separator = ' ';\n      const { l, c, h } = restrictValues(getColorValue(input, 'oklch'), precision, false);\n\n      params = [`${round(l * 100, precision, false)}%`, c, c === 0 ? 'none' : h];\n      break;\n    }\n    case 'rgb': {\n      const { r, g, b } = getColorValue(input, 'rgb');\n\n      params = [r, g, b];\n      break;\n    }\n    default: {\n      const hex = removeAlphaFromHex(getColorValue(input, 'hex'));\n\n      if (normalizedAlpha !== undefined && normalizedAlpha !== 1) {\n        return `${hex}${convertAlphaToHex(normalizedAlpha)}`;\n      }\n\n      return hex;\n    }\n  }\n\n  return `${colorFormat}(${params.join(separator)}${opacity ? ` / ${opacity}` : ''})`;\n}\n","import hex2rgb from '~/converters/hex2rgb';\nimport { extractAlphaFromHex, normalizeAlpha } from '~/modules/alpha';\nimport { COLOR_KEYS, MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { hasValidMatches, isHex, isString } from '~/modules/validators';\n\nimport { ColorModelKey, PlainObject } from '~/types';\n\n// Regex components for parsing CSS color strings\nconst MODEL = '(rgb|hsl|oklab|oklch)a?';\nconst SEP = '(?:\\\\s*[,/]\\\\s*|\\\\s+)';\n// Accepts: numbers, percentages, 'none', and angle units (deg, grad, rad, turn)\nconst VALUE = '(none|[\\\\d%.-]+(?:deg|grad|rad|turn)?)';\n\nconst colorRegex = new RegExp(\n  `${MODEL}\\\\s*\\\\(\\\\s*${VALUE}${SEP}${VALUE}${SEP}${VALUE}(?:${SEP}${VALUE})?\\\\s*\\\\)`,\n  'i',\n);\n\nexport type ExtractColorPartsReturn = {\n  alpha?: number;\n  model: ColorModelKey;\n} & PlainObject<number>;\n\n/**\n * Convert angle value with units to degrees\n */\nfunction parseAngle(value: string): number {\n  const number_ = parseFloat(value);\n  let result: number;\n\n  if (value.endsWith('grad')) {\n    result = number_ * 0.9; // 400grad = 360deg\n  } else if (value.endsWith('rad')) {\n    result = number_ * (180 / Math.PI); // radians to degrees\n  } else if (value.endsWith('turn')) {\n    result = number_ * 360; // 1turn = 360deg\n  } else {\n    // 'deg' suffix or unitless - return as-is\n    result = number_;\n  }\n\n  // Round to 5 decimal places for consistency\n  return Math.round(result * 100000) / 100000;\n}\n\n/**\n * Extract the color parts from a CSS color string.\n * Hex colors are supported via conversion.\n *\n * @param input - The CSS color string.\n * @returns An object with the color model and component values.\n */\nexport default function extractColorParts(input: string): ExtractColorPartsReturn {\n  invariant(isString(input), MESSAGES.inputString);\n\n  if (isHex(input)) {\n    const keys = COLOR_KEYS.rgb;\n    const { r, g, b } = hex2rgb(input);\n    const alpha = extractAlphaFromHex(input);\n\n    return {\n      model: 'rgb' as ColorModelKey,\n      [keys[0]]: r,\n      [keys[1]]: g,\n      [keys[2]]: b,\n      alpha: alpha < 1 ? alpha : undefined,\n    } as ExtractColorPartsReturn;\n  }\n\n  const matches = colorRegex.exec(input);\n\n  invariant(hasValidMatches(matches), MESSAGES.invalidCSS);\n\n  let rawAlpha = 1;\n\n  if (matches[5]) {\n    rawAlpha = matches[5] === 'none' ? 0 : parseFloat(matches[5]);\n  }\n\n  const model = matches[1] as ColorModelKey;\n  const keys = COLOR_KEYS[model];\n  const alpha = normalizeAlpha(rawAlpha);\n\n  // Parse values and convert percentages/angles for color models\n  const parseValue = (value: string, index: number): number => {\n    // Handle 'none' keyword - treated as 0 for rendering (CSS Color Level 4)\n    if (value === 'none') {\n      return 0;\n    }\n\n    // Handle hue values with angle units (HSL index 0, OkLCH index 2)\n    const isHue = (model === 'hsl' && index === 0) || (model === 'oklch' && index === 2);\n\n    if (isHue) {\n      return parseAngle(value);\n    }\n\n    const parsedValue = parseFloat(value);\n    const isPercent = value.includes('%');\n\n    if (!isPercent) {\n      return parsedValue;\n    }\n\n    // Convert percentages based on color model and position\n    if (model === 'oklch') {\n      // oklch: L (0-100), C (0-0.4), H (0-360)\n      if (index === 1) {\n        // Chroma: 100% = 0.4\n        return (parsedValue * 0.4) / 100;\n      }\n      // oklab: L (0-100), a (-0.4 to 0.4), b (-0.4 to 0.4)\n    } else if (model === 'oklab' && (index === 1 || index === 2)) {\n      // a/b: ±100% = ±0.4\n      return (parsedValue * 0.4) / 100;\n    }\n\n    return parsedValue;\n  };\n\n  const values = [parseValue(matches[2], 0), parseValue(matches[3], 1), parseValue(matches[4], 2)];\n\n  // Validate ranges for oklab/oklch after percentage conversion\n  if (model === 'oklab') {\n    // a and b must be in range -0.4 to 0.4\n    invariant(values[1] >= -0.4 && values[1] <= 0.4, MESSAGES.invalidRange);\n    invariant(values[2] >= -0.4 && values[2] <= 0.4, MESSAGES.invalidRange);\n  } else if (model === 'oklch') {\n    // chroma must be in range 0 to 0.4\n    invariant(values[1] >= 0 && values[1] <= 0.4, MESSAGES.invalidRange);\n  }\n\n  return {\n    model,\n    [keys[0]]: values[0],\n    [keys[1]]: values[1],\n    [keys[2]]: values[2],\n    alpha: alpha < 1 ? alpha : undefined,\n  } as ExtractColorPartsReturn;\n}\n","import * as converters from '~/converters';\nimport extractColorParts from '~/extract-color-parts';\nimport formatCSS, { FormatCSSOptions } from '~/format-css';\nimport {\n  convertAlphaToHex,\n  extractAlphaFromHex,\n  normalizeAlpha,\n  removeAlphaFromHex,\n} from '~/modules/alpha';\nimport { CSSColor, cssColors } from '~/modules/css-colors';\nimport { clamp, normalizeOkLightness } from '~/modules/utils';\nimport {\n  isHex,\n  isHSL,\n  isLAB,\n  isLCH,\n  isNamedColor,\n  isPlainObject,\n  isRGB,\n} from '~/modules/validators';\n\nimport { ColorModelKey, ColorTuple, ColorType, ColorValue, HEX, HSL, LAB, LCH, RGB } from '~/types';\n\ntype ModelConverterFn = (input: ColorTuple) => ColorValue;\n\nexport type ColorInput = string | ParsedColor | HSL | LAB | LCH | RGB;\n\nexport interface ParsedColor {\n  readonly __parsed: true;\n  readonly alpha: number;\n  readonly hex: HEX;\n  readonly hsl: HSL;\n  readonly oklab: LAB;\n  readonly oklch: LCH;\n  readonly rgb: RGB;\n  toCSS(options?: FormatCSSOptions): string;\n  readonly type: ColorType;\n}\n\n// model → hex converters (accepts ColorTuple)\nconst toHexConverters: Record<ColorModelKey, ModelConverterFn> = {\n  hsl: converters.hsl2hex,\n  oklab: converters.oklab2hex,\n  oklch: converters.oklch2hex,\n  rgb: converters.rgb2hex,\n};\n\n// hex → model converters (accepts HEX string)\nconst fromHexConverters: Record<string, (input: HEX) => HSL | LAB | LCH | RGB> = {\n  hsl: converters.hex2hsl,\n  oklab: converters.hex2oklab,\n  oklch: converters.hex2oklch,\n  rgb: converters.hex2rgb,\n};\n\n// model → model converters (accepts ColorTuple)\nconst modelConverters: Record<ColorModelKey, Partial<Record<ColorModelKey, ModelConverterFn>>> = {\n  hsl: {\n    oklab: converters.oklab2hsl,\n    oklch: converters.oklch2hsl,\n    rgb: converters.rgb2hsl,\n  },\n  oklab: {\n    hsl: converters.hsl2oklab,\n    oklch: converters.oklch2oklab,\n    rgb: converters.rgb2oklab,\n  },\n  oklch: {\n    hsl: converters.hsl2oklch,\n    oklab: converters.oklab2oklch,\n    rgb: converters.rgb2oklch,\n  },\n  rgb: {\n    hsl: converters.hsl2rgb,\n    oklab: converters.oklab2rgb,\n    oklch: converters.oklch2rgb,\n  },\n};\n\nclass ParsedColorImpl implements ParsedColor {\n  readonly __parsed = true;\n  readonly type: ColorType;\n  readonly alpha: number;\n\n  private readonly _sourceValue: ColorValue;\n  private _cache: Partial<Record<ColorType, ColorValue>> = {};\n\n  constructor(type: ColorType, value: ColorValue, alpha: number) {\n    this.type = type;\n    this.alpha = alpha;\n    this._sourceValue = value;\n    this._cache[type] = value;\n  }\n\n  get hex(): HEX {\n    return this._getAs('hex') as HEX;\n  }\n\n  get hsl(): HSL {\n    return this._getAs('hsl') as HSL;\n  }\n\n  get rgb(): RGB {\n    return this._getAs('rgb') as RGB;\n  }\n\n  get oklab(): LAB {\n    return this._getAs('oklab') as LAB;\n  }\n\n  get oklch(): LCH {\n    return this._getAs('oklch') as LCH;\n  }\n\n  toCSS(options?: FormatCSSOptions): string {\n    const format = options?.format ?? this.type;\n    const alpha = options?.alpha ?? (this.alpha < 1 ? this.alpha : undefined);\n\n    if (format === 'hex') {\n      const hex = removeAlphaFromHex(this.hex);\n\n      if (alpha !== undefined && alpha < 1) {\n        return `${hex}${convertAlphaToHex(alpha)}`;\n      }\n\n      return hex;\n    }\n\n    return formatCSS(this[format], { ...options, format, alpha });\n  }\n\n  private _getAs(target: ColorType): ColorValue {\n    if (this._cache[target]) {\n      return this._cache[target];\n    }\n\n    let result: ColorValue;\n\n    if (this.type === 'hex') {\n      result =\n        target === 'hex' ? this._sourceValue : fromHexConverters[target](this._sourceValue as HEX);\n    } else if (target === 'hex') {\n      const tuple = Object.values(this._sourceValue) as ColorTuple;\n\n      result = toHexConverters[this.type as ColorModelKey](tuple);\n\n      if (this.alpha < 1) {\n        result = `${result}${convertAlphaToHex(this.alpha)}` as HEX;\n      }\n    } else {\n      const converter = modelConverters[target]?.[this.type as ColorModelKey];\n\n      if (!converter) {\n        // Same-type lookups are served from cache; fallback via hex if invariant breaks\n        result = fromHexConverters[target](this.hex);\n      } else {\n        const tuple = Object.values(this._sourceValue) as ColorTuple;\n\n        result = converter(tuple);\n      }\n    }\n\n    this._cache[target] = result;\n\n    return result;\n  }\n}\n\nexport function isParsedColor(input: unknown): input is ParsedColor {\n  return (\n    typeof input === 'object' && input !== null && '__parsed' in input && input.__parsed === true\n  );\n}\n\nexport function resolveColor(input: ColorInput): ParsedColor {\n  if (isParsedColor(input)) {\n    return input;\n  }\n\n  if (isPlainObject(input)) {\n    const { alpha: rawAlpha = 1 } = input;\n    const alpha = clamp(normalizeAlpha(rawAlpha), 0, 1);\n\n    if (isHSL(input)) {\n      return new ParsedColorImpl(\n        'hsl',\n        { h: clamp(input.h, 0, 360), s: clamp(input.s), l: clamp(input.l) },\n        alpha,\n      );\n    }\n\n    if (isRGB(input)) {\n      return new ParsedColorImpl(\n        'rgb',\n        { r: clamp(input.r, 0, 255), g: clamp(input.g, 0, 255), b: clamp(input.b, 0, 255) },\n        alpha,\n      );\n    }\n\n    if (isLAB(input)) {\n      return new ParsedColorImpl('oklab', { l: input.l, a: input.a, b: input.b }, alpha);\n    }\n\n    if (isLCH(input)) {\n      return new ParsedColorImpl('oklch', { l: input.l, c: input.c, h: input.h }, alpha);\n    }\n  }\n\n  const value = isNamedColor(input) ? cssColors[input.toLowerCase() as CSSColor] : input;\n\n  if (isHex(value)) {\n    const alpha = extractAlphaFromHex(value);\n    const hex = removeAlphaFromHex(value);\n\n    return new ParsedColorImpl('hex', hex, alpha);\n  }\n\n  const parts = extractColorParts(value);\n  const { alpha, model, ...color } = parts;\n\n  const colorValue = (['oklab', 'oklch'].includes(model)\n    ? normalizeOkLightness(color as unknown as { l: number })\n    : color) as unknown as HSL | LAB | LCH | RGB;\n  const colorType: ColorType = model;\n\n  return new ParsedColorImpl(colorType, colorValue, alpha ?? 1);\n}\n","import formatCSS from '~/format-css';\nimport { resolveColor } from '~/modules/parsed-color';\n\nimport { ColorType } from '~/types';\n\n/**\n * Convert a CSS string to another format.\n *\n * @param input - The input CSS string.\n * @param format - The output color format.\n * @returns The converted CSS string.\n */\nexport default function convertCSS(input: string, format: ColorType): string {\n  const parsed = resolveColor(input);\n\n  return formatCSS(parsed[format], { format, alpha: parsed.alpha < 1 ? parsed.alpha : undefined });\n}\n","import { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { resolveColor } from '~/modules/parsed-color';\nimport { round } from '~/modules/utils';\nimport { isString } from '~/modules/validators';\n\n// APCA W3 Constants (version 0.0.98G-4g)\n// Based on official SAPC-APCA implementation from Myndex/SAPC-APCA\nexport const APCA_VERSION = '0.0.98G-4g';\n\n// Exponents\nconst mainTRC = 2.4; // sRGB gamma (simpler than WCAG piecewise)\nconst normBG = 0.56; // Normal polarity: dark text on light bg\nconst normTXT = 0.57;\nconst revBG = 0.65; // Reverse polarity: light text on dark bg\nconst revTXT = 0.62;\n\n// sRGB coefficients\nconst sRco = 0.2126729;\nconst sGco = 0.7151522;\nconst sBco = 0.072175;\n\n// Black soft clamp\nconst blkThreshold = 0.022; // Threshold for soft clamp\nconst blkClamp = 1.414; // Clamp exponent\n\n// Scaling\nconst scaleBoW = 1.14; // Black on white scale\nconst scaleWoB = 1.14; // White on black scale\nconst loBoWOffset = 0.027; // Low contrast offset\nconst loWoBOffset = 0.027;\nconst loClip = 0.1; // Clip contrasts below |10|\nconst deltaYmin = 0.0005; // Minimum Y difference\n\n/**\n * Apply soft clamp to black levels.\n * Improves contrast prediction for very dark colors.\n */\nfunction softClamp(Y: number): number {\n  return Y > blkThreshold ? Y : Y + (blkThreshold - Y) ** blkClamp;\n}\n\n/**\n * Convert sRGB values to luminance (Y) for APCA.\n * Uses simple gamma 2.4, unlike WCAG's piecewise function.\n */\nfunction sRGBtoY(r: number, g: number, b: number): number {\n  return sRco * (r / 255) ** mainTRC + sGco * (g / 255) ** mainTRC + sBco * (b / 255) ** mainTRC;\n}\n\n/**\n * Calculate APCA contrast between foreground and background colors.\n *\n * APCA (Accessible Perceptual Contrast Algorithm) is polarity-aware:\n * - Positive values indicate dark text on light background\n * - Negative values indicate light text on dark background\n *\n * @param background - The background color string.\n * @param foreground - The foreground/text color string.\n * @returns Lc (Lightness contrast) value, roughly -108 to +106.\n */\nexport default function apcaContrast(background: string, foreground: string): number {\n  invariant(isString(background), MESSAGES.inputString);\n  invariant(isString(foreground), MESSAGES.inputString);\n\n  const bg = resolveColor(background).rgb;\n  const fg = resolveColor(foreground).rgb;\n\n  const txtY = softClamp(sRGBtoY(fg.r, fg.g, fg.b));\n  const bgY = softClamp(sRGBtoY(bg.r, bg.g, bg.b));\n\n  // Return 0 for extremely low ΔY\n  if (Math.abs(bgY - txtY) < deltaYmin) {\n    return 0;\n  }\n\n  // Calculate SAPC based on polarity\n  // Normal polarity: dark text on light background\n  // Reverse polarity: light text on dark background\n  const SAPC =\n    bgY > txtY\n      ? (bgY ** normBG - txtY ** normTXT) * scaleBoW\n      : (bgY ** revBG - txtY ** revTXT) * scaleWoB;\n\n  // Apply low contrast clipping and offset\n  if (Math.abs(SAPC) < loClip) {\n    return 0;\n  }\n\n  const Lc = SAPC > 0 ? (SAPC - loBoWOffset) * 100 : (SAPC + loWoBOffset) * 100;\n\n  return round(Lc, 5);\n}\n","import { MESSAGES, PRECISION } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { resolveColor } from '~/modules/parsed-color';\nimport { round } from '~/modules/utils';\nimport { isString } from '~/modules/validators';\n\n/**\n * Get the brightness difference between 2 colors.\n *\n * @param left - The first color string.\n * @param right - The second color string.\n * @param precision - The decimal precision (default: 5).\n * @returns The brightness difference value.\n */\nexport default function brightnessDifference(\n  left: string,\n  right: string,\n  precision = PRECISION,\n): number {\n  invariant(isString(left), MESSAGES.left);\n  invariant(isString(right), MESSAGES.right);\n\n  const RGBLeft = resolveColor(left).rgb;\n  const RGBRight = resolveColor(right).rgb;\n\n  const brightnessLeft = (RGBLeft.r * 299 + RGBLeft.g * 587 + RGBLeft.b * 114) / 1000;\n  const brightnessRight = (RGBRight.r * 299 + RGBRight.g * 587 + RGBRight.b * 114) / 1000;\n\n  return round(Math.abs(brightnessRight - brightnessLeft), precision);\n}\n","import { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { resolveColor } from '~/modules/parsed-color';\nimport { round } from '~/modules/utils';\nimport { isString } from '~/modules/validators';\n\n/**\n * Get the chroma of a color.\n *\n * @param input - The input color string.\n * @returns The chroma value (0-1).\n */\nexport default function chroma(input: string): number {\n  invariant(isString(input), MESSAGES.inputString);\n\n  const { r, g, b } = resolveColor(input).rgb;\n\n  const max = Math.max(r, g, b);\n  const min = Math.min(r, g, b);\n\n  return round((max - min) / 255, 4);\n}\n","import { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { resolveColor } from '~/modules/parsed-color';\nimport { isString } from '~/modules/validators';\n\n/**\n * Get the color difference between 2 colors.\n *\n * @param left - The first color string.\n * @param right - The second color string.\n * @returns The color difference value.\n */\nexport default function colorDifference(left: string, right: string): number {\n  invariant(isString(left), MESSAGES.left);\n  invariant(isString(right), MESSAGES.right);\n\n  const RGBLeft = resolveColor(left).rgb;\n  const RGBRight = resolveColor(right).rgb;\n\n  return (\n    Math.max(RGBLeft.r, RGBRight.r) -\n    Math.min(RGBLeft.r, RGBRight.r) +\n    (Math.max(RGBLeft.g, RGBRight.g) - Math.min(RGBLeft.g, RGBRight.g)) +\n    (Math.max(RGBLeft.b, RGBRight.b) - Math.min(RGBLeft.b, RGBRight.b))\n  );\n}\n","import { MESSAGES } from '~/modules/constants';\nimport { srgbGammaDecode } from '~/modules/gamma';\nimport { invariant } from '~/modules/invariant';\nimport { resolveColor } from '~/modules/parsed-color';\nimport { round } from '~/modules/utils';\nimport { isString } from '~/modules/validators';\n\n/**\n * Get the relative luminance of a color (WCAG definition).\n *\n * @param input - The input color string.\n * @returns The luminance value (0-1).\n */\nexport default function luminance(input: string): number {\n  invariant(isString(input), MESSAGES.inputString);\n\n  const { r, g, b } = resolveColor(input).rgb;\n\n  const lr = srgbGammaDecode(r / 255);\n  const lg = srgbGammaDecode(g / 255);\n  const lb = srgbGammaDecode(b / 255);\n\n  return round(0.2126 * lr + 0.7152 * lg + 0.0722 * lb, 4);\n}\n","import getLuminance from '~/luminance';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { round } from '~/modules/utils';\nimport { isString } from '~/modules/validators';\n\n/**\n * Get the contrast ratio between 2 colors.\n *\n * @param left - The first color string.\n * @param right - The second color string.\n * @returns The contrast ratio (1-21).\n */\nexport default function contrast(left: string, right: string): number {\n  invariant(isString(left), MESSAGES.left);\n  invariant(isString(right), MESSAGES.right);\n\n  const LuminanceLeft = getLuminance(left);\n  const LuminanceRight = getLuminance(right);\n\n  return round(\n    LuminanceLeft >= LuminanceRight\n      ? (LuminanceLeft + 0.05) / (LuminanceRight + 0.05)\n      : (LuminanceRight + 0.05) / (LuminanceLeft + 0.05),\n  );\n}\n","import getBrightnessDifference from '~/brightness-difference';\nimport getColorDifference from '~/color-difference';\nimport getContrast from '~/contrast';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isString } from '~/modules/validators';\n\nimport { Analysis } from '~/types';\n\n/**\n * Check 2 colors for WCAG compliance.\n *\n * @param left - The first color string.\n * @param right - The second color string.\n * @returns Analysis object with WCAG compliance information.\n */\nexport default function compare(left: string, right: string): Analysis {\n  invariant(isString(left), MESSAGES.left);\n  invariant(isString(right), MESSAGES.right);\n\n  const colorThreshold = 500;\n  const brightnessThreshold = 125;\n\n  const colorDifference = getColorDifference(left, right);\n  const contrast = getContrast(left, right);\n  const brightnessDifference = getBrightnessDifference(left, right);\n\n  const isBright = brightnessDifference >= brightnessThreshold;\n  const hasEnoughDifference = colorDifference >= colorThreshold;\n\n  let compliant = 0;\n\n  if (isBright && hasEnoughDifference) {\n    compliant = 2;\n  } else if (isBright || hasEnoughDifference) {\n    compliant = 1;\n  }\n\n  return {\n    brightnessDifference,\n    colorDifference,\n    compliant,\n    contrast,\n    largeAA: contrast >= 3,\n    largeAAA: contrast >= 4.5,\n    normalAA: contrast >= 4.5,\n    normalAAA: contrast >= 7,\n  };\n}\n","import formatCSS from '~/format-css';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { type ColorInput, isParsedColor, resolveColor } from '~/modules/parsed-color';\nimport { clamp } from '~/modules/utils';\nimport { isNumberInRange, isString } from '~/modules/validators';\n\nimport { ColorModelKeys, ColorType } from '~/types';\n\n/**\n * Create a function to update HSL color properties.\n *\n * @param key - The HSL property to update ('h', 's', or 'l').\n * @param operator - The operation to perform ('+' or '-').\n * @param format - The output color format.\n * @returns A function that takes a color and amount, returning the updated color.\n */\nexport default function updater(\n  key: ColorModelKeys<'hsl'>,\n  operator: '+' | '-',\n  format?: ColorType,\n) {\n  /**\n   * @param input - The input color string or ParsedColor.\n   * @param amount - A number between 0 and 100.\n   * @returns The updated color string.\n   */\n  return (input: ColorInput, amount: number) => {\n    invariant(isString(input) || isParsedColor(input), MESSAGES.inputString);\n    invariant(isNumberInRange(amount, 0, 100), MESSAGES.amount);\n\n    const parsed = resolveColor(input);\n    const { hsl } = parsed;\n    const output = format ?? parsed.type;\n\n    return formatCSS(\n      {\n        ...hsl,\n        [key]: clamp(hsl[key] + (operator === '+' ? amount : -amount), 0, 100),\n      },\n      { format: output, alpha: parsed.alpha < 1 ? parsed.alpha : undefined },\n    );\n  };\n}\n","import updater from '~/modules/updater';\n\nimport { ColorType } from '~/types';\n\n/**\n * Decrease color lightness.\n *\n * @param input - The input color string.\n * @param amount - A number between 0 and 100.\n * @param format - The output color format.\n * @returns The darkened color string.\n */\nexport default function darken(input: string, amount: number, format?: ColorType): string {\n  return updater('l', '-', format)(input, amount);\n}\n","import { MESSAGES, PRECISION } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { resolveColor } from '~/modules/parsed-color';\nimport { round } from '~/modules/utils';\nimport { isString } from '~/modules/validators';\n\nexport const DELTA_E_JND = 0.02;\n\n/**\n * Calculate the perceptual color difference (Delta E OK) between two colors.\n * Uses Euclidean distance in OkLab space.\n *\n * @param left - The first color string.\n * @param right - The second color string.\n * @param precision - The number of decimal places for the result.\n * @returns The Delta E OK value.\n */\nexport default function deltaE(left: string, right: string, precision = PRECISION): number {\n  invariant(isString(left), MESSAGES.left);\n  invariant(isString(right), MESSAGES.right);\n\n  const lab1 = resolveColor(left).oklab;\n  const lab2 = resolveColor(right).oklab;\n\n  return round(\n    Math.sqrt((lab1.l - lab2.l) ** 2 + (lab1.a - lab2.a) ** 2 + (lab1.b - lab2.b) ** 2),\n    precision,\n  );\n}\n","import updater from '~/modules/updater';\n\nimport { ColorType } from '~/types';\n\n/**\n * Decrease color saturation.\n *\n * @param input - The input color string.\n * @param amount - A number between 0 and 100.\n * @param format - The output color format.\n * @returns The desaturated color string.\n */\nexport default function desaturate(input: string, amount: number, format?: ColorType): string {\n  return updater('s', '-', format)(input, amount);\n}\n","import formatCSS from '~/format-css';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { resolveColor } from '~/modules/parsed-color';\nimport { isString } from '~/modules/validators';\n\nimport { ColorType } from '~/types';\n\n/**\n * Convert a color to grayscale using OkLCH (perceptually uniform).\n * Sets chroma to 0 while preserving lightness.\n *\n * @param input - The input color string.\n * @param format - The output color format.\n * @returns The grayscale color string.\n */\nexport default function grayscale(input: string, format?: ColorType): string {\n  invariant(isString(input), MESSAGES.inputString);\n\n  const parsed = resolveColor(input);\n  const lch = parsed.oklch;\n  const output = format ?? parsed.type;\n\n  return formatCSS(\n    { ...lch, c: 0 },\n    { format: output, alpha: parsed.alpha < 1 ? parsed.alpha : undefined },\n  );\n}\n","import formatCSS from '~/format-css';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { resolveColor } from '~/modules/parsed-color';\nimport { constrainDegrees } from '~/modules/utils';\nimport { isNumberInRange, isString } from '~/modules/validators';\n\nimport { ColorType } from '~/types';\n\n/**\n * Change the color hue by rotating it.\n *\n * @param input - The input color string.\n * @param degrees - A number between -360 and 360.\n * @param format - The output color format.\n * @returns The rotated color string.\n */\nexport default function rotate(input: string, degrees: number, format?: ColorType): string {\n  invariant(isString(input), MESSAGES.inputString);\n  invariant(isNumberInRange(degrees, -360, 360), MESSAGES.degreesRange);\n\n  const parsed = resolveColor(input);\n  const color = parsed.hsl;\n  const output = format ?? parsed.type;\n\n  return formatCSS(\n    {\n      ...color,\n      h: constrainDegrees(color.h, degrees),\n    },\n    { format: output, alpha: parsed.alpha < 1 ? parsed.alpha : undefined },\n  );\n}\n","import { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isString } from '~/modules/validators';\nimport rotate from '~/rotate';\n\n/**\n * Invert the color by rotating hue 180 degrees.\n *\n * @param input - The input color string.\n * @returns The inverted color string in the same format as input.\n */\nexport default function invert(input: string): string {\n  invariant(isString(input), MESSAGES.inputString);\n\n  return rotate(input, 180);\n}\n","import updater from '~/modules/updater';\n\nimport { ColorType } from '~/types';\n\n/**\n * Increase color lightness.\n *\n * @param input - The input color string.\n * @param amount - A number between 0 and 100.\n * @param format - The output color format.\n * @returns The lightened color string.\n */\nexport default function lighten(input: string, amount: number, format?: ColorType): string {\n  return updater('l', '+', format)(input, amount);\n}\n","import formatCSS from '~/format-css';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { resolveColor } from '~/modules/parsed-color';\nimport { isNumberInRange, isString } from '~/modules/validators';\n\nimport { ColorModel, ColorModelKey, ColorType, HSL, LAB, LCH, RGB } from '~/types';\n\nexport type HueMode = 'shorter' | 'longer' | 'increasing' | 'decreasing';\n\nexport interface MixOptions {\n  format?: ColorType;\n  hue?: HueMode;\n  space?: ColorModelKey;\n}\n\nfunction interpolateAlpha(a1: number, a2: number, ratio: number): number {\n  return a1 + (a2 - a1) * ratio;\n}\n\n/**\n * Interpolate hue with configurable arc direction.\n * Handles achromatic colors (chroma ≈ 0) by using the other color's hue.\n */\nfunction interpolateHue(\n  h1: number,\n  h2: number,\n  c1: number,\n  c2: number,\n  ratio: number,\n  mode: HueMode = 'shorter',\n): number {\n  // Threshold works for both OkLCH chroma (0-0.37) and HSL saturation (0-100):\n  // any value below 0.0001 is effectively achromatic in either space\n  if (c1 < 0.0001) {\n    return h2;\n  }\n\n  if (c2 < 0.0001) {\n    return h1;\n  }\n\n  let diff = h2 - h1;\n\n  switch (mode) {\n    case 'shorter': {\n      if (diff > 180) {\n        diff -= 360;\n      } else if (diff < -180) {\n        diff += 360;\n      }\n\n      break;\n    }\n    case 'longer': {\n      if (diff > 0 && diff < 180) {\n        diff -= 360;\n      } else if (diff > -180 && diff <= 0) {\n        diff += 360;\n      }\n\n      break;\n    }\n    case 'increasing': {\n      if (diff < 0) {\n        diff += 360;\n      }\n\n      break;\n    }\n    case 'decreasing': {\n      if (diff > 0) {\n        diff -= 360;\n      }\n\n      break;\n    }\n  }\n\n  const result = h1 + diff * ratio;\n\n  return ((result % 360) + 360) % 360;\n}\n\nfunction mixInHSL(c1: HSL, c2: HSL, ratio: number, hueMode: HueMode) {\n  return {\n    h: interpolateHue(c1.h, c2.h, c1.s, c2.s, ratio, hueMode),\n    s: c1.s + (c2.s - c1.s) * ratio,\n    l: c1.l + (c2.l - c1.l) * ratio,\n  };\n}\n\nfunction mixInOkLab(c1: LAB, c2: LAB, ratio: number) {\n  return {\n    l: c1.l + (c2.l - c1.l) * ratio,\n    a: c1.a + (c2.a - c1.a) * ratio,\n    b: c1.b + (c2.b - c1.b) * ratio,\n  };\n}\n\nfunction mixInOkLCH(c1: LCH, c2: LCH, ratio: number, hueMode: HueMode) {\n  return {\n    l: c1.l + (c2.l - c1.l) * ratio,\n    c: c1.c + (c2.c - c1.c) * ratio,\n    h: interpolateHue(c1.h, c2.h, c1.c, c2.c, ratio, hueMode),\n  };\n}\n\nfunction mixInRGB(c1: RGB, c2: RGB, ratio: number) {\n  return {\n    r: Math.round(c1.r + (c2.r - c1.r) * ratio),\n    g: Math.round(c1.g + (c2.g - c1.g) * ratio),\n    b: Math.round(c1.b + (c2.b - c1.b) * ratio),\n  };\n}\n\n/**\n * Mix two colors using interpolation in the specified color space.\n *\n * @param color1 - The first color string.\n * @param color2 - The second color string.\n * @param ratio - A number between 0 and 1 (0 = color1, 1 = color2).\n * @param formatOrOptions - Output format or mix options object.\n * @returns The mixed color string.\n */\nexport default function mix(\n  color1: string,\n  color2: string,\n  ratio: number = 0.5,\n  formatOrOptions?: ColorType | MixOptions,\n): string {\n  invariant(isString(color1), MESSAGES.inputString);\n  invariant(isString(color2), MESSAGES.inputString);\n  invariant(isNumberInRange(ratio, 0, 1), MESSAGES.ratioRange);\n\n  const {\n    format,\n    hue = 'shorter',\n    space = 'oklch',\n  } = isString(formatOrOptions, false) ? { format: formatOrOptions } : (formatOrOptions ?? {});\n  const parsed1 = resolveColor(color1);\n  const parsed2 = resolveColor(color2);\n  const output = format ?? parsed1.type;\n\n  let color: ColorModel;\n\n  switch (space) {\n    case 'hsl': {\n      color = mixInHSL(parsed1.hsl, parsed2.hsl, ratio, hue);\n      break;\n    }\n    case 'oklab': {\n      color = mixInOkLab(parsed1.oklab, parsed2.oklab, ratio);\n      break;\n    }\n    case 'rgb': {\n      color = mixInRGB(parsed1.rgb, parsed2.rgb, ratio);\n      break;\n    }\n\n    case 'oklch':\n    default: {\n      color = mixInOkLCH(parsed1.oklch, parsed2.oklch, ratio, hue);\n      break;\n    }\n  }\n\n  const alpha = interpolateAlpha(parsed1.alpha, parsed2.alpha, ratio);\n\n  return formatCSS(color, { format: output, alpha: alpha < 1 ? alpha : undefined });\n}\n","import formatCSS from '~/format-css';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { resolveColor } from '~/modules/parsed-color';\nimport { isNumberInRange, isString } from '~/modules/validators';\n\nimport { ColorType } from '~/types';\n\n/**\n * Set the color opacity/alpha.\n *\n * @param input - The input color string.\n * @param alpha - A number between 0 and 1.\n * @param format - The output color format.\n * @returns The opacified color string.\n */\nexport default function opacify(input: string, alpha: number, format?: ColorType): string {\n  invariant(isString(input), MESSAGES.inputString);\n  invariant(isNumberInRange(alpha, 0, 1), MESSAGES.alpha);\n\n  const parsed = resolveColor(input);\n\n  return formatCSS(parsed.oklch, { format: format ?? parsed.type, alpha });\n}\n","import { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { resolveColor } from '~/modules/parsed-color';\nimport { isString } from '~/modules/validators';\n\n/**\n * Get the opacity/alpha value of a color.\n *\n * @param input - The input color string.\n * @returns The opacity value (0-1).\n */\nexport default function opacity(input: string): number {\n  invariant(isString(input), MESSAGES.inputString);\n\n  return resolveColor(input).alpha;\n}\n","import apcaContrast from '~/apca';\nimport contrast from '~/contrast';\nimport luminance from '~/luminance';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { resolveColor } from '~/modules/parsed-color';\nimport { isString } from '~/modules/validators';\n\nexport type ReadableColorMethod = 'apca' | 'contrast' | 'oklab' | 'wcag' | 'yiq';\n\nexport interface ReadableColorOptions {\n  /**\n   * The dark color to return if the background is light.\n   * @default '#000000'\n   */\n  darkColor?: string;\n  /**\n   * The light color to return if the background is dark.\n   * @default '#ffffff'\n   */\n  lightColor?: string;\n  /**\n   * The method to use for determining contrast.\n   *\n   * - `yiq`: YIQ brightness formula (fast, simple)\n   * - `wcag`: WCAG 2.x relative luminance threshold\n   * - `contrast`: WCAG 2.x contrast ratio comparison\n   * - `oklab`: OkLab perceptual lightness threshold\n   * - `apca`: APCA contrast comparison (WCAG 3.0 candidate)\n   *\n   * @default 'yiq'\n   */\n  method?: ReadableColorMethod;\n  /**\n   * The threshold for threshold-based methods.\n   *\n   * - `yiq`: 0-255 (default: 128)\n   * - `wcag`: 0-1 (default: 0.5)\n   * - `oklab`: 0-1 (default: 0.5)\n   * - `contrast` and `apca`: ignored (comparison-based)\n   */\n  threshold?: number;\n}\n\n/**\n * Compare two contrast values and return the color with higher contrast.\n * Returns darkColor if equal (arbitrary but consistent).\n */\nfunction pickByContrast(\n  darkContrast: number,\n  lightContrast: number,\n  darkColor: string,\n  lightColor: string,\n): string {\n  return darkContrast >= lightContrast ? darkColor : lightColor;\n}\n\n/**\n * Get the most readable color (light or dark) for a given background.\n *\n * Supports multiple methods for determining contrast:\n * - `yiq`: Simple YIQ brightness formula (default, backwards compatible)\n * - `wcag`: WCAG 2.x relative luminance with threshold\n * - `contrast`: WCAG 2.x contrast ratio comparison\n * - `oklab`: OkLab perceptual lightness with threshold\n * - `apca`: APCA contrast comparison (WCAG 3.0 candidate)\n *\n * @param backgroundColor - The background color string.\n * @param methodOrOptions - Method or options object.\n * @returns The most readable color (light or dark).\n */\n\nexport default function readableColor(\n  backgroundColor: string,\n  methodOrOptions?: ReadableColorMethod | ReadableColorOptions,\n): string {\n  const {\n    darkColor = '#000000',\n    lightColor = '#ffffff',\n    method = 'yiq',\n    threshold,\n  } = isString(methodOrOptions, false) ? { method: methodOrOptions } : (methodOrOptions ?? {});\n\n  invariant(isString(backgroundColor), MESSAGES.inputString);\n\n  const parsed = resolveColor(backgroundColor);\n  const bgCSS = parsed.toCSS();\n\n  switch (method) {\n    case 'yiq': {\n      const yiqThreshold = threshold ?? 128;\n\n      invariant(yiqThreshold >= 0 && yiqThreshold <= 255, MESSAGES.threshold);\n\n      const { r, g, b } = parsed.rgb;\n      const yiq = (r * 299 + g * 587 + b * 114) / 1000;\n\n      return yiq >= yiqThreshold ? darkColor : lightColor;\n    }\n    case 'wcag': {\n      const wcagThreshold = threshold ?? 0.5;\n\n      invariant(wcagThreshold >= 0 && wcagThreshold <= 1, MESSAGES.thresholdNormalized);\n\n      const lum = luminance(bgCSS);\n\n      return lum >= wcagThreshold ? darkColor : lightColor;\n    }\n    case 'contrast': {\n      const darkContrast = contrast(darkColor, bgCSS);\n      const lightContrast = contrast(lightColor, bgCSS);\n\n      return pickByContrast(darkContrast, lightContrast, darkColor, lightColor);\n    }\n    case 'oklab': {\n      const oklabThreshold = threshold ?? 0.5;\n\n      invariant(oklabThreshold >= 0 && oklabThreshold <= 1, MESSAGES.thresholdNormalized);\n\n      const { l } = parsed.oklab;\n\n      return l >= oklabThreshold ? darkColor : lightColor;\n    }\n    case 'apca': {\n      const darkContrast = Math.abs(apcaContrast(bgCSS, darkColor));\n      const lightContrast = Math.abs(apcaContrast(bgCSS, lightColor));\n\n      return pickByContrast(darkContrast, lightContrast, darkColor, lightColor);\n    }\n    /* v8 ignore next 3 -- @preserve */\n    default: {\n      throw new Error(`Unknown method: ${method}`);\n    }\n  }\n}\n","import updater from '~/modules/updater';\n\nimport { ColorType } from '~/types';\n\n/**\n * Increase color saturation.\n *\n * @param input - The input color string.\n * @param amount - A number between 0 and 100.\n * @param format - The output color format.\n * @returns The saturated color string.\n */\nexport default function saturate(input: string, amount: number, format?: ColorType): string {\n  return updater('s', '+', format)(input, amount);\n}\n","import { GAMUT_EPSILON, LMS_TO_LRGB, OKLAB_TO_CLMS, SRGB_TO_P3 } from '~/modules/constants';\n\nimport { ColorTuple } from '~/types';\n\nfunction multiplyMatrix(matrix: number[][], vector: ColorTuple): ColorTuple {\n  return [\n    matrix[0][0] * vector[0] + matrix[0][1] * vector[1] + matrix[0][2] * vector[2],\n    matrix[1][0] * vector[0] + matrix[1][1] * vector[1] + matrix[1][2] * vector[2],\n    matrix[2][0] * vector[0] + matrix[2][1] * vector[1] + matrix[2][2] * vector[2],\n  ];\n}\n\nexport function isInGamut(color: ColorTuple): boolean {\n  return color.every(component => component >= 0 - GAMUT_EPSILON && component <= 1 + GAMUT_EPSILON);\n}\n\nexport function oklabToLinearP3(L: number, a: number, b: number): ColorTuple {\n  return multiplyMatrix(SRGB_TO_P3, oklabToLinearSRGB(L, a, b));\n}\n\nexport function oklabToLinearSRGB(L: number, a: number, b: number): ColorTuple {\n  const l = (OKLAB_TO_CLMS[0][0] * L + OKLAB_TO_CLMS[0][1] * a + OKLAB_TO_CLMS[0][2] * b) ** 3;\n  const m = (OKLAB_TO_CLMS[1][0] * L + OKLAB_TO_CLMS[1][1] * a + OKLAB_TO_CLMS[1][2] * b) ** 3;\n  const s = (OKLAB_TO_CLMS[2][0] * L + OKLAB_TO_CLMS[2][1] * a + OKLAB_TO_CLMS[2][2] * b) ** 3;\n\n  return [\n    LMS_TO_LRGB[0][0] * l + LMS_TO_LRGB[0][1] * m + LMS_TO_LRGB[0][2] * s,\n    LMS_TO_LRGB[1][0] * l + LMS_TO_LRGB[1][1] * m + LMS_TO_LRGB[1][2] * s,\n    LMS_TO_LRGB[2][0] * l + LMS_TO_LRGB[2][1] * m + LMS_TO_LRGB[2][2] * s,\n  ];\n}\n","import { oklch2oklab } from '~/converters';\nimport formatCSS from '~/format-css';\nimport { GAMUT_EPSILON, MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isInGamut, oklabToLinearSRGB } from '~/modules/linear-rgb';\nimport { resolveColor } from '~/modules/parsed-color';\nimport { isString } from '~/modules/validators';\n\nimport { ColorType } from '~/types';\n\n/**\n * Map a color into the sRGB gamut by reducing chroma in OkLCH space.\n * Colors already in gamut are returned unchanged.\n *\n * @param input - The input color string.\n * @param format - Optional output color format.\n * @returns The gamut-mapped color string.\n */\nexport default function toGamut(input: string, format?: ColorType): string {\n  invariant(isString(input), MESSAGES.inputString);\n\n  const parsed = resolveColor(input);\n  const lch = parsed.oklch;\n  const output = format ?? parsed.type;\n  const alpha = parsed.alpha < 1 ? parsed.alpha : undefined;\n\n  // Edge cases: extreme lightness\n  if (lch.l <= 0) {\n    return formatCSS({ r: 0, g: 0, b: 0 }, { format: output, alpha });\n  }\n\n  if (lch.l >= 1) {\n    return formatCSS({ r: 255, g: 255, b: 255 }, { format: output, alpha });\n  }\n\n  // Already in gamut?\n  const lab = oklch2oklab(lch, 16);\n\n  if (isInGamut(oklabToLinearSRGB(lab.l, lab.a, lab.b))) {\n    return formatCSS(lch, { format: output, alpha });\n  }\n\n  // Binary search: reduce chroma until in sRGB gamut\n  const epsilon = GAMUT_EPSILON;\n  let low = 0;\n  let high = lch.c;\n\n  while (high - low > epsilon) {\n    const mid = (low + high) / 2;\n    const midLab = oklch2oklab({ l: lch.l, c: mid, h: lch.h }, 16);\n\n    if (isInGamut(oklabToLinearSRGB(midLab.l, midLab.a, midLab.b))) {\n      low = mid;\n    } else {\n      high = mid;\n    }\n  }\n\n  return formatCSS({ l: lch.l, c: low, h: lch.h }, { format: output, alpha });\n}\n","import formatCSS from '~/format-css';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { resolveColor } from '~/modules/parsed-color';\nimport { clamp, round } from '~/modules/utils';\nimport { isNumberInRange, isString } from '~/modules/validators';\n\nimport { ColorType } from '~/types';\n\n/**\n * Increase the color transparency.\n *\n * @param input - The input color string.\n * @param alpha - A number between -1 and 1. Positive values increase transparency, negative values decrease transparency.\n * @param format - The output color format.\n * @returns The transparentized color string.\n */\nexport default function transparentize(input: string, alpha: number, format?: ColorType): string {\n  invariant(isString(input), MESSAGES.inputString);\n  invariant(isNumberInRange(alpha, -1, 1), MESSAGES.alphaAdjustment);\n\n  const parsed = resolveColor(input);\n  const value = round(clamp(parsed.alpha - alpha, 0, 1));\n\n  return formatCSS(parsed.oklch, { format: format ?? parsed.type, alpha: value });\n}\n","import brightnessDifference from '~/brightness-difference';\nimport chroma from '~/chroma';\nimport colorDifference from '~/color-difference';\nimport compare from '~/compare';\nimport contrast from '~/contrast';\nimport darken from '~/darken';\nimport deltaE from '~/delta-e';\nimport desaturate from '~/desaturate';\nimport formatCSS from '~/format-css';\nimport grayscale from '~/grayscale';\nimport invert from '~/invert';\nimport lighten from '~/lighten';\nimport luminance from '~/luminance';\nimport mix, { MixOptions } from '~/mix';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { resolveColor } from '~/modules/parsed-color';\nimport opacify from '~/opacify';\nimport opacity from '~/opacity';\nimport readableColor from '~/readable-color';\nimport rotate from '~/rotate';\nimport saturate from '~/saturate';\nimport toGamut from '~/to-gamut';\nimport transparentize from '~/transparentize';\n\nimport { Analysis, ColorModel, ColorType, HEX, HSL, LAB, LCH, RGB } from '~/types';\n\nexport interface ColorizrOptions {\n  /**\n   * Output color format.\n   *\n   * If not specified, the output will use the same format as the input color.\n   */\n  format?: ColorType;\n}\n\nexport default class Colorizr {\n  /** The alpha/opacity value (0-1). */\n  public alpha: number;\n  public hex: HEX;\n  public hsl: HSL;\n  public oklab: LAB;\n  public oklch: LCH;\n  public rgb: RGB;\n  public type: ColorType;\n\n  constructor(color: string | ColorModel, options: ColorizrOptions = {}) {\n    invariant(!!color, MESSAGES.colorRequired);\n\n    const parsed = resolveColor(color);\n\n    this.hex = parsed.hex;\n    this.hsl = parsed.hsl;\n    this.oklab = parsed.oklab;\n    this.oklch = parsed.oklch;\n    this.rgb = parsed.rgb;\n\n    this.alpha = parsed.alpha;\n    this.type = options.format ?? parsed.type;\n  }\n\n  /**\n   * Get CSS string\n   */\n  get css(): string {\n    return this.currentColor;\n  }\n\n  /**\n   * Get the red value\n   */\n  get red(): number {\n    return this.rgb.r;\n  }\n\n  /**\n   * Get the green value\n   */\n  get green(): number {\n    return this.rgb.g;\n  }\n\n  /**\n   * Get the blue value\n   */\n  get blue(): number {\n    return this.rgb.b;\n  }\n\n  /**\n   * Get the hue value\n   */\n  get hue(): number {\n    return this.hsl.h;\n  }\n\n  /**\n   * Get the saturation value\n   */\n  get saturation(): number {\n    return this.hsl.s;\n  }\n\n  /**\n   * Get the lightness value\n   */\n  get lightness(): number {\n    return this.hsl.l;\n  }\n\n  /**\n   * Get the luminance value\n   */\n  get luminance(): number {\n    return luminance(this.currentColor);\n  }\n\n  /**\n   * Get the chroma value\n   */\n  get chroma(): number {\n    return chroma(this.currentColor);\n  }\n\n  /**\n   * Get the opacity value.\n   */\n  get opacity(): number {\n    return opacity(this.currentColor);\n  }\n\n  /**\n   * Get the most readable color (light or dark) for this color as a background.\n   */\n  get readableColor(): string {\n    return readableColor(this.currentColor);\n  }\n\n  private get currentColor(): string {\n    return formatCSS(this[this.type], { format: this.type, alpha: this.alpha });\n  }\n\n  /**\n   * Get the brightness difference between this color and another.\n   *\n   * @param input - The color to compare against.\n   * @returns The brightness difference value.\n   */\n  public brightnessDifference(input: string): number {\n    return brightnessDifference(this.currentColor, input);\n  }\n\n  /**\n   * Get the color difference between this color and another.\n   *\n   * @param input - The color to compare against.\n   * @returns The color difference value.\n   */\n  public colorDifference(input: string): number {\n    return colorDifference(this.currentColor, input);\n  }\n\n  /**\n   * Test 2 colors for WCAG compliance.\n   *\n   * @param input - The color to compare against.\n   * @returns Analysis object with compliance information.\n   */\n  public compare(input: string): Analysis {\n    return compare(this.currentColor, input);\n  }\n\n  /**\n   * Get the contrast ratio between this color and another.\n   *\n   * @param input - The color to compare against.\n   * @returns The contrast ratio.\n   */\n  public contrast(input: string): number {\n    return contrast(this.currentColor, input);\n  }\n\n  /**\n   * Get the perceptual color difference (Delta E OK) between this color and another.\n   *\n   * @param input - The color to compare against.\n   * @returns The Delta E OK value.\n   */\n  public deltaE(input: string): number {\n    return deltaE(this.currentColor, input);\n  }\n\n  /**\n   * Format the color to a specific type.\n   *\n   * @param type - The color format to convert to.\n   * @param precision - The decimal precision for the output.\n   * @returns The formatted color string.\n   */\n  public format(type: ColorType, precision?: number): string {\n    return formatCSS(this.rgb, {\n      alpha: this.alpha,\n      format: type,\n      precision,\n    });\n  }\n\n  /**\n   * Increase lightness.\n   *\n   * @param amount - A number between 0 and 100.\n   * @returns The lightened color string.\n   */\n  public lighten(amount: number): string {\n    return lighten(this.currentColor, amount);\n  }\n\n  /**\n   * Decrease lightness.\n   *\n   * @param amount - A number between 0 and 100.\n   * @returns The darkened color string.\n   */\n  public darken(amount: number): string {\n    return darken(this.currentColor, amount);\n  }\n\n  /**\n   * Increase saturation.\n   *\n   * @param amount - A number between 0 and 100.\n   * @returns The saturated color string.\n   */\n  public saturate(amount: number): string {\n    return saturate(this.currentColor, amount);\n  }\n\n  /**\n   * Decrease saturation.\n   *\n   * @param amount - A number between 0 and 100.\n   * @returns The desaturated color string.\n   */\n  public desaturate(amount: number): string {\n    return desaturate(this.currentColor, amount);\n  }\n\n  /**\n   * Convert to grayscale.\n   *\n   * @returns The grayscale color string.\n   */\n  public grayscale(): string {\n    return grayscale(this.currentColor);\n  }\n\n  /**\n   * Invert color.\n   *\n   * @returns The inverted color string.\n   */\n  public invert(): string {\n    return invert(this.currentColor);\n  }\n\n  /**\n   * Mix with another color.\n   *\n   * @param color - The color to mix with.\n   * @param ratio - A number between 0 and 1 (0 = this color, 1 = input color).\n   * @param options - Mix options: format, hue mode, interpolation space.\n   * @returns The mixed color string.\n   */\n  public mix(color: string, ratio?: number, options?: MixOptions): string {\n    return mix(this.currentColor, color, ratio, options);\n  }\n\n  /**\n   * Add opacity to the color.\n   *\n   * @param alpha - A number between 0 and 1.\n   * @returns The opacified color string.\n   */\n  public opacify(alpha: number = 0.9): string {\n    return opacify(this.currentColor, alpha, this.type);\n  }\n\n  /**\n   * Rotate color hue.\n   *\n   * @param degrees - A number between -360 and 360.\n   * @returns The rotated color string.\n   */\n  public rotate(degrees: number): string {\n    return rotate(this.currentColor, degrees);\n  }\n\n  /**\n   * Map this color into the sRGB gamut by reducing chroma.\n   *\n   * @param format - Optional output color format.\n   * @returns The gamut-mapped color string.\n   */\n  public toGamut(format?: ColorType): string {\n    return toGamut(this.currentColor, format);\n  }\n\n  /**\n   * Make the color more transparent.\n   *\n   * @param alpha - A number between -1 and 1.\n   * @returns The transparentized color string.\n   */\n  public transparentize(alpha: number = 0.1): string {\n    return transparentize(this.currentColor, alpha, this.type);\n  }\n}\n","import extractColorParts from '~/extract-color-parts';\nimport { isHex, isNamedColor, isString } from '~/modules/validators';\n\nimport { ColorTypeInput } from '~/types';\n\n/**\n * Detect the color type from a CSS color string.\n *\n * @param input - The color string to analyze.\n * @returns The detected color type ('hex', 'hsl', 'rgb', 'oklab', 'oklch', 'named'),\n *          or `null` if the input is not a valid color string.\n */\nexport default function getColorType(input: string): ColorTypeInput | null {\n  if (!isString(input)) {\n    return null;\n  }\n\n  if (isHex(input)) {\n    return 'hex';\n  }\n\n  if (isNamedColor(input)) {\n    return 'named';\n  }\n\n  try {\n    const { model } = extractColorParts(input);\n\n    return model;\n  } catch {\n    return null;\n  }\n}\n","import getColorType from '~/get-color-type';\n\nimport { ColorTypeInput } from '~/types';\n\n/**\n * Check if a string is a valid CSS color.\n * Optionally validate against a specific color type.\n *\n * @param input - The color string to validate.\n * @param type - Optional color type to check against.\n * @returns True if the input is a valid color (of the specified type, if given).\n */\nexport default function isValidColor(input: string, type?: ColorTypeInput): boolean {\n  const detectedType = getColorType(input);\n\n  if (detectedType === null) {\n    return false;\n  }\n\n  if (type === undefined) {\n    return true;\n  }\n\n  return detectedType === type;\n}\n","import { MESSAGES } from '~/modules/constants';\nimport { cssColors } from '~/modules/css-colors';\nimport { invariant } from '~/modules/invariant';\nimport { resolveColor } from '~/modules/parsed-color';\nimport { isString } from '~/modules/validators';\n\n/**\n * Get the CSS color name of a color.\n * Returns the hex value if no matching name is found.\n *\n * @param input - The input color string.\n * @returns The CSS color name or hex value.\n */\nexport default function name(input: string): string {\n  invariant(isString(input), MESSAGES.inputString);\n\n  const { hex } = resolveColor(input);\n\n  const [color] = Object.entries(cssColors).find(([, value]) => value === hex) || [];\n\n  return color ?? hex;\n}\n","import * as converters from '~/converters';\nimport extractColorParts from '~/extract-color-parts';\nimport {\n  addAlpha,\n  convertAlphaToHex,\n  extractAlphaFromHex,\n  removeAlphaFromHex,\n} from '~/modules/alpha';\nimport { MESSAGES } from '~/modules/constants';\nimport { CSSColor, cssColors } from '~/modules/css-colors';\nimport { invariant } from '~/modules/invariant';\nimport { normalizeOkLightness } from '~/modules/utils';\nimport { isHex, isNamedColor, isString } from '~/modules/validators';\n\nimport {\n  ColorModel,\n  ColorModelKey,\n  ColorReturn,\n  ColorTuple,\n  ColorType,\n  HEX,\n  HSL,\n  LAB,\n  LCH,\n  RGB,\n} from '~/types';\n\ntype ToHexFn = (input: ColorTuple) => HEX;\ntype ToHslFn = (input: ColorTuple) => HSL;\ntype ToOklabFn = (input: ColorTuple) => LAB;\ntype ToOklchFn = (input: ColorTuple) => LCH;\ntype ToRgbFn = (input: ColorTuple) => RGB;\n\nconst toHslConverters: Partial<Record<ColorModelKey, ToHslFn>> = {\n  oklab: converters.oklab2hsl,\n  oklch: converters.oklch2hsl,\n  rgb: converters.rgb2hsl,\n};\n\nconst toOklabConverters: Partial<Record<ColorModelKey, ToOklabFn>> = {\n  hsl: converters.hsl2oklab,\n  oklch: converters.oklch2oklab,\n  rgb: converters.rgb2oklab,\n};\n\nconst toOklchConverters: Partial<Record<ColorModelKey, ToOklchFn>> = {\n  hsl: converters.hsl2oklch,\n  oklab: converters.oklab2oklch,\n  rgb: converters.rgb2oklch,\n};\n\nconst toRgbConverters: Partial<Record<ColorModelKey, ToRgbFn>> = {\n  hsl: converters.hsl2rgb,\n  oklab: converters.oklab2rgb,\n  oklch: converters.oklch2rgb,\n};\n\nconst toHexConverters: Record<ColorModelKey, ToHexFn> = {\n  hsl: converters.hsl2hex,\n  oklab: converters.oklab2hex,\n  oklch: converters.oklch2hex,\n  rgb: converters.rgb2hex,\n};\n\n// Hex-to-format converters lookup\nconst fromHexConverters: Record<Exclude<ColorType, 'hex'>, (input: HEX) => ColorModel> = {\n  hsl: converters.hex2hsl,\n  oklab: converters.hex2oklab,\n  oklch: converters.hex2oklch,\n  rgb: converters.hex2rgb,\n};\n\n// Model-to-format converter tables lookup\nconst converterTables: Record<\n  Exclude<ColorType, 'hex'>,\n  Partial<Record<ColorModelKey, ToHslFn | ToOklabFn | ToOklchFn | ToRgbFn>>\n> = {\n  hsl: toHslConverters,\n  oklab: toOklabConverters,\n  oklch: toOklchConverters,\n  rgb: toRgbConverters,\n};\n\nfunction convertFromCSS(value: string, output: ColorType): HEX | HSL | LAB | LCH | RGB {\n  const { alpha, model, ...color } = extractColorParts(value);\n\n  const normalized = ['oklab', 'oklch'].includes(model)\n    ? normalizeOkLightness(color as unknown as { l: number })\n    : color;\n\n  const colorTuple = Object.values(normalized) as ColorTuple;\n\n  if (output === 'hex') {\n    const alphaPrefix = alpha ? convertAlphaToHex(alpha) : '';\n\n    return `${toHexConverters[model](colorTuple)}${alphaPrefix}` as HEX;\n  }\n\n  const converter = converterTables[output]?.[model];\n\n  // When converter is undefined, model matches output format, so color already has correct shape\n  return addAlpha(\n    converter ? converter(colorTuple) : (normalized as unknown as HSL | LAB | LCH | RGB),\n    alpha,\n  );\n}\n\nfunction convertFromHex(value: HEX, output: ColorType): HEX | HSL | LAB | LCH | RGB {\n  const alpha = extractAlphaFromHex(value);\n\n  if (output === 'hex') {\n    return `${removeAlphaFromHex(value)}${alpha !== 1 ? convertAlphaToHex(alpha) : ''}` as HEX;\n  }\n\n  return addAlpha(fromHexConverters[output](value), alpha);\n}\n\n/**\n * Parse a CSS color string and optionally convert to a specific format.\n *\n * @param input - The CSS color string.\n * @param format - Optional output color format.\n * @returns The parsed color in the specified format.\n */\nexport default function parseCSS<T extends ColorType>(input: string, format?: T): ColorReturn<T> {\n  invariant(isString(input), MESSAGES.inputString);\n\n  const value = isNamedColor(input) ? cssColors[input.toLowerCase() as CSSColor] : input;\n  const output = format ?? (isHex(value) ? 'hex' : extractColorParts(value).model);\n\n  if (isHex(value)) {\n    return convertFromHex(value, output) as ColorReturn<T>;\n  }\n\n  return convertFromCSS(value, output) as ColorReturn<T>;\n}\n","import { oklch2oklab } from '~/converters';\nimport { GAMUT_EPSILON, MESSAGES, PRECISION } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isInGamut, oklabToLinearP3 } from '~/modules/linear-rgb';\nimport { round } from '~/modules/utils';\nimport { isNumberInRange, isString } from '~/modules/validators';\nimport parseCSS from '~/parse-css';\n\nimport { LCH } from '~/types';\n\n/**\n * Get the maximum chroma for a given lightness and hue in the OkLCH color space.\n *\n * @param input - The input color string or LCH object.\n * @param precision - The number of decimal places for the result.\n * @returns The maximum chroma value within P3 gamut.\n */\nexport function getP3MaxChroma(input: string | LCH, precision = PRECISION): number {\n  const { l, h } = isString(input) ? parseCSS(input, 'oklch') : input;\n\n  invariant(isNumberInRange(l, 0, 1), MESSAGES.lightnessRange);\n  invariant(isNumberInRange(h, 0, 360), MESSAGES.hueRange);\n\n  // Binary search parameters\n  const epsilon = GAMUT_EPSILON;\n  let low = 0;\n  let high = 0.5; // Increased max theoretical chroma\n\n  while (high - low > epsilon) {\n    const mid = (low + high) / 2;\n    const { l: L, a, b } = oklch2oklab({ l, c: mid, h }, 16);\n\n    const p3Color = oklabToLinearP3(L, a, b);\n\n    if (isInGamut(p3Color)) {\n      low = mid;\n    } else {\n      high = mid;\n    }\n  }\n\n  return round(low, precision);\n}\n\n/**\n * Get an OkLCH color with maximum chroma in the P3 color space.\n *\n * @param input - The input color string or LCH object.\n * @returns The OkLCH color string with maximum chroma.\n */\nexport function getP3MaxColor(input: string | LCH): string {\n  const lch = isString(input) ? parseCSS(input, 'oklch') : input;\n\n  return `oklch(${round(lch.l, PRECISION, false)} ${getP3MaxChroma(lch)} ${round(lch.h, PRECISION, false)})`;\n}\n","import convertCSS from '~/convertCSS';\nimport hsl2hex from '~/converters/hsl2hex';\nimport { MESSAGES, MONOCHROMATIC_LIGHTNESS_MAX } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { resolveColor } from '~/modules/parsed-color';\nimport { isPlainObject, isString } from '~/modules/validators';\nimport rotate from '~/rotate';\n\nimport { ColorType, HEX } from '~/types';\n\nexport interface PaletteOptions {\n  /**\n   * Output color format.\n   *\n   * If not specified, the output will use the same format as the input color.\n   */\n  format?: ColorType;\n  /**\n   * Adjusts the lightness of the base color before generating the palette.\n   *\n   * Value should be between 0 and 100.\n   */\n  lightness?: number;\n  /**\n   * Generate a monochromatic palette.\n   *\n   * For more options, use the `scale` function.\n   */\n  monochromatic?: boolean;\n  /**\n   * Adjusts the saturation of the base color before generating the palette.\n   *\n   * Value should be between 0 and 100.\n   */\n  saturation?: number;\n  /**\n   * The number of colors to generate in the palette.\n   *\n   * Minimum value is 2.\n   * @default 6\n   */\n  size?: number;\n}\n\n/**\n * Generate a color palette from a base color.\n *\n * @param input - The base color string.\n * @param formatOrOptions - Output format or palette options object.\n * @returns An array of color strings.\n */\nexport default function palette(\n  input: string,\n  formatOrOptions?: ColorType | PaletteOptions,\n): string[] {\n  invariant(isString(input), MESSAGES.inputString);\n\n  const options = isString(formatOrOptions, false)\n    ? { format: formatOrOptions }\n    : (formatOrOptions ?? {});\n\n  invariant(isPlainObject(options), MESSAGES.options);\n\n  const { format, lightness, monochromatic, saturation, size = 6 } = options;\n\n  invariant(size >= 2, MESSAGES.paletteSize);\n\n  const parsed = resolveColor(input);\n  const { hsl } = parsed;\n  const colorFormat = format ?? parsed.type;\n\n  const output: string[] = [];\n\n  if (monochromatic) {\n    const step = MONOCHROMATIC_LIGHTNESS_MAX / size;\n\n    for (let index = size; index > 0; index--) {\n      output.push(hsl2hex({ ...hsl, l: step * index }));\n    }\n  } else {\n    const step = 360 / size;\n\n    output.push(hsl2hex({ ...hsl, l: lightness ?? hsl.l, s: saturation ?? hsl.s }));\n\n    for (let index = 1; index < size; index++) {\n      const color = rotate(input, step * index, 'hex') as HEX;\n      const rotatedHsl = resolveColor(color).hsl;\n\n      output.push(hsl2hex({ ...rotatedHsl, l: lightness ?? hsl.l, s: saturation ?? hsl.s }));\n    }\n  }\n\n  return output.map(color => convertCSS(color, colorFormat));\n}\n","import formatCSS from '~/format-css';\nimport { clamp } from '~/modules/utils';\n\nimport { ColorType } from '~/types';\n\ninterface RandomOptions {\n  /**\n   * The color format to return.\n   * @default 'hex'\n   */\n  format?: ColorType;\n  /**\n   * Maximum hue value (0-360).\n   * @default 360\n   */\n  maxHue?: number;\n  /**\n   * Maximum lightness value (0-100).\n   * @default 90\n   */\n  maxLightness?: number;\n  /**\n   * Maximum saturation value (0-100).\n   * @default 100\n   */\n  maxSaturation?: number;\n  /**\n   * Minimum hue value (0-360).\n   * If minHue > maxHue, the range wraps around 0° (e.g., 330-30 for reds).\n   * @default 0\n   */\n  minHue?: number;\n  /**\n   * Minimum lightness value (0-100).\n   * @default 10\n   */\n  minLightness?: number;\n  /**\n   * Minimum saturation value (0-100).\n   * @default 10\n   */\n  minSaturation?: number;\n}\n\n/**\n * Generate a random number within a range.\n * Supports wrap-around for hue values (when min > max).\n */\nfunction randomInRange(min: number, max: number, wrapAt?: number): number {\n  if (wrapAt && min > max) {\n    // Handle wrap-around (e.g., hue 330-30 spans through 0)\n    const range = wrapAt - min + max;\n    const value = min + Math.floor(Math.random() * range);\n\n    return value >= wrapAt ? value - wrapAt : value;\n  }\n\n  return min + Math.floor(Math.random() * (max - min + 1));\n}\n\n/**\n * Generate a random color.\n *\n * @param options - Options to constrain the random color generation.\n * @returns The random color string.\n */\nexport default function random(options: RandomOptions = {}): string {\n  const { format = 'hex' } = options;\n\n  const minHue = clamp(options.minHue ?? 0, 0, 360);\n  const maxHue = clamp(options.maxHue ?? 360, 0, 360);\n  const minSaturation = clamp(options.minSaturation ?? 10, 0, 100);\n  const maxSaturation = clamp(options.maxSaturation ?? 100, 0, 100);\n  const minLightness = clamp(options.minLightness ?? 10, 0, 100);\n  const maxLightness = clamp(options.maxLightness ?? 90, 0, 100);\n\n  const hsl = {\n    h: randomInRange(minHue, maxHue, 360),\n    s: randomInRange(\n      Math.min(minSaturation, maxSaturation),\n      Math.max(minSaturation, maxSaturation),\n    ),\n    l: randomInRange(Math.min(minLightness, maxLightness), Math.max(minLightness, maxLightness)),\n  };\n\n  return formatCSS(hsl, { format });\n}\n","import formatCSS from '~/format-css';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { resolveColor } from '~/modules/parsed-color';\nimport { clamp, getScaleStepKeys, warn } from '~/modules/utils';\nimport { isNumber, isString } from '~/modules/validators';\nimport { getP3MaxChroma } from '~/p3';\n\nimport type { ColorType, LCH } from '~/types';\n\ninterface GeneratePaletteOptions extends Required<\n  Pick<ScaleOptions, 'chromaCurve' | 'lightnessCurve' | 'maxLightness' | 'minLightness' | 'mode'>\n> {\n  baseChroma: number;\n  hue: number;\n  inputLightness: number | undefined;\n  keys: number[];\n  lock: number | undefined;\n}\n\nexport type ScaleMode = 'light' | 'dark';\n\nexport type ScaleVariant = 'deep' | 'neutral' | 'pastel' | 'subtle' | 'vibrant';\n\n/**\n * Options for generating a color scale.\n *\n * **Option Precedence:**\n * - `saturation` overrides `variant` if both are set\n * - `lock` affects palette calculation: steps are distributed relative to the locked position\n * - `mode` affects lightness direction: 'light' has lightest at low keys, 'dark' reverses this\n */\nexport interface ScaleOptions {\n  /**\n   * Controls chroma distribution across lightness levels (0-1).\n   * - 0: Constant chroma across all steps (default).\n   * - 1: Parabolic curve — full chroma at mid-lightness, reduced toward extremes.\n   * - Values between interpolate between constant and parabolic.\n   *\n   * @default 0\n   */\n  chromaCurve?: number;\n  /**\n   * Output color format.\n   *\n   * Determines the format of the generated colors (e.g., HEX, RGB, OKLCH, etc.).\n   *\n   * If not specified, the output will match the format of the input color.\n   */\n  format?: ColorType;\n  /**\n   * The lightness tuning factor for the scale.\n   * - 1: Linear lightness distribution.\n   * - >1: Lighter tones are emphasized.\n   * - <1: Darker tones are emphasized.\n   * @default 1.5\n   */\n  lightnessCurve?: number;\n  /**\n   * Lock input color's lightness at specific step position.\n   *\n   * The input color's lightness is anchored at this step, and other steps\n   * are distributed relative to it. Chroma is also preserved unless\n   * `chromaCurve` or `saturation` are set, which recalculate chroma independently.\n   *\n   * Must be a valid step key for the current step count.\n   * Default step keys (11 steps): 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950.\n   * Step keys vary based on the `steps` option (3-20 steps supported).\n   */\n  lock?: number;\n  /**\n   * The maximum lightness value for the scale.\n   *\n   * Defines the upper bound for the lightest color in the palette.\n   *\n   * A number between 0 and 1.\n   * @default 0.97\n   */\n  maxLightness?: number;\n  /**\n   * The minimum lightness value for the scale.\n   *\n   * Defines the lower bound for the darkest color in the palette.\n   *\n   * A number between 0 and 1.\n   *\n   * @default 0.2\n   */\n  minLightness?: number;\n  /**\n   * Theme-aware lightness direction.\n   *\n   * - 'light': Low keys (50) are lightest, high keys (950) are darkest\n   * - 'dark': Low keys (50) are darkest, high keys (950) are lightest\n   *\n   * @default 'light'\n   */\n  mode?: ScaleMode;\n  /**\n   * Global saturation override (0-100).\n   *\n   * When set, overrides the chroma for all generated shades.\n   * Maps to chroma in OKLCH space.\n   *\n   * Overrides `variant` if both are set.\n   */\n  saturation?: number;\n  /**\n   * Number of steps in the scale (3-20).\n   *\n   * Controls how many color shades are generated.\n   *\n   * @default 11\n   */\n  steps?: number;\n  /**\n   * The variant of the scale.\n   * - 'deep': Generates rich and bold tones with significantly reduced lightness.\n   * - 'neutral': Generates muted tones by reducing chroma.\n   * - 'pastel': Produces soft and airy tones with significant chroma reduction.\n   * - 'subtle': Creates extremely desaturated tones, close to grayscale.\n   * - 'vibrant': Enhances chroma for bold and striking tones.\n   */\n  variant?: ScaleVariant;\n}\n\nconst chromaScale: Record<string, number> = {\n  deep: 0.8,\n  neutral: 0.5,\n  pastel: 0.3,\n  subtle: 0.2,\n  vibrant: 1.25,\n};\n\n/**\n * Generate the color palette for the scale.\n */\n// eslint-disable-next-line sonarjs/cognitive-complexity\nfunction generatePalette(options: GeneratePaletteOptions): Record<number, LCH> {\n  const {\n    baseChroma,\n    chromaCurve,\n    hue,\n    inputLightness,\n    keys,\n    lightnessCurve,\n    lock,\n    maxLightness,\n    minLightness,\n    mode,\n  } = options;\n\n  const palette: Record<number, LCH> = {};\n\n  // Calculate lightness values\n  const lightnessMap: Record<number, number> = {};\n\n  if (lock !== undefined && inputLightness !== undefined) {\n    const lockIndex = keys.indexOf(lock);\n\n    lightnessMap[lock] = inputLightness;\n\n    // Keys before lock\n    if (lockIndex > 0) {\n      const target = mode === 'light' ? maxLightness : minLightness;\n\n      for (let index = 0; index < lockIndex; index++) {\n        const t = index / lockIndex;\n\n        lightnessMap[keys[index]] = target + (inputLightness - target) * t ** lightnessCurve;\n      }\n    }\n\n    // Keys after lock\n    const remaining = keys.length - 1 - lockIndex;\n\n    if (remaining > 0) {\n      const target = mode === 'light' ? minLightness : maxLightness;\n\n      for (let index = lockIndex + 1; index < keys.length; index++) {\n        const t = (index - lockIndex) / remaining;\n\n        lightnessMap[keys[index]] =\n          inputLightness + (target - inputLightness) * t ** lightnessCurve;\n      }\n    }\n  } else {\n    // Standard calculation (no lock)\n    for (let index = 0; index < keys.length; index++) {\n      const t = (index / (keys.length - 1)) ** lightnessCurve;\n\n      lightnessMap[keys[index]] =\n        mode === 'light'\n          ? maxLightness - (maxLightness - minLightness) * t\n          : minLightness + (maxLightness - minLightness) * t;\n    }\n  }\n\n  // Generate LCH colors\n  for (const key of keys) {\n    const lightness = lightnessMap[key];\n    const chroma = getStepChroma(lightness, baseChroma, chromaCurve);\n    const maxChroma = getP3MaxChroma({ l: lightness, c: 0, h: hue });\n\n    palette[key] = { l: lightness, c: Math.min(chroma, maxChroma), h: hue };\n  }\n\n  return palette;\n}\n\n/**\n * Calculate chroma for a step, applying chromaCurve if set.\n */\nfunction getStepChroma(lightness: number, baseChroma: number, chromaCurve: number): number {\n  if (chromaCurve === 0) {\n    return baseChroma;\n  }\n\n  const parabolic = 4 * lightness * (1 - lightness);\n  const curveScale = 1 - chromaCurve * (1 - parabolic);\n\n  return Math.max(0, baseChroma * curveScale);\n}\n\n/**\n * Generate a scale of colors based on the input color.\n *\n * This utility is ideal for designers and developers who need dynamic color\n * palettes for UI themes, design systems, or data visualization. Supports\n * multiple modes, scales, and variants for flexibility.\n *\n * @param input - The base color string.\n * @param options - Scale generation options.\n * @returns A record of step keys to color strings.\n */\nexport default function scale(input: string, options: ScaleOptions = {}): Record<number, string> {\n  invariant(isString(input), MESSAGES.inputString);\n  const {\n    chromaCurve = 0,\n    format,\n    lightnessCurve = 1.5,\n    lock: lockOption,\n    maxLightness = 0.97,\n    minLightness = 0.2,\n    mode = 'light',\n    saturation,\n    steps: stepsOption,\n    variant,\n  } = options;\n\n  invariant(\n    maxLightness > minLightness && maxLightness <= 1 && minLightness >= 0,\n    'maxLightness must be greater than minLightness and within the range [0, 1].',\n  );\n\n  const steps = stepsOption !== undefined ? Math.round(stepsOption) : 11;\n  const keys = getScaleStepKeys(steps);\n\n  // Validate lock option\n  let lock = lockOption;\n\n  if (lock !== undefined && (!isNumber(lock) || !keys.includes(lock))) {\n    warn(`lock: ${lock} is not valid for steps: ${steps}, ignoring`);\n    lock = undefined;\n  }\n\n  const parsed = resolveColor(input);\n  const lch = parsed.oklch;\n\n  // Determine base chroma\n  let baseChroma: number;\n\n  if (saturation !== undefined) {\n    // saturation overrides: % of max P3 chroma at input's lightness\n    const maxChroma = getP3MaxChroma(lch);\n\n    baseChroma = (clamp(saturation, 0, 100) / 100) * maxChroma;\n  } else if (variant && chromaScale[variant]) {\n    baseChroma = lch.c * chromaScale[variant];\n  } else {\n    baseChroma = lch.c;\n  }\n\n  const colorFormat = format ?? parsed.type;\n\n  // Generate the color palette\n  const palette = generatePalette({\n    baseChroma,\n    chromaCurve,\n    hue: lch.h,\n    inputLightness: lock !== undefined ? lch.l : undefined,\n    keys,\n    lightnessCurve,\n    lock,\n    maxLightness,\n    minLightness,\n    mode,\n  });\n\n  return Object.fromEntries(\n    Object.entries(palette).map(([key, value]) => [key, formatCSS(value, { format: colorFormat })]),\n  );\n}\n","import convertCSS from '~/convertCSS';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { resolveColor } from '~/modules/parsed-color';\nimport { isString } from '~/modules/validators';\nimport rotate from '~/rotate';\n\nimport { ColorType } from '~/types';\n\nexport type Scheme =\n  | 'analogous'\n  | 'complementary'\n  | 'rectangle'\n  | 'split'\n  | 'split-complementary'\n  | 'square'\n  | 'tetradic'\n  | 'triadic';\n\nexport interface SchemeOptions {\n  /**\n   * Output color format.\n   *\n   * If not specified, the output will use the same format as the input color.\n   */\n  format?: ColorType;\n  /**\n   * The scheme to generate.\n   * @default 'complementary'\n   */\n  scheme?: Scheme;\n}\n\n/**\n * Get a color scheme based on the input color.\n *\n * @param input - The base color string.\n * @param schemeOrOptions - The scheme type or options object.\n * @returns An array of color strings forming the scheme.\n */\nexport default function scheme(input: string, schemeOrOptions?: Scheme | SchemeOptions): string[] {\n  invariant(isString(input), MESSAGES.inputString);\n  const { format, scheme: schemeType = 'complementary' } = isString(schemeOrOptions)\n    ? { scheme: schemeOrOptions }\n    : (schemeOrOptions ?? {});\n\n  const output = format ?? resolveColor(input).type;\n\n  const colors: string[] = [];\n\n  switch (schemeType) {\n    case 'analogous': {\n      colors.push(rotate(input, -30), input, rotate(input, 30));\n      break;\n    }\n    case 'complementary': {\n      colors.push(input, rotate(input, 180));\n      break;\n    }\n\n    case 'split':\n    case 'split-complementary': {\n      colors.push(input, rotate(input, 150), rotate(input, 210));\n      break;\n    }\n    case 'triadic': {\n      colors.push(input, rotate(input, 120), rotate(input, 240));\n      break;\n    }\n\n    case 'tetradic':\n    case 'rectangle': {\n      colors.push(input, rotate(input, 60), rotate(input, 180), rotate(input, 240));\n      break;\n    }\n    case 'square': {\n      colors.push(input, rotate(input, 90), rotate(input, 180), rotate(input, 270));\n      break;\n    }\n    default: {\n      throw new TypeError('invalid type');\n    }\n  }\n\n  return colors.map(color => convertCSS(color, output));\n}\n"],"mappings":"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","names":["factor","chroma","chroma","opacity","keys","alpha","alpha","colorDifference","contrast","brightnessDifference","toHexConverters","fromHexConverters","palette","chroma"]}