zark-design 1.0.0 → 2.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 +7 -6
- package/package.json +2 -2
- package/templates/README.md +264 -0
- package/templates/html/components.css +740 -0
- package/templates/html/index.html +135 -0
- package/templates/html/showcase.html +3550 -0
- package/templates/{tokens.css → html/tokens.css} +89 -112
- 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/jsx/tokens.css +283 -0
- package/templates/jsx/tokens.js +62 -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/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 → html/assets/logo-zark-laranja.png} +0 -0
- /package/templates/{assets → html/assets}/zark-icon.png +0 -0
- /package/templates/{visual-references/logo-zark-principal.png → jsx/assets/logo-zark-laranja.png} +0 -0
- /package/templates/{visual-references/icon-zark.png → jsx/assets/zark-icon.png} +0 -0
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
/* ============================================================
|
|
2
2
|
ZARK DESIGN SYSTEM — TOKENS
|
|
3
|
-
|
|
3
|
+
v3 · Sistemas/Apps · 2026
|
|
4
|
+
Importe este arquivo no entry-point do projeto antes de
|
|
5
|
+
components.css.
|
|
4
6
|
============================================================ */
|
|
5
7
|
|
|
6
8
|
:root {
|
|
7
|
-
/* ---------- BRAND /
|
|
8
|
-
/* Anchored on official Zark brand color #F56F10 (Liquid Lava) */
|
|
9
|
+
/* ---------- BRAND / EMBER (Liquid Lava scale) ---------- */
|
|
9
10
|
--ember-50: #fff3e9;
|
|
10
11
|
--ember-100: #ffe1c8;
|
|
11
12
|
--ember-200: #ffc28e;
|
|
12
13
|
--ember-300: #ffa056;
|
|
13
|
-
--ember-400: #ff8a3a;
|
|
14
|
+
--ember-400: #ff8a3a;
|
|
14
15
|
--ember-500: #f56f10; /* LIQUID LAVA — brand primary */
|
|
15
|
-
--ember-600: #d45e0d;
|
|
16
|
+
--ember-600: #d45e0d;
|
|
16
17
|
--ember-700: #ad4a09;
|
|
17
18
|
--ember-800: #843706;
|
|
18
19
|
--ember-900: #5e2704;
|
|
@@ -21,12 +22,12 @@
|
|
|
21
22
|
--glucon-grey: #1b1a1e;
|
|
22
23
|
|
|
23
24
|
/* ---------- NEUTRALS (warm paper → ink) ---------- */
|
|
24
|
-
--paper: #fafaf8;
|
|
25
|
-
--canvas: #f5f4f1;
|
|
26
|
-
--surface: #ffffff;
|
|
27
|
-
--line-100: #f0eeea;
|
|
28
|
-
--line-200: #e8e6e1;
|
|
29
|
-
--line-300: #d8d5cf;
|
|
25
|
+
--paper: #fafaf8;
|
|
26
|
+
--canvas: #f5f4f1;
|
|
27
|
+
--surface: #ffffff;
|
|
28
|
+
--line-100: #f0eeea;
|
|
29
|
+
--line-200: #e8e6e1;
|
|
30
|
+
--line-300: #d8d5cf;
|
|
30
31
|
|
|
31
32
|
--ink-50: #f4f3f0;
|
|
32
33
|
--ink-100: #e8e6e1;
|
|
@@ -35,7 +36,7 @@
|
|
|
35
36
|
--ink-400: #6f6b64;
|
|
36
37
|
--ink-500: #4a4741;
|
|
37
38
|
--ink-600: #2e2c28;
|
|
38
|
-
--ink-700: #1a1916;
|
|
39
|
+
--ink-700: #1a1916;
|
|
39
40
|
--ink-800: #111110;
|
|
40
41
|
--ink-900: #0a0a09;
|
|
41
42
|
|
|
@@ -56,19 +57,35 @@
|
|
|
56
57
|
--info-500: #2f7adc;
|
|
57
58
|
--info-700: #1f5ba8;
|
|
58
59
|
|
|
59
|
-
/* tag/code accents */
|
|
60
60
|
--tag-bg: #fff0e0;
|
|
61
61
|
--tag-fg: #ad4a09;
|
|
62
62
|
--code-bg: #fff5ea;
|
|
63
63
|
--code-fg: #ad4a09;
|
|
64
64
|
|
|
65
|
-
/* ----------
|
|
66
|
-
--
|
|
67
|
-
--
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
--
|
|
65
|
+
/* ---------- SPACE / CLIENTE COLORS (CRM) ---------- */
|
|
66
|
+
--space-zark: #f56f10;
|
|
67
|
+
--space-zark-soft: #fff3e9;
|
|
68
|
+
--space-allsec: #c2410c;
|
|
69
|
+
--space-allsec-soft: #fff3e9;
|
|
70
|
+
--space-vipcar: #ea580c;
|
|
71
|
+
--space-vipcar-soft: #fff3e9;
|
|
72
|
+
--space-limppe: #f59e0b;
|
|
73
|
+
--space-limppe-soft: #fff8e6;
|
|
74
|
+
--space-gerais: #1f2937;
|
|
75
|
+
--space-gerais-soft: #f4f3f0;
|
|
76
|
+
--space-mixshop: #b91c1c;
|
|
77
|
+
--space-mixshop-soft:#fef1f1;
|
|
78
|
+
--space-vipseg: #991b1b;
|
|
79
|
+
--space-vipseg-soft: #fef1f1;
|
|
80
|
+
|
|
81
|
+
/* ---------- TYPOGRAPHY ----------
|
|
82
|
+
Inter → UI texto + NÚMEROS (KPIs, valores, contadores)
|
|
83
|
+
JetBrains → Código, labels técnicos, kbd
|
|
84
|
+
Space Grotesk→ TÍTULOS (h1, h2, h3, modal titles, header bands)
|
|
85
|
+
*/
|
|
86
|
+
--font-sans: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
|
|
87
|
+
--font-mono: "JetBrains Mono", "SF Mono", Menlo, Consolas, monospace;
|
|
88
|
+
--font-display: "Space Grotesk", "Inter Tight", "Inter", sans-serif;
|
|
72
89
|
--font-ui: "Inter", -apple-system, sans-serif;
|
|
73
90
|
|
|
74
91
|
/* type scale (px) */
|
|
@@ -126,7 +143,7 @@
|
|
|
126
143
|
--sp-40: 80px;
|
|
127
144
|
--sp-48: 96px;
|
|
128
145
|
|
|
129
|
-
/* ---------- RADII ---------- */
|
|
146
|
+
/* ---------- RADII (sem pill) ---------- */
|
|
130
147
|
--r-xs: 3px;
|
|
131
148
|
--r-sm: 4px;
|
|
132
149
|
--r-md: 6px;
|
|
@@ -134,9 +151,8 @@
|
|
|
134
151
|
--r-xl: 12px;
|
|
135
152
|
--r-2xl: 16px;
|
|
136
153
|
--r-3xl: 20px;
|
|
137
|
-
--r-pill: 999px;
|
|
138
154
|
|
|
139
|
-
/* ---------- SHADOWS ---------- */
|
|
155
|
+
/* ---------- SHADOWS (warm-black, never cool-black) ---------- */
|
|
140
156
|
--shadow-xs: 0 1px 0 rgba(20, 17, 12, 0.04);
|
|
141
157
|
--shadow-sm: 0 1px 2px rgba(20, 17, 12, 0.05), 0 0 0 1px rgba(20, 17, 12, 0.04);
|
|
142
158
|
--shadow-md: 0 4px 12px rgba(20, 17, 12, 0.06), 0 1px 2px rgba(20, 17, 12, 0.05);
|
|
@@ -145,7 +161,7 @@
|
|
|
145
161
|
--shadow-modal: 0 32px 96px rgba(20, 17, 12, 0.18), 0 8px 24px rgba(20, 17, 12, 0.08);
|
|
146
162
|
--shadow-inset: inset 0 1px 0 rgba(255, 255, 255, 0.08);
|
|
147
163
|
|
|
148
|
-
--ring-focus:
|
|
164
|
+
--ring-focus: 0 0 0 3px rgba(255, 93, 31, 0.20);
|
|
149
165
|
--ring-focus-soft: 0 0 0 3px rgba(255, 93, 31, 0.12);
|
|
150
166
|
|
|
151
167
|
/* ---------- MOTION ---------- */
|
|
@@ -164,56 +180,27 @@
|
|
|
164
180
|
}
|
|
165
181
|
|
|
166
182
|
/* ============================================================
|
|
167
|
-
|
|
183
|
+
DARK THEME
|
|
168
184
|
============================================================ */
|
|
169
|
-
* { box-sizing: border-box; }
|
|
170
|
-
html, body {
|
|
171
|
-
margin: 0;
|
|
172
|
-
padding: 0;
|
|
173
|
-
font-family: var(--font-sans);
|
|
174
|
-
font-size: var(--fs-base);
|
|
175
|
-
line-height: var(--lh-base);
|
|
176
|
-
color: var(--ink-700);
|
|
177
|
-
background: var(--paper);
|
|
178
|
-
-webkit-font-smoothing: antialiased;
|
|
179
|
-
text-rendering: optimizeLegibility;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
::selection { background: var(--ember-200); color: var(--ink-700); }
|
|
183
|
-
|
|
184
|
-
a { color: inherit; }
|
|
185
|
-
button { font-family: inherit; }
|
|
186
|
-
|
|
187
|
-
/* ============================================================
|
|
188
|
-
DARK THEME — opt-in via [data-theme="dark"] OR auto via prefers-color-scheme
|
|
189
|
-
============================================================
|
|
190
|
-
Filosofia: o brand (liquid-lava/ember) MANTÉM os mesmos valores —
|
|
191
|
-
é a assinatura visual ZARK. O que muda são neutros, semânticos
|
|
192
|
-
suaves, sombras e ring-focus pra contraste correto.
|
|
193
|
-
============================================================ */
|
|
194
|
-
|
|
195
185
|
[data-theme="dark"] {
|
|
196
|
-
/* Brand: liquid-lava preservado, mas os tons claros viram acentos */
|
|
197
186
|
--ember-50: #2a1810;
|
|
198
187
|
--ember-100: #3d2114;
|
|
199
|
-
--ember-200: #5e2704;
|
|
188
|
+
--ember-200: #5e2704;
|
|
200
189
|
--ember-300: #843706;
|
|
201
190
|
--ember-400: #ad4a09;
|
|
202
|
-
--ember-500: #f56f10; /*
|
|
203
|
-
--ember-600: #ff8a3a;
|
|
191
|
+
--ember-500: #f56f10; /* brand inalterado */
|
|
192
|
+
--ember-600: #ff8a3a;
|
|
204
193
|
--ember-700: #ffa056;
|
|
205
194
|
--ember-800: #ffc28e;
|
|
206
195
|
--ember-900: #ffe1c8;
|
|
207
196
|
|
|
208
|
-
|
|
209
|
-
--
|
|
210
|
-
--
|
|
211
|
-
--
|
|
212
|
-
--line-
|
|
213
|
-
--line-
|
|
214
|
-
--line-300: #3a383f; /* stronger dividers */
|
|
197
|
+
--paper: #0e0d11;
|
|
198
|
+
--canvas: #151419;
|
|
199
|
+
--surface: #1b1a1e;
|
|
200
|
+
--line-100: #232227;
|
|
201
|
+
--line-200: #2c2b32;
|
|
202
|
+
--line-300: #3a383f;
|
|
215
203
|
|
|
216
|
-
/* Ink invertido: agora é warm-white sobre dark, não warm-black sobre paper */
|
|
217
204
|
--ink-50: #1a1916;
|
|
218
205
|
--ink-100: #2c2b27;
|
|
219
206
|
--ink-200: #4a4741;
|
|
@@ -221,23 +208,20 @@ button { font-family: inherit; }
|
|
|
221
208
|
--ink-400: #a09c95;
|
|
222
209
|
--ink-500: #c8c5bf;
|
|
223
210
|
--ink-600: #e0ddd6;
|
|
224
|
-
--ink-700: #f0ede5;
|
|
211
|
+
--ink-700: #f0ede5;
|
|
225
212
|
--ink-800: #f7f5ef;
|
|
226
213
|
--ink-900: #fafaf8;
|
|
227
214
|
|
|
228
|
-
/* Semânticos suaves (50) ficam mais escuros pra fundo no dark */
|
|
229
215
|
--success-50: #0f2419;
|
|
230
216
|
--warning-50: #2a1f08;
|
|
231
217
|
--danger-50: #2a1010;
|
|
232
218
|
--info-50: #0e1a2c;
|
|
233
219
|
|
|
234
|
-
|
|
235
|
-
--tag-
|
|
236
|
-
--
|
|
237
|
-
--code-
|
|
238
|
-
--code-fg: #ffa056;
|
|
220
|
+
--tag-bg: #3d2114;
|
|
221
|
+
--tag-fg: #ffc28e;
|
|
222
|
+
--code-bg: #2a1810;
|
|
223
|
+
--code-fg: #ffa056;
|
|
239
224
|
|
|
240
|
-
/* Sombras dark — invertidas: borda + glow leve em vez de drop-shadow grosso */
|
|
241
225
|
--shadow-xs: 0 1px 0 rgba(0, 0, 0, 0.5);
|
|
242
226
|
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.04);
|
|
243
227
|
--shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4), 0 1px 2px rgba(0, 0, 0, 0.3);
|
|
@@ -246,52 +230,25 @@ button { font-family: inherit; }
|
|
|
246
230
|
--shadow-modal: 0 32px 96px rgba(0, 0, 0, 0.7), 0 8px 24px rgba(0, 0, 0, 0.4);
|
|
247
231
|
--shadow-inset: inset 0 1px 0 rgba(255, 255, 255, 0.04);
|
|
248
232
|
|
|
249
|
-
--ring-focus:
|
|
233
|
+
--ring-focus: 0 0 0 3px rgba(255, 138, 58, 0.30);
|
|
250
234
|
--ring-focus-soft: 0 0 0 3px rgba(255, 138, 58, 0.16);
|
|
251
235
|
}
|
|
252
236
|
|
|
253
|
-
/*
|
|
237
|
+
/* Auto dark via OS, opt-out: <html data-theme="light"> */
|
|
254
238
|
@media (prefers-color-scheme: dark) {
|
|
255
239
|
:root:not([data-theme="light"]) {
|
|
256
|
-
--ember-50: #2a1810;
|
|
257
|
-
--ember-
|
|
258
|
-
--ember-
|
|
259
|
-
--ember-300: #843706;
|
|
260
|
-
--ember-400: #ad4a09;
|
|
261
|
-
--ember-500: #f56f10;
|
|
262
|
-
--ember-600: #ff8a3a;
|
|
263
|
-
--ember-700: #ffa056;
|
|
264
|
-
--ember-800: #ffc28e;
|
|
240
|
+
--ember-50: #2a1810; --ember-100: #3d2114; --ember-200: #5e2704;
|
|
241
|
+
--ember-300: #843706; --ember-400: #ad4a09; --ember-500: #f56f10;
|
|
242
|
+
--ember-600: #ff8a3a; --ember-700: #ffa056; --ember-800: #ffc28e;
|
|
265
243
|
--ember-900: #ffe1c8;
|
|
266
|
-
|
|
267
|
-
--
|
|
268
|
-
--
|
|
269
|
-
--
|
|
270
|
-
--
|
|
271
|
-
--line-200: #2c2b32;
|
|
272
|
-
--line-300: #3a383f;
|
|
273
|
-
|
|
274
|
-
--ink-50: #1a1916;
|
|
275
|
-
--ink-100: #2c2b27;
|
|
276
|
-
--ink-200: #4a4741;
|
|
277
|
-
--ink-300: #6f6b64;
|
|
278
|
-
--ink-400: #a09c95;
|
|
279
|
-
--ink-500: #c8c5bf;
|
|
280
|
-
--ink-600: #e0ddd6;
|
|
281
|
-
--ink-700: #f0ede5;
|
|
282
|
-
--ink-800: #f7f5ef;
|
|
244
|
+
--paper: #0e0d11; --canvas: #151419; --surface: #1b1a1e;
|
|
245
|
+
--line-100: #232227; --line-200: #2c2b32; --line-300: #3a383f;
|
|
246
|
+
--ink-50: #1a1916; --ink-100: #2c2b27; --ink-200: #4a4741;
|
|
247
|
+
--ink-300: #6f6b64; --ink-400: #a09c95; --ink-500: #c8c5bf;
|
|
248
|
+
--ink-600: #e0ddd6; --ink-700: #f0ede5; --ink-800: #f7f5ef;
|
|
283
249
|
--ink-900: #fafaf8;
|
|
284
|
-
|
|
285
|
-
--
|
|
286
|
-
--warning-50: #2a1f08;
|
|
287
|
-
--danger-50: #2a1010;
|
|
288
|
-
--info-50: #0e1a2c;
|
|
289
|
-
|
|
290
|
-
--tag-bg: #3d2114;
|
|
291
|
-
--tag-fg: #ffc28e;
|
|
292
|
-
--code-bg: #2a1810;
|
|
293
|
-
--code-fg: #ffa056;
|
|
294
|
-
|
|
250
|
+
--success-50: #0f2419; --warning-50: #2a1f08; --danger-50: #2a1010; --info-50: #0e1a2c;
|
|
251
|
+
--tag-bg: #3d2114; --tag-fg: #ffc28e; --code-bg: #2a1810; --code-fg: #ffa056;
|
|
295
252
|
--shadow-xs: 0 1px 0 rgba(0, 0, 0, 0.5);
|
|
296
253
|
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.04);
|
|
297
254
|
--shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4), 0 1px 2px rgba(0, 0, 0, 0.3);
|
|
@@ -299,8 +256,28 @@ button { font-family: inherit; }
|
|
|
299
256
|
--shadow-xl: 0 24px 64px rgba(0, 0, 0, 0.6), 0 4px 12px rgba(0, 0, 0, 0.3);
|
|
300
257
|
--shadow-modal: 0 32px 96px rgba(0, 0, 0, 0.7), 0 8px 24px rgba(0, 0, 0, 0.4);
|
|
301
258
|
--shadow-inset: inset 0 1px 0 rgba(255, 255, 255, 0.04);
|
|
302
|
-
|
|
303
|
-
--ring-focus: 0 0 0 3px rgba(255, 138, 58, 0.30);
|
|
259
|
+
--ring-focus: 0 0 0 3px rgba(255, 138, 58, 0.30);
|
|
304
260
|
--ring-focus-soft: 0 0 0 3px rgba(255, 138, 58, 0.16);
|
|
305
261
|
}
|
|
306
262
|
}
|
|
263
|
+
|
|
264
|
+
/* ============================================================
|
|
265
|
+
BASE
|
|
266
|
+
============================================================ */
|
|
267
|
+
* { box-sizing: border-box; }
|
|
268
|
+
html, body {
|
|
269
|
+
margin: 0; padding: 0;
|
|
270
|
+
font-family: var(--font-sans);
|
|
271
|
+
font-size: var(--fs-base);
|
|
272
|
+
line-height: var(--lh-base);
|
|
273
|
+
color: var(--ink-700);
|
|
274
|
+
background: var(--paper);
|
|
275
|
+
-webkit-font-smoothing: antialiased;
|
|
276
|
+
text-rendering: optimizeLegibility;
|
|
277
|
+
}
|
|
278
|
+
::selection { background: var(--ember-200); color: var(--ink-700); }
|
|
279
|
+
a { color: inherit; text-decoration: none; }
|
|
280
|
+
button { font-family: inherit; }
|
|
281
|
+
|
|
282
|
+
@keyframes zk-spin { to { transform: rotate(360deg); } }
|
|
283
|
+
@keyframes zk-fadein { from { opacity: 0; transform: translateY(4px);} to { opacity: 1; transform: translateY(0);} }
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
// App.example.jsx — exemplo completo demonstrando o design system em uso.
|
|
2
|
+
// Replique a estrutura no seu projeto. Lembre de importar tokens.css + components.css
|
|
3
|
+
// no entry-point (main.jsx / App.jsx).
|
|
4
|
+
|
|
5
|
+
import React, { useState } from 'react';
|
|
6
|
+
import './tokens.css';
|
|
7
|
+
import './components.css';
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
Button,
|
|
11
|
+
Input,
|
|
12
|
+
Tag,
|
|
13
|
+
TagDot,
|
|
14
|
+
Badge,
|
|
15
|
+
Toggle,
|
|
16
|
+
Segmented,
|
|
17
|
+
Chips,
|
|
18
|
+
StatCard,
|
|
19
|
+
AlertCritical,
|
|
20
|
+
Funnel,
|
|
21
|
+
EmptyState,
|
|
22
|
+
KanbanBoard,
|
|
23
|
+
KanbanColumn,
|
|
24
|
+
LeadCard,
|
|
25
|
+
TableActions,
|
|
26
|
+
Sidebar,
|
|
27
|
+
SidebarLink,
|
|
28
|
+
SidebarSection,
|
|
29
|
+
Panel,
|
|
30
|
+
Section,
|
|
31
|
+
Modal,
|
|
32
|
+
Toast,
|
|
33
|
+
Announce,
|
|
34
|
+
Tip,
|
|
35
|
+
CodeBlock,
|
|
36
|
+
Avatar,
|
|
37
|
+
AvatarSpace,
|
|
38
|
+
Kbd,
|
|
39
|
+
Spec,
|
|
40
|
+
Icons,
|
|
41
|
+
} from './index';
|
|
42
|
+
|
|
43
|
+
import logoZark from './assets/logo-zark-laranja.png';
|
|
44
|
+
import iconZark from './assets/zark-icon.png';
|
|
45
|
+
|
|
46
|
+
export default function App() {
|
|
47
|
+
const [tab, setTab] = useState('hoje');
|
|
48
|
+
const [filter, setFilter] = useState('todas');
|
|
49
|
+
const [stealth, setStealth] = useState(false);
|
|
50
|
+
const [modalOpen, setModalOpen] = useState(false);
|
|
51
|
+
|
|
52
|
+
return (
|
|
53
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'var(--sidebar-w) 1fr', minHeight: '100vh' }}>
|
|
54
|
+
|
|
55
|
+
{/* SIDEBAR */}
|
|
56
|
+
<Sidebar logo={<img src={logoZark} alt="ZARK" className="zk-sidebar-logo"/>}>
|
|
57
|
+
<SidebarSection>Workspace</SidebarSection>
|
|
58
|
+
<SidebarLink active icon={<Icons.Home/>} shortcut={<Kbd>⌥D</Kbd>}>Dashboard</SidebarLink>
|
|
59
|
+
<SidebarLink icon={<Icons.Activity/>} shortcut={<Kbd>⌥P</Kbd>}>Pipeline</SidebarLink>
|
|
60
|
+
<SidebarLink icon={<Icons.Usage/>} shortcut={<Kbd>⌥T</Kbd>}>Painel de Equipe</SidebarLink>
|
|
61
|
+
<SidebarLink icon={<Icons.Docs/>} shortcut={<Kbd>⌥F</Kbd>}>Financeiro</SidebarLink>
|
|
62
|
+
|
|
63
|
+
<SidebarSection>Compartilhados</SidebarSection>
|
|
64
|
+
<SidebarLink icon={<AvatarSpace name="Z" spaceKey="zark" size={18}/>}>ZARK</SidebarLink>
|
|
65
|
+
<SidebarLink icon={<AvatarSpace name="V" spaceKey="vipcar" size={18}/>}>VIPCAR</SidebarLink>
|
|
66
|
+
<SidebarLink icon={<AvatarSpace name="L" spaceKey="limppe" size={18}/>}>LIMPPE TEC</SidebarLink>
|
|
67
|
+
</Sidebar>
|
|
68
|
+
|
|
69
|
+
{/* MAIN */}
|
|
70
|
+
<main style={{ padding: 32 }}>
|
|
71
|
+
|
|
72
|
+
{/* Header */}
|
|
73
|
+
<header style={{
|
|
74
|
+
display: 'flex', alignItems: 'center', justifyContent: 'space-between',
|
|
75
|
+
marginBottom: 32,
|
|
76
|
+
}}>
|
|
77
|
+
<div>
|
|
78
|
+
<div className="eyebrow">Hoje · 05 mai 2026</div>
|
|
79
|
+
<h1 style={{
|
|
80
|
+
fontFamily: 'var(--font-display)',
|
|
81
|
+
fontSize: 'var(--fs-3xl)',
|
|
82
|
+
fontWeight: 700, margin: 0, color: 'var(--ink-700)',
|
|
83
|
+
letterSpacing: 'var(--ls-tight)',
|
|
84
|
+
}}>Olá, Renan</h1>
|
|
85
|
+
</div>
|
|
86
|
+
<div style={{ display: 'flex', gap: 8, alignItems: 'center' }}>
|
|
87
|
+
<Segmented
|
|
88
|
+
value={tab}
|
|
89
|
+
onChange={setTab}
|
|
90
|
+
items={[
|
|
91
|
+
{ value: 'hoje', label: 'Hoje' },
|
|
92
|
+
{ value: 'semana', label: 'Semana' },
|
|
93
|
+
{ value: 'todas', label: 'Todas' },
|
|
94
|
+
]}
|
|
95
|
+
/>
|
|
96
|
+
<Button variant="primary" icon={<Icons.Plus size={14}/>} onClick={() => setModalOpen(true)}>
|
|
97
|
+
Nova Tarefa
|
|
98
|
+
</Button>
|
|
99
|
+
</div>
|
|
100
|
+
</header>
|
|
101
|
+
|
|
102
|
+
{/* Stats */}
|
|
103
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: 12, marginBottom: 24 }}>
|
|
104
|
+
<StatCard label="CONCLUÍDAS · SEMANA" value="8" sub="+18% vs anterior" iconColor="green" icon={<Icons.Check size={14}/>}/>
|
|
105
|
+
<StatCard label="CRIADAS · SEMANA" value="19" sub="média 2.7/dia" iconColor="orange" icon={<Icons.Plus size={14}/>}/>
|
|
106
|
+
<StatCard label="ATIVAS · TOTAL" value="45" sub="12 esta semana" iconColor="blue" icon={<Icons.Activity size={14}/>}/>
|
|
107
|
+
<StatCard label="ATRASADAS" value="8" sub="requer ação imediata" iconColor="red" icon={<Icons.Warning size={14}/>} critical/>
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
{/* Critical alert */}
|
|
111
|
+
<div style={{ marginBottom: 32 }}>
|
|
112
|
+
<AlertCritical
|
|
113
|
+
title="8 tarefas em atraso"
|
|
114
|
+
items={[
|
|
115
|
+
{ tag: <TagDot kind="priority" value="urgent">URGENTE</TagDot>, label: 'Enviar proposta para TR PAULO', source: 'ZARK · Tarefas', meta: '3 dias' },
|
|
116
|
+
{ tag: <TagDot kind="priority" value="urgent">URGENTE</TagDot>, label: 'CHAMANDO O HEXA!', source: 'VIPCAR · Acompanhamento', meta: '3 dias' },
|
|
117
|
+
]}
|
|
118
|
+
footer="+ 6 outras tarefas atrasadas"
|
|
119
|
+
/>
|
|
120
|
+
</div>
|
|
121
|
+
|
|
122
|
+
{/* Pipeline funnel */}
|
|
123
|
+
<Panel title="Funil de Vendas" kicker="Pipeline · maio">
|
|
124
|
+
<Funnel stages={[
|
|
125
|
+
{ label: 'Novo', count: 0, color: '#3b82f6', percent: 0 },
|
|
126
|
+
{ label: 'Qualificando', count: 4, color: '#7c3aed', percent: 36 },
|
|
127
|
+
{ label: 'Reunião', count: 1, color: 'var(--ember-500)', percent: 18 },
|
|
128
|
+
{ label: 'Proposta', count: 0, color: '#06b6d4', percent: 0 },
|
|
129
|
+
{ label: 'Won', count: 0, color: 'var(--success-500)', percent: 0 },
|
|
130
|
+
{ label: 'Perdido', count: 0, color: 'var(--ink-300)', percent: 0 },
|
|
131
|
+
]}/>
|
|
132
|
+
</Panel>
|
|
133
|
+
|
|
134
|
+
<div style={{ height: 24 }}/>
|
|
135
|
+
|
|
136
|
+
{/* Filter chips + Kanban */}
|
|
137
|
+
<Chips
|
|
138
|
+
value={filter}
|
|
139
|
+
onChange={setFilter}
|
|
140
|
+
items={[
|
|
141
|
+
{ value: 'todas', label: 'TODAS', count: 7 },
|
|
142
|
+
{ value: 'urgentes', label: 'URGENTES', count: 4 },
|
|
143
|
+
{ value: 'paradas', label: 'PARADAS', count: 5 },
|
|
144
|
+
]}
|
|
145
|
+
/>
|
|
146
|
+
|
|
147
|
+
<div style={{ height: 16 }}/>
|
|
148
|
+
|
|
149
|
+
<KanbanBoard>
|
|
150
|
+
<KanbanColumn title="A FAZER" count={3} dotColor="#9a6500" onAddClick={() => alert('Nova tarefa')}>
|
|
151
|
+
<LeadCard
|
|
152
|
+
hot
|
|
153
|
+
name="Tiffany Dias"
|
|
154
|
+
status={<TagDot kind="status" value="paused">PARADO</TagDot>}
|
|
155
|
+
channels={<><Icons.Bell size={12}/><Icons.Globe size={12}/></>}
|
|
156
|
+
time="5d"
|
|
157
|
+
indicator="Indicado por Karol"
|
|
158
|
+
paused
|
|
159
|
+
/>
|
|
160
|
+
</KanbanColumn>
|
|
161
|
+
|
|
162
|
+
<KanbanColumn title="EM PROGRESSO" count={1} dotColor="var(--ember-500)" onAddClick={() => {}}>
|
|
163
|
+
<LeadCard
|
|
164
|
+
hot
|
|
165
|
+
name="Paulo Turismo"
|
|
166
|
+
company="TR PAULO"
|
|
167
|
+
status={<TagDot kind="status" value="paused">PARADO</TagDot>}
|
|
168
|
+
channels={<Icons.Bell size={12}/>}
|
|
169
|
+
time="5d"
|
|
170
|
+
followUp="Follow-up: 27/04/2026"
|
|
171
|
+
indicator="Indicado por Gustavo"
|
|
172
|
+
paused
|
|
173
|
+
/>
|
|
174
|
+
</KanbanColumn>
|
|
175
|
+
|
|
176
|
+
<KanbanColumn title="EM REVISÃO" count={0} dotColor="var(--info-500)" onAddClick={() => {}}>
|
|
177
|
+
<EmptyState text="Arraste tarefas aqui" style={{ minHeight: 120 }}/>
|
|
178
|
+
</KanbanColumn>
|
|
179
|
+
</KanbanBoard>
|
|
180
|
+
|
|
181
|
+
<div style={{ height: 32 }}/>
|
|
182
|
+
|
|
183
|
+
{/* Inputs / settings demo */}
|
|
184
|
+
<Panel title="Inputs & controles">
|
|
185
|
+
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 12, alignItems: 'center', marginBottom: 16 }}>
|
|
186
|
+
<Input size="sm" placeholder="Buscar tarefas..." icon={<Icons.Search size={14}/>} suffix={<Kbd>⌘K</Kbd>}/>
|
|
187
|
+
<Toggle on={stealth} onChange={setStealth}/>
|
|
188
|
+
<span style={{ fontSize: 'var(--fs-md)', color: 'var(--ink-600)' }}>Modo stealth</span>
|
|
189
|
+
<Tag tone="ember" size="sm">NEW</Tag>
|
|
190
|
+
</div>
|
|
191
|
+
|
|
192
|
+
<div style={{ display: 'flex', gap: 8 }}>
|
|
193
|
+
<Button variant="primary" icon={<Icons.Plus size={14}/>}>Novo Lead</Button>
|
|
194
|
+
<Button variant="secondary" icon={<Icons.Filter size={14}/>}>Filtrar</Button>
|
|
195
|
+
<Button variant="soft" icon={<Icons.Sparkles size={14}/>}>Try with AI</Button>
|
|
196
|
+
<Button variant="ghost" icon={<Icons.Help size={14}/>}>Help</Button>
|
|
197
|
+
</div>
|
|
198
|
+
|
|
199
|
+
<Spec label="Heights" value="22 / 28 / 32 / 40 px"/>
|
|
200
|
+
<Spec label="Primary fill" value="ember-600 → ember-700 hover"/>
|
|
201
|
+
</Panel>
|
|
202
|
+
|
|
203
|
+
<div style={{ height: 32 }}/>
|
|
204
|
+
|
|
205
|
+
{/* Toast */}
|
|
206
|
+
<Toast tone="default" icon={<img src={iconZark} alt="ZARK" style={{ height: 14, filter: 'brightness(0) invert(1)' }}/>}>
|
|
207
|
+
Welcome to ZARK!
|
|
208
|
+
</Toast>
|
|
209
|
+
|
|
210
|
+
{/* Modal */}
|
|
211
|
+
<Modal
|
|
212
|
+
open={modalOpen}
|
|
213
|
+
onClose={() => setModalOpen(false)}
|
|
214
|
+
title="Vamos começar"
|
|
215
|
+
description="Complete essas ações pra ganhar créditos bônus."
|
|
216
|
+
footer={
|
|
217
|
+
<>
|
|
218
|
+
<Button variant="ghost" onClick={() => setModalOpen(false)}>Cancelar</Button>
|
|
219
|
+
<Button variant="primary" onClick={() => setModalOpen(false)}>Continuar</Button>
|
|
220
|
+
</>
|
|
221
|
+
}
|
|
222
|
+
>
|
|
223
|
+
<p style={{ margin: 0, color: 'var(--ink-500)' }}>Conteúdo do modal aqui.</p>
|
|
224
|
+
</Modal>
|
|
225
|
+
|
|
226
|
+
</main>
|
|
227
|
+
</div>
|
|
228
|
+
);
|
|
229
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* AlertCritical — banner pleno vermelho pra ação imediata
|
|
5
|
+
* Padrão derivado do "8 TAREFAS EM ATRASO" do dashboard.
|
|
6
|
+
*
|
|
7
|
+
* @param title string ou ReactNode (renderizado no header)
|
|
8
|
+
* @param items [{ tag, label, source, meta }]
|
|
9
|
+
* @param footer string (ex: "+ 4 outras tarefas atrasadas")
|
|
10
|
+
* @param icon opcional — default usa um ⚠
|
|
11
|
+
*/
|
|
12
|
+
export function AlertCritical({ title, items = [], footer, icon, onItemClick }) {
|
|
13
|
+
return (
|
|
14
|
+
<div className="alert-critical">
|
|
15
|
+
<div className="alert-critical-head">
|
|
16
|
+
{icon || (
|
|
17
|
+
<svg width="14" height="14" viewBox="0 0 18 18" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round">
|
|
18
|
+
<path d="M9 2L1 15h16L9 2zM9 7v4M9 13v0.5"/>
|
|
19
|
+
</svg>
|
|
20
|
+
)}
|
|
21
|
+
{title}
|
|
22
|
+
</div>
|
|
23
|
+
<div className="alert-critical-list">
|
|
24
|
+
{items.map((it, i) => (
|
|
25
|
+
<div
|
|
26
|
+
key={i}
|
|
27
|
+
className="alert-critical-row"
|
|
28
|
+
onClick={() => onItemClick?.(it, i)}
|
|
29
|
+
style={onItemClick ? { cursor: 'pointer' } : undefined}
|
|
30
|
+
>
|
|
31
|
+
{it.tag}
|
|
32
|
+
<span style={{ fontWeight: 500 }}>{it.label}</span>
|
|
33
|
+
<span className="src">{it.source}</span>
|
|
34
|
+
<span style={{ fontFamily: 'var(--font-mono)', fontWeight: 600 }}>{it.meta}</span>
|
|
35
|
+
</div>
|
|
36
|
+
))}
|
|
37
|
+
</div>
|
|
38
|
+
{footer && <div className="alert-critical-foot">{footer}</div>}
|
|
39
|
+
</div>
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export default AlertCritical;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Avatar — circle (default) ou square (square=true)
|
|
5
|
+
*
|
|
6
|
+
* @param name string — primeira letra é renderizada
|
|
7
|
+
* @param size number (px) default 24
|
|
8
|
+
* @param color CSS color default --ember-500
|
|
9
|
+
* @param square boolean — usa raio --r-sm em vez de 50%
|
|
10
|
+
* @param src string — se passada, renderiza <img>
|
|
11
|
+
*/
|
|
12
|
+
export function Avatar({ name, size = 24, color = 'var(--ember-500)', square = false, src, className = '', ...rest }) {
|
|
13
|
+
const cls = ['avatar', square && 'avatar-sq', className].filter(Boolean).join(' ');
|
|
14
|
+
const style = {
|
|
15
|
+
width: size,
|
|
16
|
+
height: size,
|
|
17
|
+
background: color,
|
|
18
|
+
fontSize: Math.round(size * 0.42),
|
|
19
|
+
...rest.style,
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
if (src) {
|
|
23
|
+
return <img src={src} alt={name || ''} className={cls} style={{ ...style, objectFit: 'cover' }}/>;
|
|
24
|
+
}
|
|
25
|
+
return <span className={cls} style={style}>{(name || '?').charAt(0).toUpperCase()}</span>;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* AvatarSpace — square avatar com cor fixa por espaço/cliente
|
|
30
|
+
* @param spaceKey 'zark' | 'allsec' | 'vipcar' | 'limppe' | 'gerais' | 'mixshop' | 'vipseg'
|
|
31
|
+
*/
|
|
32
|
+
export function AvatarSpace({ name, spaceKey = 'zark', size = 24 }) {
|
|
33
|
+
const color = `var(--space-${spaceKey})`;
|
|
34
|
+
return (
|
|
35
|
+
<span className="av-space" style={{ background: color, width: size, height: size, fontSize: Math.round(size * 0.46) }}>
|
|
36
|
+
{(name || spaceKey).charAt(0).toUpperCase()}
|
|
37
|
+
</span>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export default Avatar;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Badge — small notification counter
|
|
5
|
+
* @param tone 'ember' (default) | 'ink'
|
|
6
|
+
*/
|
|
7
|
+
export function Badge({ count, tone = 'ember', className = '', ...rest }) {
|
|
8
|
+
const cls = ['badge', tone === 'ink' && 'badge-ink', className].filter(Boolean).join(' ');
|
|
9
|
+
return <span className={cls} {...rest}>{count}</span>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export default Badge;
|