Communitygithub.com

fórmula de paleta OKLCH

Construa ou migre a paleta neutra de uma interface (fundos, superfícies, linhas, texto/tinta) como uma fórmula OKLCH guiada por algumas entradas em vez de dezenas de valores hexadecimais escolhidos manualmente, com temas claro e escuro, substituições por degrau na escada, um script de ajuste que reproduz cores existentes e uma auditoria de contraste no navegador.

O que é fórmula de paleta OKLCH?

Esta habilidade oferece uma abordagem sistemática para definir a paleta neutra de uma interface do usuário (fundos, superfícies, linhas e texto/tinta) usando uma fórmula matemática baseada no espaço de cor OKLCH, em vez da tradicional seleção manual de dezenas de valores hexadecimais. Com apenas algumas entradas (matiz, luminosidade e croma/contraste), é possível gerar uma escada completa de cores para temas claro e escuro, garantindo que os contrastes entre os degraus sejam preservados mesmo após uma retintagem. A habilidade fornece um arquivo CSS de referência (`references/palette.css`) com regras prontas para uso, scripts Python para ajustar a fórmula a uma paleta existente (`scripts/fit_palette.py`), e um script Node.js para auditar o contraste de todos os tokens em um navegador real (`scripts/palette-audit.mjs`). É especialmente útil para criar temas, adicionar modo escuro, retintar um produto, auditar contraste de texto ou unificar paletas de vários aplicativos. Funciona como uma skill independente, podendo ser acionada por palavras-chave como 'palette', 'neutrals', 'grey ramp', 'dark mode', 'theme tokens', 'oklch', 'retint', 'hue', 'contrast audit', 'design tokens' e 'Tailwind @theme colours'. A abordagem elimina a deriva de cores entre temas e garante acessibilidade de contraste de forma automatizada.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Adamparishspok/skills/tree/HEAD/skills/oklch-palette-formula

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

O que fórmula de paleta OKLCH faz?

Os neutros de um produto (fundo de página, superfície de cartão, poços, linhas finas, quatro degraus de texto) geralmente são de 15 a 30 valores hexadecimais por tema, escolhidos a olho. Eles desviam, o modo escuro é um segundo conjunto escolhido manualmente, e ninguém sabe quais pares ainda passam no contraste. Substitua-os por uma fórmula:

token de superfície:  L = papel + profundidade  × n(topo)     croma = matiz      matiz = matiz
token de tinta:      L = tinta  + passo   × n(topo)     croma = matiz-tinta  matiz = matiz

n(topo) é a posição do token em uma escada, uma escada por tema. Mova uma entrada e toda a rampa se move junto, então as lacunas entre os degraus, que é onde o contraste vive, sobrevivem a uma retintagem. Retintar um produto é uma linha (--matiz).

Três botões (--matiz, --luminosidade, --croma ou --contraste) controlam cada cor.

Arquivos

  • references/palette.css: regras prontas para uso com entradas e escadas iniciais.
  • scripts/fit_palette.py: ajusta as entradas a uma paleta hexadecimal existente e imprime ΔE por token.
  • scripts/ladders.json: as escadas padrão (claro, escuro).
  • scripts/palette-audit.mjs: resolve cada token em um navegador real em ambos os temas e falha no contraste.
  • scripts/oklch.py: conversões e ajudantes ΔE / WCAG.

Procedimento

  1. Nomeie os tokens pela função, não pelo valor. Os padrões:

    • Fundos: ground (página), panel (barras, barras de ferramentas), surface (cartões, menus), surface-2 (poços), surface-3 (chips, linhas destacadas), field.
    • Linhas: line, line-2, line-3 (linhas finas, do mais claro ao mais escuro), mais field-line, a borda de um controle, que deve atingir 3:1.
    • Tinta: ink, ink-2, ink-3, ink-4 (texto, do mais escuro ao mais silencioso). Cada degrau de tinta é texto, então cada um deve atingir 4,5:1.
  2. Ajuste, não escolha novamente. Para um produto existente, execute python3 scripts/fit_palette.py theme.css. Ele lê as declarações hexadecimais --color-* (claro, em seguida a regra [data-theme="dark"]), ajusta as entradas contra a escada padrão e imprime ΔE por token. Abaixo de 2 é visualmente idêntico.

  3. Substitua os degraus da escada onde o design os espaça de forma diferente, nunca a cor. Avalie candidatos com fit_palette.py theme.css light '<inputs>' '<overrides>' até que o pior ΔE esteja abaixo de ~2. Substituições típicas: field: 0 (campos são a face do cartão), uma line-3 mais larga, um intervalo maior entre ink e ink-2.

  4. Escreva as regras (veja references/palette.css):

    • Coloque as entradas e as fórmulas --color-* no elemento que carrega o atributo de tema.
    • Reafirme cada entrada que você alterar na regra escura. Uma regra escura escrita para os padrões do kit, caso contrário, ganha com seus valores.
    • Com Tailwind v4, mantenha os nomes dos tokens em @theme para que as utilidades existam; as declarações em tempo de execução as sobrescrevem.
  5. Audite em um navegador real: node scripts/palette-audit.mjs <url>. Ele pinta cada token, lê de volta o sRGB e verifica:

    • cada degrau de tinta a 4,5:1 contra cada fundo;
    • field-line e ring a 3:1.

    Corrija uma FALHA movendo o degrau da escada daquele token, não especializando uma cor. Espere FALHAS em paletas existentes: em uma migração de 17 aplicativos, a auditoria encontrou valores de ink-4 ou field-line falhando em mais da metade deles, todos já lançados anteriormente.

