
Da web à impressão, dos seletores de cor à pesquisa, 1860 a 2026. Suporte a CSS, shaders, WASM e tabelas de conversão de cores (LUTs).
Um pacote JavaScript. As mesmas conversões processam imagens inteiras com WASM, são executadas em shaders GLSL e WGSL e podem ser exportadas como LUTs e perfis ICC.
import space from 'color-space' space.rgb.oklch(255, 128, 0) // → [0.732, 0.186, 53] space.oklch.rgb(0.65, 0.25, 180) // any of 205 × 204 pairs space.oklch.name // 'oklch' space.oklch.range // [[0,1], [0,0.4], [0,360]] // one space only – tree-shaken, 0.4-1.5 kB import oklch from 'color-space/oklch.js' oklch.rgb(0.65, 0.25, 180)
// values in the notations CSS already speaks – straight from the library color: oklch(0.732 0.186 53); // space.rgb.oklch(255, 128, 0) color: color(display-p3 0.936 0.529 0.199); // space.rgb.p3(255, 128, 0) color: color(xyz-d65 0.49 0.367 0.045); // space.rgb.xyz(…) / 100 – exact interchange // spaces CSS lacks ship as ICC profiles or LUTs – see those tabs; // every dossier's css tab writes the current color in copyable forms
// per-space metadata – sourced, ships as data.json
import data from 'color-space/data.json' with { type: 'json' }
const m = data.spaces.oklch
m.channels // [{symbol, min, max, name}, …]
m.refs // defining spec / paper links
m.year, m.by // 2020, 'Björn Ottosson'
// scalar or whole-buffer, zero-copy – a true WASM kernel
import space, { alloc } from 'color-space/wasm'
space.oklch.rgb(0.72, 0.16, 41) // → [246, 125, 79]
const buf = alloc(n) // n×3 Float64Array
space.rgb.oklch(buf) // in place – 27 spaces
// every pair as a GLSL shader chunk
import { glsl } from 'color-space/gl'
import oklch from 'color-space/gl/oklch'
const src = glsl(oklch, 'rgb')
// → self-contained: vec3 oklch_rgb(vec3 c)
// paste into any fragment shader, no uniforms
Qualquer par como LUT .cube – carregue-a no Resolve, Premiere, Final Cut, OBS ou ffmpeg. Os logs de câmera são verificados com as transformações ACES oficiais dos fabricantes.
Qualquer espaço como perfil .icc v2 – matriz + curva de tom para espaços de trabalho RGB (Photoshop, gerenciamento de cor do sistema operacional), um reticulado CLUT para todo o resto (lcms, ArgyllCMS, ImageMagick).
// an MCP server – convert · gamut · css · space · spaces · cube –
// so an agent calls verified conversions instead of guessing them
npx -y color-space mcp
// Claude Code
claude mcp add color-space -- npx -y color-space mcp
// VS Code
code --add-mcp '{"name":"color-space","command":"npx","args":["-y","color-space","mcp"]}'
// Claude Desktop · Cursor · .mcp.json
{ "mcpServers": { "color-space": { "command": "npx", "args": ["-y", "color-space", "mcp"] } } }
// um plugin do Figma: os preenchimentos e traços da seleção em qualquer um dos 205 espaços – // um plano e uma barra por canal, recortados ao gamut do arquivo; copie a cor como CSS figma.com/community/plugin/1691970922817908383/color-space git clone https://github.com/colorjs/color-space // Figma para desktop: clique com o botão direito › Plugins › Development › Import plugin from manifest… color-space/plugins/figma/manifest.json // o que ele lê, grava e guarda – plugins/figma
Um sistema de coordenadas para a cor: eixos, faixas e uma regra que liga os números à luz mensurável. O mesmo laranja é rgb(255 128 0), oklch(0.732 0.186 53) e, em XYZ, [49, 36.7, 4.5]. Uma paleta é um punhado de cores escolhidas; um espaço é uma maneira de anotar qualquer cor.
Um modelo de cor define os componentes usados para descrever uma cor: três primárias no RGB, matiz, saturação e claridade no HSL, quatro tintas no CMYK. Um espaço de cor especifica as primárias, o ponto branco e a curva de codificação, para que cada conjunto de valores corresponda a uma cor mensurável. Por isso, rgb(255 0 0) representa vermelhos diferentes em sRGB, Display P3 e Adobe RGB: um modelo, três espaços.
No uso comum, ambos são chamados de espaços, inclusive no color-mix(in hsl, …) do CSS e neste catálogo. Um modelo pode usar um espaço já definido como referência: aqui, HSL e HSV são baseados no sRGB, como no CSS.
Depende da tarefa:
Para ver todos os espaços organizados por tarefa, agrupe o catálogo por finalidade.
OKLCH. Ele mantém os mesmos três controles – matiz, croma, claridade –, mas sua claridade é confiável: no HSL, o amarelo em L=50 emite cerca de 13 vezes a luz do azul em L=50, então L igual não significa brilho igual. No OKLCH, significa. O CSS suporta oklch() nativamente.
Digite ou cole o valor no campo de cor no topo, por exemplo #ff8000. Todos os espaços da página mostram essa cor ao mesmo tempo; em OKLCH os valores são 0.732, 0.186, 53, que o CSS escreve como oklch(0.732 0.186 53). A aba css de cada dossiê traz a forma pronta para copiar, e no código é space.rgb.oklch(255, 128, 0).
Porque são calculados em sRGB codificado com gama, onde tirar a média dos números de duas cores produz uma luz mais escura e mais apagada do que misturar de fato a sua luz produziria. Interpolar no OKLab evita isso; em CSS, fica linear-gradient(in oklab, red, blue). A linha interpolar de cada dossiê desenha a mesma mistura através de dois espaços lado a lado, para que você veja a diferença antes de escolher.
Abra o espaço log da sua câmera, como S-Log3, LogC4 ou Apple Log. No bloco LUT de conversão dele, escolha Rec. 709 e o seu editor: DaVinci Resolve, Premiere Pro, Final Cut Pro, OBS, ffmpeg e outros. O seu navegador gera o arquivo .cube. É uma conversão técnica, sem mapeamento de tons: as altas luzes acima do branco difuso são cortadas, e o look fica por sua conta.
Uma cor que um espaço consegue descrever, mas outro – ou a sua tela – não consegue mostrar. Um verde vívido do Display P3 não existe no sRGB: converta-o, e os números caem fora da faixa válida. O atlas deixa isso à vista: a etiqueta ao lado da cor atual indica o gamut padrão mais estreito que a contém, e os trechos fora da faixa aparecem esmaecidos sobre um quadriculado.
Uma tela emite luz; o papel reflete o que suas tintas não absorvem. Tinta no papel alcança menos cores vivas – azuis, verdes e vermelhos RGB saturados ficam fora do seu gamut – e por isso saem mais apagados. A pré-impressão converte por um perfil ICC feito para a impressora e o papel, como o FOGRA39 para papel couché europeu ou o GRACoL nos EUA. O CMYK deste catálogo é a fórmula simples que o CSS usa para device-cmyk() sem perfil: certa para os números, não uma prova da impressão.
Para a web e para compartilhar, sRGB: navegadores e celulares o adotam por padrão quando o arquivo não traz perfil. O Display P3 preserva mais de uma cena vívida nas telas da Apple e de muitos aparelhos Android, desde que o perfil continue incorporado. Envie em Adobe RGB quando um laboratório de impressão pedir. Reserve o ProPhoto RGB para edição em 16 bits: o gamut dele é tão amplo que arquivos de 8 bits ficam com faixas visíveis.
As conversões são fórmulas fechadas, não aproximações por tabela, e as idas e voltas retornam dentro do ruído de ponto flutuante. As poucas exceções estão documentadas onde ocorrem: o OSA-UCS não tem inversa fechada, sistemas de atlas como o Munsell interpolam entre graus publicados, e a saída rgb é limitada ao gamut sRGB – passe pelo XYZ ou pelo RGB linear quando precisar de valores fora dele.
E são verificadas: cada espaço aponta o artigo ou a especificação que implementa, os valores são testados contra colorjs.io onde os dois se sobrepõem, e os logs de câmera contra as transformações ACES oficiais da Academia. formula-verification.md registra o que foi conferido contra o quê – inclusive alguns pontos em que os próprios artigos publicados tinham erros.
Se os números diferem dos de outra biblioteca, compare as faixas: esta mantém as faixas convencionais de cada espaço – RGB 0–255, claridade Lab 0–100, matiz 0–360 – enquanto muitas achatam tudo para 0–1. Cada cartão mostra suas faixas; no código elas são space.oklch.range.
Nativamente rgb(), hsl(), hwb(), lab(), lch(), oklab(), oklch(), além de color() para Display P3, Adobe RGB, ProPhoto, sRGB linear e XYZ (D65 e D50). O rec2020 do CSS é uma curva gama 2.4 pura, não a curva BT.2020 do Rec. 2020 deste catálogo – os mesmos números nomeariam uma cor diferente. A aba css de cada dossiê escreve a cor atual em forma copiável; os espaços que o CSS não tem são oferecidos como perfis ICC ou LUTs.
Abra Exibição e escolha uma opção em Visão: cegueira ao vermelho (protanopia), cegueira ao verde (deuteranopia) ou cegueira ao azul (tritanopia). O catálogo é redesenhado como esse olho o vê, para você conferir se as cores de uma paleta continuam distinguíveis. Cerca de 1 em cada 12 homens tem deficiência na visão de cores, segundo a contagem do NEI.
São produtos licenciados: suas cores são definidas por dados que os proprietários vendem, não por fórmulas publicadas – então não há matemática aberta para implementar, e redistribuir suas tabelas não seria legal. Parentes próximos cuja matemática é pública estão aqui: Munsell (sua renotação de 1943 é de registro público) e RAL Design (definido diretamente em CIELAB). Todo sistema cuja matemática tenha sido publicada algum dia tem lugar aqui; sugira um que esteja faltando.
@software{Ivanov_color-space_2026,
author = {Ivanov, Dmitry},
license = {CC0-1.0},
month = oct,
title = {{color-space}},
url = {https://github.com/colorjs/color-space},
version = {3.3.0},
year = {2026}
}Ivanov, D. (2026). color-space (Version 3.3.0) [Computer software]. https://github.com/colorjs/color-space
O Beta RGB ampliado nos cianos e azuis para conter os gamuts de impressoras jato de tinta de pigmento com 10 e 12 tintas.
Espaço de trabalho de gamut amplo voltado à impressão, para saída em jato de tinta de pigmento; de nicho.
componentereferido ao displaySDRgamaD55
2011, Russell Cottrell
batizado com o nome de seu autor, Russell Cottrell
// one space, tree-shaken (0.4-1.5 kB) — its own edge: import russellrgb from 'color-space/russellrgb.js' russellrgb.xyz(0.5, 0.5, 0.5) // → [20.5166, 21.5861, 23.5085] // any-to-any, both ways — the wired hub: import space from 'color-space' space.russellrgb.rgb(0.5, 0.5, 0.5) // → [128, 128, 128] space.rgb.russellrgb(128, 128, 128) // → [0.5, 0.5, 0.5] // route: russellrgb → xyz → rgb