Communitygithub.com

ckmirafss/easy-on-the-eyes

Torna websites e aplicações web confortáveis de visualizar e evita que pareçam genéricas ou geradas por IA. Aplica e audita regras baseadas em evidências para tamanho de texto, contraste, temas claro e escuro, movimento, flashes, padrões de listras e estabilidade de layout, além de estudar sites reais de referência num navegador para extrair suas fontes, paleta, layout e movimento antes de projetar.

O que é easy-on-the-eyes?

A skill é um assistente de design que atua como um avaliador e guia de estilo para interfaces web, combinando auditoria técnica com curadoria visual. Ela executa scripts de verificação (auditoria e inspeção) que analisam o código-fonte e a página renderizada em um navegador real para verificar regras de conforto visual, como contraste mínimo de texto (4.5:1), tamanho de corpo de texto adequado (mínimo 1rem), movimento controlado (sem parallax ou scroll hijacking), e suporte a temas claro/escuro. Além disso, a skill inclui uma etapa de "estudo" onde ela abre sites reais (via web search ou fornecidos pelo usuário) e extrai suas escolhas de design (fontes, paleta, layout) para servir de inspiração, evitando que o resultado final pareça genérico ou "AI slop". A skill é particularmente útil para desenvolvedores que estão construindo UIs do zero ou refatorando designs existentes, fornecendo relatórios detalhados com IDs de regra, severidades (erro, aviso, nota) e referências a arquivos de documentação. Ela suporta comandos como `/easy-on-the-eyes audit` para auditoria, `fix` para correção automática, e `study <url>` para inspiração de design.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ckmirafss/easy-on-the-eyes/tree/HEAD/skills/easy-on-the-eyes

Perguntar na sua IA favorita

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

Documentação

Fácil para os Olhos

A maior parte da fadiga ocular em frente a uma tela vem de coisas que um site não pode controlar: piscar, distância focal, visão não corrigida, o ambiente. O que um site controla é quanta carga visual extra ele exige. Esta skill elimina esse trabalho extra e informa o quão forte é a evidência para cada regra.

Ela também mantém uma página confortável longe de parecer um template. Ela estuda sites reais em produção antes de projetar, e carrega um conjunto de regras de ofício para as escolhas que fazem o trabalho parecer gerado.

A afirmação que você pode fazer

Diga que o design "não adiciona esforço visual evitável". Nunca escreva que um design previne, reduz ou cura cansaço ocular, protege os olhos, ou é "azul-luz seguro". Não descreva modo escuro, tons quentes ou fontes especiais como características de saúde. Se o usuário pedir esse tipo de cópia, explique o porquê e ofereça a redação honesta.

Modos

Leia os argumentos com os quais a skill foi invocada.

  • Nenhum argumento, ou uma tarefa de construção. Para uma nova página ou seção, primeiro estude referências (veja "Estude antes de projetar"). Depois aplique as regras enquanto escreve ou edita a UI. Comece de assets/tokens.css quando o projeto ainda não tiver tokens de cor ou tipo. Quando a UI estiver escrita, execute audit.mjs no código-fonte e inspect.mjs na página renderizada, e revise "O que o script não pode ver" antes de dizer que está pronto.
  • audit (opcionalmente seguido de um caminho). Execute o script, depois revise o que um script não pode ver. Relate com o template abaixo. Não mude nada.
  • study seguido de uma ou mais URLs. Inspecione cada página e reporte seu resumo de design: o que ela faz, o que vale a pena pegar emprestado e quais regras de conforto ela quebra. Não mude nada.
  • fix (opcionalmente seguido de um caminho). Execute a auditoria. Corrija erros, depois avisos. Deixe uma nota em paz a menos que corrigir um erro ou aviso dependa dela, ou sua própria revisão mostre que é um problema real. Execute o script novamente e relate.

Executando o script

Execute-o da raiz do projeto e forneça o caminho para verificar. O script vive na pasta scripts/ desta skill, então use o caminho de onde esta skill foi carregada:

