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.
- package/bin/cli.js +364 -90
- package/package.json +2 -2
- package/templates/README.md.hbs +264 -0
- package/templates/_shared/ASSETS-README.md.hbs +39 -0
- package/templates/_shared/tokens.css.hbs +202 -0
- package/templates/_shared/tokens.js.hbs +34 -0
- package/templates/html/components.css +740 -0
- package/templates/html/index.html +135 -0
- package/templates/html/showcase.html +3550 -0
- package/templates/jsx/App.example.jsx +229 -0
- package/templates/jsx/components/AlertCritical.jsx +43 -0
- package/templates/jsx/components/Avatar.jsx +41 -0
- package/templates/jsx/components/Badge.jsx +12 -0
- package/templates/jsx/components/Banner.jsx +42 -0
- package/templates/jsx/components/Button.jsx +43 -0
- package/templates/jsx/components/Chip.jsx +28 -0
- package/templates/jsx/components/CodeBlock.jsx +42 -0
- package/templates/jsx/components/EmptyState.jsx +27 -0
- package/templates/jsx/components/Funnel.jsx +55 -0
- package/templates/jsx/components/Input.jsx +53 -0
- package/templates/jsx/components/KanbanColumn.jsx +51 -0
- package/templates/jsx/components/Kbd.jsx +11 -0
- package/templates/jsx/components/LeadCard.jsx +79 -0
- package/templates/jsx/components/Modal.jsx +57 -0
- package/templates/jsx/components/Panel.jsx +25 -0
- package/templates/jsx/components/Section.jsx +28 -0
- package/templates/jsx/components/Segmented.jsx +26 -0
- package/templates/jsx/components/Sidebar.jsx +49 -0
- package/templates/jsx/components/Spec.jsx +19 -0
- package/templates/jsx/components/StatCard.jsx +44 -0
- package/templates/jsx/components/TableActions.jsx +34 -0
- package/templates/jsx/components/Tag.jsx +21 -0
- package/templates/jsx/components/TagDot.jsx +26 -0
- package/templates/jsx/components/Toast.jsx +25 -0
- package/templates/jsx/components/Toggle.jsx +29 -0
- package/templates/jsx/components.css +740 -0
- package/templates/{icons.jsx → jsx/icons.jsx} +20 -9
- package/templates/jsx/index.js +31 -0
- package/templates/presets/zark/preset.json +26 -0
- package/templates/REFERENCE.md +0 -376
- package/templates/SHOWCASE.html +0 -254
- package/templates/brand.jsx +0 -89
- package/templates/components.jsx +0 -385
- package/templates/design-canvas.jsx +0 -789
- package/templates/foundations.jsx +0 -363
- package/templates/layouts.jsx +0 -232
- package/templates/patterns.jsx +0 -268
- package/templates/primitives.jsx +0 -306
- package/templates/tokens.css +0 -306
- package/templates/visual-references/icon-zark.png +0 -0
- package/templates/visual-references/logo-zark-principal.png +0 -0
- package/templates/visual-references/pasted-1777605750385-0.png +0 -0
- package/templates/visual-references/pasted-1777605766298-0.png +0 -0
- package/templates/visual-references/pasted-1777605775820-0.png +0 -0
- package/templates/visual-references/pasted-1777605789833-0.png +0 -0
- package/templates/visual-references/pasted-1777605802420-0.png +0 -0
- package/templates/visual-references/pasted-1777605812470-0.png +0 -0
- package/templates/visual-references/pasted-1777605817688-0.png +0 -0
- package/templates/visual-references/pasted-1777605828485-0.png +0 -0
- package/templates/visual-references/pasted-1777605837137-0.png +0 -0
- package/templates/visual-references/pasted-1777605849789-0.png +0 -0
- package/templates/visual-references/pasted-1777605864942-0.png +0 -0
- package/templates/visual-references/pasted-1777605877920-0.png +0 -0
- package/templates/visual-references/pasted-1777605897353-0.png +0 -0
- /package/templates/{assets/zark-logo.png → presets/zark/assets/logo-zark-laranja.png} +0 -0
- /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;
|