zark-design 1.0.0 → 3.0.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.
Files changed (66) hide show
  1. package/bin/cli.js +364 -90
  2. package/package.json +2 -2
  3. package/templates/README.md.hbs +264 -0
  4. package/templates/_shared/ASSETS-README.md.hbs +39 -0
  5. package/templates/_shared/tokens.css.hbs +202 -0
  6. package/templates/_shared/tokens.js.hbs +34 -0
  7. package/templates/html/components.css +740 -0
  8. package/templates/html/index.html +135 -0
  9. package/templates/html/showcase.html +3550 -0
  10. package/templates/jsx/App.example.jsx +229 -0
  11. package/templates/jsx/components/AlertCritical.jsx +43 -0
  12. package/templates/jsx/components/Avatar.jsx +41 -0
  13. package/templates/jsx/components/Badge.jsx +12 -0
  14. package/templates/jsx/components/Banner.jsx +42 -0
  15. package/templates/jsx/components/Button.jsx +43 -0
  16. package/templates/jsx/components/Chip.jsx +28 -0
  17. package/templates/jsx/components/CodeBlock.jsx +42 -0
  18. package/templates/jsx/components/EmptyState.jsx +27 -0
  19. package/templates/jsx/components/Funnel.jsx +55 -0
  20. package/templates/jsx/components/Input.jsx +53 -0
  21. package/templates/jsx/components/KanbanColumn.jsx +51 -0
  22. package/templates/jsx/components/Kbd.jsx +11 -0
  23. package/templates/jsx/components/LeadCard.jsx +79 -0
  24. package/templates/jsx/components/Modal.jsx +57 -0
  25. package/templates/jsx/components/Panel.jsx +25 -0
  26. package/templates/jsx/components/Section.jsx +28 -0
  27. package/templates/jsx/components/Segmented.jsx +26 -0
  28. package/templates/jsx/components/Sidebar.jsx +49 -0
  29. package/templates/jsx/components/Spec.jsx +19 -0
  30. package/templates/jsx/components/StatCard.jsx +44 -0
  31. package/templates/jsx/components/TableActions.jsx +34 -0
  32. package/templates/jsx/components/Tag.jsx +21 -0
  33. package/templates/jsx/components/TagDot.jsx +26 -0
  34. package/templates/jsx/components/Toast.jsx +25 -0
  35. package/templates/jsx/components/Toggle.jsx +29 -0
  36. package/templates/jsx/components.css +740 -0
  37. package/templates/{icons.jsx → jsx/icons.jsx} +20 -9
  38. package/templates/jsx/index.js +31 -0
  39. package/templates/presets/zark/preset.json +26 -0
  40. package/templates/REFERENCE.md +0 -376
  41. package/templates/SHOWCASE.html +0 -254
  42. package/templates/brand.jsx +0 -89
  43. package/templates/components.jsx +0 -385
  44. package/templates/design-canvas.jsx +0 -789
  45. package/templates/foundations.jsx +0 -363
  46. package/templates/layouts.jsx +0 -232
  47. package/templates/patterns.jsx +0 -268
  48. package/templates/primitives.jsx +0 -306
  49. package/templates/tokens.css +0 -306
  50. package/templates/visual-references/icon-zark.png +0 -0
  51. package/templates/visual-references/logo-zark-principal.png +0 -0
  52. package/templates/visual-references/pasted-1777605750385-0.png +0 -0
  53. package/templates/visual-references/pasted-1777605766298-0.png +0 -0
  54. package/templates/visual-references/pasted-1777605775820-0.png +0 -0
  55. package/templates/visual-references/pasted-1777605789833-0.png +0 -0
  56. package/templates/visual-references/pasted-1777605802420-0.png +0 -0
  57. package/templates/visual-references/pasted-1777605812470-0.png +0 -0
  58. package/templates/visual-references/pasted-1777605817688-0.png +0 -0
  59. package/templates/visual-references/pasted-1777605828485-0.png +0 -0
  60. package/templates/visual-references/pasted-1777605837137-0.png +0 -0
  61. package/templates/visual-references/pasted-1777605849789-0.png +0 -0
  62. package/templates/visual-references/pasted-1777605864942-0.png +0 -0
  63. package/templates/visual-references/pasted-1777605877920-0.png +0 -0
  64. package/templates/visual-references/pasted-1777605897353-0.png +0 -0
  65. /package/templates/{assets/zark-logo.png → presets/zark/assets/logo-zark-laranja.png} +0 -0
  66. /package/templates/{assets → presets/zark/assets}/zark-icon.png +0 -0