node <skill-dir>/scripts/audit.mjs src                 # relatório de texto, sai com 1 se qualquer erro
node <skill-dir>/scripts/audit.mjs src --json          # legível por máquina
node <skill-dir>/scripts/audit.mjs src --strict        # sai com 1 também em avisos
node <skill-dir>/scripts/audit.mjs contrast "#1f2328" "#ffffff"          # um par
node <skill-dir>/scripts/audit.mjs contrast "#8a8f98" "#ffffff" --min 3  # uma borda ou ícone
node <skill-dir>/scripts/inspect.mjs https://example.com              # resumo de design e verificação de conforto renderizada
node <skill-dir>/scripts/inspect.mjs http://localhost:3000 --out shots # também salva capturas de tela claras e escuras
node <skill-dir>/scripts/inspect.mjs dist/index.html --json
  • audit.mjs lê arquivos-fonte. inspect.mjs abre uma página em um navegador real, então mede o que o leitor obtém: o contraste do texto real em seu fundo real, caracteres reais por linha, se um esquema escuro existe e se o movimento para quando movimento reduzido é solicitado.
  • inspect.mjs funciona em qualquer URL ou arquivo HTML local. Ele precisa do Playwright no projeto (npm i -D playwright && npx playwright install chromium). Se estiver faltando e você não puder instalá-lo, diga que a verificação renderizada não foi executada.
  • Um caminho é obrigatório. Se o usuário não forneceu nenhum, use a pasta que contém o código-fonte da UI.
  • Cores podem ser hex, rgb(), hsl(), oklch(), white ou black.
  • Para silenciar um achado que é intencional, coloque um comentário contendo easy-on-the-eyes-ignore naquela linha, ou easy-on-the-eyes-ignore-next-line na linha anterior.
  • O script precisa do Node 18 ou superior e não tem dependências. Se o Node estiver faltando, aplique as regras manualmente e diga que o script não foi executado.

Ambos os scripts reportam sob os IDs de regra na tabela abaixo. Use esses mesmos IDs em seu relatório.

Estude antes de projetar

Modelos produzem a média do que viram, e a média é o que as pessoas reconhecem como gerado. Olhar para trabalhos específicos e publicados primeiro dá a você decisões reais para reagir.

  1. Escolha três a cinco sites ativos na mesma categoria do que você está construindo. Use os que o usuário nomear. Caso contrário, encontre-os com pesquisa na web, ou com qualquer ferramenta de referência de design ou captura de tela conectada à sessão.
  2. Execute inspect.mjs em cada um, com --out para que você possa abrir as capturas de tela e observá-las.
  3. Para cada um, anote as fontes e escala de tipo, quantas cores usa e onde vai o acento, o comprimento da linha, a estrutura das seções, e a única coisa que a torna reconhecível.
  4. Leia os achados de conforto para cada referência. Sites admirados frequentemente têm texto minúsculo, contraste fraco e movimento pesado. Pegue a composição emprestada e deixe esses problemas para trás. references/craft.md tem a tabela.
  5. Diga ao usuário quais sites você estudou e o que você tirou de cada um. Pegue estrutura e decisões emprestadas. Nunca copie o nome, logotipo, redação, imagens ou layout exato de uma marca.

Se você não conseguir abrir nenhuma referência, diga isso e projete a partir das regras e de references/craft.md.

Graus de evidência

Cada regra carrega um grau. Repita o grau quando explicar um achado, para que ninguém confunda um hábito com um fato.

GrauSignificado
researchSuportado por estudos controlados ou revisões sistemáticas
standardEstabelecido por um critério de sucesso da WCAG 2.2. O arquivo de referência dá o critério e seu nível
conventionSensato e amplamente implementado, mas sem teste por trás
inferenceDerivado de pesquisa sobre um estímulo relacionado, não testado em páginas web

Regras

Severidade decide a ordem: erros primeiro, depois avisos, depois notas. Dentro de uma severidade, trabalhe descendo na tabela. A severidade mostrada é a usual. O script a diminui quando não consegue dizer se uma linha é um problema (um tamanho pequeno no que pode ser um rótulo), e você pode aumentá-la quando sua revisão mostrar danos reais.

