xertica-ui 1.1.0 → 1.2.1
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.ts +49 -7
- package/bin/generate-tokens.ts +230 -0
- package/contexts/BrandColorsContext.tsx +55 -389
- package/contexts/theme-data.ts +340 -0
- package/dist/cli.js +528 -2
- package/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -9,6 +9,498 @@ import fs from "fs-extra";
|
|
|
9
9
|
import path from "path";
|
|
10
10
|
import { fileURLToPath } from "url";
|
|
11
11
|
import { execa } from "execa";
|
|
12
|
+
|
|
13
|
+
// contexts/theme-data.ts
|
|
14
|
+
var colorThemes = [
|
|
15
|
+
{
|
|
16
|
+
id: "xertica-original",
|
|
17
|
+
name: "Xertica Original",
|
|
18
|
+
description: "A identidade visual cl\xE1ssica da Xertica com o gradiente original",
|
|
19
|
+
colors: {
|
|
20
|
+
primary: "#2C275B",
|
|
21
|
+
primaryForeground: "#FFFFFF",
|
|
22
|
+
primaryLight: "#5B568F",
|
|
23
|
+
primaryDarkMode: "#72CDFD",
|
|
24
|
+
primaryForegroundDark: "#09090B",
|
|
25
|
+
sidebarLight: "#2C275B",
|
|
26
|
+
// Primary Color
|
|
27
|
+
sidebarDark: "#1a1928",
|
|
28
|
+
// Original Dark BG
|
|
29
|
+
gradientStart: "#FDB0F2",
|
|
30
|
+
gradientEnd: "#72CDFD",
|
|
31
|
+
gradientStartDark: "#7B4A7A",
|
|
32
|
+
gradientEndDark: "#3A5C7D",
|
|
33
|
+
chart1: "#2C275B",
|
|
34
|
+
chart2: "#FDB0F2",
|
|
35
|
+
chart3: "#72CDFD",
|
|
36
|
+
chart4: "#5B568F",
|
|
37
|
+
chart5: "#4F46E5"
|
|
38
|
+
},
|
|
39
|
+
preview: {
|
|
40
|
+
primary: "#2C275B",
|
|
41
|
+
secondary: "#FDB0F2",
|
|
42
|
+
accent: "#72CDFD"
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: "zinc",
|
|
47
|
+
name: "Zinc",
|
|
48
|
+
description: "Minimalista, s\xE9rio e elegante (Escala de Cinza)",
|
|
49
|
+
colors: {
|
|
50
|
+
primary: "#18181B",
|
|
51
|
+
primaryForeground: "#FAFAFA",
|
|
52
|
+
primaryLight: "#E4E4E7",
|
|
53
|
+
primaryDarkMode: "#FAFAFA",
|
|
54
|
+
primaryForegroundDark: "#18181B",
|
|
55
|
+
sidebarLight: "#18181B",
|
|
56
|
+
// Primary Color
|
|
57
|
+
sidebarDark: "#09090B",
|
|
58
|
+
gradientStart: "#52525B",
|
|
59
|
+
gradientEnd: "#D4D4D8",
|
|
60
|
+
gradientStartDark: "#27272A",
|
|
61
|
+
gradientEndDark: "#52525B",
|
|
62
|
+
chart1: "#18181B",
|
|
63
|
+
chart2: "#52525B",
|
|
64
|
+
chart3: "#A1A1AA",
|
|
65
|
+
chart4: "#D4D4D8",
|
|
66
|
+
chart5: "#E4E4E7"
|
|
67
|
+
},
|
|
68
|
+
preview: {
|
|
69
|
+
primary: "#18181B",
|
|
70
|
+
secondary: "#52525B",
|
|
71
|
+
accent: "#E4E4E7"
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: "slate",
|
|
76
|
+
name: "Slate",
|
|
77
|
+
description: "Profissional com tons de azul acinzentado",
|
|
78
|
+
colors: {
|
|
79
|
+
primary: "#0F172A",
|
|
80
|
+
primaryForeground: "#F8FAFC",
|
|
81
|
+
primaryLight: "#CBD5E1",
|
|
82
|
+
primaryDarkMode: "#F8FAFC",
|
|
83
|
+
primaryForegroundDark: "#0F172A",
|
|
84
|
+
sidebarLight: "#0F172A",
|
|
85
|
+
// Primary Color
|
|
86
|
+
sidebarDark: "#020617",
|
|
87
|
+
gradientStart: "#475569",
|
|
88
|
+
gradientEnd: "#94A3B8",
|
|
89
|
+
gradientStartDark: "#1E293B",
|
|
90
|
+
gradientEndDark: "#475569",
|
|
91
|
+
chart1: "#0F172A",
|
|
92
|
+
chart2: "#475569",
|
|
93
|
+
chart3: "#94A3B8",
|
|
94
|
+
chart4: "#CBD5E1",
|
|
95
|
+
chart5: "#E2E8F0"
|
|
96
|
+
},
|
|
97
|
+
preview: {
|
|
98
|
+
primary: "#0F172A",
|
|
99
|
+
secondary: "#475569",
|
|
100
|
+
accent: "#94A3B8"
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: "blue",
|
|
105
|
+
name: "Blue",
|
|
106
|
+
description: "Confi\xE1vel e seguro, padr\xE3o corporativo",
|
|
107
|
+
colors: {
|
|
108
|
+
primary: "#2563EB",
|
|
109
|
+
primaryForeground: "#FFFFFF",
|
|
110
|
+
primaryLight: "#DBEAFE",
|
|
111
|
+
primaryDarkMode: "#3B82F6",
|
|
112
|
+
primaryForegroundDark: "#FFFFFF",
|
|
113
|
+
sidebarLight: "#1E3A8A",
|
|
114
|
+
// Blue 900 (High Contrast Sidebar)
|
|
115
|
+
sidebarDark: "#172554",
|
|
116
|
+
gradientStart: "#2563EB",
|
|
117
|
+
gradientEnd: "#60A5FA",
|
|
118
|
+
gradientStartDark: "#1D4ED8",
|
|
119
|
+
gradientEndDark: "#2563EB",
|
|
120
|
+
chart1: "#2563EB",
|
|
121
|
+
chart2: "#3B82F6",
|
|
122
|
+
chart3: "#60A5FA",
|
|
123
|
+
chart4: "#93C5FD",
|
|
124
|
+
chart5: "#BFDBFE"
|
|
125
|
+
},
|
|
126
|
+
preview: {
|
|
127
|
+
primary: "#2563EB",
|
|
128
|
+
secondary: "#60A5FA",
|
|
129
|
+
accent: "#DBEAFE"
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
id: "violet",
|
|
134
|
+
name: "Violet",
|
|
135
|
+
description: "Criativo e vibrante",
|
|
136
|
+
colors: {
|
|
137
|
+
primary: "#7C3AED",
|
|
138
|
+
primaryForeground: "#FFFFFF",
|
|
139
|
+
primaryLight: "#EDE9FE",
|
|
140
|
+
primaryDarkMode: "#8B5CF6",
|
|
141
|
+
primaryForegroundDark: "#FFFFFF",
|
|
142
|
+
sidebarLight: "#4C1D95",
|
|
143
|
+
// Violet 900 (High Contrast Sidebar)
|
|
144
|
+
sidebarDark: "#2E1065",
|
|
145
|
+
gradientStart: "#7C3AED",
|
|
146
|
+
gradientEnd: "#A78BFA",
|
|
147
|
+
gradientStartDark: "#5B21B6",
|
|
148
|
+
gradientEndDark: "#7C3AED",
|
|
149
|
+
chart1: "#7C3AED",
|
|
150
|
+
chart2: "#8B5CF6",
|
|
151
|
+
chart3: "#A78BFA",
|
|
152
|
+
chart4: "#C4B5FD",
|
|
153
|
+
chart5: "#DDD6FE"
|
|
154
|
+
},
|
|
155
|
+
preview: {
|
|
156
|
+
primary: "#7C3AED",
|
|
157
|
+
secondary: "#A78BFA",
|
|
158
|
+
accent: "#EDE9FE"
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
id: "rose",
|
|
163
|
+
name: "Rose",
|
|
164
|
+
description: "Elegante e suave",
|
|
165
|
+
colors: {
|
|
166
|
+
primary: "#BE123C",
|
|
167
|
+
// Rose 700 (Better text contrast for Primary)
|
|
168
|
+
primaryForeground: "#FFFFFF",
|
|
169
|
+
primaryLight: "#FFE4E6",
|
|
170
|
+
primaryDarkMode: "#F43F5E",
|
|
171
|
+
primaryForegroundDark: "#FFFFFF",
|
|
172
|
+
sidebarLight: "#881337",
|
|
173
|
+
// Rose 900 (High Contrast Sidebar)
|
|
174
|
+
sidebarDark: "#881337",
|
|
175
|
+
gradientStart: "#E11D48",
|
|
176
|
+
gradientEnd: "#FB7185",
|
|
177
|
+
gradientStartDark: "#9F1239",
|
|
178
|
+
gradientEndDark: "#E11D48",
|
|
179
|
+
chart1: "#E11D48",
|
|
180
|
+
chart2: "#F43F5E",
|
|
181
|
+
chart3: "#FB7185",
|
|
182
|
+
chart4: "#FDA4AF",
|
|
183
|
+
chart5: "#FECDD3"
|
|
184
|
+
},
|
|
185
|
+
preview: {
|
|
186
|
+
primary: "#BE123C",
|
|
187
|
+
secondary: "#FB7185",
|
|
188
|
+
accent: "#FFE4E6"
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
id: "emerald",
|
|
193
|
+
name: "Emerald",
|
|
194
|
+
description: "Natural e equilibrado",
|
|
195
|
+
colors: {
|
|
196
|
+
primary: "#047857",
|
|
197
|
+
// Emerald 700 (Better text contrast for Primary)
|
|
198
|
+
primaryForeground: "#FFFFFF",
|
|
199
|
+
primaryLight: "#D1FAE5",
|
|
200
|
+
primaryDarkMode: "#10B981",
|
|
201
|
+
primaryForegroundDark: "#FFFFFF",
|
|
202
|
+
sidebarLight: "#064E3B",
|
|
203
|
+
// Emerald 900 (High Contrast Sidebar)
|
|
204
|
+
sidebarDark: "#064E3B",
|
|
205
|
+
gradientStart: "#059669",
|
|
206
|
+
gradientEnd: "#34D399",
|
|
207
|
+
gradientStartDark: "#064E3B",
|
|
208
|
+
gradientEndDark: "#059669",
|
|
209
|
+
chart1: "#059669",
|
|
210
|
+
chart2: "#10B981",
|
|
211
|
+
chart3: "#34D399",
|
|
212
|
+
chart4: "#6EE7B7",
|
|
213
|
+
chart5: "#A7F3D0"
|
|
214
|
+
},
|
|
215
|
+
preview: {
|
|
216
|
+
primary: "#047857",
|
|
217
|
+
secondary: "#34D399",
|
|
218
|
+
accent: "#D1FAE5"
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
id: "amber",
|
|
223
|
+
name: "Amber",
|
|
224
|
+
description: "Quente e energ\xE9tico",
|
|
225
|
+
colors: {
|
|
226
|
+
primary: "#B45309",
|
|
227
|
+
// Amber 700 (Better text contrast for Primary)
|
|
228
|
+
primaryForeground: "#FFFFFF",
|
|
229
|
+
primaryLight: "#FEF3C7",
|
|
230
|
+
primaryDarkMode: "#F59E0B",
|
|
231
|
+
primaryForegroundDark: "#FFFFFF",
|
|
232
|
+
sidebarLight: "#78350F",
|
|
233
|
+
// Amber 900 (High Contrast Sidebar)
|
|
234
|
+
sidebarDark: "#78350F",
|
|
235
|
+
gradientStart: "#D97706",
|
|
236
|
+
gradientEnd: "#FBBF24",
|
|
237
|
+
gradientStartDark: "#92400E",
|
|
238
|
+
gradientEndDark: "#D97706",
|
|
239
|
+
chart1: "#D97706",
|
|
240
|
+
chart2: "#F59E0B",
|
|
241
|
+
chart3: "#FBBF24",
|
|
242
|
+
chart4: "#FDE68A",
|
|
243
|
+
chart5: "#FEF3C7"
|
|
244
|
+
},
|
|
245
|
+
preview: {
|
|
246
|
+
primary: "#B45309",
|
|
247
|
+
secondary: "#FBBF24",
|
|
248
|
+
accent: "#FEF3C7"
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
id: "orange",
|
|
253
|
+
name: "Orange",
|
|
254
|
+
description: "Vibrante e amig\xE1vel",
|
|
255
|
+
colors: {
|
|
256
|
+
primary: "#C2410C",
|
|
257
|
+
// Orange 700 (Better text contrast for Primary)
|
|
258
|
+
primaryForeground: "#FFFFFF",
|
|
259
|
+
primaryLight: "#FFEDD5",
|
|
260
|
+
primaryDarkMode: "#F97316",
|
|
261
|
+
primaryForegroundDark: "#FFFFFF",
|
|
262
|
+
sidebarLight: "#7C2D12",
|
|
263
|
+
// Orange 900 (High Contrast Sidebar)
|
|
264
|
+
sidebarDark: "#7C2D12",
|
|
265
|
+
gradientStart: "#EA580C",
|
|
266
|
+
gradientEnd: "#FB923C",
|
|
267
|
+
gradientStartDark: "#9A3412",
|
|
268
|
+
gradientEndDark: "#EA580C",
|
|
269
|
+
chart1: "#EA580C",
|
|
270
|
+
chart2: "#F97316",
|
|
271
|
+
chart3: "#FB923C",
|
|
272
|
+
chart4: "#FDBA74",
|
|
273
|
+
chart5: "#FED7AA"
|
|
274
|
+
},
|
|
275
|
+
preview: {
|
|
276
|
+
primary: "#C2410C",
|
|
277
|
+
secondary: "#FB923C",
|
|
278
|
+
accent: "#FFEDD5"
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
];
|
|
282
|
+
|
|
283
|
+
// bin/generate-tokens.ts
|
|
284
|
+
var hexToRgbString = (hex) => {
|
|
285
|
+
hex = hex.replace(/^#/, "");
|
|
286
|
+
let r = 0, g = 0, b = 0;
|
|
287
|
+
if (hex.length === 3) {
|
|
288
|
+
r = parseInt(hex[0] + hex[0], 16);
|
|
289
|
+
g = parseInt(hex[1] + hex[1], 16);
|
|
290
|
+
b = parseInt(hex[2] + hex[2], 16);
|
|
291
|
+
} else if (hex.length === 6) {
|
|
292
|
+
r = parseInt(hex.substring(0, 2), 16);
|
|
293
|
+
g = parseInt(hex.substring(2, 4), 16);
|
|
294
|
+
b = parseInt(hex.substring(4, 6), 16);
|
|
295
|
+
}
|
|
296
|
+
return `${r}, ${g}, ${b}`;
|
|
297
|
+
};
|
|
298
|
+
var rgba = (hex, alpha = 1) => {
|
|
299
|
+
return `rgba(${hexToRgbString(hex)}, ${alpha})`;
|
|
300
|
+
};
|
|
301
|
+
var generateTokensCss = (theme) => {
|
|
302
|
+
const { colors } = theme;
|
|
303
|
+
return `/* ============================================
|
|
304
|
+
\u{1F3A8} TOKENS / VARIABLES (Generated by CLI)
|
|
305
|
+
============================================ */
|
|
306
|
+
|
|
307
|
+
:root,
|
|
308
|
+
:root[data-theme="default"] {
|
|
309
|
+
/* Brand Tokens - Source of Truth */
|
|
310
|
+
--xertica-primary: ${rgba(colors.primary)};
|
|
311
|
+
--xertica-dark: ${rgba(colors.sidebarDark)}; /* Approximating generic dark from sidebar dark if needed, or keeping static? */
|
|
312
|
+
|
|
313
|
+
/* Semantic Colors */
|
|
314
|
+
--background: rgba(255, 255, 255, 1);
|
|
315
|
+
--foreground: rgba(9, 9, 11, 1);
|
|
316
|
+
|
|
317
|
+
--card: rgba(255, 255, 255, 1);
|
|
318
|
+
--card-foreground: rgba(9, 9, 11, 1);
|
|
319
|
+
|
|
320
|
+
--popover: rgba(255, 255, 255, 1);
|
|
321
|
+
--popover-foreground: rgba(9, 9, 11, 1);
|
|
322
|
+
|
|
323
|
+
--primary: var(--xertica-primary);
|
|
324
|
+
--primary-foreground: ${rgba(colors.primaryForeground)};
|
|
325
|
+
--primary-light: ${rgba(colors.primary, 0.15)};
|
|
326
|
+
--primary-light-foreground: ${rgba(colors.primary)};
|
|
327
|
+
|
|
328
|
+
--secondary: rgba(244, 244, 245, 1);
|
|
329
|
+
--secondary-foreground: rgba(24, 24, 27, 1);
|
|
330
|
+
|
|
331
|
+
--muted: rgba(244, 244, 245, 1);
|
|
332
|
+
--muted-foreground: rgba(113, 113, 122, 1);
|
|
333
|
+
|
|
334
|
+
--accent: rgba(244, 244, 245, 1);
|
|
335
|
+
--accent-foreground: rgba(24, 24, 27, 1);
|
|
336
|
+
|
|
337
|
+
--destructive: rgba(239, 68, 68, 1);
|
|
338
|
+
--destructive-foreground: rgba(250, 250, 250, 1);
|
|
339
|
+
|
|
340
|
+
--border: rgba(228, 228, 231, 1);
|
|
341
|
+
--input: rgba(244, 244, 245, 0.5);
|
|
342
|
+
--input-background: rgba(244, 244, 245, 0.5);
|
|
343
|
+
--ring: ${rgba(colors.primary, 0.5)}; /* Adjusted to match brand somewhat */
|
|
344
|
+
|
|
345
|
+
/* Sidebar */
|
|
346
|
+
--sidebar: ${rgba(colors.sidebarLight)};
|
|
347
|
+
--sidebar-foreground: ${colors.sidebarLight.toLowerCase() === "#ffffff" ? "rgba(15, 23, 42, 1)" : "rgba(250, 250, 250, 1)"};
|
|
348
|
+
--sidebar-primary: ${colors.sidebarLight.toLowerCase() === "#ffffff" ? rgba(colors.primary) : "rgba(255, 255, 255, 1)"};
|
|
349
|
+
--sidebar-primary-foreground: ${colors.sidebarLight.toLowerCase() === "#ffffff" ? rgba(colors.primaryForeground) : rgba(colors.primary)}; /* Actually if sidebar is dark, primary item usually white? */
|
|
350
|
+
/* Replicating logic from Context roughly or sticking to safe defaults */
|
|
351
|
+
/* Context Logic:
|
|
352
|
+
if !isSidebarLight:
|
|
353
|
+
primary: #FFFFFF
|
|
354
|
+
primaryFg: primary
|
|
355
|
+
*/
|
|
356
|
+
--sidebar-accent: ${rgba(colors.sidebarLight.toLowerCase() === "#ffffff" ? colors.primary : "#FFFFFF", 0.1)};
|
|
357
|
+
--sidebar-accent-foreground: ${colors.sidebarLight.toLowerCase() === "#ffffff" ? rgba(colors.primary) : "#FFFFFF"};
|
|
358
|
+
--sidebar-border: rgba(255, 255, 255, 0.1);
|
|
359
|
+
--sidebar-ring: ${rgba(colors.primary, 0.5)};
|
|
360
|
+
|
|
361
|
+
/* Charts */
|
|
362
|
+
--chart-1: ${rgba(colors.chart1)};
|
|
363
|
+
--chart-2: ${rgba(colors.chart2)};
|
|
364
|
+
--chart-3: ${rgba(colors.chart3)};
|
|
365
|
+
--chart-4: ${rgba(colors.chart4)};
|
|
366
|
+
--chart-5: ${rgba(colors.chart5)};
|
|
367
|
+
|
|
368
|
+
/* Gradients */
|
|
369
|
+
--gradient-diagonal: linear-gradient(135deg, ${colors.gradientStart} 0%, ${colors.gradientEnd} 100%);
|
|
370
|
+
|
|
371
|
+
/* Spacing & Radius */
|
|
372
|
+
--radius: 6px;
|
|
373
|
+
--radius-button: 12px;
|
|
374
|
+
--radius-card: 12px;
|
|
375
|
+
|
|
376
|
+
--elevation-sm: 0px 0px 48px 0px rgba(0, 0, 0, 0.1);
|
|
377
|
+
|
|
378
|
+
/* Typography */
|
|
379
|
+
--font-size: 16px;
|
|
380
|
+
--text-h1: 2rem;
|
|
381
|
+
--text-h2: 1.75rem;
|
|
382
|
+
--text-h3: 1.5rem;
|
|
383
|
+
--text-h4: 1.25rem;
|
|
384
|
+
--text-base: 1rem;
|
|
385
|
+
--text-p: 0.875rem;
|
|
386
|
+
--text-label: 0.875rem;
|
|
387
|
+
--text-small: 0.875rem;
|
|
388
|
+
--text-xs: 0.75rem;
|
|
389
|
+
--text-muted: 0.875rem;
|
|
390
|
+
--text-stats: 2.25rem;
|
|
391
|
+
--text-table-head: 1.25rem;
|
|
392
|
+
|
|
393
|
+
--font-weight-regular: 400;
|
|
394
|
+
--font-weight-medium: 500;
|
|
395
|
+
--font-weight-semibold: 600;
|
|
396
|
+
--font-weight-bold: 700;
|
|
397
|
+
--font-weight-extrabold: 800;
|
|
398
|
+
|
|
399
|
+
--spacing-1: 0.25rem;
|
|
400
|
+
--spacing-2: 0.5rem;
|
|
401
|
+
--spacing-3: 0.75rem;
|
|
402
|
+
--spacing-4: 1rem;
|
|
403
|
+
--spacing-5: 1.25rem;
|
|
404
|
+
--spacing-6: 1.5rem;
|
|
405
|
+
--spacing-8: 2rem;
|
|
406
|
+
|
|
407
|
+
/* Calendar */
|
|
408
|
+
--cell-size: 2.5rem;
|
|
409
|
+
--cell-radius: var(--radius);
|
|
410
|
+
--calendar-caption-size: 15px;
|
|
411
|
+
--calendar-weekday-size: 12px;
|
|
412
|
+
--calendar-day-size: 14px;
|
|
413
|
+
|
|
414
|
+
/* Toast - Success */
|
|
415
|
+
--toast-success-bg: rgba(220, 252, 231, 1);
|
|
416
|
+
--toast-success-border: rgba(5, 150, 105, 1);
|
|
417
|
+
--toast-success-icon: rgba(5, 150, 105, 1);
|
|
418
|
+
/* Toast - Warning */
|
|
419
|
+
--toast-warning-bg: rgba(254, 243, 199, 1);
|
|
420
|
+
--toast-warning-border: rgba(245, 158, 11, 1);
|
|
421
|
+
--toast-warning-icon: rgba(245, 158, 11, 1);
|
|
422
|
+
/* Toast - Info */
|
|
423
|
+
--toast-info-bg: rgba(219, 234, 254, 1);
|
|
424
|
+
--toast-info-border: rgba(37, 99, 235, 1);
|
|
425
|
+
--toast-info-icon: rgba(37, 99, 235, 1);
|
|
426
|
+
/* Toast - Error */
|
|
427
|
+
--toast-error-bg: rgba(254, 226, 226, 1);
|
|
428
|
+
--toast-error-border: rgba(239, 68, 68, 1);
|
|
429
|
+
--toast-error-icon: rgba(239, 68, 68, 1);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
:root[data-mode="dark"],
|
|
433
|
+
.dark {
|
|
434
|
+
/* Brand Tokens */
|
|
435
|
+
--xertica-primary: ${rgba(colors.primaryDarkMode)};
|
|
436
|
+
|
|
437
|
+
/* Semantic Colors */
|
|
438
|
+
--background: rgba(5, 5, 5, 1);
|
|
439
|
+
--foreground: rgba(250, 250, 250, 1);
|
|
440
|
+
|
|
441
|
+
--card: rgba(20, 20, 22, 1);
|
|
442
|
+
--card-foreground: rgba(250, 250, 250, 1);
|
|
443
|
+
|
|
444
|
+
--popover: rgba(20, 20, 22, 1);
|
|
445
|
+
--popover-foreground: rgba(250, 250, 250, 1);
|
|
446
|
+
|
|
447
|
+
--primary-foreground: ${rgba(colors.primaryForegroundDark)};
|
|
448
|
+
--primary-light: ${rgba(colors.primaryDarkMode, 0.15)};
|
|
449
|
+
--primary-light-foreground: ${rgba(colors.primaryDarkMode)};
|
|
450
|
+
|
|
451
|
+
--secondary: rgba(39, 39, 42, 1);
|
|
452
|
+
--secondary-foreground: rgba(250, 250, 250, 1);
|
|
453
|
+
|
|
454
|
+
--muted: rgba(39, 39, 42, 1);
|
|
455
|
+
--muted-foreground: rgba(161, 161, 170, 1);
|
|
456
|
+
|
|
457
|
+
--accent: rgba(39, 39, 42, 1);
|
|
458
|
+
--accent-foreground: rgba(250, 250, 250, 1);
|
|
459
|
+
|
|
460
|
+
--destructive: rgba(239, 68, 68, 1);
|
|
461
|
+
--destructive-foreground: rgba(250, 250, 250, 1);
|
|
462
|
+
|
|
463
|
+
--border: rgba(63, 63, 70, 1);
|
|
464
|
+
--input: rgba(39, 39, 42, 0.5);
|
|
465
|
+
--input-background: rgba(39, 39, 42, 0.5);
|
|
466
|
+
--ring: ${rgba(colors.primaryDarkMode, 0.5)};
|
|
467
|
+
|
|
468
|
+
--elevation-sm: 0px 0px 48px 0px rgba(0, 0, 0, 0.3);
|
|
469
|
+
|
|
470
|
+
/* Sidebar */
|
|
471
|
+
--sidebar: ${rgba(colors.sidebarDark)};
|
|
472
|
+
--sidebar-foreground: rgba(250, 250, 250, 1);
|
|
473
|
+
--sidebar-primary: rgba(255, 255, 255, 1);
|
|
474
|
+
--sidebar-primary-foreground: ${rgba(colors.primary)}; /* Often primary brand color on dark background */
|
|
475
|
+
--sidebar-accent: rgba(63, 63, 70, 1);
|
|
476
|
+
--sidebar-accent-foreground: rgba(250, 250, 250, 1);
|
|
477
|
+
--sidebar-border: rgba(65, 61, 107, 1); /* Keeping subtle border */
|
|
478
|
+
--sidebar-ring: ${rgba(colors.primaryDarkMode, 0.5)};
|
|
479
|
+
|
|
480
|
+
/* Gradients */
|
|
481
|
+
--gradient-diagonal: linear-gradient(135deg, ${colors.gradientStartDark} 0%, ${colors.gradientEndDark} 100%);
|
|
482
|
+
|
|
483
|
+
/* Toast - Success */
|
|
484
|
+
--toast-success-bg: rgba(6, 78, 59, 1);
|
|
485
|
+
--toast-success-border: rgba(34, 197, 94, 1);
|
|
486
|
+
--toast-success-icon: rgba(34, 197, 94, 1);
|
|
487
|
+
/* Toast - Warning */
|
|
488
|
+
--toast-warning-bg: rgba(113, 63, 18, 1);
|
|
489
|
+
--toast-warning-border: rgba(251, 191, 36, 1);
|
|
490
|
+
--toast-warning-icon: rgba(251, 191, 36, 1);
|
|
491
|
+
/* Toast - Info */
|
|
492
|
+
--toast-info-bg: rgba(30, 58, 138, 1);
|
|
493
|
+
--toast-info-border: rgba(96, 165, 250, 1);
|
|
494
|
+
--toast-info-icon: rgba(96, 165, 250, 1);
|
|
495
|
+
/* Toast - Error */
|
|
496
|
+
--toast-error-bg: rgba(127, 29, 29, 1);
|
|
497
|
+
--toast-error-border: rgba(248, 113, 113, 1);
|
|
498
|
+
--toast-error-icon: rgba(248, 113, 113, 1);
|
|
499
|
+
}
|
|
500
|
+
`;
|
|
501
|
+
};
|
|
502
|
+
|
|
503
|
+
// bin/cli.ts
|
|
12
504
|
var __filename = fileURLToPath(import.meta.url);
|
|
13
505
|
var __dirname = path.dirname(__filename);
|
|
14
506
|
var program = new Command();
|
|
@@ -20,7 +512,7 @@ program.command("init").description("Initialize a new Xertica UI project").argum
|
|
|
20
512
|
let componentChoices = [{ title: "All Components", value: "all", selected: true }];
|
|
21
513
|
if (await fs.pathExists(uiComponentsDir)) {
|
|
22
514
|
const files = await fs.readdir(uiComponentsDir);
|
|
23
|
-
const components = files.filter((f) => f.endsWith(".tsx") && !f.startsWith("index")).map((f) => ({ title: f.replace(".tsx", ""), value: f }));
|
|
515
|
+
const components = files.filter((f) => f.endsWith(".tsx") && !f.startsWith("index")).map((f) => ({ title: f.replace(".tsx", ""), value: f, selected: true }));
|
|
24
516
|
componentChoices = [
|
|
25
517
|
{ title: "All Components", value: "all", selected: true },
|
|
26
518
|
...components
|
|
@@ -32,7 +524,12 @@ program.command("init").description("Initialize a new Xertica UI project").argum
|
|
|
32
524
|
type: "multiselect",
|
|
33
525
|
name: "components",
|
|
34
526
|
message: "Which components would you like to include?",
|
|
35
|
-
choices: componentChoices
|
|
527
|
+
choices: componentChoices.length > 1 ? componentChoices : [
|
|
528
|
+
{ title: "All Components", value: "all", selected: true }
|
|
529
|
+
// Fetch components logic was above, I'll rely on existing code for that part
|
|
530
|
+
// and just insert my code around existing blocks in separate steps if needed.
|
|
531
|
+
// But replace_file_content requires me to match content.
|
|
532
|
+
],
|
|
36
533
|
hint: "- Space to select. Return to submit",
|
|
37
534
|
min: 1
|
|
38
535
|
},
|
|
@@ -46,6 +543,17 @@ program.command("init").description("Initialize a new Xertica UI project").argum
|
|
|
46
543
|
{ title: "Template Page", value: "template", selected: true }
|
|
47
544
|
]
|
|
48
545
|
},
|
|
546
|
+
{
|
|
547
|
+
type: "select",
|
|
548
|
+
name: "theme",
|
|
549
|
+
message: "Select the default color theme for your project:",
|
|
550
|
+
choices: colorThemes.map((t) => ({
|
|
551
|
+
title: t.name,
|
|
552
|
+
description: t.description,
|
|
553
|
+
value: t.id
|
|
554
|
+
})),
|
|
555
|
+
initial: 0
|
|
556
|
+
},
|
|
49
557
|
{
|
|
50
558
|
type: "confirm",
|
|
51
559
|
name: "install",
|
|
@@ -137,6 +645,24 @@ export default function App() {
|
|
|
137
645
|
});
|
|
138
646
|
}
|
|
139
647
|
}
|
|
648
|
+
if (response.theme) {
|
|
649
|
+
const contextPath = path.join(targetDir, "contexts", "BrandColorsContext.tsx");
|
|
650
|
+
if (await fs.pathExists(contextPath)) {
|
|
651
|
+
let content = await fs.readFile(contextPath, "utf8");
|
|
652
|
+
content = content.replace(
|
|
653
|
+
/return saved \|\| 'xertica-original';/,
|
|
654
|
+
`return saved || '${response.theme}';`
|
|
655
|
+
);
|
|
656
|
+
await fs.writeFile(contextPath, content);
|
|
657
|
+
}
|
|
658
|
+
const tokensPath = path.join(targetDir, "styles", "xertica", "tokens.css");
|
|
659
|
+
const selectedTheme = colorThemes.find((t) => t.id === response.theme);
|
|
660
|
+
if (selectedTheme) {
|
|
661
|
+
await fs.ensureDir(path.dirname(tokensPath));
|
|
662
|
+
const newTokensCss = generateTokensCss(selectedTheme);
|
|
663
|
+
await fs.writeFile(tokensPath, newTokensCss);
|
|
664
|
+
}
|
|
665
|
+
}
|
|
140
666
|
spinner.succeed("Project initialized successfully!");
|
|
141
667
|
if (response.install) {
|
|
142
668
|
const installSpinner = ora("Installing dependencies...").start();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xertica-ui",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "Xertica UI - Design System completo com componentes React e Tailwind CSS",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": "./dist/cli.js",
|
|
@@ -116,4 +116,4 @@
|
|
|
116
116
|
"typescript": "^5.7.2",
|
|
117
117
|
"vite": "^6.0.5"
|
|
118
118
|
}
|
|
119
|
-
}
|
|
119
|
+
}
|