zark-design 3.0.3 → 3.1.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 +111 -36
- package/bin/cli.js +15 -12
- package/package.json +7 -3
- package/templates/README.md.hbs +219 -12
- package/templates/html/showcase.html.hbs +2 -2
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
|
-
>
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
[](https://www.npmjs.com/package/zark-design)
|
|
6
|
+
[](https://www.npmjs.com/package/zark-design)
|
|
7
|
+
[](./LICENSE)
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
#
|
|
11
|
-
npx zark-design init
|
|
12
|
-
|
|
13
|
-
#
|
|
14
|
-
|
|
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
|
-
|
|
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
|
-
|
|
46
|
+
---
|
|
35
47
|
|
|
36
|
-
##
|
|
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
|
-
|
|
40
|
-
|
|
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
|
-
|
|
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
|
|
75
|
+
npx zark-design@latest presets
|
|
47
76
|
```
|
|
48
77
|
|
|
49
|
-
|
|
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
|
-
|
|
127
|
+
## Tags
|
|
52
128
|
|
|
53
|
-
|
|
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
|
-
|
|
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('
|
|
206
|
-
console.log(` ${c.green('
|
|
207
|
-
console.log(` ${c.bold('Uso
|
|
208
|
-
console.log(` npx zark-design init
|
|
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('
|
|
212
|
-
console.log(`
|
|
213
|
-
console.log(`
|
|
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
|
|
305
|
-
if (
|
|
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: #
|
|
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\
|
|
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
|
-
"description": "Design system scaffolder
|
|
3
|
+
"version": "3.1.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. 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,11 @@
|
|
|
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"
|
|
24
28
|
],
|
|
25
29
|
"author": "Maycon Jordan",
|
|
26
30
|
"license": "MIT",
|
package/templates/README.md.hbs
CHANGED
|
@@ -6,6 +6,39 @@ 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 glassmorphism, gradiente colorido, neon, blur exagerado.** Sombra é warm (`rgba(20, 17, 12, ...)`), nunca azul-fria.
|
|
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
|
+
|
|
21
|
+
### Copy / texto gerado
|
|
22
|
+
- ❌ **NUNCA use travessão (—) ou en-dash (–) em texto da UI ou copy gerada.** É a assinatura mais óbvia de texto de IA. Use:
|
|
23
|
+
- **vírgula** quando a pausa for curta
|
|
24
|
+
- **dois-pontos** quando o que vem depois explica o anterior
|
|
25
|
+
- **ponto final** quando o pensamento acabou
|
|
26
|
+
- **parênteses** ou nova linha pra aposto/extensão
|
|
27
|
+
- ❌ Nada de "Não apenas X, mas também Y" / "It's not just A — it's B".
|
|
28
|
+
- ❌ Nada de bullet com travessão na frente. Use traço simples `-` ou ponto `•`.
|
|
29
|
+
- ❌ Frases longas com 3 vírgulas + travessão + "ou seja". Texto direto: sujeito, verbo, complemento.
|
|
30
|
+
- ✅ Exemplo ruim: "Esta plataforma oferece — além da automação — recursos avançados de análise, que permitem decisões mais estratégicas."
|
|
31
|
+
- ✅ Exemplo bom: "Plataforma com automação e análise. Decisões mais rápidas."
|
|
32
|
+
|
|
33
|
+
### Layout
|
|
34
|
+
- Hairlines de 1px em `var(--line-200)`. Nunca borders grossos (2px+) em componentes de UI.
|
|
35
|
+
- Espaçamento múltiplo de 4px (use os tokens `--sp-*`).
|
|
36
|
+
- Animação ≤ 280ms. Microinterações ≤ 180ms. Nada de `bounce` exagerado.
|
|
37
|
+
|
|
38
|
+
> 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**.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
9
42
|
## Estrutura
|
|
10
43
|
|
|
11
44
|
```
|
|
@@ -63,13 +96,14 @@ design-system-apps/
|
|
|
63
96
|
|
|
64
97
|
## Filosofia
|
|
65
98
|
|
|
66
|
-
**Warm, neutral,
|
|
67
|
-
- `--paper` (#fafaf8) cremoso, NÃO branco puro.
|
|
68
|
-
- `--brand-500` (
|
|
99
|
+
**Warm, neutral, brand-on-paper.**
|
|
100
|
+
- `--paper` (#fafaf8) cremoso, NÃO branco puro. Fundo dominante é sempre neutro warm.
|
|
101
|
+
- `--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.
|
|
102
|
+
- Cor de marca usada com **moderação**: CTA primário, focus ring, link, ícone-acento. Nunca background dominante.
|
|
69
103
|
- Hairlines de 1px em `--line-200`. Nunca borders grossos.
|
|
70
104
|
- Sombras warm (`rgba(20,17,12,...)`), nunca azuis-frias.
|
|
71
|
-
- Tipografia editorial: **
|
|
72
|
-
- **Sem pill.** Tags, chips, toggles, badges usam raio sm/md (4-6px). Avatares usam 50% (
|
|
105
|
+
- Tipografia editorial: **{{fonts.ui}}** pra UI e números · **{{fonts.mono}}** pra código e labels · **{{fonts.display}}** pra títulos.
|
|
106
|
+
- **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
107
|
|
|
74
108
|
---
|
|
75
109
|
|
|
@@ -224,6 +258,161 @@ function Dashboard() {
|
|
|
224
258
|
|
|
225
259
|
---
|
|
226
260
|
|
|
261
|
+
## Receitas prontas (copy-paste, HTML)
|
|
262
|
+
|
|
263
|
+
> Padrões testados em produção. Comece daqui em vez de inventar do zero.
|
|
264
|
+
|
|
265
|
+
### Botão primário + secundário (ação padrão)
|
|
266
|
+
|
|
267
|
+
```html
|
|
268
|
+
<div style="display:flex; gap:8px;">
|
|
269
|
+
<button class="btn btn-primary btn-md">Salvar</button>
|
|
270
|
+
<button class="btn btn-secondary btn-md">Cancelar</button>
|
|
271
|
+
</div>
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Regra: **um** primário por bloco/modal. Outros viram secondary, soft ou ghost.
|
|
275
|
+
|
|
276
|
+
### Botão de perigo (ação destrutiva)
|
|
277
|
+
|
|
278
|
+
```html
|
|
279
|
+
<button class="btn btn-danger btn-md">Excluir conta</button>
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
Não é vermelho dominante; é texto vermelho em fundo branco com hover suave (`--danger-50`). Vermelho cheio só em `.alert-critical` (banner de erro imediato).
|
|
283
|
+
|
|
284
|
+
### Card básico (panel)
|
|
285
|
+
|
|
286
|
+
```html
|
|
287
|
+
<div class="panel">
|
|
288
|
+
<div class="panel-head">
|
|
289
|
+
<div class="panel-title">Resumo do mês</div>
|
|
290
|
+
<div class="panel-kicker">Atualizado agora</div>
|
|
291
|
+
</div>
|
|
292
|
+
<div class="panel-body">
|
|
293
|
+
Conteúdo do card. Texto direto, sem travessão.
|
|
294
|
+
</div>
|
|
295
|
+
</div>
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
Raio `var(--r-lg)` (8px). Hairline 1px em `--line-200`. Sombra `--shadow-sm`. Sem gradiente, sem glassmorphism.
|
|
299
|
+
|
|
300
|
+
### Card KPI (StatCard)
|
|
301
|
+
|
|
302
|
+
```html
|
|
303
|
+
<div class="stat">
|
|
304
|
+
<div class="stat-head">
|
|
305
|
+
<span class="stat-label">CONCLUÍDAS · SEMANA</span>
|
|
306
|
+
<span class="stat-icon green">✓</span>
|
|
307
|
+
</div>
|
|
308
|
+
<div class="stat-value">8</div>
|
|
309
|
+
<div class="stat-sub">+18% vs anterior</div>
|
|
310
|
+
</div>
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
Label em uppercase `--ls-widest`. Valor em display font. Sub-texto pequeno, com cor neutra.
|
|
314
|
+
|
|
315
|
+
### Formulário (campo + label + erro)
|
|
316
|
+
|
|
317
|
+
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:
|
|
318
|
+
|
|
319
|
+
```html
|
|
320
|
+
<label style="display:flex; flex-direction:column; gap:6px; max-width:360px;">
|
|
321
|
+
<span style="font-size:var(--fs-sm); font-weight:500; color:var(--ink-700);">Email</span>
|
|
322
|
+
<span class="input input-md">
|
|
323
|
+
<input type="email" placeholder="voce@exemplo.com"/>
|
|
324
|
+
</span>
|
|
325
|
+
<span style="font-size:var(--fs-xs); color:var(--ink-400);">Usaremos pra notificações importantes.</span>
|
|
326
|
+
</label>
|
|
327
|
+
|
|
328
|
+
<label style="display:flex; flex-direction:column; gap:6px; max-width:360px; margin-top:16px;">
|
|
329
|
+
<span style="font-size:var(--fs-sm); font-weight:500; color:var(--ink-700);">Senha</span>
|
|
330
|
+
<span class="input input-md invalid">
|
|
331
|
+
<input type="password"/>
|
|
332
|
+
</span>
|
|
333
|
+
<span style="font-size:var(--fs-xs); color:var(--danger-700);">Mínimo 8 caracteres.</span>
|
|
334
|
+
</label>
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
Erro = `.input` com classe `.invalid` (borda vermelha) + help em `var(--danger-700)`. Help text curto, direto, sem travessão.
|
|
338
|
+
|
|
339
|
+
### Status (TagDot) — quando há fluxo
|
|
340
|
+
|
|
341
|
+
```html
|
|
342
|
+
<span class="tag-dot s-todo">A FAZER</span>
|
|
343
|
+
<span class="tag-dot s-progress">EM ANDAMENTO</span>
|
|
344
|
+
<span class="tag-dot s-review">EM REVISÃO</span>
|
|
345
|
+
<span class="tag-dot s-done">CONCLUÍDO</span>
|
|
346
|
+
<span class="tag-dot s-canceled">CANCELADO</span>
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
Use `tag-dot` (raio 4px) **NUNCA** `border-radius: 999px`. Texto sempre uppercase, weight 600.
|
|
350
|
+
|
|
351
|
+
### Empty state (quando lista vazia)
|
|
352
|
+
|
|
353
|
+
```html
|
|
354
|
+
<div class="empty-state">
|
|
355
|
+
<div class="ico">📭</div>
|
|
356
|
+
<div class="text">Nenhum lead ainda.</div>
|
|
357
|
+
<button class="btn btn-primary btn-sm">Adicionar primeiro lead</button>
|
|
358
|
+
</div>
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
Sem ilustração 3D, sem gradiente. Ícone simples + CTA único.
|
|
362
|
+
|
|
363
|
+
### Alerta crítico (ação imediata)
|
|
364
|
+
|
|
365
|
+
```html
|
|
366
|
+
<div class="alert-critical">
|
|
367
|
+
<div class="alert-critical-head">⚠ Atenção necessária</div>
|
|
368
|
+
<div class="alert-critical-list">
|
|
369
|
+
<div class="alert-critical-row">
|
|
370
|
+
<span>3 leads sem follow-up há mais de 7 dias.</span>
|
|
371
|
+
<span class="src">crm/pipeline</span>
|
|
372
|
+
</div>
|
|
373
|
+
<div class="alert-critical-row">
|
|
374
|
+
<span>Limite de envios próximo do teto mensal.</span>
|
|
375
|
+
<span class="src">billing</span>
|
|
376
|
+
</div>
|
|
377
|
+
</div>
|
|
378
|
+
<div class="alert-critical-foot">2 itens · revisar agora</div>
|
|
379
|
+
</div>
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
Único componente onde vermelho é background dominante. Use SÓ pra coisa que precisa ação humana imediata.
|
|
383
|
+
|
|
384
|
+
### Toast (feedback rápido)
|
|
385
|
+
|
|
386
|
+
```html
|
|
387
|
+
<div class="toast toast-success">Salvo.</div>
|
|
388
|
+
<div class="toast toast-danger">Falhou ao salvar.</div>
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
Texto curto. **Uma frase.** Sem "Operação realizada com êxito! 🎉" — direto.
|
|
392
|
+
|
|
393
|
+
---
|
|
394
|
+
|
|
395
|
+
## Regras de copy (texto da UI)
|
|
396
|
+
|
|
397
|
+
Quando a IA gera **labels de botão, mensagens, placeholders, títulos**:
|
|
398
|
+
|
|
399
|
+
| Faça | Não faça |
|
|
400
|
+
|------|----------|
|
|
401
|
+
| "Salvar" | "Salvar alterações no sistema agora" |
|
|
402
|
+
| "Email inválido." | "O endereço de email fornecido não atende — é inválido." |
|
|
403
|
+
| "Adicionar lead" | "✨ Crie seu próximo lead com nossa IA! 🚀" |
|
|
404
|
+
| "Limite atingido." | "Você atingiu o limite — entre em contato com nosso time" |
|
|
405
|
+
| "8 concluídas hoje" | "Olha só — você concluiu 8 tarefas hoje, parabéns!" |
|
|
406
|
+
|
|
407
|
+
**Princípios:**
|
|
408
|
+
1. Sem travessão (—) nem en-dash (–). Use vírgula, ponto ou dois-pontos.
|
|
409
|
+
2. Sem emoji em label de botão / título de campo. Emoji só em empty state, toast informativo, ou banner.
|
|
410
|
+
3. Frases ≤ 12 palavras em UI. Se passou, quebra ou corta.
|
|
411
|
+
4. Voz ativa. Sujeito + verbo + complemento. "Você concluiu 8" não "Foram concluídas 8 por você".
|
|
412
|
+
5. Sem "experimente", "descubra", "transforme", "potencialize" — vocabulário de landing page de IA, não app real.
|
|
413
|
+
|
|
414
|
+
---
|
|
415
|
+
|
|
227
416
|
## Dark mode
|
|
228
417
|
|
|
229
418
|
Toggle automático via OS, ou manual:
|
|
@@ -239,14 +428,32 @@ A cor de marca (`--brand-500`) **NUNCA muda no dark mode** — é assinatura da
|
|
|
239
428
|
|
|
240
429
|
## Regras importantes (NÃO fazer)
|
|
241
430
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
- ❌
|
|
246
|
-
- ❌
|
|
247
|
-
- ❌
|
|
431
|
+
> Resumo prático. Detalhes no bloco "anti-IA-genérica" no topo deste README.
|
|
432
|
+
|
|
433
|
+
**Cor**
|
|
434
|
+
- ❌ Trocar `--brand-500` no meio do projeto (regenere o DS com nova primária).
|
|
435
|
+
- ❌ Hex hardcoded. SEMPRE `var(--brand-500)` ou token.
|
|
436
|
+
- ❌ Sombras frias `rgba(0,0,0,...)`. Use warm `rgba(20,17,12,...)`.
|
|
437
|
+
- ❌ Brand color como bg dominante.
|
|
438
|
+
|
|
439
|
+
**Geometria**
|
|
440
|
+
- ❌ `border-radius: 999px` / `9999px` / `--r-pill`. Pill banido.
|
|
441
|
+
- ❌ Raio > `var(--r-2xl)` (16px) em qualquer componente.
|
|
442
|
+
- ❌ Borda > 1px em UI normal.
|
|
443
|
+
|
|
444
|
+
**Texto / copy**
|
|
445
|
+
- ❌ Travessão (—) ou en-dash (–) em qualquer texto da UI/copy.
|
|
446
|
+
- ❌ Emoji em label de botão, título de campo, título de página.
|
|
447
|
+
- ❌ Frase > 12 palavras em UI.
|
|
448
|
+
- ❌ Vocabulário de marketing IA: "transforme", "potencialize", "descubra", "experimente".
|
|
449
|
+
|
|
450
|
+
**Tipografia**
|
|
451
|
+
- ❌ {{fonts.display}} em UI body. Só títulos h1/h2/h3, modal titles, brand.
|
|
452
|
+
- ❌ {{fonts.ui}} em h1 grande de página — display font é {{fonts.display}}.
|
|
453
|
+
|
|
454
|
+
**Motion**
|
|
248
455
|
- ❌ Animação > 280ms em microinterações.
|
|
249
|
-
- ❌
|
|
456
|
+
- ❌ Bounce/elastic em UI — só `--ease-spring` em entradas de modal.
|
|
250
457
|
|
|
251
458
|
---
|
|
252
459
|
|
|
@@ -1824,7 +1824,7 @@ main { background: var(--paper); }
|
|
|
1824
1824
|
<div class="row">
|
|
1825
1825
|
<div style="display:flex; align-items:center; gap:8px">
|
|
1826
1826
|
<span class="avatar" style="width:22px; height:22px; font-size:10px">M</span>
|
|
1827
|
-
<span style="font-size:var(--fs-sm); color:var(--ink-500); font-family:var(--font-mono)">
|
|
1827
|
+
<span style="font-size:var(--fs-sm); color:var(--ink-500); font-family:var(--font-mono)">user@exemplo.com</span>
|
|
1828
1828
|
</div>
|
|
1829
1829
|
</div>
|
|
1830
1830
|
</div>
|
|
@@ -1932,7 +1932,7 @@ main { background: var(--paper); }
|
|
|
1932
1932
|
|
|
1933
1933
|
<div style="display:flex; align-items:center; gap:8px; padding:8px 10px">
|
|
1934
1934
|
<span class="avatar avatar-sq" style="width:22px; height:22px; font-size:10px">M</span>
|
|
1935
|
-
<span style="font-size:var(--fs-xs); color:var(--ink-500); font-family:var(--font-mono); overflow:hidden; text-overflow:ellipsis; white-space:nowrap">
|
|
1935
|
+
<span style="font-size:var(--fs-xs); color:var(--ink-500); font-family:var(--font-mono); overflow:hidden; text-overflow:ellipsis; white-space:nowrap">contato@exemplo.com</span>
|
|
1936
1936
|
</div>
|
|
1937
1937
|
</div>
|
|
1938
1938
|
|