zark-design 3.0.4 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,60 +1,135 @@
1
- # zark-design
1
+ # 🎨 zark-design — Design System anti-cara-de-IA (gerador agnóstico de marca)
2
2
 
3
- > ZARK SAAS Design System instale via `npx zark-design init` em qualquer projeto.
3
+ > **`npx zark-design init` em qualquer pasta cria um design system completo (HTML + JSX side-by-side) com a sua cor primária e regras explícitas pra IA não gerar UI "cara de IA": sem pill, sem rounded extremo, sem travessão em copy, sem brand color dominante, sem glassmorphism.**
4
4
 
5
- O design system fica como **REFERÊNCIA pra IA**, não como dependência runtime. A IA lê os arquivos JSX + tokens + screenshots e adapta pra qualquer stack (React, Vue, Svelte, Blade, Django templates, HTML puro com Tailwind, etc.).
6
-
7
- ## Uso
5
+ [![npm version](https://img.shields.io/npm/v/zark-design.svg?style=flat-square&color=f56f10)](https://www.npmjs.com/package/zark-design)
6
+ [![weekly downloads](https://img.shields.io/npm/dw/zark-design.svg?style=flat-square&color=f56f10)](https://www.npmjs.com/package/zark-design)
7
+ [![license](https://img.shields.io/npm/l/zark-design.svg?style=flat-square)](./LICENSE)
8
8
 
9
9
  ```bash
10
- # Em qualquer pasta de projeto
11
- npx zark-design init
12
-
13
- # Cria ./design-system/ com:
14
- # REFERENCE.md (cérebro: tokens + primitivos + patterns documentados)
15
- # tokens.css (light + dark themes)
16
- # primitives.jsx (Button, Input, Tag, etc. — referência visual)
17
- # components.jsx
18
- # layouts.jsx
19
- # patterns.jsx
20
- # icons.jsx
21
- # brand.jsx
22
- # foundations.jsx
23
- # SHOWCASE.html (preview offline)
24
- # visual-references/ (15 screenshots — ground truth visual)
25
- # assets/ (logo + ícone)
10
+ # Custom (recomendado sua cor de marca + paleta 50→900 gerada automaticamente)
11
+ npx zark-design@latest init --name "MinhaEmpresa" --primary "#3B82F6" --yes
12
+
13
+ # Preset ZARK de referência (cor #F56F10 + logos ZARK)
14
+ npx zark-design@latest init --preset zark --yes
26
15
  ```
27
16
 
28
- Depois, abra a IA na pasta:
17
+ ---
18
+
19
+ ## O que é
20
+
21
+ `zark-design` é um **scaffolder de design system híbrido** parte do ecossistema [ZARK](https://github.com/mayconjordanr/zark-dev). Em modo `preset zark` ele entrega o design system ZARK pronto pra usar (paleta ember, logos, tipografia). Em modo `custom` ele **gera** um design system completo a partir de **1 cor hex** (escala 50→900 calculada via HSL) ou de uma paleta JSON pronta.
22
+
23
+ A IA (Claude Code, Cursor, Codex) lê os arquivos como **referência visual e estrutural** — não como dependência runtime — e adapta os componentes pra qualquer stack: React, Vue, Svelte, Solid, Blade (Laravel), Django templates, ERB (Rails), HTML puro com Tailwind, CSS modules, styled-components.
24
+
25
+ ### O que vem instalado
29
26
 
30
- ```bash
31
- claude # ou cursor . / codex / aider
32
27
  ```
28
+ design-system/
29
+ ├── README.md # cérebro pra IA
30
+ ├── html/
31
+ │ ├── tokens.css # light + dark themes
32
+ │ ├── components.css # 50+ classes utilitárias (.btn, .tag-dot, .stat...)
33
+ │ ├── index.html # exemplo mínimo
34
+ │ └── showcase.html # galeria completa (light/dark toggle)
35
+ ├── jsx/
36
+ │ ├── tokens.css/.js
37
+ │ ├── components.css
38
+ │ ├── icons.jsx # 35 ícones outline
39
+ │ ├── App.example.jsx # exemplo completo
40
+ │ └── components/ # 24 componentes individuais
41
+ └── assets/ # logos (preset = ZARK; custom = SVG dinâmico com sua cor)
42
+ ```
43
+
44
+ 24 componentes individuais: `Button` · `Input` · `Tag` · `TagDot` · `Badge` · `Toggle` · `Segmented` · `Chip` · `Avatar` · `Kbd` · `Spec` · `Panel` · `Section` · `Modal` · `Toast` · `Banner` · `CodeBlock` · `StatCard` · `AlertCritical` · `Funnel` · `KanbanColumn` · `LeadCard` · `EmptyState` · `TableActions` · `Sidebar`. **App Patterns derivados do CRM real ZARK** — não componentes genéricos de portfólio.
33
45
 
34
- A IA detecta `design-system/REFERENCE.md` e usa como fonte de verdade pra qualquer trabalho de UI/frontend.
46
+ ---
35
47
 
36
- ## Pasta customizada
48
+ ## 🚀 Quick start
49
+
50
+ ### Modo preset (ZARK pronto)
51
+
52
+ ```bash
53
+ mkdir meu-projeto && cd meu-projeto
54
+ npx zark-design@latest init --preset zark --yes
55
+ open design-system/html/showcase.html # vê tudo renderizado no browser
56
+ ```
57
+
58
+ ### Modo custom (sua marca)
37
59
 
38
60
  ```bash
39
- npx zark-design init ./ui # instala em ./ui em vez de ./design-system
40
- npx zark-design init ./src/zark # instala em src/zark
61
+ mkdir meu-projeto && cd meu-projeto
62
+
63
+ # Interativo
64
+ npx zark-design@latest init
65
+
66
+ # Ou com flags
67
+ npx zark-design@latest init --name "MinhaEmpresa" --primary "#3B82F6" --yes
41
68
  ```
42
69
 
43
- ## Sobrescrever instalação existente
70
+ A paleta `--brand-50` até `--brand-900` é gerada automaticamente via HSL manipulation a partir da cor primária. Ring focus, tons dark mode e variações suaves também são derivados.
71
+
72
+ ### Listar presets disponíveis
44
73
 
45
74
  ```bash
46
- npx zark-design init --force
75
+ npx zark-design@latest presets
47
76
  ```
48
77
 
49
- ## Integração com `.ai-context/CONTEXT.md` ou `CLAUDE.md`
78
+ ---
79
+
80
+ ## Filosofia visual (anti-cara-de-IA)
81
+
82
+ A paleta é sua. O padrão visual é universal: foge das assinaturas óbvias de UI gerada por IA.
83
+
84
+ **Visual**
85
+ - Warm + neutral + brand-on-paper. Fundo cremoso quente (`#fafaf8`), nunca branco puro.
86
+ - Cor da marca usada com moderação. Só CTA primário, focus ring, ícone-acento. Nunca background dominante.
87
+ - Sem pill. Raio máx 6px em tags/chips/toggles; 8-12px em cards; 16px em modal. Avatares 50% (círculo geométrico).
88
+ - Hairlines de 1px em `--line-200`. Borders grossos banidos.
89
+ - Sombras warm (`rgba(20, 17, 12, ...)`), nunca frias.
90
+ - Sem glassmorphism, gradiente colorido, neon, blur exagerado.
91
+
92
+ **Copy**
93
+ - Sem travessão (—) nem en-dash (–) em qualquer texto da UI. Vírgula, ponto, dois-pontos.
94
+ - Sem emoji em label de botão, título de campo, título de página.
95
+ - Frase ≤ 12 palavras em UI. Voz ativa.
96
+ - Sem vocabulário marketing-IA: "transforme", "potencialize", "descubra", "experimente".
97
+
98
+ **Tipografia**
99
+ - Editorial: Inter (UI) + JetBrains Mono (código) + Space Grotesk (display).
100
+ - Dark mode nativo via `[data-theme="dark"]` ou `prefers-color-scheme`.
101
+
102
+ ---
103
+
104
+ ## Integração com `CLAUDE.md`
105
+
106
+ Se o projeto já tem ZARK acoplado (via `npx zark-dev start`), o `init` detecta e adiciona automaticamente uma nota em `.ai-context/CONTEXT.md` ou `CLAUDE.md` instruindo a IA a ler `design-system/README.md` antes de qualquer trabalho de UI.
107
+
108
+ ---
109
+
110
+ ## O Ecossistema ZARK
111
+
112
+ `zark-design` é uma das 4 peças do método [ZARK](https://github.com/mayconjordanr/zark-dev):
113
+
114
+ - [**`zark-dev`**](https://www.npmjs.com/package/zark-dev) — metodologia + contexto pra IA (orquestra todo o método)
115
+ - **`zark-design`** ← você está aqui
116
+ - [**`zark-seo`**](https://www.npmjs.com/package/zark-seo) — 17 skills SEO/GEO especialistas, foco BR
117
+ - [**`zark-skills`**](https://www.npmjs.com/package/zark-skills) — 5 skills Claude Code user-level
118
+
119
+ ---
120
+
121
+ ## Quem está por trás
122
+
123
+ [**Maycon Jordan**](https://github.com/mayconjordanr) — fundador da [ZARK](https://grupozark.com.br). Design system derivado do CRM real da ZARK + clientes (Limppetec, AllSec, VipCar, VipSeg, MixShop), refinado em produção.
124
+
125
+ ---
50
126
 
51
- Se o projeto já tem ZARK acoplado (via `zark-dev start` ou `audit`), o `init` adiciona automaticamente uma nota em `CLAUDE.md` ou `.ai-context/CONTEXT.md` instruindo a IA a ler o `REFERENCE.md` antes de qualquer UI.
127
+ ## Tags
52
128
 
53
- ## Filosofia
129
+ `zark` `design-system` `zark-design-system` `react-design-system` `html-design-system` `dual-implementation` `dark-mode` `design-tokens` `tailwind-alternative` `palette-generator` `app-patterns` `crm-ui` `brazil` `pt-br` `metodologia-zark`
54
130
 
55
- ZARK é warm + neutral + ember-on-paper. Cor de marca: Liquid Lava (`#f56f10`).
56
- Os primitivos JSX são **referência estrutural** — adapte pra stack alvo, nunca copie literal.
131
+ ---
57
132
 
58
133
  ## Licença
59
134
 
60
- MIT — Maycon Jordan
135
+ [MIT](./LICENSE) — Maycon Jordan / ZARK · 2026
package/bin/cli.js CHANGED
@@ -202,15 +202,18 @@ function printHelp(version) {
202
202
  console.log(` ${c.green('help')} mostra esta ajuda`);
203
203
  console.log(` ${c.green('version')} mostra a versão\n`);
204
204
  console.log(` ${c.bold('Modos:')}`);
205
- console.log(` ${c.green('preset ZARK')} paleta + logos ZARK prontos (Liquid Lava #F56F10)`);
206
- console.log(` ${c.green('custom')} sua cor primária + suas logos\n`);
207
- console.log(` ${c.bold('Uso interativo:')}`);
208
- console.log(` npx zark-design init ${c.dim('# pergunta tudo')}`);
205
+ console.log(` ${c.green('custom')} ${c.dim('(padrão)')} sua cor primária paleta 50→900 gerada via HSL`);
206
+ console.log(` ${c.green('preset ZARK')} configuração pronta de referência (Liquid Lava #F56F10)\n`);
207
+ console.log(` ${c.bold('Uso custom (recomendado — sua marca):')}`);
208
+ console.log(` npx zark-design init ${c.dim('# pergunta tudo')}`);
209
+ console.log(` npx zark-design init --name "MinhaEmpresa" --primary "#3B82F6" --yes`);
210
+ console.log(` npx zark-design init --palette ./minha-paleta.json --yes\n`);
211
+ console.log(` ${c.bold('Uso preset ZARK:')}`);
209
212
  console.log(` npx zark-design init --preset zark ${c.dim('# usa ZARK direto')}`);
210
213
  console.log(` npx zark-design init --preset zark --yes ${c.dim('# sem confirms')}\n`);
211
- console.log(` ${c.bold('Uso custom (flags):')}`);
212
- console.log(` npx zark-design init --name "ALLSEC" --primary "#E74C3C" --yes`);
213
- console.log(` npx zark-design init --palette ./minha-paleta.json --yes\n`);
214
+ console.log(` ${c.bold('Filosofia:')}`);
215
+ console.log(` Anti "cara de IA": sem pill, sem rounded extremo, sem travessão em copy, sem`);
216
+ console.log(` brand color dominante, sem glassmorphism. App patterns derivados de CRM real.\n`);
214
217
  console.log(` ${c.bold('Output:')}`);
215
218
  console.log(` design-system/ ${c.dim('# default; mude com [pasta]')}`);
216
219
  console.log(` ├── README.md`);
@@ -298,15 +301,15 @@ async function buildCtx({ flags, prompt }) {
298
301
  fonts: { ui: 'Inter', mono: 'JetBrains Mono', display: 'Space Grotesk' },
299
302
  };
300
303
  }
301
- // 4) Interativo
304
+ // 4) Interativo — modo custom é o padrão (sua marca, sua cor)
302
305
  if (!prompt) throw new Error('Modo interativo precisa de TTY. Use --preset zark ou --primary <hex>.');
303
306
  console.log(c.dim(' Pressione Enter pra usar o default em parênteses.\n'));
304
- const usePreset = await prompt.yn('Usar preset ZARK pronto?', true);
305
- if (usePreset) return await loadPreset('zark');
307
+ const useCustom = await prompt.yn('Customizar com sua cor de marca?', true);
308
+ if (!useCustom) return await loadPreset('zark');
306
309
 
307
310
  const name = await prompt.ask('Nome do projeto/empresa:', 'Custom');
308
311
  const slug = await prompt.ask('Slug (lowercase, sem espaços):', slugify(name));
309
- const primary = await prompt.ask('Cor primária (hex, ex: #E74C3C):');
312
+ const primary = await prompt.ask('Cor primária (hex, ex: #3B82F6):');
310
313
  if (!primary) throw new Error('Cor primária é obrigatória.');
311
314
  const palette = generatePalette(primary);
312
315
  return {
@@ -425,7 +428,7 @@ async function runInit(args) {
425
428
  }
426
429
 
427
430
  async function appendNoteToContextFiles(targetRoot, designDirName, ctx) {
428
- const note = `\n\n## Design system\nEste projeto usa o **${ctx.name} Design System** (gerado por \`zark-design\`${ctx.preset ? `, preset ${ctx.preset}` : ', modo custom'}). Antes de qualquer trabalho de UI/frontend, leia \`${designDirName}/README.md\`.\n\n2 implementações lado a lado consumindo \`tokens.css\` + \`components.css\` idênticos:\n- \`${designDirName}/html/\` — HTML puro (Blade/Django/Rails/HTML)\n- \`${designDirName}/jsx/\` — React (24 componentes individuais)\n\nVue/Svelte/Solid: use \`tokens.css\` + \`components.css\` direto, adapte os JSX mantendo as classes.\n\nCor de marca: \`var(--brand-500)\` = ${ctx.brand['500']}. Abra \`${designDirName}/html/showcase.html\` no browser pra inspeção visual.\n`;
431
+ const note = `\n\n## Design system\nEste projeto usa o **${ctx.name} Design System** (gerado por \`zark-design\`${ctx.preset ? `, preset ${ctx.preset}` : ', modo custom'}). Antes de qualquer trabalho de UI/frontend, leia \`${designDirName}/README.md\` — em especial o bloco "LEIA ANTES DE GERAR UI (regras anti-IA-genérica)".\n\n**Regras críticas resumidas (detalhes no README):**\n- Sem pill (border-radius 999px / --r-pill). Tag/chip/toggle: raio máx 6px. Avatar 50%.\n- Sem rounded extremo. Card 8-12px, modal 16px máx. Botão 6px.\n- Sem travessão (—) nem en-dash (–) em copy/UI/labels. Use vírgula, ponto, dois-pontos.\n- Sem emoji em label de botão, título de campo, título de página.\n- Sem brand color como background dominante. Use \`var(--paper)\` / \`var(--canvas)\`.\n- Sem hex hardcoded. SEMPRE \`var(--brand-500)\` (= ${ctx.brand['500']}) ou tokens.\n- Sem sombra fria. Use as warm \`rgba(20,17,12,...)\` dos tokens.\n\n2 implementações lado a lado consumindo \`tokens.css\` + \`components.css\` idênticos:\n- \`${designDirName}/html/\` — HTML puro (Blade/Django/Rails/HTML)\n- \`${designDirName}/jsx/\` — React (24 componentes individuais)\n\nVue/Svelte/Solid: use \`tokens.css\` + \`components.css\` direto, adapte os JSX mantendo as classes.\n\nReceitas prontas (botão, card, KPI, formulário, status, empty state, alerta, toast) na seção "Receitas prontas" do README. Comece daí em vez de inventar do zero.\n\nAbra \`${designDirName}/html/showcase.html\` no browser pra inspeção visual.\n`;
429
432
  const candidates = [
430
433
  path.join(targetRoot, '.ai-context', 'CONTEXT.md'),
431
434
  path.join(targetRoot, 'CLAUDE.md'),
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "zark-design",
3
- "version": "3.0.4",
4
- "description": "Design system scaffolder seguindo método ZARK — `npx zark-design init` em modo preset (ZARK pronto) ou custom (cor e logos suas, paleta 50→900 gerada). HTML + JSX side-by-side. Dark mode nativo. Sem dependência runtime.",
3
+ "version": "3.2.0",
4
+ "description": "Design system scaffolder anti-cara-de-IA. `npx zark-design init` gera um DS completo a partir da sua cor primária (paleta 50→900 via HSL) ou usa o preset ZARK. Regras explícitas pra IA: sem pill, sem rounded extremo, sem travessão em copy, sem brand color dominante, sem glow/shine/gradiente, botões fiéis aos padrões canônicos. Inclui paleta validada de data viz (8 slots categoricos CVD-safe, sequential, diverging, status) + receitas de estados (skeleton, tooltip, tabela, meter, sparkline). HTML + JSX side-by-side. Dark mode nativo. Sem dependência runtime.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "zark-design": "bin/cli.js"
@@ -20,7 +20,16 @@
20
20
  "ai-context",
21
21
  "scaffold",
22
22
  "tokens",
23
- "ui"
23
+ "ui",
24
+ "anti-ai-look",
25
+ "palette-generator",
26
+ "dark-mode",
27
+ "brand-agnostic",
28
+ "data-viz",
29
+ "dataviz",
30
+ "charts",
31
+ "cvd-safe",
32
+ "categorical-palette"
24
33
  ],
25
34
  "author": "Maycon Jordan",
26
35
  "license": "MIT",
@@ -6,6 +6,41 @@ Versão: **v3 · {{date}}** · gerado por `npx zark-design init{{#if preset}} --
6
6
 
7
7
  ---
8
8
 
9
+ ## ⚠️ LEIA ANTES DE GERAR UI (regras anti-IA-genérica)
10
+
11
+ Este design system existe pra **fugir do "cara de IA"**. Se você é uma IA gerando UI ou copy pra este projeto, siga estas regras SEM EXCEÇÃO:
12
+
13
+ ### Visual
14
+ - ❌ **Nada de pill como indicador.** Tag, badge, chip, toggle: raio máximo `var(--r-md)` (6px). Pill (`border-radius: 999px`, `9999px`, `--r-pill`) está banido. Único uso de raio 50%: **avatar circular** e **status dot** (8px).
15
+ - ❌ **Nada de bordas extremamente arredondadas.** Cards, panels, modals: raio máximo `var(--r-2xl)` (16px) pra modal, `var(--r-xl)` (12px) pra card grande, `var(--r-lg)` (8px) pra card padrão. Botões: `var(--r-md)` (6px), nunca mais. Se você está pensando em `border-radius: 24px+`, **pare**.
16
+ - ❌ **Nada de glow, shine, drop-shadow colorido, gradiente colorido, glassmorphism, neon, blur exagerado.** Assinaturas óbvias de UI gerada por IA. Sombra é warm (`rgba(20, 17, 12, ...)`), 1 camada, discreta. Sem `filter: drop-shadow(0 0 12px brand-500)`. Sem `text-shadow` colorido. Sem `backdrop-filter: blur()` como decoração.
17
+ - ❌ **Brand color dominante.** A cor de marca (`var(--brand-500)`) só aparece em: CTA primário, focus ring, link, ícone-acento. Nunca como background de tela inteira, hero, card. Use neutros warm pro grosso (`--paper`, `--canvas`, `--surface`).
18
+ - ❌ **Hex hardcoded** (`#f56f10`, `#3B82F6`). SEMPRE `var(--brand-500)` ou variável do token.
19
+ - ❌ **Border-radius percentual aleatório** (`30%`, `40%`). Só `50%` pra círculos geométricos.
20
+ - ❌ **Botão inflado, botão gigante, botão com gradiente ou brilho.** Botão é `.btn` + variante + tamanho. Ponto. Ver seção "Fidelidade aos padrões de botão" abaixo.
21
+ - ❌ **Container arredondado grande com padding grande e sombra pesada.** Esse combo é o "cara de landing page gerada por IA". Card ZARK tem hairline 1px + `--shadow-sm` + raio ≤ 12px.
22
+
23
+ ### Copy / texto gerado
24
+ - ❌ **NUNCA use travessão (—) ou en-dash (–) em texto da UI ou copy gerada.** É a assinatura mais óbvia de texto de IA. Use:
25
+ - **vírgula** quando a pausa for curta
26
+ - **dois-pontos** quando o que vem depois explica o anterior
27
+ - **ponto final** quando o pensamento acabou
28
+ - **parênteses** ou nova linha pra aposto/extensão
29
+ - ❌ Nada de "Não apenas X, mas também Y" / "It's not just A — it's B".
30
+ - ❌ Nada de bullet com travessão na frente. Use traço simples `-` ou ponto `•`.
31
+ - ❌ Frases longas com 3 vírgulas + travessão + "ou seja". Texto direto: sujeito, verbo, complemento.
32
+ - ✅ Exemplo ruim: "Esta plataforma oferece — além da automação — recursos avançados de análise, que permitem decisões mais estratégicas."
33
+ - ✅ Exemplo bom: "Plataforma com automação e análise. Decisões mais rápidas."
34
+
35
+ ### Layout
36
+ - Hairlines de 1px em `var(--line-200)`. Nunca borders grossos (2px+) em componentes de UI.
37
+ - Espaçamento múltiplo de 4px (use os tokens `--sp-*`).
38
+ - Animação ≤ 280ms. Microinterações ≤ 180ms. Nada de `bounce` exagerado.
39
+
40
+ > Estas regras estão refletidas em `tokens.css` (não há `--r-pill`) e `components.css` (todos os componentes seguem). Se você sentir necessidade de quebrar alguma, **fale com o humano antes**.
41
+
42
+ ---
43
+
9
44
  ## Estrutura
10
45
 
11
46
  ```
@@ -63,13 +98,14 @@ design-system-apps/
63
98
 
64
99
  ## Filosofia
65
100
 
66
- **Warm, neutral, ember-on-paper.**
67
- - `--paper` (#fafaf8) cremoso, NÃO branco puro.
68
- - `--brand-500` (#f56f10 — Liquid Lava) é a única cor de marca. Use com **moderação** em CTAs, focus, brand moments.
101
+ **Warm, neutral, brand-on-paper.**
102
+ - `--paper` (#fafaf8) cremoso, NÃO branco puro. Fundo dominante é sempre neutro warm.
103
+ - `--brand-500` ({{brand.500}}) é a sua cor de marca, gerada da paleta 50→900 a partir da primária. **A paleta é sua** o sistema é agnóstico: troque a cor primária via `npx zark-design init --primary "#SUACOR"` e tudo se recalcula (50→900 + ring + dark mode). O preset ZARK é só uma das infinitas configurações.
104
+ - Cor de marca usada com **moderação**: CTA primário, focus ring, link, ícone-acento. Nunca background dominante.
69
105
  - Hairlines de 1px em `--line-200`. Nunca borders grossos.
70
106
  - Sombras warm (`rgba(20,17,12,...)`), nunca azuis-frias.
71
- - Tipografia editorial: **Inter** pra UI e números · **JetBrains Mono** pra código e labels · **Space Grotesk** pra títulos.
72
- - **Sem pill.** Tags, chips, toggles, badges usam raio sm/md (4-6px). Avatares usam 50% (são círculos geométricos, não pills).
107
+ - Tipografia editorial: **{{fonts.ui}}** pra UI e números · **{{fonts.mono}}** pra código e labels · **{{fonts.display}}** pra títulos.
108
+ - **Sem pill, sem rounded extremo.** Tags, chips, toggles, badges usam raio sm/md (4-6px). Avatares usam 50% (círculos geométricos, não pills). Veja o bloco anti-IA no topo.
73
109
 
74
110
  ---
75
111
 
@@ -224,6 +260,460 @@ function Dashboard() {
224
260
 
225
261
  ---
226
262
 
263
+ ## Fidelidade aos padrões de botão
264
+
265
+ > Botão é o componente mais copiado errado. Aqui a IA usa **o que existe**, não inventa variante nova.
266
+
267
+ ### Variantes canônicas (as únicas permitidas)
268
+
269
+ | Classe | Uso |
270
+ |---|---|
271
+ | `.btn-primary` | **UMA** ação principal do bloco/modal/página. Brand color no bg. |
272
+ | `.btn-secondary` | Ação alternativa lado a lado do primary. Surface + hairline. |
273
+ | `.btn-soft` | Ação secundária sem competir visualmente. `--brand-50` bg, `--brand-700` texto. |
274
+ | `.btn-ghost` | Ação terciária, discreta. Sem bg, sem borda até hover. |
275
+ | `.btn-danger` | Ação destrutiva. Texto vermelho em fundo branco, hover vermelho suave. |
276
+
277
+ ### Tamanhos canônicos (as únicas permitidas)
278
+
279
+ | Classe | Altura | Uso |
280
+ |---|---|---|
281
+ | `.btn-xs` | 22px | Dentro de tabela, chip menu, breadcrumb. |
282
+ | `.btn-sm` | 28px | Botão dentro de card compacto. |
283
+ | `.btn-md` | 32px | **Padrão.** 95% dos casos. |
284
+ | `.btn-lg` | 40px | Formulário grande, modal principal. |
285
+
286
+ Sem `xl`, `2xl`, `huge`. Sem `w-full` gigante. Sem `py-6`, `py-8`.
287
+
288
+ ### Regras rígidas
289
+ - ❌ **Nunca invente uma variante nova** (`btn-gradient`, `btn-glow`, `btn-outline-primary`, `btn-3d`, `btn-hero`). Se você acha que precisa, você não precisa.
290
+ - ❌ **Nunca 2 primários no mesmo bloco.** UM primário. Outros são secondary, soft, ghost.
291
+ - ❌ **Nunca botão com gradiente colorido**, glow, box-shadow colorido, `text-shadow`, `filter: drop-shadow`.
292
+ - ❌ **Nunca botão com ícone gigante ou emoji-hero**. Ícone de botão é 14px `.btn-md`, 12px `.btn-sm`.
293
+ - ❌ **Nunca botão com raio > `var(--r-lg)` (8px)**. `.btn-md` é 6px, `.btn-lg` é 8px. Chega.
294
+ - ❌ **Nunca botão sem uma das classes de tamanho** (`.btn-xs/sm/md/lg`). Isso não é opção; é obrigatório.
295
+ - ✅ Ícone à esquerda ou direita: `<button class="btn btn-primary btn-md"><svg>…</svg> Salvar</button>`. Gap padrão 6px vem da classe.
296
+ - ✅ Loading: `<button class="btn btn-primary btn-md" disabled><span class="spinner"></span> Salvando…</button>`. Spinner CSS já existe.
297
+
298
+ ### Exemplo do que NÃO fazer
299
+
300
+ ```html
301
+ <!-- ❌ HORROR: variante inventada, gigante, gradiente, glow -->
302
+ <button style="background: linear-gradient(90deg, #f56f10, #ff8f30);
303
+ color: white; padding: 16px 32px; border-radius: 999px;
304
+ font-size: 20px; box-shadow: 0 0 24px #f56f10;
305
+ font-weight: 800; text-transform: uppercase;
306
+ letter-spacing: 0.1em;">
307
+ ✨ COMEÇAR AGORA
308
+ </button>
309
+ ```
310
+
311
+ Cara-de-IA em 8 sinais: gradient, pill (999px), padding inflado, fonte grande, glow shadow, uppercase, letter-spacing marketing, emoji de foguete/estrela em CTA.
312
+
313
+ ```html
314
+ <!-- ✅ CERTO -->
315
+ <button class="btn btn-primary btn-md">Começar</button>
316
+ ```
317
+
318
+ ---
319
+
320
+ ## Receitas prontas (copy-paste, HTML)
321
+
322
+ > Padrões testados em produção. Comece daqui em vez de inventar do zero.
323
+
324
+ ### Botão primário + secundário (ação padrão)
325
+
326
+ ```html
327
+ <div style="display:flex; gap:8px;">
328
+ <button class="btn btn-primary btn-md">Salvar</button>
329
+ <button class="btn btn-secondary btn-md">Cancelar</button>
330
+ </div>
331
+ ```
332
+
333
+ Regra: **um** primário por bloco/modal. Outros viram secondary, soft ou ghost.
334
+
335
+ ### Botão de perigo (ação destrutiva)
336
+
337
+ ```html
338
+ <button class="btn btn-danger btn-md">Excluir conta</button>
339
+ ```
340
+
341
+ Não é vermelho dominante; é texto vermelho em fundo branco com hover suave (`--danger-50`). Vermelho cheio só em `.alert-critical` (banner de erro imediato).
342
+
343
+ ### Card básico (panel)
344
+
345
+ ```html
346
+ <div class="panel">
347
+ <div class="panel-head">
348
+ <div class="panel-title">Resumo do mês</div>
349
+ <div class="panel-kicker">Atualizado agora</div>
350
+ </div>
351
+ <div class="panel-body">
352
+ Conteúdo do card. Texto direto, sem travessão.
353
+ </div>
354
+ </div>
355
+ ```
356
+
357
+ Raio `var(--r-lg)` (8px). Hairline 1px em `--line-200`. Sombra `--shadow-sm`. Sem gradiente, sem glassmorphism.
358
+
359
+ ### Card KPI (StatCard)
360
+
361
+ ```html
362
+ <div class="stat">
363
+ <div class="stat-head">
364
+ <span class="stat-label">CONCLUÍDAS · SEMANA</span>
365
+ <span class="stat-icon green">✓</span>
366
+ </div>
367
+ <div class="stat-value">8</div>
368
+ <div class="stat-sub">+18% vs anterior</div>
369
+ </div>
370
+ ```
371
+
372
+ Label em uppercase `--ls-widest`. Valor em display font. Sub-texto pequeno, com cor neutra.
373
+
374
+ ### Formulário (campo + label + erro)
375
+
376
+ Use o primitivo `.input` com HTML semântico. Label acima do input, help text abaixo. Sem classes inventadas — o sistema é minimalista, você compõe com flex/grid e tokens:
377
+
378
+ ```html
379
+ <label style="display:flex; flex-direction:column; gap:6px; max-width:360px;">
380
+ <span style="font-size:var(--fs-sm); font-weight:500; color:var(--ink-700);">Email</span>
381
+ <span class="input input-md">
382
+ <input type="email" placeholder="voce@exemplo.com"/>
383
+ </span>
384
+ <span style="font-size:var(--fs-xs); color:var(--ink-400);">Usaremos pra notificações importantes.</span>
385
+ </label>
386
+
387
+ <label style="display:flex; flex-direction:column; gap:6px; max-width:360px; margin-top:16px;">
388
+ <span style="font-size:var(--fs-sm); font-weight:500; color:var(--ink-700);">Senha</span>
389
+ <span class="input input-md invalid">
390
+ <input type="password"/>
391
+ </span>
392
+ <span style="font-size:var(--fs-xs); color:var(--danger-700);">Mínimo 8 caracteres.</span>
393
+ </label>
394
+ ```
395
+
396
+ Erro = `.input` com classe `.invalid` (borda vermelha) + help em `var(--danger-700)`. Help text curto, direto, sem travessão.
397
+
398
+ ### Status (TagDot) — quando há fluxo
399
+
400
+ ```html
401
+ <span class="tag-dot s-todo">A FAZER</span>
402
+ <span class="tag-dot s-progress">EM ANDAMENTO</span>
403
+ <span class="tag-dot s-review">EM REVISÃO</span>
404
+ <span class="tag-dot s-done">CONCLUÍDO</span>
405
+ <span class="tag-dot s-canceled">CANCELADO</span>
406
+ ```
407
+
408
+ Use `tag-dot` (raio 4px) **NUNCA** `border-radius: 999px`. Texto sempre uppercase, weight 600.
409
+
410
+ ### Empty state (quando lista vazia)
411
+
412
+ ```html
413
+ <div class="empty-state">
414
+ <div class="ico">📭</div>
415
+ <div class="text">Nenhum lead ainda.</div>
416
+ <button class="btn btn-primary btn-sm">Adicionar primeiro lead</button>
417
+ </div>
418
+ ```
419
+
420
+ Sem ilustração 3D, sem gradiente. Ícone simples + CTA único.
421
+
422
+ ### Alerta crítico (ação imediata)
423
+
424
+ ```html
425
+ <div class="alert-critical">
426
+ <div class="alert-critical-head">⚠ Atenção necessária</div>
427
+ <div class="alert-critical-list">
428
+ <div class="alert-critical-row">
429
+ <span>3 leads sem follow-up há mais de 7 dias.</span>
430
+ <span class="src">crm/pipeline</span>
431
+ </div>
432
+ <div class="alert-critical-row">
433
+ <span>Limite de envios próximo do teto mensal.</span>
434
+ <span class="src">billing</span>
435
+ </div>
436
+ </div>
437
+ <div class="alert-critical-foot">2 itens · revisar agora</div>
438
+ </div>
439
+ ```
440
+
441
+ Único componente onde vermelho é background dominante. Use SÓ pra coisa que precisa ação humana imediata.
442
+
443
+ ### Toast (feedback rápido)
444
+
445
+ ```html
446
+ <div class="toast toast-success">Salvo.</div>
447
+ <div class="toast toast-danger">Falhou ao salvar.</div>
448
+ ```
449
+
450
+ Texto curto. **Uma frase.** Sem "Operação realizada com êxito! 🎉" — direto.
451
+
452
+ ---
453
+
454
+ ## Regras de copy (texto da UI)
455
+
456
+ Quando a IA gera **labels de botão, mensagens, placeholders, títulos**:
457
+
458
+ | Faça | Não faça |
459
+ |------|----------|
460
+ | "Salvar" | "Salvar alterações no sistema agora" |
461
+ | "Email inválido." | "O endereço de email fornecido não atende — é inválido." |
462
+ | "Adicionar lead" | "✨ Crie seu próximo lead com nossa IA! 🚀" |
463
+ | "Limite atingido." | "Você atingiu o limite — entre em contato com nosso time" |
464
+ | "8 concluídas hoje" | "Olha só — você concluiu 8 tarefas hoje, parabéns!" |
465
+
466
+ **Princípios:**
467
+ 1. Sem travessão (—) nem en-dash (–). Use vírgula, ponto ou dois-pontos.
468
+ 2. Sem emoji em label de botão / título de campo. Emoji só em empty state, toast informativo, ou banner.
469
+ 3. Frases ≤ 12 palavras em UI. Se passou, quebra ou corta.
470
+ 4. Voz ativa. Sujeito + verbo + complemento. "Você concluiu 8" não "Foram concluídas 8 por você".
471
+ 5. Sem "experimente", "descubra", "transforme", "potencialize" — vocabulário de landing page de IA, não app real.
472
+
473
+ ---
474
+
475
+ ## Data viz (gráficos, KPIs, tabelas)
476
+
477
+ > Regras derivadas de método validado. Se você é IA gerando dashboard, siga na ordem abaixo. Cor vem por último.
478
+
479
+ ### 1. Decida a forma ANTES de escolher cor
480
+
481
+ | Os dados são… | Use | NÃO use |
482
+ |---|---|---|
483
+ | Um número atual (+ trend) | `.stat` (StatCard: value + delta + sparkline) | Um bar chart de 1 barra |
484
+ | 3 a 6 KPIs em fila | KPI row de `.stat` | Grouped bar |
485
+ | A one number que o dashboard lidera | Hero figure (≥48px, mesma fonte do resto) | — |
486
+ | Uma razão contra limite | Meter (barra com progresso, mesma cor) | Pie de 2 fatias |
487
+ | Mais de ~7 categorias com significado | Tabela (ou tabela + chart) | Mais cores |
488
+
489
+ Se um chart *é* certo, escolha por trabalho:
490
+
491
+ | Trabalho | Forma default | Cor |
492
+ |---|---|---|
493
+ | Comparar magnitude (low→high) | bar / column (heatmap pra grid) | sequential (1 hue) |
494
+ | Trend ao longo do tempo | line (area pra 1 série) | sequential ou 1 categorical |
495
+ | Distinguir séries distintas | grouped/stacked bar, multi-line | **categorical** |
496
+ | Uma série é o ponto, resto é contexto | **emphasis** (1 destacada, resto cinza) | 1 hue + cinza |
497
+ | Acima/abaixo de baseline; delta a target | diverging bar, line vs baseline | diverging |
498
+ | Part-to-whole | stacked bar (horizontal se muitas categorias) | categorical |
499
+
500
+ ### 2. Aplique as regras não-negociáveis
501
+
502
+ - **Uma escala Y só.** Nunca dual-axis (dois eixos Y na mesma view). Duas medidas de escalas diferentes = 2 charts, small multiples, ou index 100 na origem.
503
+ - **Cor segue a entidade, não o rank.** Filtrar remove série; sobrevivente mantém sua cor. Nunca recolor-on-filter.
504
+ - **8 slots categóricos, ordenados por CVD-safety.** O 9º nunca é gerado; vira "Outros" ou small multiples.
505
+ - **Sequential = 1 hue, mais-é-escuro.** Nunca rainbow. Nunca ramp em categoria nominal.
506
+ - **Diverging = 2 hues opostos + neutro cinza no meio.** blue↔red, blue↔orange (nunca blue↔aqua: ambos frios).
507
+ - **Status colors são reservados.** Sucess/warning/critical nunca viram "série 4". Sempre ícone + label, cor nunca sozinha.
508
+
509
+ ### 3. Paleta ZARK de data viz (tokens novos)
510
+
511
+ Categorical — os 8 slots, na ordem obrigatória. Slot 1 é o default pra 1 série; nunca cicla:
512
+
513
+ | Slot | Hue | Light (`--paper`) | Dark (`--bg-void`) |
514
+ |---|---|---|---|
515
+ | 1 | blue | `#2a78d6` | `#3987e5` |
516
+ | 2 | aqua | `#1baf7a` | `#199e70` |
517
+ | 3 | yellow | `#eda100` | `#c98500` |
518
+ | 4 | green | `#008300` | `#008300` |
519
+ | 5 | violet | `#4a3aa7` | `#9085e9` |
520
+ | 6 | red | `#e34948` | `#e66767` |
521
+ | 7 | magenta | `#e87ba4` | `#d55181` |
522
+ | 8 | orange (viz) | `#eb6834` | `#d95926` |
523
+
524
+ Tokens: `--viz-cat-1` até `--viz-cat-8` (definidos em `tokens.css`).
525
+
526
+ > **Importante.** O laranja do slot 8 (`--viz-cat-8`) NÃO é o brand ember `--brand-500` (#f56f10). São cores diferentes. A ember é *reservada* pra CTA/focus/link e **nunca é cor de série**. Se você renderiza um chart com uma série ember, você confunde a marca.
527
+
528
+ Sequential (blue, light→dark) — pra magnitude contínua (heatmap, choropleth, ordinal ramp):
529
+
530
+ | Step | Hex | Uso |
531
+ |---|---|---|
532
+ | 100 | `#cde2fb` | valor perto de zero (recessivo) |
533
+ | 200 | `#9ec5f4` | |
534
+ | 300 | `#6da7ec` | |
535
+ | 400 | `#3987e5` | |
536
+ | 500 | `#256abf` | valor médio |
537
+ | 600 | `#184f95` | |
538
+ | 700 | `#0d366b` | valor alto |
539
+
540
+ Tokens: `--viz-seq-100` … `--viz-seq-700`.
541
+
542
+ Diverging: usa slots `--viz-cat-1` (blue = positivo) ↔ `--viz-cat-6` (red = negativo) + `--line-100` (neutro do próprio ZARK) no meio.
543
+
544
+ Status: reusa os tokens semânticos ZARK (`--success-500`, `--warning-500`, `--danger-500`, `--info-500`). **Sempre com ícone + label.** Nunca cor sozinha.
545
+
546
+ ### 4. Marcas (specs de renderização)
547
+
548
+ - **Traços finos.** Line 2px, marker ≥8px, bar-end com raio 4px arredondado só no topo (ancorado à baseline).
549
+ - **2px de gap surface entre fills.** Stacked bar segments E adjacent bars. Nunca border escuro pra separar.
550
+ - **Grid/eixos = hairlines sólidos.** 1px, cor `--line-200` (light) / `--line-300` (dark). Nunca tracejado (parece "projeção").
551
+ - **Labels seletivos.** Direct label o endpoint / o extremo / a série que importa. **Legenda sempre presente pra ≥ 2 séries** (nenhuma pra 1 — o título nomeia a série). Nunca número em todo ponto.
552
+ - **Texto usa tokens de ink**, nunca a cor da série. Valor/label/legenda ficam em `--ink-700` / `--ink-500` / `--ink-400`. A cor identifica; o texto não repete.
553
+ - **Sem dual-axis.** (Anti-pattern #1.)
554
+ - **Sem `overflow: hidden` cortando label dentro de bar.** Se label não cabe, joga fora do bar ou pra tooltip.
555
+
556
+ ### 5. Interação padrão
557
+
558
+ - Line/area → **crosshair + tooltip** ao passar o mouse.
559
+ - Bar/dot/cell → tooltip per-mark.
560
+ - Hit area ≥ 24px (não o tamanho visual do mark).
561
+ - Filters ficam em UMA linha acima de TODOS os charts. Nunca dentro do card do chart.
562
+ - Skeleton flash em refetch: NÃO. Mantém o render anterior a 60% opacity até o novo chegar.
563
+
564
+ ### 6. Anti-patterns (checar TODO chart contra)
565
+
566
+ - ❌ **Dual-axis** (2 escalas Y). Corrige com 2 charts ou index 100.
567
+ - ❌ **Recolor-on-filter.** Cor segue entidade.
568
+ - ❌ **9ª cor gerada.** Vira "Outros".
569
+ - ❌ **Ramp de valor em categoria nominal.** 1 série = 1 cor (slot 1).
570
+ - ❌ **Rainbow sequential.** 1 hue, light→dark.
571
+ - ❌ **Hue no meio do diverging** ou 2 hues frios como polos.
572
+ - ❌ **Status color como série 4** ou série color como status.
573
+ - ❌ **1-bar bar chart** ou **2-slice pie**. Use stat tile.
574
+ - ❌ **Donut/pie pra comparar valores próximos.** Use bar.
575
+ - ❌ **Grid pesado, bar grosso, sem breathing room.** Reads loud.
576
+ - ❌ **Tracejado** em grid ou axis. Solid hairline.
577
+ - ❌ **Número em cada ponto.** Direct label seletivo + tooltip.
578
+ - ❌ **Display font ou serif no hero figure.** Usa a mesma sans do sistema.
579
+ - ❌ **`tabular-nums` em número grande.** Só em coluna de tabela e ticks de eixo.
580
+ - ❌ **Texture on by default.** Só opt-in (a11y, print, forced-colors), 45°/135° apenas.
581
+ - ❌ **Tooltip como único jeito de ler valor.** Tem que ter label OU tabela.
582
+
583
+ ### 7. Bibliotecas recomendadas
584
+
585
+ Sem preferência dogmática — a IA escolhe conforme stack:
586
+
587
+ - **React (recomendado):** `recharts` (leve, declarativo, defaults sanos) ou `visx` (mais controle, low-level).
588
+ - **HTML/vanilla:** `chart.js` (aceitável se cuidar da config) ou D3 direto pra controle total.
589
+ - **Se stack é Blade/Django/Rails:** renderize server-side um SVG, ou use `chart.js` via CDN.
590
+ - **Nunca:** Highcharts (licença), ApexCharts (defaults barulhentos), qualquer lib que renderiza 3D por default.
591
+
592
+ Configuração obrigatória em qualquer lib:
593
+ - Grid: hairline `--line-200`, sem dash.
594
+ - Fonte: mesma do sistema (`var(--font-sans)`).
595
+ - Cores: sempre via CSS custom properties (`--viz-cat-*`), nunca hex hardcoded no config.
596
+ - Sem animação > 400ms na entrada. Sem "bounce" ou "elastic".
597
+
598
+ ---
599
+
600
+ ## Estados que faltavam (loading, skeleton, tooltip, tabela)
601
+
602
+ ### Loading state (skeleton, warm)
603
+
604
+ Skeleton usa cor de fundo `--line-100` com animação sutil (shimmer 1200ms, contida). Sem gradiente colorido.
605
+
606
+ ```html
607
+ <div class="panel">
608
+ <div class="panel-head">
609
+ <div class="panel-title" style="background:var(--line-100); color:transparent; border-radius:var(--r-sm); width:180px;">···</div>
610
+ </div>
611
+ <div class="panel-body">
612
+ <div style="height:12px; background:var(--line-100); border-radius:var(--r-xs); margin-bottom:8px;"></div>
613
+ <div style="height:12px; background:var(--line-100); border-radius:var(--r-xs); width:80%;"></div>
614
+ </div>
615
+ </div>
616
+ ```
617
+
618
+ **Regra:** skeleton só em first-load. Refetch de dados mantém render anterior a `opacity: 0.6`. Nunca "skeleton flash" no meio da sessão.
619
+
620
+ ### Tooltip (hover simples)
621
+
622
+ Sem lib. Sem framework. `title` HTML nativo pra tooltips secos. Pra tooltips ricos (chart, KPI com detalhamento), use um `div` absoluto com estas specs:
623
+
624
+ ```css
625
+ .zk-tooltip {
626
+ position: absolute;
627
+ background: var(--surface);
628
+ border: 1px solid var(--line-300);
629
+ border-radius: var(--r-sm);
630
+ padding: 8px 12px;
631
+ font-size: var(--fs-sm);
632
+ color: var(--ink-700);
633
+ box-shadow: var(--shadow-md);
634
+ pointer-events: none;
635
+ max-width: 280px;
636
+ line-height: 1.4;
637
+ }
638
+ ```
639
+
640
+ **Regra:** tooltip enhance, nunca gate. Toda informação em tooltip tem que estar OU visível OU na tabela.
641
+
642
+ ### Tabela (companion do chart)
643
+
644
+ Todo chart tem uma tabela-view equivalente. Padrão:
645
+
646
+ ```html
647
+ <table class="zk-table">
648
+ <thead>
649
+ <tr>
650
+ <th>Período</th>
651
+ <th class="num">Concluídas</th>
652
+ <th class="num">Meta</th>
653
+ <th class="num">Δ</th>
654
+ </tr>
655
+ </thead>
656
+ <tbody>
657
+ <tr><td>Jun/26</td><td class="num">128</td><td class="num">120</td><td class="num pos">+8</td></tr>
658
+ <tr><td>Jul/26</td><td class="num">142</td><td class="num">130</td><td class="num pos">+12</td></tr>
659
+ </tbody>
660
+ </table>
661
+ ```
662
+
663
+ Specs (adicione ao `components.css` se ainda não tem):
664
+
665
+ - Fonte tabular apenas em coluna numérica (`.num { font-variant-numeric: tabular-nums; text-align: right; }`).
666
+ - Hairline `--line-200` entre linhas (sem zebra, sem grid vertical).
667
+ - Header em `--ink-500`, uppercase, `--fs-xs`, `--ls-widest`.
668
+ - Delta positivo em `--success-700`, negativo em `--danger-700`. Nunca cor sozinha, sempre com sinal (+/-).
669
+ - Densidade: `.zk-table-dense` (linha 32px) vs default (linha 44px).
670
+
671
+ ### Meter (barra de ratio contra limite)
672
+
673
+ Pra "12 de 20 usada", "3.2GB de 5GB". Progresso é sempre **1 hue**, light track + dark fill:
674
+
675
+ ```html
676
+ <div style="display:flex; flex-direction:column; gap:6px; max-width:320px;">
677
+ <div style="display:flex; justify-content:space-between; font-size:var(--fs-sm);">
678
+ <span>Uso de storage</span>
679
+ <span style="color:var(--ink-500);"><b>3.2 GB</b> de 5 GB</span>
680
+ </div>
681
+ <div style="height:6px; background:var(--line-100); border-radius:var(--r-xs); overflow:hidden;">
682
+ <div style="height:100%; width:64%; background:var(--brand-500); border-radius:var(--r-xs);"></div>
683
+ </div>
684
+ </div>
685
+ ```
686
+
687
+ Cor do fill:
688
+ - Uso normal (< 80%): `--brand-500` ou `--info-500`.
689
+ - Perto do limite (80–95%): `--warning-500`.
690
+ - Estourou / crítico (≥ 95%): `--danger-500`.
691
+
692
+ Cor troca só quando cruza threshold. Nunca gradiente.
693
+
694
+ ### Sparkline (dentro de StatCard)
695
+
696
+ Sparkline é a única exceção onde chart entra dentro de card. Inline SVG, linha 1.5px, sem eixos, sem grid, sem legenda. Só a curva.
697
+
698
+ ```html
699
+ <div class="stat">
700
+ <div class="stat-head">
701
+ <span class="stat-label">CONCLUÍDAS · SEMANA</span>
702
+ </div>
703
+ <div class="stat-value">142</div>
704
+ <div class="stat-sub">+12 vs anterior</div>
705
+ <svg viewBox="0 0 100 30" style="width:100%; height:24px; margin-top:8px;">
706
+ <polyline points="0,25 15,20 30,22 45,15 60,10 75,12 90,6 100,4"
707
+ fill="none" stroke="var(--brand-500)" stroke-width="1.5"
708
+ stroke-linecap="round" stroke-linejoin="round"/>
709
+ </svg>
710
+ </div>
711
+ ```
712
+
713
+ Regra: sparkline usa 1 cor (`--brand-500` OU `--viz-cat-1` se está em contexto de chart section), nunca área preenchida colorida, nunca marcador em cada ponto.
714
+
715
+ ---
716
+
227
717
  ## Dark mode
228
718
 
229
719
  Toggle automático via OS, ou manual:
@@ -239,14 +729,57 @@ A cor de marca (`--brand-500`) **NUNCA muda no dark mode** — é assinatura da
239
729
 
240
730
  ## Regras importantes (NÃO fazer)
241
731
 
242
- - Trocar `--brand-500` por outra cor.
243
- - ❌ Hardcode de hex (`#f56f10` no código). SEMPRE use `var(--brand-500)`.
244
- - ❌ Sombras frias (`rgba(0,0,0,...)`). Use as warm `rgba(20,17,12,...)`.
245
- - ❌ `border-radius: 999px` ou `--r-pill`. Pill foi removido v3.
246
- - ❌ Display font (Space Grotesk) em UI body — só títulos h1/h2/h3, modal titles, brand.
247
- - ❌ Inter em títulos display font é Space Grotesk.
732
+ > Resumo prático. Detalhes no bloco "anti-IA-genérica" no topo deste README.
733
+
734
+ **Cor**
735
+ - ❌ Trocar `--brand-500` no meio do projeto (regenere o DS com nova primária).
736
+ - ❌ Hex hardcoded. SEMPRE `var(--brand-500)` ou token.
737
+ - ❌ Sombras frias `rgba(0,0,0,...)`. Use warm `rgba(20,17,12,...)`.
738
+ - ❌ Brand color como bg dominante.
739
+
740
+ **Geometria**
741
+ - ❌ `border-radius: 999px` / `9999px` / `--r-pill`. Pill banido.
742
+ - ❌ Raio > `var(--r-2xl)` (16px) em qualquer componente.
743
+ - ❌ Borda > 1px em UI normal.
744
+
745
+ **Efeitos (anti-cara-de-IA)**
746
+ - ❌ Glow / halo (`box-shadow: 0 0 Xpx <cor>`, `filter: drop-shadow(0 0 X <cor>)`).
747
+ - ❌ Shine / brilho decorativo (linhas brilhantes, sparkle, "glass reflection").
748
+ - ❌ Gradiente colorido em botão, card, hero, background.
749
+ - ❌ `text-shadow` colorido.
750
+ - ❌ `backdrop-filter: blur()` como decoração (só em modal overlay leve, ≤ 8px).
751
+ - ❌ Sombras frias `rgba(0,0,0,...)`. Use warm `rgba(20,17,12,...)`.
752
+
753
+ **Botão (regra própria)**
754
+ - ❌ Variante inventada (`btn-gradient`, `btn-glow`, `btn-hero`, `btn-3d`). Só as 5 canônicas.
755
+ - ❌ Tamanho fora de xs/sm/md/lg. Sem `xl`, `w-full` inflado, `py-8`.
756
+ - ❌ 2 botões `primary` no mesmo bloco. UM primário.
757
+ - ❌ Emoji ou ícone gigante como CTA principal.
758
+
759
+ **Texto / copy**
760
+ - ❌ Travessão (—) ou en-dash (–) em qualquer texto da UI/copy.
761
+ - ❌ Emoji em label de botão, título de campo, título de página.
762
+ - ❌ Frase > 12 palavras em UI.
763
+ - ❌ Vocabulário de marketing IA: "transforme", "potencialize", "descubra", "experimente".
764
+
765
+ **Data viz**
766
+ - ❌ Dual-axis (duas escalas Y).
767
+ - ❌ Recolor-on-filter. Cor segue entidade.
768
+ - ❌ 9ª cor gerada além dos 8 slots categóricos.
769
+ - ❌ Rainbow em sequential. 1 hue, light→dark.
770
+ - ❌ Status color como série de dado. Reservados.
771
+ - ❌ Brand ember `--brand-500` como cor de série. É acento, não categoria.
772
+ - ❌ Chart 3D, animação bounce, tooltip pesado com sombra colorida.
773
+
774
+ **Tipografia**
775
+ - ❌ {{fonts.display}} em UI body. Só títulos h1/h2/h3, modal titles, brand.
776
+ - ❌ {{fonts.ui}} em h1 grande de página — display font é {{fonts.display}}.
777
+ - ❌ Display/serif no hero figure de chart. Mesma sans do resto.
778
+
779
+ **Motion**
248
780
  - ❌ Animação > 280ms em microinterações.
249
- - ❌ Brand color como bg dominante de tela inteira.
781
+ - ❌ Animação > 400ms em entrada de chart.
782
+ - ❌ Bounce/elastic em UI — só `--ease-spring` em entradas de modal.
250
783
 
251
784
  ---
252
785
 
@@ -66,6 +66,41 @@
66
66
  --code-bg: var(--brand-50);
67
67
  --code-fg: var(--brand-700);
68
68
 
69
+ /* ---------- DATA VIZ (charts, KPIs, dashboards) ----------
70
+ Paleta validada (CVD safe, adjacent ΔE ≥ 12 no light surface).
71
+ 8 slots categoricos ordenados; nunca cicle, nunca gere o 9o.
72
+ O brand ember (--brand-500) NAO eh cor de serie: fica reservada
73
+ pra CTA/focus/link. */
74
+ --viz-cat-1: #2a78d6; /* blue */
75
+ --viz-cat-2: #1baf7a; /* aqua */
76
+ --viz-cat-3: #eda100; /* yellow */
77
+ --viz-cat-4: #008300; /* green */
78
+ --viz-cat-5: #4a3aa7; /* violet */
79
+ --viz-cat-6: #e34948; /* red */
80
+ --viz-cat-7: #e87ba4; /* magenta */
81
+ --viz-cat-8: #eb6834; /* orange (viz-only, distinto do brand) */
82
+
83
+ /* Sequential (blue, light -> dark) — magnitude, heatmap, ordinal */
84
+ --viz-seq-100: #cde2fb;
85
+ --viz-seq-200: #9ec5f4;
86
+ --viz-seq-300: #6da7ec;
87
+ --viz-seq-400: #3987e5;
88
+ --viz-seq-500: #256abf;
89
+ --viz-seq-600: #184f95;
90
+ --viz-seq-700: #0d366b;
91
+
92
+ /* Diverging (blue <-> red, warm/cool poles) + neutro no meio */
93
+ --viz-div-pos: var(--viz-cat-1);
94
+ --viz-div-neg: var(--viz-cat-6);
95
+ --viz-div-mid: var(--line-100);
96
+
97
+ /* Chart chrome */
98
+ --viz-surface: var(--surface);
99
+ --viz-grid: var(--line-200);
100
+ --viz-axis: var(--line-300);
101
+ --viz-ink: var(--ink-700);
102
+ --viz-ink-muted: var(--ink-400);
103
+
69
104
  /* ---------- TYPOGRAPHY ---------- */
70
105
  --font-sans: "{{fonts.ui}}", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
71
106
  --font-mono: "{{fonts.mono}}", "SF Mono", Menlo, Consolas, monospace;
@@ -178,6 +213,18 @@ button { font-family: inherit; }
178
213
 
179
214
  --ring-focus: 0 0 0 3px {{brand.ringDark}};
180
215
  --ring-focus-soft: 0 0 0 3px {{brand.ringSoftDark}};
216
+
217
+ /* DATA VIZ — mesmos 8 hues, steppados pra dark surface */
218
+ --viz-cat-1: #3987e5;
219
+ --viz-cat-2: #199e70;
220
+ --viz-cat-3: #c98500;
221
+ --viz-cat-4: #008300;
222
+ --viz-cat-5: #9085e9;
223
+ --viz-cat-6: #e66767;
224
+ --viz-cat-7: #d55181;
225
+ --viz-cat-8: #d95926;
226
+ /* sequential steps ficam iguais (blue funciona no dark); os steps proximos do surface recuam */
227
+ --viz-div-mid: var(--line-200);
181
228
  }
182
229
 
183
230
  @media (prefers-color-scheme: dark) {
@@ -198,5 +245,11 @@ button { font-family: inherit; }
198
245
 
199
246
  --tag-bg: var(--brand-800); --tag-fg: var(--brand-200);
200
247
  --code-bg: var(--brand-900); --code-fg: var(--brand-300);
248
+
249
+ --viz-cat-1: #3987e5; --viz-cat-2: #199e70;
250
+ --viz-cat-3: #c98500; --viz-cat-4: #008300;
251
+ --viz-cat-5: #9085e9; --viz-cat-6: #e66767;
252
+ --viz-cat-7: #d55181; --viz-cat-8: #d95926;
253
+ --viz-div-mid: var(--line-200);
201
254
  }
202
255
  }