Cor
Cálculos de cor sem precisar interpretar hex à mão nem misturar RGB manualmente. Cores de entrada são strings "#rrggbb" / "#rrggbbaa" ou tabelas { r, g, b, a } (0-255, a opcional); cores de saída são tabelas { r, g, b, a }, a menos que o nome indique hex. Misturar e ajustar usam OKLab por padrão, um espaço perceptual em que passos iguais parecem iguais; `space` pode ser "oklab", "oklch", "rgb" ou "hsl". Os resultados são limitados ao sRGB reduzindo o croma, então matiz e luminosidade se mantêm. Listas (ramp, shades) são geradas em uma única chamada. (11 funções)
Cálculos de cor sem precisar interpretar hex à mão nem misturar RGB manualmente. Cores de entrada são strings "#rrggbb" / "#rrggbbaa" ou tabelas { r, g, b, a } (0-255, a opcional); cores de saída são tabelas { r, g, b, a }, a menos que o nome indique hex. Misturar e ajustar usam OKLab por padrão, um espaço perceptual em que passos iguais parecem iguais; space pode ser "oklab", "oklch", "rgb" ou "hsl". Os resultados são limitados ao sRGB reduzindo o croma, então matiz e luminosidade se mantêm. Listas (ramp, shades) são geradas em uma única chamada.
app.color.adjust(c, opts?) — pura
Altera a luminosidade, o croma, o matiz, a saturação ou o alfa de uma cor, de forma absoluta ou relativa. O resultado é limitado ao gamut sRGB reduzindo o croma (luminosidade e matiz são mantidos), não cortando canais.
c(color) — Uma cor: "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.opts(table, opcional) — As chaves absolutas definem um valor; as chaves com prefixo d somam a ele (primeiro se aplica o valor definido, depois o delta). Chaves omitidas mantêm o valor da própria cor.lightness(number) — Define a luminosidade: L do OKLab/OKLCH (0 preto - 1 branco) ou a luminosidade HSL com space = "hsl".chroma(number ≥ 0) — Define o croma OKLCH (intensidade da cor, 0 = cinza; o sRGB chega a cerca de 0.32). Não disponível com space = "hsl".hue(number) — Define o ângulo do matiz em graus (dá a volta em 360).saturation(number 0–1) — Define a saturação 0-1: saturação HSL com space = "hsl"; caso contrário, o croma como fração do maior croma que o sRGB permite naquela luminosidade e matiz.alpha(number 0–255) — Define o alfa, 0-255.dLightness(number) — Soma à luminosidade (negativo escurece).dChroma(number) — Soma ao croma.dHue(number) — Gira o matiz neste número de graus.dSaturation(number) — Soma à saturação (escala 0-1).dAlpha(number) — Soma ao alfa (escala 0-255).space(string; padrão "oklab") — "oklab" | "oklch" (iguais aqui) | "hsl". "rgb" não tem eixo de luminosidade nem de matiz e é rejeitado.
Retorna (table): { r, g, b, a }, cada um de 0-255.
app.color.contrast(a, b) — pura
Taxa de contraste WCAG entre duas cores (alfa ignorado), de 1 (idênticas) a 21 (preto sobre branco). 4.5 é o mínimo usual para texto legível.
a(color) — Uma cor: "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.b(color) — Uma cor: "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.
Retorna (number): A taxa, 1-21.
app.color.darken(c, amount, space?) — pura
Atalho para app.color.adjust(c, { dLightness = -amount }).
c(color) — Uma cor: "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.amount(number) — Subtraído da luminosidade (unidades de L do OKLab, 0-1).space(string, opcional) — Onde a luminosidade é medida: "oklab" (padrão), "oklch" ou "hsl".
Retorna (table): { r, g, b, a }, cada um de 0-255.
app.color.distance(a, b) — pura
Distância euclidiana entre duas cores no OKLab (alfa ignorado). 0 = idênticas; de preto a branco é 1; cerca de 0.02 mal se percebe.
a(color) — Uma cor: "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.b(color) — Uma cor: "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.
Retorna (number): A distância, 0 ou mais.
app.color.hex(c, withAlpha?) — pura
Uma cor como string hex em minúsculas.
c(color) — Uma cor: "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.withAlpha(boolean, opcional) — true para "#rrggbbaa"; o padrão é "#rrggbb".
Retorna (string): "#rrggbb", ou "#rrggbbaa" com withAlpha.
app.color.lighten(c, amount, space?) — pura
Atalho para app.color.adjust(c, { dLightness = amount }).
c(color) — Uma cor: "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.amount(number) — Somado à luminosidade (unidades de L do OKLab, 0-1).space(string, opcional) — Onde a luminosidade é medida: "oklab" (padrão), "oklch" ou "hsl".
Retorna (table): { r, g, b, a }, cada um de 0-255.
app.color.mix(a, b, t, space?) — pura
Mistura duas cores (inclusive o alfa) em um espaço perceptual; OKLab por padrão, o que evita os pontos médios turvos da mistura em RGB.
a(color) — Uma cor: "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.b(color) — Uma cor: "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.t(number) — 0 = a, 1 = b; limitado a 0-1.space(string, opcional) — Espaço de interpolação: "oklab" (padrão), "oklch" (o matiz percorre o caminho mais curto), "rgb" ou "hsl".
Retorna (table): { r, g, b, a }, cada um de 0-255.
app.color.nearest(c, palette) — pura
A entrada da paleta mais próxima de c pela distância OKLab (alfa ignorado). Em caso de empate, vence a entrada anterior.
c(color) — Uma cor: "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.palette(table) — Uma lista de cores não vazia.
Retorna (number): O índice em palette, começando em 1.
app.color.parse(c) — pura
Normaliza qualquer cor aceita para { r, g, b, a } (a = 255 quando a entrada não tem alfa).
c(color) — Uma cor: "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.
Retorna (table): { r, g, b, a }, cada um de 0-255.
app.color.ramp(stops, n, space?) — pura
Um gradiente amostrado em uma lista de n cores, da primeira à última parada, com as duas extremidades incluídas. Uma única chamada, qualquer que seja n.
stops(table) — Uma lista de cores, ou de { color =, pos = } com pos 0-1 (paradas sem pos são espaçadas igualmente). Precisa de pelo menos uma.n(number) — Quantas cores retornar, 1-4096. 1 retorna a primeira parada.space(string, opcional) — Espaço de interpolação: "oklab" (padrão), "oklch" (o matiz percorre o caminho mais curto), "rgb" ou "hsl".
Retorna (table): Uma lista de n cores { r, g, b, a }.
app.color.shades(base, n, opts?) — pura
Uma lista de n cores da sombra ao brilho em torno de base, para sombreamento. A base fica no índice floor(n / 2) + 1 (o meio para n ímpar) e é retornada exatamente como está. Com f indo de -1 (mais escuro) passando por 0 (base) até +1 (mais claro), o tom i tem luminosidade OKLab L + f * spread / 2 (limitada a 0-1), matiz H + f * hueShift e croma C * (1 - 0.4 * f^2), para que os extremos fiquem dentro do sRGB (o que ainda sair perde croma, nunca luminosidade). O alfa é mantido. A luminosidade é monotônica ao longo da lista.
base(color) — Uma cor: "#rrggbb", "#rrggbbaa" ou { r, g, b, a }.n(number) — Quantas cores retornar, 1-4096.opts(table, opcional)spread(number; padrão 0.5) — Faixa total de luminosidade OKLab, da sombra ao brilho (a base fica no meio: metade da faixa para baixo, metade para cima). Limitada a 0-1.hueShift(number; padrão 8) — Graus que o matiz gira nos extremos: sombras em -hueShift, brilhos em +hueShift, reduzindo linearmente até 0 na base.
Retorna (table): Uma lista de n cores { r, g, b, a }, a mais escura primeiro.
Em Markdown: color.md.