Couleur

Du calcul de couleur sans analyse manuelle de l'hexadécimal ni mélange RGB maison. En entrée, les couleurs sont des chaînes "#rrggbb" / "#rrggbbaa" ou des tables { r, g, b, a } (0-255, a facultatif) ; en sortie, ce sont des tables { r, g, b, a }, sauf si le nom parle d'hexadécimal. Le mélange et les ajustements utilisent OKLab par défaut, un espace perceptuel où des pas égaux paraissent égaux ; `space` peut valoir "oklab", "oklch", "rgb" ou "hsl". Les résultats sont ramenés dans le gamut sRGB en réduisant la chroma, donc la teinte et la luminosité sont conservées. Les listes (ramp, shades) se construisent en un seul appel. (11 fonctions)

Du calcul de couleur sans analyse manuelle de l'hexadécimal ni mélange RGB maison. En entrée, les couleurs sont des chaînes "#rrggbb" / "#rrggbbaa" ou des tables { r, g, b, a } (0-255, a facultatif) ; en sortie, ce sont des tables { r, g, b, a }, sauf si le nom parle d'hexadécimal. Le mélange et les ajustements utilisent OKLab par défaut, un espace perceptuel où des pas égaux paraissent égaux ; space peut valoir "oklab", "oklch", "rgb" ou "hsl". Les résultats sont ramenés dans le gamut sRGB en réduisant la chroma, donc la teinte et la luminosité sont conservées. Les listes (ramp, shades) se construisent en un seul appel.

app.color.adjust(c, opts?) — pure

Modifie la luminosité, la chroma, la teinte, la saturation ou l'alpha d'une couleur, de façon absolue ou relative. Le résultat est ramené dans le gamut sRGB en réduisant la chroma (la luminosité et la teinte sont conservées), et non en écrêtant les canaux.

  • c (color) — Une couleur : "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.
  • opts (table, facultatif) — Les clés absolues définissent une valeur ; les clés préfixées par d s'y ajoutent (la définition est appliquée d'abord, puis le delta). Les clés omises gardent la valeur de la couleur.
    • lightness (number) — Définit la luminosité : L d'OKLab/OKLCH (0 noir - 1 blanc), ou la luminosité HSL avec space = "hsl".
    • chroma (number ≥ 0) — Définit la chroma OKLCH (intensité de la couleur, 0 = gris ; le sRGB plafonne vers 0.32). Indisponible avec space = "hsl".
    • hue (number) — Définit l'angle de teinte en degrés (se reboucle à 360).
    • saturation (number 0–1) — Définit la saturation 0-1 : saturation HSL avec space = "hsl" ; sinon, la chroma en fraction de la chroma maximale que le sRGB permet à cette luminosité et cette teinte.
    • alpha (number 0–255) — Définit l'alpha, 0-255.
    • dLightness (number) — Ajoute à la luminosité (une valeur négative assombrit).
    • dChroma (number) — Ajoute à la chroma.
    • dHue (number) — Fait tourner la teinte de ce nombre de degrés.
    • dSaturation (number) — Ajoute à la saturation (échelle 0-1).
    • dAlpha (number) — Ajoute à l'alpha (échelle 0-255).
    • space (string; par défaut "oklab") — "oklab" | "oklch" (identique ici) | "hsl". "rgb" n'a ni axe de luminosité ni axe de teinte et est refusé.

Renvoie (table) : { r, g, b, a }, chacun de 0 à 255.

app.color.contrast(a, b) — pure

Rapport de contraste WCAG entre deux couleurs (alpha ignoré), de 1 (identiques) à 21 (noir sur blanc). 4.5 est le minimum habituel pour un texte lisible.

  • a (color) — Une couleur : "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.
  • b (color) — Une couleur : "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.

Renvoie (number) : Le rapport, de 1 à 21.

app.color.darken(c, amount, space?) — pure