@@ -0,0 +1,264 @@
1
+ # {{name}} Design System — Apps
2
+
3
+ {{nameDesc}}. Disponível em **HTML puro** e **React (JSX)**, ambos consumindo as mesmas folhas de estilo (`tokens.css` + `components.css`).
4
+
5
+ Versão: **v3 · {{date}}** · gerado por `npx zark-design init{{#if preset}} --preset {{preset}}{{/if}}` · App Patterns derivados do CRM real.
6
+
7
+ ---
8
+
9
+ ## Estrutura
10
+
11
+ ```
12
+ design-system-apps/
13
+ ├── README.md ← você está aqui
14
+
15
+ ├── html/ ← versão HTML pura
16
+ │ ├── tokens.css ← variáveis CSS (cores, tipografia, espaçamento)
17
+ │ ├── components.css ← classes de componente (.btn, .tag-dot, .stat...)
18
+ │ ├── index.html ← exemplo mínimo de uso
19
+ │ ├── showcase.html ← galeria completa interativa
20
+ │ └── assets/
21
+ │ ├── logo-zark-laranja.png
22
+ │ └── zark-icon.png
23
+
24
+ └── jsx/ ← versão React
25
+ ├── tokens.css ← (idêntico ao html/tokens.css)
26
+ ├── components.css ← (idêntico ao html/components.css)
27
+ ├── tokens.js ← tokens em JS para inline styles / charts
28
+ ├── icons.jsx ← 35 ícones outline
29
+ ├── index.js ← barrel export
30
+ ├── App.example.jsx ← exemplo completo de uso
31
+ ├── components/
32
+ │ ├── Button.jsx
33
+ │ ├── Input.jsx ← + UrlInputFull
34
+ │ ├── Tag.jsx
35
+ │ ├── TagDot.jsx ← status, priority, space
36
+ │ ├── Badge.jsx
37
+ │ ├── Toggle.jsx
38
+ │ ├── Segmented.jsx
39
+ │ ├── Chip.jsx ← filter chips
40
+ │ ├── StatCard.jsx ← KPI card unificado
41
+ │ ├── AlertCritical.jsx ← banner vermelho de ação imediata
42
+ │ ├── Funnel.jsx ← + ProgressBar
43
+ │ ├── EmptyState.jsx
44
+ │ ├── KanbanColumn.jsx ← + KanbanBoard
45
+ │ ├── LeadCard.jsx ← Pipeline
46
+ │ ├── TableActions.jsx ← check / edit / delete
47
+ │ ├── Sidebar.jsx ← + SidebarLink, SidebarSection
48
+ │ ├── Panel.jsx ← card padrão
49
+ │ ├── Section.jsx ← bloco de página
50
+ │ ├── Modal.jsx
51
+ │ ├── Toast.jsx
52
+ │ ├── Banner.jsx ← Announce + Tip
53
+ │ ├── CodeBlock.jsx
54
+ │ ├── Avatar.jsx ← + AvatarSpace
55
+ │ ├── Kbd.jsx
56
+ │ └── Spec.jsx
57
+ └── assets/
58
+ ├── logo-zark-laranja.png
59
+ └── zark-icon.png
60
+ ```
61
+
62
+ ---
63
+
64
+ ## Filosofia
65
+
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.
69
+ - Hairlines de 1px em `--line-200`. Nunca borders grossos.
70
+ - 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).
73
+
74
+ ---
75
+
76
+ ## Como usar — HTML puro
77
+
78
+ 1. Importe os 2 CSS no `<head>`:
79
+
80
+ ```html
81
+ <link rel="preconnect" href="https://fonts.googleapis.com"/>
82
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Space+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet"/>
83
+
84
+ <link rel="stylesheet" href="/path/to/tokens.css"/>
85
+ <link rel="stylesheet" href="/path/to/components.css"/>
86
+ ```
87
+
88
+ 2. Use as classes diretamente:
89
+
90
+ ```html
91
+ <button class="btn btn-primary btn-md">Nova Tarefa</button>
92
+
93
+ <span class="tag-dot s-todo">A FAZER</span>
94
+ <span class="tag-dot p-urgent">URGENTE</span>
95
+ <span class="tag-dot sp sp-vipcar">VIPCAR</span>
96
+
97
+ <div class="stat">
98
+ <div class="stat-head">
99
+ <span class="stat-label">CONCLUÍDAS · SEMANA</span>
100
+ <span class="stat-icon green">✓</span>
101
+ </div>
102
+ <div class="stat-value">8</div>
103
+ <div class="stat-sub">+18% vs anterior</div>
104
+ </div>
105
+ ```
106
+
107
+ 3. Veja `html/index.html` (exemplo prático) e `html/showcase.html` (galeria completa).
108
+
109
+ ---
110
+
111
+ ## Como usar — React (JSX)
112
+
113
+ 1. Copie a pasta `jsx/` pro seu projeto OU configure como pacote local.
114
+
115
+ 2. No entry-point (`main.jsx` / `App.jsx`):
116
+
117
+ ```jsx
118
+ import './path/to/jsx/tokens.css';
119
+ import './path/to/jsx/components.css';
120
+ ```
121
+
122
+ 3. Carregue as fontes (uma vez no `index.html` ou via `@import` no CSS).
123
+
124
+ 4. Importe componentes:
125
+
126
+ ```jsx
127
+ import { Button, TagDot, StatCard, Icons } from './path/to/jsx';
128
+
129
+ function Dashboard() {
130
+ return (
131
+ <>
132
+ <Button variant="primary" icon={<Icons.Plus size={14}/>}>
133
+ Nova Tarefa
134
+ </Button>
135
+
136
+ <TagDot kind="status" value="todo">A FAZER</TagDot>
137
+ <TagDot kind="priority" value="urgent">URGENTE</TagDot>
138
+ <TagDot kind="space" value="vipcar">VIPCAR</TagDot>
139
+
140
+ <StatCard
141
+ label="CONCLUÍDAS · SEMANA"
142
+ value="8"
143
+ sub="+18% vs anterior"
144
+ iconColor="green"
145
+ icon={<Icons.Check size={14}/>}
146
+ />
147
+ </>
148
+ );
149
+ }
150
+ ```
151
+
152
+ 5. Veja `jsx/App.example.jsx` para o exemplo completo (sidebar + dashboard + kanban + modal).
153
+
154
+ ---
155
+
156
+ ## Catálogo de componentes
157
+
158
+ ### Primitivos
159
+ | Componente | HTML class | JSX |
160
+ |------------|-----------|-----|
161
+ | Button | `.btn .btn-{variant} .btn-{size}` | `<Button variant size icon iconRight loading>` |
162
+ | Input | `.input .input-{size}` | `<Input size icon suffix mono invalid/>` |
163
+ | UrlInputFull | `.url-input-full` | `<UrlInputFull scheme placeholder/>` |
164
+ | Tag | `.tag .tag-{tone} .tag-{size}` | `<Tag tone size square>` |
165
+ | TagDot | `.tag-dot .{prefix}-{value}` | `<TagDot kind value>` |
166
+ | Badge | `.badge` | `<Badge count tone/>` |
167
+ | Toggle | `.toggle .toggle-sm .on` | `<Toggle on onChange size/>` |
168
+ | Segmented | `.segmented` | `<Segmented items value onChange/>` |
169
+ | Chips | `.chips .chip .active` | `<Chips items value onChange/>` |
170
+ | Avatar | `.avatar .avatar-sq` | `<Avatar name size color square src/>` |
171
+ | AvatarSpace| `.av-space` | `<AvatarSpace name spaceKey size/>` |
172
+ | Kbd | `.kbd` | `<Kbd>⌘K</Kbd>` |
173
+
174
+ ### App Patterns (derivados do CRM)
175
+ | Componente | HTML class | JSX |
176
+ |------------|-----------|-----|
177
+ | StatCard | `.stat .is-critical` | `<StatCard label value sub icon iconColor progress critical/>` |
178
+ | AlertCritical | `.alert-critical` | `<AlertCritical title items footer onItemClick/>` |
179
+ | Funnel | `.funnel .funnel-stages` | `<Funnel stages={[]}/>` |
180
+ | ProgressBar | `.stat-progress` | `<ProgressBar value tone/>` |
181
+ | KanbanColumn | `.k-col .k-col-head .k-add` | `<KanbanColumn title count dotColor onAddClick/>` |
182
+ | LeadCard | `.lead-card .is-paused .is-overdue` | `<LeadCard name company status hot channels time followUp indicator paused overdue/>` |
183
+ | EmptyState | `.empty-state` | `<EmptyState icon text action/>` |
184
+ | TableActions | `.t-actions .t-act` | `<TableActions onConfirm onEdit onDelete/>` |
185
+
186
+ ### Layout
187
+ | Componente | HTML class | JSX |
188
+ |------------|-----------|-----|
189
+ | Sidebar | `.zk-sidebar .zk-sidebar-link` | `<Sidebar logo footer/>` + `<SidebarLink active icon shortcut/>` + `<SidebarSection/>` |
190
+ | Panel | `.panel .panel-head .panel-body` | `<Panel title kicker flush/>` |
191
+ | Section | `.section .eyebrow` + h2 | `<Section eyebrow title description id/>` |
192
+ | Modal | `.modal-overlay .modal` | `<Modal open onClose title description footer/>` |
193
+ | Toast | `.toast .toast-success .toast-danger` | `<Toast tone icon/>` |
194
+ | Announce | `.announce` | `<Announce/>` |
195
+ | Tip | `.tip` | `<Tip eyebrow title desc icon onClose/>` |
196
+ | CodeBlock | `.code-block` | `<CodeBlock code onCopy onPreview/>` |
197
+ | Spec | `.spec` | `<Spec label value/>` |
198
+
199
+ ### Ícones (35)
200
+ 35 ícones outline em `Icons.{Name}`. Veja `jsx/icons.jsx` ou abra `html/showcase.html` (seção 26) para a galeria visual.
201
+
202
+ ---
203
+
204
+ ## Tokens essenciais
205
+
206
+ ### Status (tag-dot prefixo `s-`)
207
+ - `s-todo`, `s-progress`, `s-review`, `s-done`, `s-canceled`
208
+ - Modificadores: `s-overdue`, `s-paused`, `s-followup`
209
+
210
+ ### Prioridade (`p-`)
211
+ - `p-urgent`, `p-high`, `p-med`, `p-low`
212
+
213
+ ### Espaços/Clientes (`sp sp-{key}`)
214
+ - `sp-zark`, `sp-allsec`, `sp-vipcar`, `sp-limppe`, `sp-gerais`, `sp-mixshop`, `sp-vipseg`
215
+
216
+ ### Cores semânticas
217
+ - `--success-500` (verde), `--warning-500` (amarelo), `--danger-500` (vermelho), `--info-500` (azul)
218
+
219
+ ### Espaçamento (4px base)
220
+ - `--sp-4` (8px), `--sp-8` (16px), `--sp-12` (24px), `--sp-16` (32px), `--sp-20` (40px)
221
+
222
+ ### Raios (sem pill — Jordan-approved)
223
+ - `--r-xs` (3px), `--r-sm` (4px), `--r-md` (6px), `--r-lg` (8px), `--r-xl` (12px), `--r-2xl` (16px), `--r-3xl` (20px)
224
+
225
+ ---
226
+
227
+ ## Dark mode
228
+
229
+ Toggle automático via OS, ou manual:
230
+ ```js
231
+ document.documentElement.dataset.theme = 'dark'; // força dark
232
+ document.documentElement.dataset.theme = 'light'; // força light
233
+ delete document.documentElement.dataset.theme; // segue OS
234
+ ```
235
+
236
+ A cor de marca (`--brand-500`) **NUNCA muda no dark mode** — é assinatura ZARK. Apenas neutros, semânticos suaves e sombras ajustam.
237
+
238
+ ---
239
+
240
+ ## Regras importantes (NÃO fazer)
241
+
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.
248
+ - ❌ Animação > 280ms em microinterações.
249
+ - ❌ Brand color como bg dominante de tela inteira.
250
+
251
+ ---
252
+
253
+ ## Showcase
254
+
255
+ Para ver TUDO renderizado em uma página interativa, abra:
256
+ ```
257
+ html/showcase.html
258
+ ```
259
+
260
+ Tem light/dark toggle, todos os componentes, toda a paleta, todos os ícones — pronto pra inspecionar e copiar.
261
+
262
+ ---
263
+
264
+ *Mantido por @renankennedy · ZARK · 2026*
@@ -0,0 +1,39 @@
1
+ # assets/ — Logos e ícones do {{name}}
2
+
3
+ Esta pasta está vazia porque você usou o modo **custom** do `zark-design init`. Cole aqui as imagens da marca do seu sistema.
4
+
5
+ ## Arquivos recomendados
6
+
7
+ ```
8
+ assets/
9
+ ├── logo-primary.png ← logo horizontal completo (cor, fundo claro)
10
+ ├── logo-primary-dark.png ← logo horizontal completo (fundo escuro)
11
+ ├── logo-mark.png ← só o símbolo/mark (sem texto)
12
+ ├── icon.png ← ícone quadrado (favicon, app icon)
13
+ └── (opcional) logo.svg ← versão vetorial pra escalabilidade
14
+ ```
15
+
16
+ ## Tamanhos sugeridos
17
+
18
+ | Arquivo | Tamanho | Uso |
19
+ |---|---|---|
20
+ | `logo-primary.png` | ~600×180px | Sidebar, topbar, marketing |
21
+ | `logo-mark.png` | ~256×256px | Avatares, badges, espaço apertado |
22
+ | `icon.png` | 512×512px | Favicon, PWA manifest, app store |
23
+
24
+ ## Convenção de nomenclatura nos componentes
25
+
26
+ Os JSX usam paths relativos. Exemplo em `jsx/components/Sidebar.jsx`:
27
+
28
+ ```jsx
29
+ <img src="../assets/logo-primary.png" alt="{{name}}" />
30
+ ```
31
+
32
+ Mantenha os nomes acima ou ajuste as referências em:
33
+ - `jsx/components/Sidebar.jsx`
34
+ - `html/showcase.html`
35
+ - `html/index.html`
36
+
37
+ ## Logos do {{name}}
38
+
39
+ > **Nota:** se você não tem os arquivos finais ainda, use placeholders temporários. O design system funciona sem as imagens (o JSX vai mostrar alt-text), mas a sidebar fica esquisita.
@@ -0,0 +1,202 @@
1
+ /* ============================================================
2
+ {{NAME}} DESIGN SYSTEM — TOKENS
3
+ v3 · Sistemas/Apps · {{date}}
4
+ Importe este arquivo no entry-point do projeto antes de
5
+ components.css.
6
+
7
+ Gerado por: npx zark-design init{{#if preset}} --preset {{preset}}{{/if}}
8
+ ============================================================ */
9
+
10
+ :root {
11
+ /* ---------- BRAND ({{name}}) ---------- */
12
+ --brand-50: {{brand.50}};
13
+ --brand-100: {{brand.100}};
14
+ --brand-200: {{brand.200}};
15
+ --brand-300: {{brand.300}};
16
+ --brand-400: {{brand.400}};
17
+ --brand-500: {{brand.500}}; /* primary */
18
+ --brand-600: {{brand.600}};
19
+ --brand-700: {{brand.700}};
20
+ --brand-800: {{brand.800}};
21
+ --brand-900: {{brand.900}};
22
+ --brand: var(--brand-500); /* alias semântico */
23
+
24
+ /* ---------- NEUTRALS (warm paper → ink) ---------- */
25
+ --paper: #fafaf8;
26
+ --canvas: #f5f4f1;
27
+ --surface: #ffffff;
28
+ --line-100: #f0eeea;
29
+ --line-200: #e8e6e1;
30
+ --line-300: #d8d5cf;
31
+
32
+ --ink-50: #f4f3f0;
33
+ --ink-100: #e8e6e1;
34
+ --ink-200: #c8c5bf;
35
+ --ink-300: #a09c95;
36
+ --ink-400: #6f6b64;
37
+ --ink-500: #4a4741;
38
+ --ink-600: #2e2c28;
39
+ --ink-700: #1a1916;
40
+ --ink-800: #111110;
41
+ --ink-900: #0a0a09;
42
+
43
+ /* fundos dark — usados pelo tema dark */
44
+ --bg-void: #151419;
45
+ --bg-glucon: #1b1a1e;
46
+
47
+ /* ---------- SEMANTIC ---------- */
48
+ --success-50: #ecfdf3;
49
+ --success-500: #10a960;
50
+ --success-700: #067a44;
51
+
52
+ --warning-50: #fff8e6;
53
+ --warning-500: #d99000;
54
+ --warning-700: #9a6500;
55
+
56
+ --danger-50: #fef1f1;
57
+ --danger-500: #dc3545;
58
+ --danger-700: #a52833;
59
+
60
+ --info-50: #eef5ff;
61
+ --info-500: #2f7adc;
62
+ --info-700: #1f5ba8;
63
+
64
+ --tag-bg: var(--brand-50);
65
+ --tag-fg: var(--brand-700);
66
+ --code-bg: var(--brand-50);
67
+ --code-fg: var(--brand-700);
68
+
69
+ /* ---------- TYPOGRAPHY ---------- */
70
+ --font-sans: "{{fonts.ui}}", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
71
+ --font-mono: "{{fonts.mono}}", "SF Mono", Menlo, Consolas, monospace;
72
+ --font-display: "{{fonts.display}}", "{{fonts.ui}}", sans-serif;
73
+ --font-ui: "{{fonts.ui}}", -apple-system, sans-serif;
74
+
75
+ /* type scale */
76
+ --fs-2xs: 10px; --fs-xs: 11px; --fs-sm: 12px; --fs-md: 13px;
77
+ --fs-base: 14px; --fs-lg: 16px; --fs-xl: 18px;
78
+ --fs-2xl: 22px; --fs-3xl: 28px; --fs-4xl: 36px;
79
+ --fs-5xl: 48px; --fs-6xl: 64px; --fs-display: 88px;
80
+
81
+ --lh-tight: 1.1; --lh-snug: 1.25; --lh-base: 1.45; --lh-loose: 1.6;
82
+ --ls-tight: -0.02em; --ls-snug: -0.01em; --ls-normal: 0;
83
+ --ls-wide: 0.04em; --ls-wider: 0.08em; --ls-widest: 0.14em;
84
+
85
+ --fw-regular: 400; --fw-medium: 500; --fw-semibold: 600; --fw-bold: 700;
86
+
87
+ /* ---------- SPACING (4px base) ---------- */
88
+ --sp-0: 0; --sp-1: 2px; --sp-2: 4px; --sp-3: 6px; --sp-4: 8px;
89
+ --sp-5: 10px; --sp-6: 12px; --sp-7: 14px; --sp-8: 16px;
90
+ --sp-10: 20px; --sp-12: 24px; --sp-14: 28px; --sp-16: 32px;
91
+ --sp-20: 40px; --sp-24: 48px; --sp-32: 64px; --sp-40: 80px; --sp-48: 96px;
92
+
93
+ /* ---------- RADII (sem pill — design choice) ---------- */
94
+ --r-xs: 3px; --r-sm: 4px; --r-md: 6px; --r-lg: 8px;
95
+ --r-xl: 12px; --r-2xl: 16px; --r-3xl: 20px;
96
+
97
+ /* ---------- SHADOWS (warm, não frias) ---------- */
98
+ --shadow-xs: 0 1px 0 rgba(20, 17, 12, 0.04);
99
+ --shadow-sm: 0 1px 2px rgba(20, 17, 12, 0.05), 0 0 0 1px rgba(20, 17, 12, 0.04);
100
+ --shadow-md: 0 4px 12px rgba(20, 17, 12, 0.06), 0 1px 2px rgba(20, 17, 12, 0.05);
101
+ --shadow-lg: 0 12px 32px rgba(20, 17, 12, 0.08), 0 2px 6px rgba(20, 17, 12, 0.04);
102
+ --shadow-xl: 0 24px 64px rgba(20, 17, 12, 0.12), 0 4px 12px rgba(20, 17, 12, 0.05);
103
+ --shadow-modal: 0 32px 96px rgba(20, 17, 12, 0.18), 0 8px 24px rgba(20, 17, 12, 0.08);
104
+ --shadow-inset: inset 0 1px 0 rgba(255, 255, 255, 0.08);
105
+
106
+ --ring-focus: 0 0 0 3px {{brand.ring}};
107
+ --ring-focus-soft: 0 0 0 3px {{brand.ringSoft}};
108
+
109
+ /* ---------- MOTION ---------- */
110
+ --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
111
+ --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
112
+ --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
113
+ --t-fast: 120ms; --t-base: 180ms; --t-slow: 280ms; --t-slower: 420ms;
114
+
115
+ /* ---------- LAYOUT ---------- */
116
+ --sidebar-w: 240px; --topbar-h: 56px; --container-max: 1280px;
117
+ }
118
+
119
+ /* ============================================================ BASE */
120
+ * { box-sizing: border-box; }
121
+ html, body {
122
+ margin: 0; padding: 0;
123
+ font-family: var(--font-sans);
124
+ font-size: var(--fs-base);
125
+ line-height: var(--lh-base);
126
+ color: var(--ink-700);
127
+ background: var(--paper);
128
+ -webkit-font-smoothing: antialiased;
129
+ text-rendering: optimizeLegibility;
130
+ }
131
+ ::selection { background: var(--brand-200); color: var(--ink-700); }
132
+ a { color: inherit; }
133
+ button { font-family: inherit; }
134
+
135
+ /* ============================================================
136
+ DARK THEME — opt-in via [data-theme="dark"] OU auto via prefers-color-scheme
137
+ ============================================================
138
+ Filosofia: a brand color MANTÉM os mesmos valores no dark — é assinatura.
139
+ O que muda são neutros, semânticos suaves, sombras e ring-focus.
140
+ ============================================================ */
141
+
142
+ [data-theme="dark"] {
143
+ --paper: #0e0d11;
144
+ --canvas: var(--bg-void);
145
+ --surface: var(--bg-glucon);
146
+ --line-100: #232227;
147
+ --line-200: #2c2b32;
148
+ --line-300: #3a383f;
149
+
150
+ --ink-50: #1a1916;
151
+ --ink-100: #2c2b27;
152
+ --ink-200: #4a4741;
153
+ --ink-300: #6f6b64;
154
+ --ink-400: #a09c95;
155
+ --ink-500: #c8c5bf;
156
+ --ink-600: #e0ddd6;
157
+ --ink-700: #f0ede5;
158
+ --ink-800: #f7f5ef;
159
+ --ink-900: #fafaf8;
160
+
161
+ --success-50: #0f2419;
162
+ --warning-50: #2a1f08;
163
+ --danger-50: #2a1010;
164
+ --info-50: #0e1a2c;
165
+
166
+ --tag-bg: var(--brand-800);
167
+ --tag-fg: var(--brand-200);
168
+ --code-bg: var(--brand-900);
169
+ --code-fg: var(--brand-300);
170
+
171
+ --shadow-xs: 0 1px 0 rgba(0, 0, 0, 0.5);
172
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.04);
173
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4), 0 1px 2px rgba(0, 0, 0, 0.3);
174
+ --shadow-lg: 0 12px 32px rgba(0, 0, 0, 0.5), 0 2px 6px rgba(0, 0, 0, 0.3);
175
+ --shadow-xl: 0 24px 64px rgba(0, 0, 0, 0.6), 0 4px 12px rgba(0, 0, 0, 0.3);
176
+ --shadow-modal: 0 32px 96px rgba(0, 0, 0, 0.7), 0 8px 24px rgba(0, 0, 0, 0.4);
177
+ --shadow-inset: inset 0 1px 0 rgba(255, 255, 255, 0.04);
178
+
179
+ --ring-focus: 0 0 0 3px {{brand.ringDark}};
180
+ --ring-focus-soft: 0 0 0 3px {{brand.ringSoftDark}};
181
+ }
182
+
183
+ @media (prefers-color-scheme: dark) {
184
+ :root:not([data-theme="light"]) {
185
+ --paper: #0e0d11;
186
+ --canvas: var(--bg-void);
187
+ --surface: var(--bg-glucon);
188
+ --line-100: #232227;
189
+ --line-200: #2c2b32;
190
+ --line-300: #3a383f;
191
+
192
+ --ink-50: #1a1916; --ink-100: #2c2b27; --ink-200: #4a4741;
193
+ --ink-300: #6f6b64; --ink-400: #a09c95; --ink-500: #c8c5bf;
194
+ --ink-600: #e0ddd6; --ink-700: #f0ede5; --ink-800: #f7f5ef; --ink-900: #fafaf8;
195
+
196
+ --success-50: #0f2419; --warning-50: #2a1f08;
197
+ --danger-50: #2a1010; --info-50: #0e1a2c;
198
+
199
+ --tag-bg: var(--brand-800); --tag-fg: var(--brand-200);
200
+ --code-bg: var(--brand-900); --code-fg: var(--brand-300);
201
+ }
202
+ }
@@ -0,0 +1,34 @@
1
+ // Tokens em JS — para casos onde você precisa do valor em runtime
2
+ // (animações, charts, inline styles dinâmicos). Para CSS, use tokens.css.
3
+
4
+ export const tokens = {
5
+ brand: {
6
+ 50: '{{brand.50}}', 100: '{{brand.100}}', 200: '{{brand.200}}',
7
+ 300: '{{brand.300}}', 400: '{{brand.400}}', 500: '{{brand.500}}',
8
+ 600: '{{brand.600}}', 700: '{{brand.700}}', 800: '{{brand.800}}',
9
+ 900: '{{brand.900}}',
10
+ primary: '{{brand.500}}',
11
+ },
12
+ neutral: {
13
+ paper: '#fafaf8', canvas: '#f5f4f1', surface: '#ffffff',
14
+ line: { 100: '#f0eeea', 200: '#e8e6e1', 300: '#d8d5cf' },
15
+ ink: {
16
+ 50: '#f4f3f0', 100: '#e8e6e1', 200: '#c8c5bf', 300: '#a09c95',
17
+ 400: '#6f6b64', 500: '#4a4741', 600: '#2e2c28', 700: '#1a1916',
18
+ 800: '#111110', 900: '#0a0a09',
19
+ },
20
+ },
21
+ semantic: {
22
+ success: { 50: '#ecfdf3', 500: '#10a960', 700: '#067a44' },
23
+ warning: { 50: '#fff8e6', 500: '#d99000', 700: '#9a6500' },
24
+ danger: { 50: '#fef1f1', 500: '#dc3545', 700: '#a52833' },
25
+ info: { 50: '#eef5ff', 500: '#2f7adc', 700: '#1f5ba8' },
26
+ },
27
+ fonts: {
28
+ ui: '"{{fonts.ui}}"',
29
+ mono: '"{{fonts.mono}}"',
30
+ display: '"{{fonts.display}}"',
31
+ },
32
+ };
33
+
34
+ export default tokens;