Armadilhas

  • var() dentro de uma propriedade personalizada resolve onde é declarada.
    • Declare as fórmulas em :root e defina entradas em um filho: o filho nunca recoloriza.
    • Tokens de alias (--color-heading: var(--color-ink)) devem ser declarados no mesmo elemento com tema também.
  • Os valores de @theme do Tailwind v4 vivem em :root. Um tema com escopo em uma raiz de aplicativo ([data-app]) deve declarar a fórmula lá, não em @theme.
  • Qualquer coisa que entregue cores a uma tela ou biblioteca de mapas (getComputedStyle(...).getPropertyValue('--color-x')) agora recebe uma string oklch(calc(...)) não resolvida. Resolva-a primeiro: pinte um elemento sonda e leia uma tela de 1px, da mesma forma que a auditoria faz.
  • Um matiz para fundos e tintas. Se as tintas do design carregam um matiz diferente de seus fundos, mantenha --ink-tint baixo; em L 0,98 qualquer croma parece um tom de cor.
  • Cores de marca, status e gráfico ficam fora da fórmula. Derive variantes de texto sobre tom (por exemplo brand-text) a partir do mesmo matiz a uma luminosidade fixa em vez de escolhê-las separadamente.
  • Paletas com matiz misto e apenas modo claro amostradas de composições podem não se ajustar dentro de ~2 ΔE. Pule-as em vez de distorcer o design. A auditoria ainda se aplica.

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

Adamparishspok/skills

Make a website, web app or online store ready for AI agents. Scan it with Cloudflare's Agent Readiness checks, decide which checks apply to this kind of site, ship the discovery files and headers in priority order, and add the AI-first basics the scanner does not score (server-rendered content, JSON-LD, llms.txt). Covers robots.txt AI rules, Content Signals, sitemap, Markdown for Agents (Accept text/markdown), Link headers, API catalog, OAuth discovery, auth.md, MCP server card, A2A agent card, agent skills index, WebMCP, and commerce protocols (ACP, UCP, AP2, MPP, x402). Use when making a site AI-ready, agent-ready or AI-first, or fixing an isitagentready.com or Cloudflare Agent Readiness report. Triggers on: AI ready, agent ready, AI-first, agent readiness, isitagentready, AI Crawl Control, Markdown for Agents, text/markdown, llms.txt, GPTBot, ClaudeBot, AI crawlers, Content-Signal, ai-train, api-catalog, .well-known, oauth-protected-resource, auth.md, MCP server card, agent card, agent skills, WebMCP, a...

Adamparishspok/skills

Install a complete, lean favicon set on any website or web app — the five files modern browsers, iOS and Android actually use, one block of head markup added once in the root layout, and a check that every file resolves. Covers finding the public folder per framework, generating the set from one SVG (or from a RealFaviconGenerator package), dark-mode SVG icons, maskable manifest icons, cache busting and verification. Use when adding, replacing or auditing a favicon, app icon, apple-touch-icon or web manifest. Triggers on: favicon, favicon.ico, favicon.svg, apple-touch-icon, site.webmanifest, manifest.json, app icon, PWA icon, maskable icon, tab icon, RealFaviconGenerator.

Adamparishspok/skills

Give an interface one shared tempo and a small vocabulary of hover and state micro-interactions: duration tiers (tap/pop/hover/card/layout) for CSS and Motion, swap hand-offs, rows whose highlight grows in, trailing arrows, chevron nudges, card lifts without translate, scroll-edge fades, and icon/label swaps for copy and toggle buttons. Use when animations feel inconsistent, durations are scattered magic numbers, hovers only change colour, or a product feels flat or unfinished. Triggers on: animation duration, transition timing, hover state, micro-interaction, polish, copy button feedback, menu icon to close, back arrow, card hover, scroll fade, motion tokens, Framer Motion durations.

Adamparishspok/skills

Consolidate several apps or prototypes onto one shared component library without flattening their looks. Covers finding duplicated local components (buttons, selects, fields, modals, pagers, toasts), making shared components token-sized so each suite or app sets its own measurements, mapping variant names, deciding what stays app-specific, and the tailwind-merge traps that silently break custom tokens. Use when several apps each grew their own Btn/Select/Modal, when a design system's components "don't fit" a second product, or when retheming a family of apps. Triggers on: shared component library, design system consolidation, duplicate components, retheme, suite of apps, shadcn retokened, token-driven components, cn tailwind-merge custom tokens, variant mapping.

Habilidades Relacionadas