O sistema de cores da Frutjam usa tokens CSS semânticos projetados para atender às taxas de contraste WCAG AA prontas para uso. Sem JavaScript, compatível com modo escuro, compatível com Tailwind CSS v4. Funciona com Django, HTMX, Laravel e qualquer pilha somente CSS.
Frutjam usa propriedades personalizadas CSS como tokens de design para todas as cores. Cada cor é definida por tema e funciona automaticamente com classes de utilitário CSS do Tailwind, sem necessidade de configuração extra. Somente CSS, sem necessidade de JavaScript. Contraste WCAG AA garantido em cada par de cores, funciona com Django, HTMX, Laravel, React e qualquer projeto Tailwind CSS v4.
Nomes de cores
Frutjam define os seguintes papéis semânticos de cores. Cada cor tem uma correspondência on-{color} token para texto acessível em primeiro plano.
on-{color} O par é ajustado manualmente no OKLCH para atender aos requisitos de contraste WCAG AA. Ao contrário das bibliotecas que calculam as cores de primeiro plano automaticamente, o Frutjam oferece pares explícitos e verificados, para que seus componentes sejam acessíveis por design, e não por acaso.| Cor | Símbolo | Propósito |
|---|---|---|
| base | --color-base | Plano de fundo da página |
| neutro | --color-neutral | Superfícies, barras laterais, sobreposições |
| primário | --color-primary | Cor principal da marca |
| secundário | --color-secondary | Cor da marca secundária |
| sotaque | --color-accent | Cor de destaque/destaque |
| informações | --color-info | Mensagens informativas |
| sucesso | --color-success | Estados de sucesso |
| aviso | --color-warning | Estados de aviso |
| erro | --color-error | Erro e estados destrutivos |
Escala de cores (50–950)
Cada cor gera uma escala de 11 passos, calculada a partir das variáveis do tema raiz com color-mix() no OKLCH e não no momento da construção. Defina uma cor de marca e todas as onze etapas decorrem dela, para que você nunca as defina manualmente.
Cada etapa é uma variável CSS e um utilitário Tailwind ao mesmo tempo: use var(--color-primary-700) em seu próprio CSS ou bg-primary-700 na marcação. Passe o mouse sobre uma amostra para ver os dois nomes.
primaryprimary 50primary 100primary 200primary 300primary 400primary 500primary 600primary 700primary 800primary 900primary 950secondarysecondary 50secondary 100secondary 200secondary 300secondary 400secondary 500secondary 600secondary 700secondary 800secondary 900secondary 950accentaccent 50accent 100accent 200accent 300accent 400accent 500accent 600accent 700accent 800accent 900accent 950infoinfo 50info 100info 200info 300info 400info 500info 600info 700info 800info 900info 950successsuccess 50success 100success 200success 300success 400success 500success 600success 700success 800success 900success 950warningwarning 50warning 100warning 200warning 300warning 400warning 500warning 600warning 700warning 800warning 900warning 950errorerror 50error 100error 200error 300error 400error 500error 600error 700error 800error 900error 950neutralneutral 50neutral 100neutral 200neutral 300neutral 400neutral 500neutral 600neutral 700neutral 800neutral 900neutral 950basebase 50base 100base 200base 300base 400base 500base 600base 700base 800base 900base 950Como as etapas são calculadas a partir do seu tema, e não codificadas, esta grade não é uma imagem das cores de Frutjam. São as suas cores. Mude o tema e cada amostra acima se moverá com ele, e é também por isso que não há valores hexadecimais impressos ao lado deles.
1 2 3 | <div class="bg-primary-100 text-primary-900 p-4 rounded">Light tint, dark text</div> <div class="bg-success-700 text-success-50 p-4 rounded">Dark shade, light text</div> <div class="border-2 border-error-400 text-error-600 p-4 rounded">Border and text</div> |
on- cor, então nada garante contraste com ela. Quando o texto estiver em uma cor, use o par que a biblioteca testa: bg-primary com text-on-primary.| Variável CSS | Descrição |
|---|---|
--color-{color}-50 | 80% da sombra clara, 20% da cor |
--color-{color}-100 | 65% de luz, 35% de cor |
--color-{color}-200 | 50% de luz, 50% de cor |
--color-{color}-300 | 35% de luz, 65% de cor |
--color-{color}-400 | 18% de luz, 82% de cor |
--color-{color}-500 | a cor em si, igual a --color-{color} |
--color-{color}-600 | 18% de sombra escura, 82% de cor |
--color-{color}-700 | 34% escuro, 66% colorido |
--color-{color}-800 | 50% escuro, 50% colorido |
--color-{color}-900 | 65% escuro, 35% colorido |
--color-{color}-950 | 80% escuro, 20% colorido |
Classes de utilitários de cores
Todas as cores Frutjam funcionam com qualquer utilitário de cores Tailwind CSS. Substituir {color} com qualquer nome de cor da tabela acima, opcionalmente seguido por um passo da escala 50-950: bg-primary, bg-primary-100, text-error-900, border-success-300.
| Aula | Descrição |
|---|---|
bg-{color} | Cor de fundo |
text-{color} | Cor do texto |
border-{color} | Cor da borda |
ring-{color} | Cor do anel |
outline-{color} | Cor do contorno |
shadow-{color} | Cor da sombra |
fill-{color} | Cor de preenchimento SVG |
stroke-{color} | Cor do traço SVG |
decoration-{color} | Cor da decoração do texto |
caret-{color} | Cor do cursor de entrada |
placeholder-{color} | Cor do texto do espaço reservado |
divide-{color} | Cor da borda do divisor |
{utility}-{color}-{step} | Qualquer um dos itens acima em escala, por exemplo bg-accent-200 |
1 2 3 | <div class="bg-primary text-on-primary p-4 rounded">Primary background</div> <div class="bg-secondary text-on-secondary p-4 rounded">Secondary background</div> <div class="border border-primary text-primary p-4 rounded">Primary border and text</div> |
Modificador de opacidade
Controle a opacidade da cor com o /{value} modificador, assim como qualquer cor do Tailwind.
1 2 3 | <div class="bg-primary/10 text-primary p-4 rounded">10% primary background</div> <div class="bg-primary/20 text-primary p-4 rounded">20% primary background</div> <div class="text-on-base/60 p-4">60% opacity text</div> |
Suave e ativo
Variantes com reconhecimento de estado para elementos interativos, adaptando-se automaticamente a temas claros e escuros.
| Variável CSS | Descrição |
|---|---|
--color-{color}-soft | Fundo colorido sutil para variantes suaves |
--color-on-{color}-soft | Cor do texto para uso em fundos suaves |
--color-{color}-active | Sombra escurecida/clara para estados ativos e pairados |
--color-body | Cor do texto do corpo computada (ligeiramente suavizada de on-base) |
Variáveis CSS do tema
Estes são os tokens raiz que você define ao criar um tema personalizado. Todos os outros tokens de cores são calculados automaticamente a partir deles.
| Variável CSS | Descrição |
|---|---|
--scheme-color | Esquema de cores: light ou dark |
--border-radius | Raio da borda base para componentes |
--color-base | Cor de fundo da página |
--color-on-base | Cor de texto padrão no plano de fundo base |
--color-neutral | Cor de superfície neutra |
--color-on-neutral | Cor do texto em superfícies neutras |
--color-primary | Cor principal da marca |
--color-on-primary | Cor do texto em fundos primários |
--color-secondary | Cor da marca secundária |
--color-on-secondary | Cor do texto em fundos secundários |
--color-accent | Cor de destaque |
--color-on-accent | Cor do texto em fundos acentuados |
--color-info | Cor da informação |
--color-on-info | Cor do texto em fundos de informações |
--color-success | Cor do sucesso |
--color-on-success | Cor do texto em fundos de sucesso |
--color-warning | Cor de aviso |
--color-on-warning | Cor do texto em fundos de aviso |
--color-error | Cor do erro |
--color-on-error | Cor do texto em fundos de erro |
Exemplo de tema personalizado
Substitua os tokens raiz para criar um tema personalizado. Frutjam calcula todas as escalas e estados automaticamente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | @import "tailwindcss"; @plugin "frutjam"; [data-theme="mytheme"] { --scheme-color: light; --border-radius: 0.5rem; --color-base: oklch(98% 0 0); --color-on-base: oklch(15% 0 0); --color-neutral: oklch(20% 0 0); --color-on-neutral: oklch(98% 0 0); --color-primary: oklch(55% 0.25 260); --color-on-primary: oklch(98% 0 0); --color-secondary: oklch(60% 0.20 320); --color-on-secondary: oklch(98% 0 0); --color-accent: oklch(65% 0.22 180); --color-on-accent: oklch(15% 0 0); --color-info: oklch(68% 0.17 237); --color-on-info: oklch(15% 0 0); --color-success: oklch(75% 0.20 150); --color-on-success: oklch(15% 0 0); --color-warning: oklch(82% 0.19 90); --color-on-warning: oklch(15% 0 0); --color-error: oklch(58% 0.24 27); --color-on-error: oklch(98% 0 0); } |