IDRegraSeveridadeGrauReferência
type-rem-zoomO texto deve sobreviver ao zoom. Tamanhos em rem, sem tamanhos de fonte apenas com viewport, zoom nunca desabilitado.errostandardtipografia
contrast-floorCada par de texto com pelo menos 4.5:1. Texto grande e partes de UI com pelo menos 3:1.errostandardcontraste-e-cor
contrast-color-aloneNunca sinalize estado com cor sozinha.errostandardcontraste-e-cor
motion-flashNada pisca mais de três vezes por segundo.errostandardmovimento
motion-autoplaySem vídeo em autoplay sem controles. Qualquer coisa que se mova por mais de 5 s além de texto precisa de pausa. Sem loops infinitos além de texto.errostandardmovimento
motion-reducedMovimento existe apenas dentro de prefers-reduced-motion: no-preference.errostandardmovimento
theme-focusNunca remova o contorno de foco sem um substituto visível de pelo menos 3:1.errostandardtematização
type-body-sizeTexto do corpo 1rem mínimo, 1.125rem a 1.25rem para leitura longa. Nada legível abaixo de 0.875rem.avisoresearchtipografia
motion-triggersSem parallax, sequestro de scroll ou zoom em grande área. Fades e mudanças de cor são aceitáveis.avisoresearchmovimento
contrast-dark-secondaryTexto secundário em superfícies escuras com 8.5:1 ou melhor. AA sozinho lê fraco ali.avisoinferencecontraste-e-cor
contrast-saturated-on-darkSem vermelho ou azul saturado como texto pequeno em escuro. Acentos mais claros e calmos em temas escuros.avisoresearchcontraste-e-cor
lum-section-stepsSem alternância de seções escuras e brancas com sangria total. Sem incorporações brancas ou modais em um tema escuro.avisoinferencelayout-e-padrões
lum-white-flashFundo html tematizado e uma declaração color-scheme e meta tag.avisoconventiontematização
layout-shiftReserve dimensões de mídia, combine métricas de fontes substitutas, mantenha CLS em ou abaixo de 0.1.avisoresearchlayout-e-padrões
contrast-pure-extremesQuase-preto em quase-branco, off-white em cinza escuro. Evite preto puro e branco puro como texto e fundo da página.avisoconventioncontraste-e-cor
type-leadingline-height do corpo 1.5 (1.4 a 1.6). Cabeçalhos 1.1 a 1.3.avisoconventiontipografia
type-weightPeso do corpo 400 ou mais. Sem 100 a 300 em tamanhos de corpo.avisoconventiontipografia
type-aligntext-align: start. Sem texto justificado no corpo. Maiúsculas apenas para rótulos curtos.avisostandardtipografia
layout-targetsAlvos de ponteiro com 24 por 24 px CSS no mínimo, 44 por 44 para ações primárias. Links dentro de uma frase são isentos.avisostandardlayout-e-padrões
theme-both-schemesImplemente claro e escuro e siga prefers-color-scheme. Um alternador manual é opcional e padrão para sistema.notaresearchtematização
pattern-stripesSem listras ou grades de alto contraste com período de 7 a 27 px sobre grandes áreas.notainferencelayout-e-padrões
type-measureTexto de leitura limitado a 50ch a 60ch, que é cerca de 65 a 78 caracteres.notaconventiontipografia
motion-duration100 a 300 ms, teto de 500 ms, ease-out para entradas.notaconventionmovimento
theme-preferencesRespeite prefers-contrast, forced-colors e prefers-reduced-transparency.notaconventiontematização
pattern-clutterUma ênfase primária por visualização. Poucas cores de acento, tamanhos e estilos de borda.notaresearchlayout-e-padrões
craft-copyCópia específica. Nunca invente estatísticas, depoimentos, avaliações ou logotipos de clientes.avisoconventionofício
craft-referenceEstude três a cinco sites reais na mesma categoria antes de projetar. Pegue decisões emprestadas, nunca copie.notaconventionofício
craft-one-ideaUma ideia distintiva por visualização. Todo o resto permanece quieto.notaconventionofício
craft-paletteNeutros com tom e um acento. Sem gradientes índigo ou roxo, sem texto com gradiente.notaconventionofício
craft-show-productMostre a interface, dados ou código reais. Sem fileira de três cartões de ícone idênticos, sem ícones de emoji.notaconventionofício
craft-layoutNão centralize tudo. Divisões de grade desiguais e estrutura de seção variada.notaconventionofício
craft-restraintSuperfícies planas e traços finos. Poucas sombras, uma escala de raio, sem blur e brilho empilhados.notaconventionofício

Os arquivos de referência contêm o raciocínio, fontes e código antes/depois. Leia cada um que cobre uma regra que você está aplicando ou relatando. Uma correção em toda uma página geralmente precisa de três ou quatro deles.

  • references/contrast-and-color.md: escolha de cores, construção de uma paleta ou um tema escuro, explicação de um achado de contraste.
  • references/typography.md: tamanho de tipo, comprimento de linha, espaçamento, fontes, tipo fluido.
  • references/motion.md: animação, transições, vídeo, efeitos de scroll, carregadores.
  • references/layout-and-patterns.md: tabelas, grades, listras, densidade, fundos de seção, imagens, mudança de layout.
  • references/theming.md: temas claro e escuro, um alternador de tema, estilos de foco, consultas de mídia de preferência do usuário, Tailwind e shadcn/ui.
  • references/craft.md: projetar uma nova página ou seção, um resultado que parece template ou gerado, o que pegar emprestado de um site de referência e o que deixar.
  • references/evidence.md: quando o usuário pergunta por que, questiona uma regra, ou pergunta sobre luz azul, modo escuro, fontes de dislexia ou APCA.