Raccourci pour app.color.adjust(c, { dLightness = -amount }).

  • c (color) — Une couleur : "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.
  • amount (number) — Soustrait de la luminosité (unités du L d'OKLab, 0-1).
  • space (string, facultatif) — L'espace où la luminosité est mesurée : "oklab" (par défaut), "oklch" ou "hsl".

Renvoie (table) : { r, g, b, a }, chacun de 0 à 255.

app.color.distance(a, b) — pure

Distance euclidienne entre deux couleurs dans OKLab (alpha ignoré). 0 = identiques ; du noir au blanc, 1 ; environ 0.02 est à peine perceptible.

  • a (color) — Une couleur : "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.
  • b (color) — Une couleur : "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.

Renvoie (number) : La distance, 0 ou plus.

app.color.hex(c, withAlpha?) — pure

Une couleur sous forme de chaîne hexadécimale en minuscules.

  • c (color) — Une couleur : "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.
  • withAlpha (boolean, facultatif) — true pour "#rrggbbaa" ; par défaut "#rrggbb".

Renvoie (string) : "#rrggbb", ou "#rrggbbaa" avec withAlpha.

app.color.lighten(c, amount, space?) — pure

Raccourci pour app.color.adjust(c, { dLightness = amount }).

  • c (color) — Une couleur : "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.
  • amount (number) — Ajouté à la luminosité (unités du L d'OKLab, 0-1).
  • space (string, facultatif) — L'espace où la luminosité est mesurée : "oklab" (par défaut), "oklch" ou "hsl".

Renvoie (table) : { r, g, b, a }, chacun de 0 à 255.

app.color.mix(a, b, t, space?) — pure

Mélange deux couleurs (alpha compris) dans un espace perceptuel ; OKLab par défaut, ce qui évite les teintes intermédiaires boueuses du mélange RGB.

  • a (color) — Une couleur : "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.
  • b (color) — Une couleur : "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.
  • t (number) — 0 = a, 1 = b ; limité à 0-1.
  • space (string, facultatif) — Espace d'interpolation : "oklab" (par défaut), "oklch" (la teinte prend le chemin le plus court), "rgb" ou "hsl".

Renvoie (table) : { r, g, b, a }, chacun de 0 à 255.

app.color.nearest(c, palette) — pure

L'entrée de la palette la plus proche de c selon la distance OKLab (alpha ignoré). En cas d'égalité, la première entrée l'emporte.

  • c (color) — Une couleur : "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.
  • palette (table) — Une liste de couleurs non vide.

Renvoie (number) : L'indice dans palette, en commençant à 1.

app.color.parse(c) — pure

Normalise n'importe quelle couleur acceptée en { r, g, b, a } (a = 255 quand l'entrée n'en a pas).

  • c (color) — Une couleur : "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.

Renvoie (table) : { r, g, b, a }, chacun de 0 à 255.

app.color.ramp(stops, n, space?) — pure

Un dégradé échantillonné en une liste de n couleurs, du premier au dernier point, extrémités comprises. Un seul appel, quel que soit n.

  • stops (table) — Une liste de couleurs, ou de { color =, pos = } avec pos de 0 à 1 (les points sans pos sont répartis régulièrement). Il en faut au moins un.
  • n (number) — Combien de couleurs renvoyer, de 1 à 4096. 1 renvoie le premier point.
  • space (string, facultatif) — Espace d'interpolation : "oklab" (par défaut), "oklch" (la teinte prend le chemin le plus court), "rgb" ou "hsl".

Renvoie (table) : Une liste de n couleurs { r, g, b, a }.

app.color.shades(base, n, opts?) — pure

Une liste de n couleurs de l'ombre à la lumière autour de base, pour l'ombrage. La base se trouve à l'indice floor(n / 2) + 1 (le milieu pour un n impair) et est renvoyée telle quelle. Avec f allant de -1 (le plus sombre) à +1 (le plus clair) en passant par 0 (la base), la nuance i a une luminosité OKLab L + f * spread / 2 (limitée à 0-1), une teinte H + f * hueShift et une chroma C * (1 - 0.4 * f^2), pour que les extrémités restent dans le sRGB (ce qui en sort encore perd de la chroma, jamais de la luminosité). L'alpha est conservé. La luminosité est monotone le long de la liste.

  • base (color) — Une couleur : "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.
  • n (number) — Combien de couleurs renvoyer, de 1 à 4096.
  • opts (table, facultatif)
    • spread (number; par défaut 0.5) — Étendue totale de luminosité OKLab, de l'ombre à la lumière (la base est au milieu : la moitié de l'étendue vers le bas, la moitié vers le haut). Limitée à 0-1.
    • hueShift (number; par défaut 8) — Degrés dont la teinte tourne aux extrémités : les ombres de -hueShift, les lumières de +hueShift, avec une variation linéaire jusqu'à 0 à la base.

Renvoie (table) : Une liste de n couleurs { r, g, b, a }, la plus sombre en premier.

En Markdown : color.md.