Padrões para escrever sem ser perguntado

:root {
  color-scheme: light dark;
  --bg:     light-dark(oklch(0.985 0.002 90), oklch(0.18 0.01 255));
  --text:   light-dark(oklch(0.24 0.01 255),  oklch(0.93 0.005 255));
  --muted:  light-dark(oklch(0.48 0.01 255),  oklch(0.78 0.01 255));
  --accent: light-dark(oklch(0.5 0.19 255),   oklch(0.74 0.13 255));
}
html { background-color: var(--bg); color: var(--text); }
body { font-size: clamp(1rem, 0.95rem + 0.25vw, 1.125rem); line-height: 1.6; }
p, li { max-inline-size: 55ch; }
:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
@media (prefers-reduced-motion: no-preference) {
  .card { transition: transform 200ms ease-out; }
}

Adicione <meta name="color-scheme" content="light dark"> ao cabeçalho da página.

Texto do corpo mede 15.75:1 em claro e 15.30:1 em escuro. Texto suave mede 6.25:1 e 9.39:1. O acento mede 5.78:1 e 8.14:1, que é por que é usado para o anel de foco: a cor Highlight do sistema pode cair abaixo de 3:1 em uma superfície escura. assets/tokens.css tem o conjunto completo, incluindo superfícies, bordas para controles, um tamanho de leitura longa e um tema escuro opcional.

Só adicione color-scheme: light dark uma vez que a página realmente tenha cores para ambos os esquemas. Em uma página com cores claras codificadas, isso dá barras de rolagem e controles de formulário escuros em uma página branca. Corrija theme-both-schemes na mesma alteração.

Tailwind e shadcn/ui enviam branco puro com quase-preto (cerca de 19.8:1) e bg-white / text-black como valores puros. Sobrescreva --background e --foreground, e use utilitários semânticos como bg-background e text-foreground.

O que o script não pode ver

inspect.mjs cobre o primeiro, terceiro e quinto itens abaixo quando você pode executá-lo na página renderizada. Verifique o resto, e todos eles quando ele não puder executar, lendo o código ou a página. Se você não puder verificar um, liste-o sob "Não verificado" e diga por que.

  • Contraste de cada par real de texto e fundo, incluindo texto sobre imagens e gradientes. Meça pares com o comando contrast
  • Se texto pequeno é conteúdo do corpo ou um rótulo curto
  • Comprimento da linha no layout renderizado. Conte caracteres em algumas linhas completas
  • Taxa de flash de animações e vídeo
  • Saltos de brilho entre seções e incorporações brancas dentro de temas escuros
  • Mudança de layout durante o carregamento, incluindo imagens e vídeo sem width e height
  • Se o estado é transmitido apenas pela cor
  • Animação orientada por JavaScript que ignora movimento reduzido
  • Tamanhos definidos em em, porcentagens ou a abreviação font, e listras construídas a partir de background-size

Template de relatório

Fácil para os Olhos

Caminho auditado: <caminho>
Script: <caminho do audit.mjs>

Erros:
  <nenhum ou lista>

Avisos:
  <nenhum ou lista>

Notas:
  <nenhum ou lista>

Não verificado:
  <ítens com motivo>

Resumo:
  Total de problemas: <número>
  Erros: <número>
  Avisos: <número>

Use uma lista com marcadores para muitos itens na mesma seção. Cada item de problema deve ter o ID da regra, o local (caminho do arquivo e número da linha, ou "no <nome>" para regras que afetam um componente ou elemento nomeado), e uma breve explicação. Se o script foi executado, diga que foi. Se você corrigiu algo, liste as correções.

Quando você reporta para o modo audit, não mude nada e não liste correções. Para o modo fix, liste o que o script corrigiu e qualquer correção manual adicional.

O usuário pode perguntar por que uma regra existe, o que significa um grau, ou o que diferencia dois tipos de severidade. Leia o arquivo de referência da regra e responda com citações das fontes que ele contém.

Habilidades Relacionadas