@cryptotaxi247 / CoPilot / commits / 0a0a6e5a

Update template 2 (#394)

* refactor: updated template and design tokens * refactor: updated design tokens --------- Co-authored-by: Davide Di Modica <webmaster.ddm@gmail.com>

taylor_socfortress committed Jan 16, 2025 at 08:41 UTC 0a0a6e5aa42cd8df111afde6416b5a39c24ccf3f
105 files changed +1814 -3552
frontend/cypress/e2e/example.cy.ts
+1 -1
@@ -3,6 +3,6 @@
3 describe("My First Test", () => {
4 it("visits the app root url", () => {
5 cy.visit("/")
6 - cy.contains(".title", "SOCFortress CoPilot")
6 + cy.contains(`[data-test="login-title"]`, "SOCFortress CoPilot")
7 })
8 })
frontend/figma-tokens.json
+208 -1332
@@ -1,6 +1,6 @@
1 {
2 "global": {
3 - "border-radius-base": {
3 + "border-radius-default": {
4 "value": "8px",
5 "type": "borderRadius"
6 },
@@ -8,11 +8,11 @@
8 "value": "4px",
9 "type": "borderRadius"
10 },
11 - "line-heights-base": {
12 - "value": "1.35",
11 + "line-heights-default": {
12 + "value": "1.25",
13 "type": "lineHeights"
14 },
15 - "font-sizes-base": {
15 + "font-sizes-default": {
16 "value": "16px",
17 "type": "fontSizes"
18 },
@@ -20,7 +20,19 @@
20 "value": "18px",
21 "type": "fontSizes"
22 },
23 - "font-families-base": {
23 + "font-weights-default": {
24 + "value": "400",
25 + "type": "fontWeights"
26 + },
27 + "font-weights-strong": {
28 + "value": "600",
29 + "type": "fontWeights"
30 + },
31 + "font-weights-card-title": {
32 + "value": "600",
33 + "type": "fontWeights"
34 + },
35 + "font-families-default": {
36 "value": "'Public Sans', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'",
37 "type": "fontFamilies"
38 },
@@ -33,1493 +45,357 @@
45 "type": "fontFamilies"
46 },
47 "color-light-sidebar-background": {
36 - "value": "#ffffff",
48 + "value": "rgb(255, 255, 255)",
49 "type": "color"
50 },
51 "color-light-body-background": {
40 - "value": "#f5f7f9",
52 + "value": "rgb(245, 247, 249)",
53 "type": "color"
54 },
55 "color-light-text": {
44 - "value": "#000000",
56 + "value": "rgb(0, 0, 0)",
57 "type": "color"
58 },
59 "color-light-text-secondary": {
48 - "value": "#495465",
49 - "type": "color"
50 - },
51 - "color-light-background": {
52 - "value": "#ffffff",
53 - "type": "color"
54 - },
55 - "color-light-background-secondary": {
56 - "value": "#fafbfc",
57 - "type": "color"
58 - },
59 - "color-light-primary": {
60 - "value": "rgb(255, 182, 0)",
61 - "type": "color"
62 - },
63 - "color-light-primary-005": {
64 - "value": "rgba(255, 182, 0, 0.05)",
65 - "type": "color"
66 - },
67 - "color-light-primary-010": {
68 - "value": "rgba(255, 182, 0, 0.1)",
69 - "type": "color"
70 - },
71 - "color-light-primary-015": {
72 - "value": "rgba(255, 182, 0, 0.15)",
73 - "type": "color"
74 - },
75 - "color-light-primary-020": {
76 - "value": "rgba(255, 182, 0, 0.2)",
77 - "type": "color"
78 - },
79 - "color-light-primary-030": {
80 - "value": "rgba(255, 182, 0, 0.3)",
60 + "value": "rgb(73, 84, 101)",
61 "type": "color"
62 },
83 - "color-light-primary-040": {
84 - "value": "rgba(255, 182, 0, 0.4)",
63 + "color-light-text-tertiary": {
64 + "value": "rgb(114, 115, 115)",
65 "type": "color"
66 },
87 - "color-light-primary-050": {
88 - "value": "rgba(255, 182, 0, 0.5)",
67 + "color-light-background": {
68 + "value": "rgb(255, 255, 255)",
69 "type": "color"
70 },
91 - "color-light-primary-060": {
92 - "value": "rgba(255, 182, 0, 0.6)",
71 + "color-light-background-secondary": {
72 + "value": "rgb(250, 251, 252)",
73 "type": "color"
74 },
95 - "color-light-primary-070": {
96 - "value": "rgba(255, 182, 0, 0.7)",
75 + "color-light-border": {
76 + "value": "rgb(226, 230, 233)",
77 "type": "color"
78 },
99 - "color-light-primary-080": {
100 - "value": "rgba(255, 182, 0, 0.8)",
79 + "color-light-hover": {
80 + "value": "rgba(221, 224, 225, 0.5)",
81 "type": "color"
82 },
103 - "color-light-primary-090": {
104 - "value": "rgba(255, 182, 0, 0.9)",
83 + "color-light-primary": {
84 + "value": "rgb(255, 182, 0)",
85 "type": "color"
86 },
87 "color-light-info": {
108 - "value": "#6267FF",
88 + "value": "rgb(98, 103, 255)",
89 "type": "color"
90 },
91 "color-light-success": {
112 - "value": "#00B27B",
92 + "value": "rgb(0, 178, 123)",
93 "type": "color"
94 },
95 "color-light-warning": {
116 - "value": "#E3C22F",
96 + "value": "rgb(227, 194, 47)",
97 "type": "color"
98 },
99 "color-light-error": {
120 - "value": "#FF0156",
121 - "type": "color"
122 - },
123 - "color-light-info-005": {
124 - "value": "rgba(98, 103, 255, 0.05)",
125 - "type": "color"
126 - },
127 - "color-light-info-010": {
128 - "value": "rgba(98, 103, 255, 0.1)",
129 - "type": "color"
130 - },
131 - "color-light-info-020": {
132 - "value": "rgba(98, 103, 255, 0.2)",
133 - "type": "color"
134 - },
135 - "color-light-info-030": {
136 - "value": "rgba(98, 103, 255, 0.3)",
137 - "type": "color"
138 - },
139 - "color-light-info-040": {
140 - "value": "rgba(98, 103, 255, 0.4)",
141 - "type": "color"
142 - },
143 - "color-light-info-050": {
144 - "value": "rgba(98, 103, 255, 0.5)",
145 - "type": "color"
146 - },
147 - "color-light-info-060": {
148 - "value": "rgba(98, 103, 255, 0.6)",
149 - "type": "color"
150 - },
151 - "color-light-info-070": {
152 - "value": "rgba(98, 103, 255, 0.7)",
153 - "type": "color"
154 - },
155 - "color-light-info-080": {
156 - "value": "rgba(98, 103, 255, 0.8)",
157 - "type": "color"
158 - },
159 - "color-light-info-090": {
160 - "value": "rgba(98, 103, 255, 0.9)",
161 - "type": "color"
162 - },
163 - "color-light-success-005": {
164 - "value": "rgba(0, 178, 123, 0.05)",
165 - "type": "color"
166 - },
167 - "color-light-success-010": {
168 - "value": "rgba(0, 178, 123, 0.1)",
169 - "type": "color"
170 - },
171 - "color-light-success-020": {
172 - "value": "rgba(0, 178, 123, 0.2)",
173 - "type": "color"
174 - },
175 - "color-light-success-030": {
176 - "value": "rgba(0, 178, 123, 0.3)",
177 - "type": "color"
178 - },
179 - "color-light-success-040": {
180 - "value": "rgba(0, 178, 123, 0.4)",
181 - "type": "color"
182 - },
183 - "color-light-success-050": {
184 - "value": "rgba(0, 178, 123, 0.5)",
185 - "type": "color"
186 - },
187 - "color-light-success-060": {
188 - "value": "rgba(0, 178, 123, 0.6)",
189 - "type": "color"
190 - },
191 - "color-light-success-070": {
192 - "value": "rgba(0, 178, 123, 0.7)",
193 - "type": "color"
194 - },
195 - "color-light-success-080": {
196 - "value": "rgba(0, 178, 123, 0.8)",
197 - "type": "color"
198 - },
199 - "color-light-success-090": {
200 - "value": "rgba(0, 178, 123, 0.9)",
201 - "type": "color"
202 - },
203 - "color-light-warning-005": {
204 - "value": "rgba(227, 194, 47, 0.05)",
205 - "type": "color"
206 - },
207 - "color-light-warning-010": {
208 - "value": "rgba(227, 194, 47, 0.1)",
209 - "type": "color"
210 - },
211 - "color-light-warning-020": {
212 - "value": "rgba(227, 194, 47, 0.2)",
213 - "type": "color"
214 - },
215 - "color-light-warning-030": {
216 - "value": "rgba(227, 194, 47, 0.3)",
217 - "type": "color"
218 - },
219 - "color-light-warning-040": {
220 - "value": "rgba(227, 194, 47, 0.4)",
221 - "type": "color"
222 - },
223 - "color-light-warning-050": {
224 - "value": "rgba(227, 194, 47, 0.5)",
100 + "value": "rgb(255, 1, 86)",
101 "type": "color"
102 },
227 - "color-light-warning-060": {
228 - "value": "rgba(227, 194, 47, 0.6)",
103 + "color-light-extra-1": {
104 + "value": "rgb(98, 103, 255)",
105 "type": "color"
106 },
231 - "color-light-warning-070": {
232 - "value": "rgba(227, 194, 47, 0.7)",
107 + "color-light-extra-2": {
108 + "value": "rgb(255, 97, 201)",
109 "type": "color"
110 },
235 - "color-light-warning-080": {
236 - "value": "rgba(227, 194, 47, 0.8)",
111 + "color-light-extra-3": {
112 + "value": "rgb(227, 194, 47)",
113 "type": "color"
114 },
239 - "color-light-warning-090": {
240 - "value": "rgba(227, 194, 47, 0.9)",
115 + "color-light-extra-4": {
116 + "value": "rgb(255, 1, 86)",
117 "type": "color"
118 },
243 - "color-light-error-005": {
244 - "value": "rgba(255, 1, 86, 0.05)",
119 + "color-dark-sidebar-background": {
120 + "value": "rgb(29, 31, 37)",
121 "type": "color"
122 },
247 - "color-light-error-010": {
248 - "value": "rgba(255, 1, 86, 0.1)",
123 + "color-dark-body-background": {
124 + "value": "rgb(20, 22, 26)",
125 "type": "color"
126 },
251 - "color-light-error-020": {
252 - "value": "rgba(255, 1, 86, 0.2)",
127 + "color-dark-text": {
128 + "value": "rgb(255, 255, 255)",
129 "type": "color"
130 },
255 - "color-light-error-030": {
256 - "value": "rgba(255, 1, 86, 0.3)",
131 + "color-dark-text-secondary": {
132 + "value": "rgb(172, 181, 190)",
133 "type": "color"
134 },
259 - "color-light-error-040": {
260 - "value": "rgba(255, 1, 86, 0.4)",
135 + "color-dark-text-tertiary": {
136 + "value": "rgb(172, 181, 190)",
137 "type": "color"
138 },
263 - "color-light-error-050": {
264 - "value": "rgba(255, 1, 86, 0.5)",
139 + "color-dark-background": {
140 + "value": "rgb(38, 40, 45)",
141 "type": "color"
142 },
267 - "color-light-error-060": {
268 - "value": "rgba(255, 1, 86, 0.6)",
143 + "color-dark-background-secondary": {
144 + "value": "rgb(29, 31, 37)",
145 "type": "color"
146 },
271 - "color-light-error-070": {
272 - "value": "rgba(255, 1, 86, 0.7)",
147 + "color-dark-border": {
148 + "value": "rgb(70, 71, 79)",
149 "type": "color"
150 },
275 - "color-light-error-080": {
276 - "value": "rgba(255, 1, 86, 0.8)",
151 + "color-dark-hover": {
152 + "value": "rgba(59, 61, 68, 0.5)",
153 "type": "color"
154 },
279 - "color-light-error-090": {
280 - "value": "rgba(255, 1, 86, 0.9)",
155 + "color-dark-primary": {
156 + "value": "rgb(255, 182, 0)",
157 "type": "color"
158 },
283 - "color-light-secondary-1": {
159 + "color-dark-info": {
160 "value": "rgb(98, 103, 255)",
161 "type": "color"
162 },
287 - "color-light-secondary-1-opacity-005": {
288 - "value": "rgba(98, 103, 255, 0.05)",
163 + "color-dark-success": {
164 + "value": "rgb(0, 225, 155)",
165 "type": "color"
166 },
291 - "color-light-secondary-1-opacity-010": {
292 - "value": "rgba(98, 103, 255, 0.1)",
167 + "color-dark-warning": {
168 + "value": "rgb(227, 194, 47)",
169 "type": "color"
170 },
295 - "color-light-secondary-1-opacity-020": {
296 - "value": "rgba(98, 103, 255, 0.2)",
171 + "color-dark-error": {
172 + "value": "rgb(255, 1, 86)",
173 "type": "color"
174 },
299 - "color-light-secondary-1-opacity-030": {
300 - "value": "rgba(98, 103, 255, 0.3)",
175 + "color-dark-extra-1": {
176 + "value": "rgb(98, 103, 255)",
177 "type": "color"
178 },
303 - "color-light-secondary-2": {
179 + "color-dark-extra-2": {
180 "value": "rgb(255, 97, 201)",
181 "type": "color"
182 },
307 - "color-light-secondary-2-opacity-005": {
308 - "value": "rgba(255, 97, 201, 0.05)",
309 - "type": "color"
310 - },
311 - "color-light-secondary-2-opacity-010": {
312 - "value": "rgba(255, 97, 201, 0.1)",
313 - "type": "color"
314 - },
315 - "color-light-secondary-2-opacity-020": {
316 - "value": "rgba(255, 97, 201, 0.2)",
317 - "type": "color"
318 - },
319 - "color-light-secondary-2-opacity-030": {
320 - "value": "rgba(255, 97, 201, 0.3)",
321 - "type": "color"
322 - },
323 - "color-light-secondary-3": {
183 + "color-dark-extra-3": {
184 "value": "rgb(227, 194, 47)",
185 "type": "color"
186 },
327 - "color-light-secondary-3-opacity-005": {
328 - "value": "rgba(227, 194, 47, 0.05)",
329 - "type": "color"
330 - },
331 - "color-light-secondary-3-opacity-010": {
332 - "value": "rgba(227, 194, 47, 0.1)",
333 - "type": "color"
334 - },
335 - "color-light-secondary-3-opacity-020": {
336 - "value": "rgba(227, 194, 47, 0.2)",
337 - "type": "color"
338 - },
339 - "color-light-secondary-3-opacity-030": {
340 - "value": "rgba(227, 194, 47, 0.3)",
341 - "type": "color"
342 - },
343 - "color-light-secondary-4": {
187 + "color-dark-extra-4": {
188 "value": "rgb(255, 1, 86)",
189 "type": "color"
190 },
347 - "color-light-secondary-4-opacity-005": {
348 - "value": "rgba(255, 1, 86, 0.05)",
349 - "type": "color"
350 - },
351 - "color-light-secondary-4-opacity-010": {
352 - "value": "rgba(255, 1, 86, 0.1)",
353 - "type": "color"
354 - },
355 - "color-light-secondary-4-opacity-020": {
356 - "value": "rgba(255, 1, 86, 0.2)",
357 - "type": "color"
358 - },
359 - "color-light-secondary-4-opacity-030": {
360 - "value": "rgba(255, 1, 86, 0.3)",
361 - "type": "color"
362 - },
363 - "color-light-divider-005": {
364 - "value": "rgba(0, 0, 0, 0.05)",
365 - "type": "color"
366 - },
367 - "color-light-divider-010": {
368 - "value": "rgba(0, 0, 0, 0.1)",
369 - "type": "color"
370 - },
371 - "color-light-divider-020": {
372 - "value": "rgba(0, 0, 0, 0.2)",
373 - "type": "color"
374 - },
375 - "color-light-divider-030": {
376 - "value": "rgba(0, 0, 0, 0.3)",
377 - "type": "color"
378 - },
379 - "color-light-hover-005": {
380 - "value": "rgba(0, 0, 0, 0.05)",
381 - "type": "color"
382 - },
383 - "color-light-hover-010": {
384 - "value": "rgba(0, 0, 0, 0.1)",
385 - "type": "color"
386 - },
387 - "color-light-hover-050": {
388 - "value": "rgba(0, 0, 0, 0.5)",
389 - "type": "color"
390 - },
391 - "color-dark-sidebar-background": {
392 - "value": "#1D1F25",
393 - "type": "color"
394 - },
395 - "color-dark-body-background": {
396 - "value": "#14161A",
397 - "type": "color"
398 - },
399 - "color-dark-text": {
400 - "value": "#ffffff",
401 - "type": "color"
191 + "typo-h1": {
192 + "value": {
193 + "fontFamily": "{font-families-display}",
194 + "fontSize": "30px",
195 + "fontWeight": "700",
196 + "lineHeight": "38"
197 + },
198 + "type": "typography"
199 },
403 - "color-dark-text-secondary": {
404 - "value": "#ACB5BE",
405 - "type": "color"
200 + "typo-h2": {
201 + "value": {
202 + "fontFamily": "{font-families-display}",
203 + "fontSize": "26px",
204 + "fontWeight": "700",
205 + "lineHeight": "33"
206 + },
207 + "type": "typography"
208 },
407 - "color-dark-background": {
408 - "value": "#26282d",
409 - "type": "color"
209 + "typo-h3": {
210 + "value": {
211 + "fontFamily": "{font-families-display}",
212 + "fontSize": "22px",
213 + "fontWeight": "700",
214 + "lineHeight": "28"
215 + },
216 + "type": "typography"
217 },
411 - "color-dark-background-secondary": {
412 - "value": "#1D1F25",
413 - "type": "color"
218 + "typo-h4": {
219 + "value": {
220 + "fontFamily": "{font-families-display}",
221 + "fontSize": "18px",
222 + "fontWeight": "500",
223 + "lineHeight": "23"
224 + },
225 + "type": "typography"
226 },
415 - "color-dark-primary": {
416 - "value": "rgb(255, 182, 0)",
417 - "type": "color"
227 + "typo-h5": {
228 + "value": {
229 + "fontFamily": "{font-families-display}",
230 + "fontSize": "14px",
231 + "fontWeight": "700",
232 + "lineHeight": "18"
233 + },
234 + "type": "typography"
235 },
419 - "color-dark-primary-005": {
420 - "value": "rgba(255, 182, 0, 0.05)",
421 - "type": "color"
236 + "typo-h6": {
237 + "value": {
238 + "fontFamily": "{font-families-default}",
239 + "fontSize": "12px",
240 + "fontWeight": "500",
241 + "lineHeight": "15"
242 + },
243 + "type": "typography"
244 },
423 - "color-dark-primary-010": {
424 - "value": "rgba(255, 182, 0, 0.1)",
245 + "typo-p": {
246 + "value": {
247 + "fontFamily": "{font-families-default}",
248 + "fontSize": "{font-sizes-default}",
249 + "lineHeight": "20"
250 + },
251 + "type": "typography"
252 + }
253 + },
254 + "light": {
255 + "color-sidebar-background": {
256 + "value": "{color-light-sidebar-background}",
257 "type": "color"
258 },
427 - "color-dark-primary-015": {
428 - "value": "rgba(255, 182, 0, 0.15)",
259 + "color-body-background": {
260 + "value": "{color-light-body-background}",
261 "type": "color"
262 },
431 - "color-dark-primary-020": {
432 - "value": "rgba(255, 182, 0, 0.2)",
263 + "color-text": {
264 + "value": "{color-light-text}",
265 "type": "color"
266 },
435 - "color-dark-primary-030": {
436 - "value": "rgba(255, 182, 0, 0.3)",
267 + "color-text-secondary": {
268 + "value": "{color-light-text-secondary}",
269 "type": "color"
270 },
439 - "color-dark-primary-040": {
440 - "value": "rgba(255, 182, 0, 0.4)",
271 + "color-text-tertiary": {
272 + "value": "{color-light-text-tertiary}",
273 "type": "color"
274 },
443 - "color-dark-primary-050": {
444 - "value": "rgba(255, 182, 0, 0.5)",
275 + "color-background": {
276 + "value": "{color-light-background}",
277 "type": "color"
278 },
447 - "color-dark-primary-060": {
448 - "value": "rgba(255, 182, 0, 0.6)",
279 + "color-background-secondary": {
280 + "value": "{color-light-background-secondary}",
281 "type": "color"
282 },
451 - "color-dark-primary-070": {
452 - "value": "rgba(255, 182, 0, 0.7)",
283 + "color-border": {
284 + "value": "{color-light-border}",
285 "type": "color"
286 },
455 - "color-dark-primary-080": {
456 - "value": "rgba(255, 182, 0, 0.8)",
287 + "color-hover": {
288 + "value": "{color-light-hover}",
289 "type": "color"
290 },
459 - "color-dark-primary-090": {
460 - "value": "rgba(255, 182, 0, 0.9)",
291 + "color-primary": {
292 + "value": "{color-light-primary}",
293 "type": "color"
294 },
463 - "color-dark-info": {
464 - "value": "#6267FF",
295 + "color-info": {
296 + "value": "{color-light-info}",
297 "type": "color"
298 },
467 - "color-dark-success": {
468 - "value": "#00E19B",
299 + "color-success": {
300 + "value": "{color-light-success}",
301 "type": "color"
302 },
471 - "color-dark-warning": {
472 - "value": "#E3C22F",
303 + "color-warning": {
304 + "value": "{color-light-warning}",
305 "type": "color"
306 },
475 - "color-dark-error": {
476 - "value": "#FF0156",
307 + "color-error": {
308 + "value": "{color-light-error}",
309 "type": "color"
310 },
479 - "color-dark-info-005": {
480 - "value": "rgba(98, 103, 255, 0.05)",
311 + "color-extra-1": {
312 + "value": "{color-light-extra-1}",
313 "type": "color"
314 },
483 - "color-dark-info-010": {
484 - "value": "rgba(98, 103, 255, 0.1)",
315 + "color-extra-2": {
316 + "value": "{color-light-extra-2}",
317 "type": "color"
318 },
487 - "color-dark-info-020": {
488 - "value": "rgba(98, 103, 255, 0.2)",
319 + "color-extra-3": {
320 + "value": "{color-light-extra-3}",
321 "type": "color"
322 },
491 - "color-dark-info-030": {
492 - "value": "rgba(98, 103, 255, 0.3)",
323 + "color-extra-4": {
324 + "value": "{color-light-extra-4}",
325 "type": "color"
494 - },
495 - "color-dark-info-040": {
496 - "value": "rgba(98, 103, 255, 0.4)",
326 + }
327 + },
328 + "dark": {
329 + "color-sidebar-background": {
330 + "value": "{color-dark-sidebar-background}",
331 "type": "color"
332 },
499 - "color-dark-info-050": {
500 - "value": "rgba(98, 103, 255, 0.5)",
333 + "color-body-background": {
334 + "value": "{color-dark-body-background}",
335 "type": "color"
336 },
503 - "color-dark-info-060": {
504 - "value": "rgba(98, 103, 255, 0.6)",
337 + "color-text": {
338 + "value": "{color-dark-text}",
339 "type": "color"
340 },
507 - "color-dark-info-070": {
508 - "value": "rgba(98, 103, 255, 0.7)",
341 + "color-text-secondary": {
342 + "value": "{color-dark-text-secondary}",
343 "type": "color"
344 },
511 - "color-dark-info-080": {
512 - "value": "rgba(98, 103, 255, 0.8)",
345 + "color-text-tertiary": {
346 + "value": "{color-dark-text-tertiary}",
347 "type": "color"
348 },
515 - "color-dark-info-090": {
516 - "value": "rgba(98, 103, 255, 0.9)",
349 + "color-background": {
350 + "value": "{color-dark-background}",
351 "type": "color"
352 },
519 - "color-dark-success-005": {
520 - "value": "rgba(0, 178, 123, 0.05)",
353 + "color-background-secondary": {
354 + "value": "{color-dark-background-secondary}",
355 "type": "color"
356 },
523 - "color-dark-success-010": {
524 - "value": "rgba(0, 178, 123, 0.1)",
357 + "color-border": {
358 + "value": "{color-dark-border}",
359 "type": "color"
360 },
527 - "color-dark-success-020": {
528 - "value": "rgba(0, 178, 123, 0.2)",
361 + "color-hover": {
362 + "value": "{color-dark-hover}",
363 "type": "color"
364 },
531 - "color-dark-success-030": {
532 - "value": "rgba(0, 178, 123, 0.3)",
365 + "color-primary": {
366 + "value": "{color-dark-primary}",
367 "type": "color"
368 },
535 - "color-dark-success-040": {
536 - "value": "rgba(0, 178, 123, 0.4)",
369 + "color-info": {
370 + "value": "{color-dark-info}",
371 "type": "color"
372 },
539 - "color-dark-success-050": {
540 - "value": "rgba(0, 178, 123, 0.5)",
373 + "color-success": {
374 + "value": "{color-dark-success}",
375 "type": "color"
376 },
543 - "color-dark-success-060": {
544 - "value": "rgba(0, 178, 123, 0.6)",
545 - "type": "color"
546 - },
547 - "color-dark-success-070": {
548 - "value": "rgba(0, 178, 123, 0.7)",
549 - "type": "color"
550 - },
551 - "color-dark-success-080": {
552 - "value": "rgba(0, 178, 123, 0.8)",
553 - "type": "color"
554 - },
555 - "color-dark-success-090": {
556 - "value": "rgba(0, 178, 123, 0.9)",
557 - "type": "color"
558 - },
559 - "color-dark-warning-005": {
560 - "value": "rgba(227, 194, 47, 0.05)",
561 - "type": "color"
562 - },
563 - "color-dark-warning-010": {
564 - "value": "rgba(227, 194, 47, 0.1)",
565 - "type": "color"
566 - },
567 - "color-dark-warning-020": {
568 - "value": "rgba(227, 194, 47, 0.2)",
569 - "type": "color"
570 - },
571 - "color-dark-warning-030": {
572 - "value": "rgba(227, 194, 47, 0.3)",
573 - "type": "color"
574 - },
575 - "color-dark-warning-040": {
576 - "value": "rgba(227, 194, 47, 0.4)",
577 - "type": "color"
578 - },
579 - "color-dark-warning-050": {
580 - "value": "rgba(227, 194, 47, 0.5)",
581 - "type": "color"
582 - },
583 - "color-dark-warning-060": {
584 - "value": "rgba(227, 194, 47, 0.6)",
585 - "type": "color"
586 - },
587 - "color-dark-warning-070": {
588 - "value": "rgba(227, 194, 47, 0.7)",
589 - "type": "color"
590 - },
591 - "color-dark-warning-080": {
592 - "value": "rgba(227, 194, 47, 0.8)",
593 - "type": "color"
594 - },
595 - "color-dark-warning-090": {
596 - "value": "rgba(227, 194, 47, 0.9)",
597 - "type": "color"
598 - },
599 - "color-dark-error-005": {
600 - "value": "rgba(255, 1, 86, 0.05)",
601 - "type": "color"
602 - },
603 - "color-dark-error-010": {
604 - "value": "rgba(255, 1, 86, 0.1)",
605 - "type": "color"
606 - },
607 - "color-dark-error-020": {
608 - "value": "rgba(255, 1, 86, 0.2)",
609 - "type": "color"
610 - },
611 - "color-dark-error-030": {
612 - "value": "rgba(255, 1, 86, 0.3)",
613 - "type": "color"
614 - },
615 - "color-dark-error-040": {
616 - "value": "rgba(255, 1, 86, 0.4)",
617 - "type": "color"
618 - },
619 - "color-dark-error-050": {
620 - "value": "rgba(255, 1, 86, 0.5)",
621 - "type": "color"
622 - },
623 - "color-dark-error-060": {
624 - "value": "rgba(255, 1, 86, 0.6)",
625 - "type": "color"
626 - },
627 - "color-dark-error-070": {
628 - "value": "rgba(255, 1, 86, 0.7)",
629 - "type": "color"
630 - },
631 - "color-dark-error-080": {
632 - "value": "rgba(255, 1, 86, 0.8)",
633 - "type": "color"
634 - },
635 - "color-dark-error-090": {
636 - "value": "rgba(255, 1, 86, 0.9)",
637 - "type": "color"
638 - },
639 - "color-dark-secondary-1": {
640 - "value": "rgb(98, 103, 255)",
641 - "type": "color"
642 - },
643 - "color-dark-secondary-1-opacity-005": {
644 - "value": "rgba(98, 103, 255, 0.05)",
645 - "type": "color"
646 - },
647 - "color-dark-secondary-1-opacity-010": {
648 - "value": "rgba(98, 103, 255, 0.1)",
649 - "type": "color"
650 - },
651 - "color-dark-secondary-1-opacity-020": {
652 - "value": "rgba(98, 103, 255, 0.2)",
653 - "type": "color"
654 - },
655 - "color-dark-secondary-1-opacity-030": {
656 - "value": "rgba(98, 103, 255, 0.3)",
657 - "type": "color"
658 - },
659 - "color-dark-secondary-2": {
660 - "value": "rgb(255, 97, 201)",
661 - "type": "color"
662 - },
663 - "color-dark-secondary-2-opacity-005": {
664 - "value": "rgba(255, 97, 201, 0.05)",
665 - "type": "color"
666 - },
667 - "color-dark-secondary-2-opacity-010": {
668 - "value": "rgba(255, 97, 201, 0.1)",
669 - "type": "color"
670 - },
671 - "color-dark-secondary-2-opacity-020": {
672 - "value": "rgba(255, 97, 201, 0.2)",
673 - "type": "color"
674 - },
675 - "color-dark-secondary-2-opacity-030": {
676 - "value": "rgba(255, 97, 201, 0.3)",
677 - "type": "color"
678 - },
679 - "color-dark-secondary-3": {
680 - "value": "rgb(227, 194, 47)",
681 - "type": "color"
682 - },
683 - "color-dark-secondary-3-opacity-005": {
684 - "value": "rgba(227, 194, 47, 0.05)",
685 - "type": "color"
686 - },
687 - "color-dark-secondary-3-opacity-010": {
688 - "value": "rgba(227, 194, 47, 0.1)",
689 - "type": "color"
690 - },
691 - "color-dark-secondary-3-opacity-020": {
692 - "value": "rgba(227, 194, 47, 0.2)",
693 - "type": "color"
694 - },
695 - "color-dark-secondary-3-opacity-030": {
696 - "value": "rgba(227, 194, 47, 0.3)",
697 - "type": "color"
698 - },
699 - "color-dark-secondary-4": {
700 - "value": "rgb(255, 1, 86)",
701 - "type": "color"
702 - },
703 - "color-dark-secondary-4-opacity-005": {
704 - "value": "rgba(255, 1, 86, 0.05)",
705 - "type": "color"
706 - },
707 - "color-dark-secondary-4-opacity-010": {
708 - "value": "rgba(255, 1, 86, 0.1)",
709 - "type": "color"
710 - },
711 - "color-dark-secondary-4-opacity-020": {
712 - "value": "rgba(255, 1, 86, 0.2)",
713 - "type": "color"
714 - },
715 - "color-dark-secondary-4-opacity-030": {
716 - "value": "rgba(255, 1, 86, 0.3)",
717 - "type": "color"
718 - },
719 - "color-dark-divider-005": {
720 - "value": "rgba(255, 255, 255, 0.05)",
721 - "type": "color"
722 - },
723 - "color-dark-divider-010": {
724 - "value": "rgba(255, 255, 255, 0.1)",
725 - "type": "color"
726 - },
727 - "color-dark-divider-020": {
728 - "value": "rgba(255, 255, 255, 0.2)",
729 - "type": "color"
730 - },
731 - "color-dark-divider-030": {
732 - "value": "rgba(255, 255, 255, 0.3)",
733 - "type": "color"
734 - },
735 - "color-dark-hover-005": {
736 - "value": "rgba(255, 255, 255, 0.05)",
737 - "type": "color"
738 - },
739 - "color-dark-hover-010": {
740 - "value": "rgba(255, 255, 255, 0.1)",
741 - "type": "color"
742 - },
743 - "color-dark-hover-050": {
744 - "value": "rgba(255, 255, 255, 0.5)",
745 - "type": "color"
746 - },
747 - "typo-h1": {
748 - "value": {
749 - "fontFamily": "{font-families-display}",
750 - "fontSize": "30px",
751 - "fontWeight": "700",
752 - "lineHeight": "41"
753 - },
754 - "type": "typography"
755 - },
756 - "typo-h2": {
757 - "value": {
758 - "fontFamily": "{font-families-display}",
759 - "fontSize": "26px",
760 - "fontWeight": "700",
761 - "lineHeight": "35"
762 - },
763 - "type": "typography"
764 - },
765 - "typo-h3": {
766 - "value": {
767 - "fontFamily": "{font-families-display}",
768 - "fontSize": "22px",
769 - "fontWeight": "700",
770 - "lineHeight": "30"
771 - },
772 - "type": "typography"
773 - },
774 - "typo-h4": {
775 - "value": {
776 - "fontFamily": "{font-families-display}",
777 - "fontSize": "18px",
778 - "fontWeight": "500",
779 - "lineHeight": "24"
780 - },
781 - "type": "typography"
782 - },
783 - "typo-h5": {
784 - "value": {
785 - "fontFamily": "{font-families-display}",
786 - "fontSize": "14px",
787 - "fontWeight": "700",
788 - "lineHeight": "19"
789 - },
790 - "type": "typography"
791 - },
792 - "typo-h6": {
793 - "value": {
794 - "fontFamily": "{font-families-base}",
795 - "fontSize": "12px",
796 - "fontWeight": "500",
797 - "lineHeight": "16"
798 - },
799 - "type": "typography"
800 - },
801 - "typo-p": {
802 - "value": {
803 - "fontFamily": "{font-families-base}",
804 - "fontSize": "{font-sizes-base}",
805 - "lineHeight": "22"
806 - },
807 - "type": "typography"
808 - }
809 - },
810 - "light": {
811 - "color-sidebar-background": {
812 - "value": "{color-light-sidebar-background}",
813 - "type": "color"
814 - },
815 - "color-body-background": {
816 - "value": "{color-light-body-background}",
817 - "type": "color"
818 - },
819 - "color-text": {
820 - "value": "{color-light-text}",
821 - "type": "color"
822 - },
823 - "color-text-secondary": {
824 - "value": "{color-light-text-secondary}",
825 - "type": "color"
826 - },
827 - "color-background": {
828 - "value": "{color-light-background}",
829 - "type": "color"
830 - },
831 - "color-background-secondary": {
832 - "value": "{color-light-background-secondary}",
833 - "type": "color"
834 - },
835 - "color-primary": {
836 - "value": "{color-light-primary}",
837 - "type": "color"
838 - },
839 - "color-primary-005": {
840 - "value": "{color-light-primary-005}",
841 - "type": "color"
842 - },
843 - "color-primary-010": {
844 - "value": "{color-light-primary-010}",
845 - "type": "color"
846 - },
847 - "color-primary-015": {
848 - "value": "{color-light-primary-015}",
849 - "type": "color"
850 - },
851 - "color-primary-020": {
852 - "value": "{color-light-primary-020}",
853 - "type": "color"
854 - },
855 - "color-primary-030": {
856 - "value": "{color-light-primary-030}",
857 - "type": "color"
858 - },
859 - "color-primary-040": {
860 - "value": "{color-light-primary-040}",
861 - "type": "color"
862 - },
863 - "color-primary-050": {
864 - "value": "{color-light-primary-050}",
865 - "type": "color"
866 - },
867 - "color-primary-060": {
868 - "value": "{color-light-primary-060}",
869 - "type": "color"
870 - },
871 - "color-primary-070": {
872 - "value": "{color-light-primary-070}",
873 - "type": "color"
874 - },
875 - "color-primary-080": {
876 - "value": "{color-light-primary-080}",
877 - "type": "color"
878 - },
879 - "color-primary-090": {
880 - "value": "{color-light-primary-090}",
881 - "type": "color"
882 - },
883 - "color-info": {
884 - "value": "{color-light-info}",
885 - "type": "color"
886 - },
887 - "color-success": {
888 - "value": "{color-light-success}",
889 - "type": "color"
890 - },
891 - "color-warning": {
892 - "value": "{color-light-warning}",
893 - "type": "color"
894 - },
895 - "color-error": {
896 - "value": "{color-light-error}",
897 - "type": "color"
898 - },
899 - "color-info-005": {
900 - "value": "{color-light-info-005}",
901 - "type": "color"
902 - },
903 - "color-info-010": {
904 - "value": "{color-light-info-010}",
905 - "type": "color"
906 - },
907 - "color-info-020": {
908 - "value": "{color-light-info-020}",
909 - "type": "color"
910 - },
911 - "color-info-030": {
912 - "value": "{color-light-info-030}",
913 - "type": "color"
914 - },
915 - "color-info-040": {
916 - "value": "{color-light-info-040}",
917 - "type": "color"
918 - },
919 - "color-info-050": {
920 - "value": "{color-light-info-050}",
921 - "type": "color"
922 - },
923 - "color-info-060": {
924 - "value": "{color-light-info-060}",
925 - "type": "color"
926 - },
927 - "color-info-070": {
928 - "value": "{color-light-info-070}",
929 - "type": "color"
930 - },
931 - "color-info-080": {
932 - "value": "{color-light-info-080}",
933 - "type": "color"
934 - },
935 - "color-info-090": {
936 - "value": "{color-light-info-090}",
937 - "type": "color"
938 - },
939 - "color-success-005": {
940 - "value": "{color-light-success-005}",
941 - "type": "color"
942 - },
943 - "color-success-010": {
944 - "value": "{color-light-success-010}",
945 - "type": "color"
946 - },
947 - "color-success-020": {
948 - "value": "{color-light-success-020}",
949 - "type": "color"
950 - },
951 - "color-success-030": {
952 - "value": "{color-light-success-030}",
953 - "type": "color"
954 - },
955 - "color-success-040": {
956 - "value": "{color-light-success-040}",
957 - "type": "color"
958 - },
959 - "color-success-050": {
960 - "value": "{color-light-success-050}",
961 - "type": "color"
962 - },
963 - "color-success-060": {
964 - "value": "{color-light-success-060}",
965 - "type": "color"
966 - },
967 - "color-success-070": {
968 - "value": "{color-light-success-070}",
969 - "type": "color"
970 - },
971 - "color-success-080": {
972 - "value": "{color-light-success-080}",
973 - "type": "color"
974 - },
975 - "color-success-090": {
976 - "value": "{color-light-success-090}",
977 - "type": "color"
978 - },
979 - "color-warning-005": {
980 - "value": "{color-light-warning-005}",
981 - "type": "color"
982 - },
983 - "color-warning-010": {
984 - "value": "{color-light-warning-010}",
985 - "type": "color"
986 - },
987 - "color-warning-020": {
988 - "value": "{color-light-warning-020}",
989 - "type": "color"
990 - },
991 - "color-warning-030": {
992 - "value": "{color-light-warning-030}",
993 - "type": "color"
994 - },
995 - "color-warning-040": {
996 - "value": "{color-light-warning-040}",
997 - "type": "color"
998 - },
999 - "color-warning-050": {
1000 - "value": "{color-light-warning-050}",
1001 - "type": "color"
1002 - },
1003 - "color-warning-060": {
1004 - "value": "{color-light-warning-060}",
1005 - "type": "color"
1006 - },
1007 - "color-warning-070": {
1008 - "value": "{color-light-warning-070}",
1009 - "type": "color"
1010 - },
1011 - "color-warning-080": {
1012 - "value": "{color-light-warning-080}",
1013 - "type": "color"
1014 - },
1015 - "color-warning-090": {
1016 - "value": "{color-light-warning-090}",
1017 - "type": "color"
1018 - },
1019 - "color-error-005": {
1020 - "value": "{color-light-error-005}",
1021 - "type": "color"
1022 - },
1023 - "color-error-010": {
1024 - "value": "{color-light-error-010}",
1025 - "type": "color"
1026 - },
1027 - "color-error-020": {
1028 - "value": "{color-light-error-020}",
1029 - "type": "color"
1030 - },
1031 - "color-error-030": {
1032 - "value": "{color-light-error-030}",
1033 - "type": "color"
1034 - },
1035 - "color-error-040": {
1036 - "value": "{color-light-error-040}",
1037 - "type": "color"
1038 - },
1039 - "color-error-050": {
1040 - "value": "{color-light-error-050}",
1041 - "type": "color"
1042 - },
1043 - "color-error-060": {
1044 - "value": "{color-light-error-060}",
1045 - "type": "color"
1046 - },
1047 - "color-error-070": {
1048 - "value": "{color-light-error-070}",
1049 - "type": "color"
1050 - },
1051 - "color-error-080": {
1052 - "value": "{color-light-error-080}",
1053 - "type": "color"
1054 - },
1055 - "color-error-090": {
1056 - "value": "{color-light-error-090}",
1057 - "type": "color"
1058 - },
1059 - "color-secondary-1": {
1060 - "value": "{color-light-secondary-1}",
1061 - "type": "color"
1062 - },
1063 - "color-secondary-1-opacity-005": {
1064 - "value": "{color-light-secondary-1-opacity-005}",
1065 - "type": "color"
1066 - },
1067 - "color-secondary-1-opacity-010": {
1068 - "value": "{color-light-secondary-1-opacity-010}",
1069 - "type": "color"
1070 - },
1071 - "color-secondary-1-opacity-020": {
1072 - "value": "{color-light-secondary-1-opacity-020}",
1073 - "type": "color"
1074 - },
1075 - "color-secondary-1-opacity-030": {
1076 - "value": "{color-light-secondary-1-opacity-030}",
1077 - "type": "color"
1078 - },
1079 - "color-secondary-2": {
1080 - "value": "{color-light-secondary-2}",
1081 - "type": "color"
1082 - },
1083 - "color-secondary-2-opacity-005": {
1084 - "value": "{color-light-secondary-2-opacity-005}",
1085 - "type": "color"
1086 - },
1087 - "color-secondary-2-opacity-010": {
1088 - "value": "{color-light-secondary-2-opacity-010}",
1089 - "type": "color"
1090 - },
1091 - "color-secondary-2-opacity-020": {
1092 - "value": "{color-light-secondary-2-opacity-020}",
1093 - "type": "color"
1094 - },
1095 - "color-secondary-2-opacity-030": {
1096 - "value": "{color-light-secondary-2-opacity-030}",
1097 - "type": "color"
1098 - },
1099 - "color-secondary-3": {
1100 - "value": "{color-light-secondary-3}",
1101 - "type": "color"
1102 - },
1103 - "color-secondary-3-opacity-005": {
1104 - "value": "{color-light-secondary-3-opacity-005}",
1105 - "type": "color"
1106 - },
1107 - "color-secondary-3-opacity-010": {
1108 - "value": "{color-light-secondary-3-opacity-010}",
1109 - "type": "color"
1110 - },
1111 - "color-secondary-3-opacity-020": {
1112 - "value": "{color-light-secondary-3-opacity-020}",
1113 - "type": "color"
1114 - },
1115 - "color-secondary-3-opacity-030": {
1116 - "value": "{color-light-secondary-3-opacity-030}",
1117 - "type": "color"
1118 - },
1119 - "color-secondary-4": {
1120 - "value": "{color-light-secondary-4}",
1121 - "type": "color"
1122 - },
1123 - "color-secondary-4-opacity-005": {
1124 - "value": "{color-light-secondary-4-opacity-005}",
1125 - "type": "color"
1126 - },
1127 - "color-secondary-4-opacity-010": {
1128 - "value": "{color-light-secondary-4-opacity-010}",
1129 - "type": "color"
1130 - },
1131 - "color-secondary-4-opacity-020": {
1132 - "value": "{color-light-secondary-4-opacity-020}",
1133 - "type": "color"
1134 - },
1135 - "color-secondary-4-opacity-030": {
1136 - "value": "{color-light-secondary-4-opacity-030}",
1137 - "type": "color"
1138 - },
1139 - "color-divider-005": {
1140 - "value": "{color-light-divider-005}",
1141 - "type": "color"
1142 - },
1143 - "color-divider-010": {
1144 - "value": "{color-light-divider-010}",
1145 - "type": "color"
1146 - },
1147 - "color-divider-020": {
1148 - "value": "{color-light-divider-020}",
1149 - "type": "color"
1150 - },
1151 - "color-divider-030": {
1152 - "value": "{color-light-divider-030}",
1153 - "type": "color"
1154 - },
1155 - "color-hover-005": {
1156 - "value": "{color-light-hover-005}",
1157 - "type": "color"
1158 - },
1159 - "color-hover-010": {
1160 - "value": "{color-light-hover-010}",
1161 - "type": "color"
1162 - },
1163 - "color-hover-050": {
1164 - "value": "{color-light-hover-050}",
1165 - "type": "color"
1166 - }
1167 - },
1168 - "dark": {
1169 - "color-sidebar-background": {
1170 - "value": "{color-dark-sidebar-background}",
1171 - "type": "color"
1172 - },
1173 - "color-body-background": {
1174 - "value": "{color-dark-body-background}",
1175 - "type": "color"
1176 - },
1177 - "color-text": {
1178 - "value": "{color-dark-text}",
1179 - "type": "color"
1180 - },
1181 - "color-text-secondary": {
1182 - "value": "{color-dark-text-secondary}",
1183 - "type": "color"
1184 - },
1185 - "color-background": {
1186 - "value": "{color-dark-background}",
1187 - "type": "color"
1188 - },
1189 - "color-background-secondary": {
1190 - "value": "{color-dark-background-secondary}",
1191 - "type": "color"
1192 - },
1193 - "color-primary": {
1194 - "value": "{color-dark-primary}",
1195 - "type": "color"
1196 - },
1197 - "color-primary-005": {
1198 - "value": "{color-dark-primary-005}",
1199 - "type": "color"
1200 - },
1201 - "color-primary-010": {
1202 - "value": "{color-dark-primary-010}",
1203 - "type": "color"
1204 - },
1205 - "color-primary-015": {
1206 - "value": "{color-dark-primary-015}",
1207 - "type": "color"
1208 - },
1209 - "color-primary-020": {
1210 - "value": "{color-dark-primary-020}",
1211 - "type": "color"
1212 - },
1213 - "color-primary-030": {
1214 - "value": "{color-dark-primary-030}",
1215 - "type": "color"
1216 - },
1217 - "color-primary-040": {
1218 - "value": "{color-dark-primary-040}",
1219 - "type": "color"
1220 - },
1221 - "color-primary-050": {
1222 - "value": "{color-dark-primary-050}",
1223 - "type": "color"
1224 - },
1225 - "color-primary-060": {
1226 - "value": "{color-dark-primary-060}",
1227 - "type": "color"
1228 - },
1229 - "color-primary-070": {
1230 - "value": "{color-dark-primary-070}",
1231 - "type": "color"
1232 - },
1233 - "color-primary-080": {
1234 - "value": "{color-dark-primary-080}",
1235 - "type": "color"
1236 - },
1237 - "color-primary-090": {
1238 - "value": "{color-dark-primary-090}",
1239 - "type": "color"
1240 - },
1241 - "color-info": {
1242 - "value": "{color-dark-info}",
1243 - "type": "color"
1244 - },
1245 - "color-success": {
1246 - "value": "{color-dark-success}",
1247 - "type": "color"
1248 - },
1249 - "color-warning": {
1250 - "value": "{color-dark-warning}",
377 + "color-warning": {
378 + "value": "{color-dark-warning}",
379 "type": "color"
380 },
381 "color-error": {
382 "value": "{color-dark-error}",
383 "type": "color"
384 },
1257 - "color-info-005": {
1258 - "value": "{color-dark-info-005}",
1259 - "type": "color"
1260 - },
1261 - "color-info-010": {
1262 - "value": "{color-dark-info-010}",
1263 - "type": "color"
1264 - },
1265 - "color-info-020": {
1266 - "value": "{color-dark-info-020}",
1267 - "type": "color"
1268 - },
1269 - "color-info-030": {
1270 - "value": "{color-dark-info-030}",
1271 - "type": "color"
1272 - },
1273 - "color-info-040": {
1274 - "value": "{color-dark-info-040}",
1275 - "type": "color"
1276 - },
1277 - "color-info-050": {
1278 - "value": "{color-dark-info-050}",
1279 - "type": "color"
1280 - },
1281 - "color-info-060": {
1282 - "value": "{color-dark-info-060}",
1283 - "type": "color"
1284 - },
1285 - "color-info-070": {
1286 - "value": "{color-dark-info-070}",
1287 - "type": "color"
1288 - },
1289 - "color-info-080": {
1290 - "value": "{color-dark-info-080}",
1291 - "type": "color"
1292 - },
1293 - "color-info-090": {
1294 - "value": "{color-dark-info-090}",
1295 - "type": "color"
1296 - },
1297 - "color-success-005": {
1298 - "value": "{color-dark-success-005}",
1299 - "type": "color"
1300 - },
1301 - "color-success-010": {
1302 - "value": "{color-dark-success-010}",
1303 - "type": "color"
1304 - },
1305 - "color-success-020": {
1306 - "value": "{color-dark-success-020}",
1307 - "type": "color"
1308 - },
1309 - "color-success-030": {
1310 - "value": "{color-dark-success-030}",
1311 - "type": "color"
1312 - },
1313 - "color-success-040": {
1314 - "value": "{color-dark-success-040}",
1315 - "type": "color"
1316 - },
1317 - "color-success-050": {
1318 - "value": "{color-dark-success-050}",
1319 - "type": "color"
1320 - },
1321 - "color-success-060": {
1322 - "value": "{color-dark-success-060}",
1323 - "type": "color"
1324 - },
1325 - "color-success-070": {
1326 - "value": "{color-dark-success-070}",
1327 - "type": "color"
1328 - },
1329 - "color-success-080": {
1330 - "value": "{color-dark-success-080}",
1331 - "type": "color"
1332 - },
1333 - "color-success-090": {
1334 - "value": "{color-dark-success-090}",
1335 - "type": "color"
1336 - },
1337 - "color-warning-005": {
1338 - "value": "{color-dark-warning-005}",
1339 - "type": "color"
1340 - },
1341 - "color-warning-010": {
1342 - "value": "{color-dark-warning-010}",
1343 - "type": "color"
1344 - },
1345 - "color-warning-020": {
1346 - "value": "{color-dark-warning-020}",
1347 - "type": "color"
1348 - },
1349 - "color-warning-030": {
1350 - "value": "{color-dark-warning-030}",
1351 - "type": "color"
1352 - },
1353 - "color-warning-040": {
1354 - "value": "{color-dark-warning-040}",
1355 - "type": "color"
1356 - },
1357 - "color-warning-050": {
1358 - "value": "{color-dark-warning-050}",
1359 - "type": "color"
1360 - },
1361 - "color-warning-060": {
1362 - "value": "{color-dark-warning-060}",
1363 - "type": "color"
1364 - },
1365 - "color-warning-070": {
1366 - "value": "{color-dark-warning-070}",
1367 - "type": "color"
1368 - },
1369 - "color-warning-080": {
1370 - "value": "{color-dark-warning-080}",
1371 - "type": "color"
1372 - },
1373 - "color-warning-090": {
1374 - "value": "{color-dark-warning-090}",
1375 - "type": "color"
1376 - },
1377 - "color-error-005": {
1378 - "value": "{color-dark-error-005}",
1379 - "type": "color"
1380 - },
1381 - "color-error-010": {
1382 - "value": "{color-dark-error-010}",
1383 - "type": "color"
1384 - },
1385 - "color-error-020": {
1386 - "value": "{color-dark-error-020}",
1387 - "type": "color"
1388 - },
1389 - "color-error-030": {
1390 - "value": "{color-dark-error-030}",
1391 - "type": "color"
1392 - },
1393 - "color-error-040": {
1394 - "value": "{color-dark-error-040}",
1395 - "type": "color"
1396 - },
1397 - "color-error-050": {
1398 - "value": "{color-dark-error-050}",
1399 - "type": "color"
1400 - },
1401 - "color-error-060": {
1402 - "value": "{color-dark-error-060}",
1403 - "type": "color"
1404 - },
1405 - "color-error-070": {
1406 - "value": "{color-dark-error-070}",
1407 - "type": "color"
1408 - },
1409 - "color-error-080": {
1410 - "value": "{color-dark-error-080}",
1411 - "type": "color"
1412 - },
1413 - "color-error-090": {
1414 - "value": "{color-dark-error-090}",
1415 - "type": "color"
1416 - },
1417 - "color-secondary-1": {
1418 - "value": "{color-dark-secondary-1}",
1419 - "type": "color"
1420 - },
1421 - "color-secondary-1-opacity-005": {
1422 - "value": "{color-dark-secondary-1-opacity-005}",
1423 - "type": "color"
1424 - },
1425 - "color-secondary-1-opacity-010": {
1426 - "value": "{color-dark-secondary-1-opacity-010}",
1427 - "type": "color"
1428 - },
1429 - "color-secondary-1-opacity-020": {
1430 - "value": "{color-dark-secondary-1-opacity-020}",
1431 - "type": "color"
1432 - },
1433 - "color-secondary-1-opacity-030": {
1434 - "value": "{color-dark-secondary-1-opacity-030}",
1435 - "type": "color"
1436 - },
1437 - "color-secondary-2": {
1438 - "value": "{color-dark-secondary-2}",
1439 - "type": "color"
1440 - },
1441 - "color-secondary-2-opacity-005": {
1442 - "value": "{color-dark-secondary-2-opacity-005}",
1443 - "type": "color"
1444 - },
1445 - "color-secondary-2-opacity-010": {
1446 - "value": "{color-dark-secondary-2-opacity-010}",
1447 - "type": "color"
1448 - },
1449 - "color-secondary-2-opacity-020": {
1450 - "value": "{color-dark-secondary-2-opacity-020}",
1451 - "type": "color"
1452 - },
1453 - "color-secondary-2-opacity-030": {
1454 - "value": "{color-dark-secondary-2-opacity-030}",
1455 - "type": "color"
1456 - },
1457 - "color-secondary-3": {
1458 - "value": "{color-dark-secondary-3}",
1459 - "type": "color"
1460 - },
1461 - "color-secondary-3-opacity-005": {
1462 - "value": "{color-dark-secondary-3-opacity-005}",
1463 - "type": "color"
1464 - },
1465 - "color-secondary-3-opacity-010": {
1466 - "value": "{color-dark-secondary-3-opacity-010}",
1467 - "type": "color"
1468 - },
1469 - "color-secondary-3-opacity-020": {
1470 - "value": "{color-dark-secondary-3-opacity-020}",
1471 - "type": "color"
1472 - },
1473 - "color-secondary-3-opacity-030": {
1474 - "value": "{color-dark-secondary-3-opacity-030}",
1475 - "type": "color"
1476 - },
1477 - "color-secondary-4": {
1478 - "value": "{color-dark-secondary-4}",
1479 - "type": "color"
1480 - },
1481 - "color-secondary-4-opacity-005": {
1482 - "value": "{color-dark-secondary-4-opacity-005}",
1483 - "type": "color"
1484 - },
1485 - "color-secondary-4-opacity-010": {
1486 - "value": "{color-dark-secondary-4-opacity-010}",
1487 - "type": "color"
1488 - },
1489 - "color-secondary-4-opacity-020": {
1490 - "value": "{color-dark-secondary-4-opacity-020}",
1491 - "type": "color"
1492 - },
1493 - "color-secondary-4-opacity-030": {
1494 - "value": "{color-dark-secondary-4-opacity-030}",
1495 - "type": "color"
1496 - },
1497 - "color-divider-005": {
1498 - "value": "{color-dark-divider-005}",
1499 - "type": "color"
1500 - },
1501 - "color-divider-010": {
1502 - "value": "{color-dark-divider-010}",
1503 - "type": "color"
1504 - },
1505 - "color-divider-020": {
1506 - "value": "{color-dark-divider-020}",
1507 - "type": "color"
1508 - },
1509 - "color-divider-030": {
1510 - "value": "{color-dark-divider-030}",
385 + "color-extra-1": {
386 + "value": "{color-dark-extra-1}",
387 "type": "color"
388 },
1513 - "color-hover-005": {
1514 - "value": "{color-dark-hover-005}",
389 + "color-extra-2": {
390 + "value": "{color-dark-extra-2}",
391 "type": "color"
392 },
1517 - "color-hover-010": {
1518 - "value": "{color-dark-hover-010}",
393 + "color-extra-3": {
394 + "value": "{color-dark-extra-3}",
395 "type": "color"
396 },
1521 - "color-hover-050": {
1522 - "value": "{color-dark-hover-050}",
397 + "color-extra-4": {
398 + "value": "{color-dark-extra-4}",
399 "type": "color"
400 }
401 }
frontend/package-lock.json
+707 -566
@@ -13,9 +13,9 @@
13 "@fontsource/jetbrains-mono": "^5.1.2",
14 "@fontsource/lexend": "^5.1.2",
15 "@fontsource/public-sans": "^5.1.2",
16 - "@shikijs/markdown-it": "^1.26.1",
16 + "@shikijs/markdown-it": "^1.27.2",
17 "@tailwindcss/container-queries": "^0.1.1",
18 - "@vueuse/core": "^12.3.0",
18 + "@vueuse/core": "^12.4.0",
19 "axios": "^1.7.9",
20 "bytes": "^3.1.2",
21 "colord": "^2.9.3",
@@ -34,7 +34,7 @@
34 "pinia": "^2.3.0",
35 "pinia-plugin-persistedstate": "^4.2.0",
36 "secure-ls": "^2.0.0",
37 - "shiki": "^1.26.1",
37 + "shiki": "^1.27.2",
38 "validator": "^13.12.0",
39 "vue": "^3.5.13",
40 "vue-advanced-cropper": "^2.8.9",
@@ -47,8 +47,8 @@
47 "vuedraggable": "^4.1.0"
48 },
49 "devDependencies": {
50 - "@antfu/eslint-config": "^3.12.1",
51 - "@clack/prompts": "^0.9.0",
50 + "@antfu/eslint-config": "^3.14.0",
51 + "@clack/prompts": "^0.9.1",
52 "@iconify/vue": "^4.3.0",
53 "@tsconfig/node20": "^20.1.4",
54 "@types/bytes": "^3.1.5",
@@ -56,7 +56,7 @@
56 "@types/fs-extra": "^11.0.4",
57 "@types/jsdom": "^21.1.7",
58 "@types/lodash": "^4.17.14",
59 - "@types/node": "^22.10.5",
59 + "@types/node": "^22.10.6",
60 "@types/validator": "^13.12.2",
61 "@vitejs/plugin-vue": "^5.2.1",
62 "@vitejs/plugin-vue-jsx": "^4.1.1",
@@ -65,25 +65,24 @@
65 "autoprefixer": "^10.4.20",
66 "cypress": "^13.17.0",
67 "depcheck": "^1.4.7",
68 - "eslint": "^9.17.0",
68 + "eslint": "^9.18.0",
69 "flourite": "^1.3.0",
70 "fs-extra": "^11.2.0",
71 - "jsdom": "^25.0.1",
71 + "jsdom": "^26.0.0",
72 "npm-run-all2": "^7.0.2",
73 - "postcss": "^8.4.49",
73 + "postcss": "^8.5.1",
74 "prettier": "^3.4.2",
75 "prettier-plugin-tailwindcss": "^0.6.9",
76 - "sass": "^1.83.1",
77 - "start-server-and-test": "^2.0.9",
76 + "sass": "^1.83.4",
77 + "start-server-and-test": "^2.0.10",
78 "tailwind-config-viewer": "^2.0.4",
79 "tailwindcss": "^3.4.17",
80 - "taze": "^0.18.0",
81 - "type-fest": "^4.31.0",
82 - "typescript": "~5.7.2",
83 - "unplugin-vue-components": "^0.28.0",
80 + "taze": "^18.2.0",
81 + "type-fest": "^4.32.0",
82 + "typescript": "~5.7.3",
83 "vite": "^6.0.7",
84 "vite-bundle-visualizer": "^1.2.1",
86 - "vite-plugin-vue-devtools": "^7.6.8",
85 + "vite-plugin-vue-devtools": "^7.7.0",
86 "vite-svg-loader": "^5.1.0",
87 "vitest": "^2.1.8",
88 "vue-tsc": "^2.2.0"
@@ -92,7 +91,9 @@
91 "node": ">=18.0.0"
92 },
93 "optionalDependencies": {
95 - "@rollup/rollup-linux-x64-gnu": "^4.30.0"
94 + "@rollup/rollup-linux-x64-gnu": "^4.30.1",
95 + "treemate": "^0.3.11",
96 + "vueuc": "^0.4.64"
97 }
98 },
99 "node_modules/@ajoelp/json-to-formdata": {
@@ -130,41 +131,41 @@
131 }
132 },
133 "node_modules/@antfu/eslint-config": {
133 - "version": "3.12.1",
134 - "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-3.12.1.tgz",
135 - "integrity": "sha512-6sRgO4u63GK75xeZ2MfCSRT9GcfLti4ZN3Xw+bIu39oo6HY50fBY+rXnWvgwNimzHBOh3yV5xUHfTqcHq1M5AA==",
134 + "version": "3.14.0",
135 + "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-3.14.0.tgz",
136 + "integrity": "sha512-SBQOFrF/d2aqsVhxcHZ6g5DAoUaNyaV3Vd+lGNJx4CfSuwk9EuC8sRUF819GkNdCMbH5wNdFoJ4+Tsd9sr/NBw==",
137 "dev": true,
138 "license": "MIT",
139 "dependencies": {
139 - "@antfu/install-pkg": "^0.5.0",
140 - "@clack/prompts": "^0.9.0",
140 + "@antfu/install-pkg": "^1.0.0",
141 + "@clack/prompts": "^0.9.1",
142 "@eslint-community/eslint-plugin-eslint-comments": "^4.4.1",
143 "@eslint/markdown": "^6.2.1",
143 - "@stylistic/eslint-plugin": "^2.12.1",
144 - "@typescript-eslint/eslint-plugin": "^8.18.2",
145 - "@typescript-eslint/parser": "^8.18.2",
146 - "@vitest/eslint-plugin": "^1.1.20",
147 - "eslint-config-flat-gitignore": "^0.3.0",
148 - "eslint-flat-config-utils": "^0.4.0",
149 - "eslint-merge-processors": "^0.1.0",
144 + "@stylistic/eslint-plugin": "^2.13.0",
145 + "@typescript-eslint/eslint-plugin": "^8.19.1",
146 + "@typescript-eslint/parser": "^8.19.1",
147 + "@vitest/eslint-plugin": "^1.1.25",
148 + "eslint-config-flat-gitignore": "^1.0.0",
149 + "eslint-flat-config-utils": "^1.0.0",
150 + "eslint-merge-processors": "^1.0.0",
151 "eslint-plugin-antfu": "^2.7.0",
151 - "eslint-plugin-command": "^0.2.7",
152 + "eslint-plugin-command": "^2.1.0",
153 "eslint-plugin-import-x": "^4.6.1",
154 "eslint-plugin-jsdoc": "^50.6.1",
155 "eslint-plugin-jsonc": "^2.18.2",
156 "eslint-plugin-n": "^17.15.1",
157 "eslint-plugin-no-only-tests": "^3.3.0",
157 - "eslint-plugin-perfectionist": "^4.4.0",
158 + "eslint-plugin-perfectionist": "^4.6.0",
159 "eslint-plugin-regexp": "^2.7.0",
160 "eslint-plugin-toml": "^0.12.0",
161 "eslint-plugin-unicorn": "^56.0.1",
162 "eslint-plugin-unused-imports": "^4.1.4",
163 "eslint-plugin-vue": "^9.32.0",
164 "eslint-plugin-yml": "^1.16.0",
164 - "eslint-processor-vue-blocks": "^0.1.2",
165 + "eslint-processor-vue-blocks": "^1.0.0",
166 "globals": "^15.14.0",
167 "jsonc-eslint-parser": "^2.4.0",
167 - "local-pkg": "^0.5.1",
168 + "local-pkg": "^1.0.0",
169 "parse-gitignore": "^2.0.0",
170 "picocolors": "^1.1.1",
171 "toml-eslint-parser": "^0.10.0",
@@ -237,23 +238,23 @@
238 }
239 },
240 "node_modules/@antfu/install-pkg": {
240 - "version": "0.5.0",
241 - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.5.0.tgz",
242 - "integrity": "sha512-dKnk2xlAyC7rvTkpkHmu+Qy/2Zc3Vm/l8PtNyIOGDBtXPY3kThfU4ORNEp3V7SXw5XSOb+tOJaUYpfquPzL/Tg==",
241 + "version": "1.0.0",
242 + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.0.0.tgz",
243 + "integrity": "sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==",
244 "dev": true,
245 "license": "MIT",
246 "dependencies": {
246 - "package-manager-detector": "^0.2.5",
247 - "tinyexec": "^0.3.1"
247 + "package-manager-detector": "^0.2.8",
248 + "tinyexec": "^0.3.2"
249 },
250 "funding": {
251 "url": "https://github.com/sponsors/antfu"
252 }
253 },
254 "node_modules/@antfu/ni": {
254 - "version": "0.23.2",
255 - "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-0.23.2.tgz",
256 - "integrity": "sha512-FSEVWXvwroExDXUu8qV6Wqp2X3D1nJ0Li4LFymCyvCVrm7I3lNfG0zZWSWvGU1RE7891eTnFTyh31L3igOwNKQ==",
255 + "version": "23.2.0",
256 + "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-23.2.0.tgz",
257 + "integrity": "sha512-PsqWG9QcgTQ0eyEMxYaaJMxoCaCmy8InPkToC7MQuOHHUPQknMZtCrnzZSZDXk+X9Z93eGFh+v0mE2X6FWNtuw==",
258 "dev": true,
259 "license": "MIT",
260 "bin": {
@@ -276,6 +277,27 @@
277 "url": "https://github.com/sponsors/antfu"
278 }
279 },
280 + "node_modules/@asamuzakjp/css-color": {
281 + "version": "2.8.3",
282 + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-2.8.3.tgz",
283 + "integrity": "sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==",
284 + "dev": true,
285 + "license": "MIT",
286 + "dependencies": {
287 + "@csstools/css-calc": "^2.1.1",
288 + "@csstools/css-color-parser": "^3.0.7",
289 + "@csstools/css-parser-algorithms": "^3.0.4",
290 + "@csstools/css-tokenizer": "^3.0.3",
291 + "lru-cache": "^10.4.3"
292 + }
293 + },
294 + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": {
295 + "version": "10.4.3",
296 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
297 + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
298 + "dev": true,
299 + "license": "ISC"
300 + },
301 "node_modules/@babel/code-frame": {
302 "version": "7.26.2",
303 "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
@@ -291,9 +313,9 @@
313 }
314 },
315 "node_modules/@babel/compat-data": {
294 - "version": "7.26.3",
295 - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz",
296 - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==",
316 + "version": "7.26.5",
317 + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz",
318 + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==",
319 "license": "MIT",
320 "engines": {
321 "node": ">=6.9.0"
@@ -339,13 +361,13 @@
361 }
362 },
363 "node_modules/@babel/generator": {
342 - "version": "7.26.3",
343 - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz",
344 - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==",
364 + "version": "7.26.5",
365 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz",
366 + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==",
367 "license": "MIT",
368 "dependencies": {
347 - "@babel/parser": "^7.26.3",
348 - "@babel/types": "^7.26.3",
369 + "@babel/parser": "^7.26.5",
370 + "@babel/types": "^7.26.5",
371 "@jridgewell/gen-mapping": "^0.3.5",
372 "@jridgewell/trace-mapping": "^0.3.25",
373 "jsesc": "^3.0.2"
@@ -368,12 +390,12 @@
390 }
391 },
392 "node_modules/@babel/helper-compilation-targets": {
371 - "version": "7.25.9",
372 - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
373 - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==",
393 + "version": "7.26.5",
394 + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz",
395 + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==",
396 "license": "MIT",
397 "dependencies": {
376 - "@babel/compat-data": "^7.25.9",
398 + "@babel/compat-data": "^7.26.5",
399 "@babel/helper-validator-option": "^7.25.9",
400 "browserslist": "^4.24.0",
401 "lru-cache": "^5.1.1",
@@ -482,9 +504,9 @@
504 }
505 },
506 "node_modules/@babel/helper-plugin-utils": {
485 - "version": "7.25.9",
486 - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz",
487 - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==",
507 + "version": "7.26.5",
508 + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
509 + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
510 "dev": true,
511 "license": "MIT",
512 "engines": {
@@ -492,15 +514,15 @@
514 }
515 },
516 "node_modules/@babel/helper-replace-supers": {
495 - "version": "7.25.9",
496 - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz",
497 - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==",
517 + "version": "7.26.5",
518 + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz",
519 + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==",
520 "dev": true,
521 "license": "MIT",
522 "dependencies": {
523 "@babel/helper-member-expression-to-functions": "^7.25.9",
524 "@babel/helper-optimise-call-expression": "^7.25.9",
503 - "@babel/traverse": "^7.25.9"
525 + "@babel/traverse": "^7.26.5"
526 },
527 "engines": {
528 "node": ">=6.9.0"
@@ -564,12 +586,12 @@
586 }
587 },
588 "node_modules/@babel/parser": {
567 - "version": "7.26.3",
568 - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz",
569 - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==",
589 + "version": "7.26.5",
590 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz",
591 + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==",
592 "license": "MIT",
593 "dependencies": {
572 - "@babel/types": "^7.26.3"
594 + "@babel/types": "^7.26.5"
595 },
596 "bin": {
597 "parser": "bin/babel-parser.js"
@@ -674,15 +696,15 @@
696 }
697 },
698 "node_modules/@babel/plugin-transform-typescript": {
677 - "version": "7.26.3",
678 - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz",
679 - "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==",
699 + "version": "7.26.5",
700 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.5.tgz",
701 + "integrity": "sha512-GJhPO0y8SD5EYVCy2Zr+9dSZcEgaSmq5BLR0Oc25TOEhC+ba49vUAGZFjy8v79z9E1mdldq4x9d1xgh4L1d5dQ==",
702 "dev": true,
703 "license": "MIT",
704 "dependencies": {
705 "@babel/helper-annotate-as-pure": "^7.25.9",
706 "@babel/helper-create-class-features-plugin": "^7.25.9",
685 - "@babel/helper-plugin-utils": "^7.25.9",
707 + "@babel/helper-plugin-utils": "^7.26.5",
708 "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
709 "@babel/plugin-syntax-typescript": "^7.25.9"
710 },
@@ -694,9 +716,9 @@
716 }
717 },
718 "node_modules/@babel/standalone": {
697 - "version": "7.26.4",
698 - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.26.4.tgz",
699 - "integrity": "sha512-SF+g7S2mhTT1b7CHyfNjDkPU1corxg4LPYsyP0x5KuCl+EbtBQHRLqr9N3q7e7+x7NQ5LYxQf8mJ2PmzebLr0A==",
719 + "version": "7.26.6",
720 + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.26.6.tgz",
721 + "integrity": "sha512-h1mkoNFYCqDkS+vTLGzsQYvp1v1qbuugk4lOtb/oyjArZ+EtreAaxcSYg3rSIzWZRQOjx4iqGe7A8NRYIMSTTw==",
722 "license": "MIT",
723 "engines": {
724 "node": ">=6.9.0"
@@ -717,16 +739,16 @@
739 }
740 },
741 "node_modules/@babel/traverse": {
720 - "version": "7.26.4",
721 - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz",
722 - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==",
742 + "version": "7.26.5",
743 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz",
744 + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==",
745 "license": "MIT",
746 "dependencies": {
747 "@babel/code-frame": "^7.26.2",
726 - "@babel/generator": "^7.26.3",
727 - "@babel/parser": "^7.26.3",
748 + "@babel/generator": "^7.26.5",
749 + "@babel/parser": "^7.26.5",
750 "@babel/template": "^7.25.9",
729 - "@babel/types": "^7.26.3",
751 + "@babel/types": "^7.26.5",
752 "debug": "^4.3.1",
753 "globals": "^11.1.0"
754 },
@@ -744,9 +766,9 @@
766 }
767 },
768 "node_modules/@babel/types": {
747 - "version": "7.26.3",
748 - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz",
749 - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
769 + "version": "7.26.5",
770 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz",
771 + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==",
772 "license": "MIT",
773 "dependencies": {
774 "@babel/helper-string-parser": "^7.25.9",
@@ -757,9 +779,9 @@
779 }
780 },
781 "node_modules/@clack/core": {
760 - "version": "0.4.0",
761 - "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.4.0.tgz",
762 - "integrity": "sha512-YJCYBsyJfNDaTbvDUVSJ3SgSuPrcujarRgkJ5NLjexDZKvaOiVVJvAQYx8lIgG0qRT8ff0fPgqyBCVivanIZ+A==",
782 + "version": "0.4.1",
783 + "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.4.1.tgz",
784 + "integrity": "sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA==",
785 "dev": true,
786 "license": "MIT",
787 "dependencies": {
@@ -768,13 +790,13 @@
790 }
791 },
792 "node_modules/@clack/prompts": {
771 - "version": "0.9.0",
772 - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.9.0.tgz",
773 - "integrity": "sha512-nGsytiExgUr4FL0pR/LeqxA28nz3E0cW7eLTSh3Iod9TGrbBt8Y7BHbV3mmkNC4G0evdYyQ3ZsbiBkk7ektArA==",
793 + "version": "0.9.1",
794 + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.9.1.tgz",
795 + "integrity": "sha512-JIpyaboYZeWYlyP0H+OoPPxd6nqueG/CmN6ixBiNFsIDHREevjIf0n0Ohh5gr5C8pEDknzgvz+pIJ8dMhzWIeg==",
796 "dev": true,
797 "license": "MIT",
798 "dependencies": {
777 - "@clack/core": "0.4.0",
799 + "@clack/core": "0.4.1",
800 "picocolors": "^1.0.0",
801 "sisteransi": "^1.0.5"
802 }
@@ -808,6 +830,121 @@
830 "vue": "^3.0.11"
831 }
832 },
833 + "node_modules/@csstools/color-helpers": {
834 + "version": "5.0.1",
835 + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz",
836 + "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==",
837 + "dev": true,
838 + "funding": [
839 + {
840 + "type": "github",
841 + "url": "https://github.com/sponsors/csstools"
842 + },
843 + {
844 + "type": "opencollective",
845 + "url": "https://opencollective.com/csstools"
846 + }
847 + ],
848 + "license": "MIT-0",
849 + "engines": {
850 + "node": ">=18"
851 + }
852 + },
853 + "node_modules/@csstools/css-calc": {
854 + "version": "2.1.1",
855 + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.1.tgz",
856 + "integrity": "sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==",
857 + "dev": true,
858 + "funding": [
859 + {
860 + "type": "github",
861 + "url": "https://github.com/sponsors/csstools"
862 + },
863 + {
864 + "type": "opencollective",
865 + "url": "https://opencollective.com/csstools"
866 + }
867 + ],
868 + "license": "MIT",
869 + "engines": {
870 + "node": ">=18"
871 + },
872 + "peerDependencies": {
873 + "@csstools/css-parser-algorithms": "^3.0.4",
874 + "@csstools/css-tokenizer": "^3.0.3"
875 + }
876 + },
877 + "node_modules/@csstools/css-color-parser": {
878 + "version": "3.0.7",
879 + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz",
880 + "integrity": "sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==",
881 + "dev": true,
882 + "funding": [
883 + {
884 + "type": "github",
885 + "url": "https://github.com/sponsors/csstools"
886 + },
887 + {
888 + "type": "opencollective",
889 + "url": "https://opencollective.com/csstools"
890 + }
891 + ],
892 + "license": "MIT",
893 + "dependencies": {
894 + "@csstools/color-helpers": "^5.0.1",
895 + "@csstools/css-calc": "^2.1.1"
896 + },
897 + "engines": {
898 + "node": ">=18"
899 + },
900 + "peerDependencies": {
901 + "@csstools/css-parser-algorithms": "^3.0.4",
902 + "@csstools/css-tokenizer": "^3.0.3"
903 + }
904 + },
905 + "node_modules/@csstools/css-parser-algorithms": {
906 + "version": "3.0.4",
907 + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz",
908 + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==",
909 + "dev": true,
910 + "funding": [
911 + {
912 + "type": "github",
913 + "url": "https://github.com/sponsors/csstools"
914 + },
915 + {
916 + "type": "opencollective",
917 + "url": "https://opencollective.com/csstools"
918 + }
919 + ],
920 + "license": "MIT",
921 + "engines": {
922 + "node": ">=18"
923 + },
924 + "peerDependencies": {
925 + "@csstools/css-tokenizer": "^3.0.3"
926 + }
927 + },
928 + "node_modules/@csstools/css-tokenizer": {
929 + "version": "3.0.3",
930 + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz",
931 + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==",
932 + "dev": true,
933 + "funding": [
934 + {
935 + "type": "github",
936 + "url": "https://github.com/sponsors/csstools"
937 + },
938 + {
939 + "type": "opencollective",
940 + "url": "https://opencollective.com/csstools"
941 + }
942 + ],
943 + "license": "MIT",
944 + "engines": {
945 + "node": ">=18"
946 + }
947 + },
948 "node_modules/@cypress/request": {
949 "version": "3.0.7",
950 "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.7.tgz",
@@ -866,18 +1003,21 @@
1003 "license": "MIT"
1004 },
1005 "node_modules/@es-joy/jsdoccomment": {
869 - "version": "0.49.0",
870 - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz",
871 - "integrity": "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==",
1006 + "version": "0.50.0",
1007 + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.50.0.tgz",
1008 + "integrity": "sha512-+zZymuVLH6zVwXPtCAtC+bDymxmEwEqDftdAK+f407IF1bnX49anIxvBhCA1AqUIfD6egj1jM1vUnSuijjNyYg==",
1009 "dev": true,
1010 "license": "MIT",
1011 "dependencies": {
1012 + "@types/eslint": "^9.6.1",
1013 + "@types/estree": "^1.0.6",
1014 + "@typescript-eslint/types": "^8.11.0",
1015 "comment-parser": "1.4.1",
1016 "esquery": "^1.6.0",
1017 "jsdoc-type-pratt-parser": "~4.1.0"
1018 },
1019 "engines": {
880 - "node": ">=16"
1020 + "node": ">=18"
1021 }
1022 },
1023 "node_modules/@esbuild/aix-ppc64": {
@@ -1368,9 +1508,9 @@
1508 }
1509 },
1510 "node_modules/@eslint/compat": {
1371 - "version": "1.2.4",
1372 - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.4.tgz",
1373 - "integrity": "sha512-S8ZdQj/N69YAtuqFt7653jwcvuUj131+6qGLUyDqfDg1OIoBQ66OCuXC473YQfO2AaxITTutiRQiDwoo7ZLYyg==",
1511 + "version": "1.2.5",
1512 + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.5.tgz",
1513 + "integrity": "sha512-5iuG/StT+7OfvhoBHPlmxkPA9om6aDUFgmD4+mWKAGsYt4vCe8rypneG03AuseyRHBmcCLXQtIH5S26tIoggLg==",
1514 "dev": true,
1515 "license": "Apache-2.0",
1516 "engines": {
@@ -1425,9 +1565,9 @@
1565 }
1566 },
1567 "node_modules/@eslint/core": {
1428 - "version": "0.9.1",
1429 - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz",
1430 - "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==",
1568 + "version": "0.10.0",
1569 + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz",
1570 + "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==",
1571 "dev": true,
1572 "license": "Apache-2.0",
1573 "dependencies": {
@@ -1519,9 +1659,9 @@
1659 }
1660 },
1661 "node_modules/@eslint/js": {
1522 - "version": "9.17.0",
1523 - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz",
1524 - "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==",
1662 + "version": "9.18.0",
1663 + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.18.0.tgz",
1664 + "integrity": "sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==",
1665 "dev": true,
1666 "license": "MIT",
1667 "engines": {
@@ -1555,12 +1695,13 @@
1695 }
1696 },
1697 "node_modules/@eslint/plugin-kit": {
1558 - "version": "0.2.4",
1559 - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz",
1560 - "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==",
1698 + "version": "0.2.5",
1699 + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz",
1700 + "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==",
1701 "dev": true,
1702 "license": "Apache-2.0",
1703 "dependencies": {
1704 + "@eslint/core": "^0.10.0",
1705 "levn": "^0.4.1"
1706 },
1707 "engines": {
@@ -1921,72 +2062,61 @@
2062 }
2063 },
2064 "node_modules/@nuxt/kit": {
1924 - "version": "3.15.1",
1925 - "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.15.1.tgz",
1926 - "integrity": "sha512-7cVWjzfz3L6CsZrg6ppDZa7zGrZxCSfZjEQDIvVFn4mFKtJlK9k2izf5EewL6luzWwIQojkZAC3iq/1wtgI0Xw==",
2065 + "version": "3.15.2",
2066 + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.15.2.tgz",
2067 + "integrity": "sha512-nxiPJVz2fICcyBKlN5pL1IgZVejyArulREsS5HvAk07hijlYuZ5toRM8soLt51VQNpFd/PedL+Z1AlYu/bQCYQ==",
2068 "license": "MIT",
2069 "dependencies": {
1929 - "@nuxt/schema": "3.15.1",
2070 + "@nuxt/schema": "3.15.2",
2071 "c12": "^2.0.1",
1931 - "consola": "^3.3.3",
2072 + "consola": "^3.4.0",
2073 "defu": "^6.1.4",
2074 "destr": "^2.0.3",
2075 "globby": "^14.0.2",
1935 - "ignore": "^7.0.0",
2076 + "ignore": "^7.0.3",
2077 "jiti": "^2.4.2",
2078 "klona": "^2.0.6",
2079 "knitwork": "^1.2.0",
1939 - "mlly": "^1.7.3",
2080 + "mlly": "^1.7.4",
2081 "ohash": "^1.1.4",
1941 - "pathe": "^2.0.0",
1942 - "pkg-types": "^1.3.0",
2082 + "pathe": "^2.0.1",
2083 + "pkg-types": "^1.3.1",
2084 "scule": "^1.3.0",
2085 "semver": "^7.6.3",
2086 + "std-env": "^3.8.0",
2087 "ufo": "^1.5.4",
2088 "unctx": "^2.4.1",
1947 - "unimport": "^3.14.5",
2089 + "unimport": "^3.14.6",
2090 "untyped": "^1.5.2"
2091 },
2092 "engines": {
1951 - "node": ">=18.20.5"
2093 + "node": ">=18.0.0"
2094 }
2095 },
2096 "node_modules/@nuxt/kit/node_modules/ignore": {
1955 - "version": "7.0.0",
1956 - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.0.tgz",
1957 - "integrity": "sha512-lcX8PNQygAa22u/0BysEY8VhaFRzlOkvdlKczDPnJvrkJD1EuqzEky5VYYKM2iySIuaVIDv9N190DfSreSLw2A==",
2097 + "version": "7.0.3",
2098 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz",
2099 + "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==",
2100 "license": "MIT",
2101 "engines": {
2102 "node": ">= 4"
2103 }
2104 },
1963 - "node_modules/@nuxt/kit/node_modules/pathe": {
1964 - "version": "2.0.0",
1965 - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.0.tgz",
1966 - "integrity": "sha512-G7n4uhtk9qJt2hlD+UFfsIGY854wpF+zs2bUbQ3CQEUTcn7v25LRsrmurOxTo4bJgjE4qkyshd9ldsEuY9M6xg==",
1967 - "license": "MIT"
1968 - },
2105 "node_modules/@nuxt/schema": {
1970 - "version": "3.15.1",
1971 - "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.15.1.tgz",
1972 - "integrity": "sha512-n5kOHt8uUyUM9z4Wu/8tIZkBYh3KTCGvyruG6oD9bfeT4OaS21+X3M7XsTXFMe+eYBZA70IFFlWn1JJZIPsKeA==",
2106 + "version": "3.15.2",
2107 + "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.15.2.tgz",
2108 + "integrity": "sha512-cTHGbLTbrQ83B+7Mh0ggc5MzIp74o8KciA0boCiBJyK5uImH9QQNK6VgfwRWcTD5sj3WNKiIB1luOMom3LHgVw==",
2109 "license": "MIT",
2110 "dependencies": {
1975 - "consola": "^3.3.3",
2111 + "consola": "^3.4.0",
2112 "defu": "^6.1.4",
1977 - "pathe": "^2.0.0",
2113 + "pathe": "^2.0.1",
2114 "std-env": "^3.8.0"
2115 },
2116 "engines": {
2117 "node": "^14.18.0 || >=16.10.0"
2118 }
2119 },
1984 - "node_modules/@nuxt/schema/node_modules/pathe": {
1985 - "version": "2.0.0",
1986 - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.0.tgz",
1987 - "integrity": "sha512-G7n4uhtk9qJt2hlD+UFfsIGY854wpF+zs2bUbQ3CQEUTcn7v25LRsrmurOxTo4bJgjE4qkyshd9ldsEuY9M6xg==",
1988 - "license": "MIT"
1989 - },
2120 "node_modules/@one-ini/wasm": {
2121 "version": "0.1.1",
2122 "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz",
@@ -2357,9 +2487,9 @@
2487 }
2488 },
2489 "node_modules/@rollup/rollup-android-arm-eabi": {
2360 - "version": "4.30.0",
2361 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.0.tgz",
2362 - "integrity": "sha512-qFcFto9figFLz2g25DxJ1WWL9+c91fTxnGuwhToCl8BaqDsDYMl/kOnBXAyAqkkzAWimYMSWNPWEjt+ADAHuoQ==",
2490 + "version": "4.30.1",
2491 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz",
2492 + "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==",
2493 "cpu": [
2494 "arm"
2495 ],
@@ -2371,9 +2501,9 @@
2501 ]
2502 },
2503 "node_modules/@rollup/rollup-android-arm64": {
2374 - "version": "4.30.0",
2375 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.0.tgz",
2376 - "integrity": "sha512-vqrQdusvVl7dthqNjWCL043qelBK+gv9v3ZiqdxgaJvmZyIAAXMjeGVSqZynKq69T7062T5VrVTuikKSAAVP6A==",
2504 + "version": "4.30.1",
2505 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz",
2506 + "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==",
2507 "cpu": [
2508 "arm64"
2509 ],
@@ -2385,9 +2515,9 @@
2515 ]
2516 },
2517 "node_modules/@rollup/rollup-darwin-arm64": {
2388 - "version": "4.30.0",
2389 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.0.tgz",
2390 - "integrity": "sha512-617pd92LhdA9+wpixnzsyhVft3szYiN16aNUMzVkf2N+yAk8UXY226Bfp36LvxYTUt7MO/ycqGFjQgJ0wlMaWQ==",
2518 + "version": "4.30.1",
2519 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz",
2520 + "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==",
2521 "cpu": [
2522 "arm64"
2523 ],
@@ -2399,9 +2529,9 @@
2529 ]
2530 },
2531 "node_modules/@rollup/rollup-darwin-x64": {
2402 - "version": "4.30.0",
2403 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.0.tgz",
2404 - "integrity": "sha512-Y3b4oDoaEhCypg8ajPqigKDcpi5ZZovemQl9Edpem0uNv6UUjXv7iySBpGIUTSs2ovWOzYpfw9EbFJXF/fJHWw==",
2532 + "version": "4.30.1",
2533 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz",
2534 + "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==",
2535 "cpu": [
2536 "x64"
2537 ],
@@ -2413,9 +2543,9 @@
2543 ]
2544 },
2545 "node_modules/@rollup/rollup-freebsd-arm64": {
2416 - "version": "4.30.0",
2417 - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.0.tgz",
2418 - "integrity": "sha512-3REQJ4f90sFIBfa0BUokiCdrV/E4uIjhkWe1bMgCkhFXbf4D8YN6C4zwJL881GM818qVYE9BO3dGwjKhpo2ABA==",
2546 + "version": "4.30.1",
2547 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz",
2548 + "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==",
2549 "cpu": [
2550 "arm64"
2551 ],
@@ -2427,9 +2557,9 @@
2557 ]
2558 },
2559 "node_modules/@rollup/rollup-freebsd-x64": {
2430 - "version": "4.30.0",
2431 - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.0.tgz",
2432 - "integrity": "sha512-ZtY3Y8icbe3Cc+uQicsXG5L+CRGUfLZjW6j2gn5ikpltt3Whqjfo5mkyZ86UiuHF9Q3ZsaQeW7YswlHnN+lAcg==",
2560 + "version": "4.30.1",
2561 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz",
2562 + "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==",
2563 "cpu": [
2564 "x64"
2565 ],
@@ -2441,9 +2571,9 @@
2571 ]
2572 },
2573 "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
2444 - "version": "4.30.0",
2445 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.0.tgz",
2446 - "integrity": "sha512-bsPGGzfiHXMhQGuFGpmo2PyTwcrh2otL6ycSZAFTESviUoBOuxF7iBbAL5IJXc/69peXl5rAtbewBFeASZ9O0g==",
2574 + "version": "4.30.1",
2575 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz",
2576 + "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==",
2577 "cpu": [
2578 "arm"
2579 ],
@@ -2455,9 +2585,9 @@
2585 ]
2586 },
2587 "node_modules/@rollup/rollup-linux-arm-musleabihf": {
2458 - "version": "4.30.0",
2459 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.0.tgz",
2460 - "integrity": "sha512-kvyIECEhs2DrrdfQf++maCWJIQ974EI4txlz1nNSBaCdtf7i5Xf1AQCEJWOC5rEBisdaMFFnOWNLYt7KpFqy5A==",
2588 + "version": "4.30.1",
2589 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz",
2590 + "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==",
2591 "cpu": [
2592 "arm"
2593 ],
@@ -2469,9 +2599,9 @@
2599 ]
2600 },
2601 "node_modules/@rollup/rollup-linux-arm64-gnu": {
2472 - "version": "4.30.0",
2473 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.0.tgz",
2474 - "integrity": "sha512-CFE7zDNrokaotXu+shwIrmWrFxllg79vciH4E/zeK7NitVuWEaXRzS0mFfFvyhZfn8WfVOG/1E9u8/DFEgK7WQ==",
2602 + "version": "4.30.1",
2603 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz",
2604 + "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==",
2605 "cpu": [
2606 "arm64"
2607 ],
@@ -2483,9 +2613,9 @@
2613 ]
2614 },
2615 "node_modules/@rollup/rollup-linux-arm64-musl": {
2486 - "version": "4.30.0",
2487 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.0.tgz",
2488 - "integrity": "sha512-MctNTBlvMcIBP0t8lV/NXiUwFg9oK5F79CxLU+a3xgrdJjfBLVIEHSAjQ9+ipofN2GKaMLnFFXLltg1HEEPaGQ==",
2616 + "version": "4.30.1",
2617 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz",
2618 + "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==",
2619 "cpu": [
2620 "arm64"
2621 ],
@@ -2497,9 +2627,9 @@
2627 ]
2628 },
2629 "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
2500 - "version": "4.30.0",
2501 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.0.tgz",
2502 - "integrity": "sha512-fBpoYwLEPivL3q368+gwn4qnYnr7GVwM6NnMo8rJ4wb0p/Y5lg88vQRRP077gf+tc25akuqd+1Sxbn9meODhwA==",
2630 + "version": "4.30.1",
2631 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz",
2632 + "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==",
2633 "cpu": [
2634 "loong64"
2635 ],
@@ -2511,9 +2641,9 @@
2641 ]
2642 },
2643 "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
2514 - "version": "4.30.0",
2515 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.0.tgz",
2516 - "integrity": "sha512-1hiHPV6dUaqIMXrIjN+vgJqtfkLpqHS1Xsg0oUfUVD98xGp1wX89PIXgDF2DWra1nxAd8dfE0Dk59MyeKaBVAw==",
2644 + "version": "4.30.1",
2645 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz",
2646 + "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==",
2647 "cpu": [
2648 "ppc64"
2649 ],
@@ -2525,9 +2655,9 @@
2655 ]
2656 },
2657 "node_modules/@rollup/rollup-linux-riscv64-gnu": {
2528 - "version": "4.30.0",
2529 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.0.tgz",
2530 - "integrity": "sha512-U0xcC80SMpEbvvLw92emHrNjlS3OXjAM0aVzlWfar6PR0ODWCTQtKeeB+tlAPGfZQXicv1SpWwRz9Hyzq3Jx3g==",
2658 + "version": "4.30.1",
2659 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz",
2660 + "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==",
2661 "cpu": [
2662 "riscv64"
2663 ],
@@ -2539,9 +2669,9 @@
2669 ]
2670 },
2671 "node_modules/@rollup/rollup-linux-s390x-gnu": {
2542 - "version": "4.30.0",
2543 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.0.tgz",
2544 - "integrity": "sha512-VU/P/IODrNPasgZDLIFJmMiLGez+BN11DQWfTVlViJVabyF3JaeaJkP6teI8760f18BMGCQOW9gOmuzFaI1pUw==",
2672 + "version": "4.30.1",
2673 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz",
2674 + "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==",
2675 "cpu": [
2676 "s390x"
2677 ],
@@ -2553,9 +2683,9 @@
2683 ]
2684 },
2685 "node_modules/@rollup/rollup-linux-x64-gnu": {
2556 - "version": "4.30.0",
2557 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.0.tgz",
2558 - "integrity": "sha512-laQVRvdbKmjXuFA3ZiZj7+U24FcmoPlXEi2OyLfbpY2MW1oxLt9Au8q9eHd0x6Pw/Kw4oe9gwVXWwIf2PVqblg==",
2686 + "version": "4.30.1",
2687 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz",
2688 + "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==",
2689 "cpu": [
2690 "x64"
2691 ],
@@ -2566,9 +2696,9 @@
2696 ]
2697 },
2698 "node_modules/@rollup/rollup-linux-x64-musl": {
2569 - "version": "4.30.0",
2570 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.0.tgz",
2571 - "integrity": "sha512-3wzKzduS7jzxqcOvy/ocU/gMR3/QrHEFLge5CD7Si9fyHuoXcidyYZ6jyx8OPYmCcGm3uKTUl+9jUSAY74Ln5A==",
2699 + "version": "4.30.1",
2700 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz",
2701 + "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==",
2702 "cpu": [
2703 "x64"
2704 ],
@@ -2580,9 +2710,9 @@
2710 ]
2711 },
2712 "node_modules/@rollup/rollup-win32-arm64-msvc": {
2583 - "version": "4.30.0",
2584 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.0.tgz",
2585 - "integrity": "sha512-jROwnI1+wPyuv696rAFHp5+6RFhXGGwgmgSfzE8e4xfit6oLRg7GyMArVUoM3ChS045OwWr9aTnU+2c1UdBMyw==",
2713 + "version": "4.30.1",
2714 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz",
2715 + "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==",
2716 "cpu": [
2717 "arm64"
2718 ],
@@ -2594,9 +2724,9 @@
2724 ]
2725 },
2726 "node_modules/@rollup/rollup-win32-ia32-msvc": {
2597 - "version": "4.30.0",
2598 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.0.tgz",
2599 - "integrity": "sha512-duzweyup5WELhcXx5H1jokpr13i3BV9b48FMiikYAwk/MT1LrMYYk2TzenBd0jj4ivQIt58JWSxc19y4SvLP4g==",
2727 + "version": "4.30.1",
2728 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz",
2729 + "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==",
2730 "cpu": [
2731 "ia32"
2732 ],
@@ -2608,9 +2738,9 @@
2738 ]
2739 },
2740 "node_modules/@rollup/rollup-win32-x64-msvc": {
2611 - "version": "4.30.0",
2612 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.0.tgz",
2613 - "integrity": "sha512-DYvxS0M07PvgvavMIybCOBYheyrqlui6ZQBHJs6GqduVzHSZ06TPPvlfvnYstjODHQ8UUXFwt5YE+h0jFI8kwg==",
2741 + "version": "4.30.1",
2742 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz",
2743 + "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==",
2744 "cpu": [
2745 "x64"
2746 ],
@@ -2629,72 +2759,72 @@
2759 "license": "MIT"
2760 },
2761 "node_modules/@shikijs/core": {
2632 - "version": "1.26.1",
2633 - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.26.1.tgz",
2634 - "integrity": "sha512-yeo7sG+WZQblKPclUOKRPwkv1PyoHYkJ4gP9DzhFJbTdueKR7wYTI1vfF/bFi1NTgc545yG/DzvVhZgueVOXMA==",
2762 + "version": "1.27.2",
2763 + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.27.2.tgz",
2764 + "integrity": "sha512-ns1dokDr0KE1lQ9mWd4rqaBkhSApk0qGCK1+lOqwnkQSkVZ08UGqXj1Ef8dAcTMZNFkN6PSNjkL5TYNX7pyPbQ==",
2765 "license": "MIT",
2766 "dependencies": {
2637 - "@shikijs/engine-javascript": "1.26.1",
2638 - "@shikijs/engine-oniguruma": "1.26.1",
2639 - "@shikijs/types": "1.26.1",
2767 + "@shikijs/engine-javascript": "1.27.2",
2768 + "@shikijs/engine-oniguruma": "1.27.2",
2769 + "@shikijs/types": "1.27.2",
2770 "@shikijs/vscode-textmate": "^10.0.1",
2771 "@types/hast": "^3.0.4",
2772 "hast-util-to-html": "^9.0.4"
2773 }
2774 },
2775 "node_modules/@shikijs/engine-javascript": {
2646 - "version": "1.26.1",
2647 - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.26.1.tgz",
2648 - "integrity": "sha512-CRhA0b8CaSLxS0E9A4Bzcb3LKBNpykfo9F85ozlNyArxjo2NkijtiwrJZ6eHa+NT5I9Kox2IXVdjUsP4dilsmw==",
2776 + "version": "1.27.2",
2777 + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.27.2.tgz",
2778 + "integrity": "sha512-0JB7U5vJc16NShBdxv9hSSJYSKX79+32O7F4oXIxJLdYfomyFvx4B982ackUI9ftO9T3WwagkiiD3nOxOOLiGA==",
2779 "license": "MIT",
2780 "dependencies": {
2651 - "@shikijs/types": "1.26.1",
2781 + "@shikijs/types": "1.27.2",
2782 "@shikijs/vscode-textmate": "^10.0.1",
2653 - "oniguruma-to-es": "0.10.0"
2783 + "oniguruma-to-es": "^2.0.0"
2784 }
2785 },
2786 "node_modules/@shikijs/engine-oniguruma": {
2657 - "version": "1.26.1",
2658 - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.26.1.tgz",
2659 - "integrity": "sha512-F5XuxN1HljLuvfXv7d+mlTkV7XukC1cawdtOo+7pKgPD83CAB1Sf8uHqP3PK0u7njFH0ZhoXE1r+0JzEgAQ+kg==",
2787 + "version": "1.27.2",
2788 + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.27.2.tgz",
2789 + "integrity": "sha512-FZYKD1KN7srvpkz4lbGLOYWlyDU4Rd+2RtuKfABTkafAPOFr+J6umfIwY/TzOQqfNtWjL7SAwPAO0dcOraRLaQ==",
2790 "license": "MIT",
2791 "dependencies": {
2662 - "@shikijs/types": "1.26.1",
2792 + "@shikijs/types": "1.27.2",
2793 "@shikijs/vscode-textmate": "^10.0.1"
2794 }
2795 },
2796 "node_modules/@shikijs/langs": {
2667 - "version": "1.26.1",
2668 - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-1.26.1.tgz",
2669 - "integrity": "sha512-oz/TQiIqZejEIZbGtn68hbJijAOTtYH4TMMSWkWYozwqdpKR3EXgILneQy26WItmJjp3xVspHdiUxUCws4gtuw==",
2797 + "version": "1.27.2",
2798 + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-1.27.2.tgz",
2799 + "integrity": "sha512-MSrknKL0DbeXvhtSigMLIzjPOOQfvK7fsbcRv2NUUB0EvuTTomY8/U+lAkczYrXY2+dygKOapJKk8ScFYbtoNw==",
2800 "license": "MIT",
2801 "dependencies": {
2672 - "@shikijs/types": "1.26.1"
2802 + "@shikijs/types": "1.27.2"
2803 }
2804 },
2805 "node_modules/@shikijs/markdown-it": {
2676 - "version": "1.26.1",
2677 - "resolved": "https://registry.npmjs.org/@shikijs/markdown-it/-/markdown-it-1.26.1.tgz",
2678 - "integrity": "sha512-+1WSmaD1ANN0x15ud4oMw5RFgFdyT0FpU9OoE7MUbiaU9+pRtAjIx0viTVsbhBzJEG1oVUBzK1Wc6Wz7toiTZg==",
2806 + "version": "1.27.2",
2807 + "resolved": "https://registry.npmjs.org/@shikijs/markdown-it/-/markdown-it-1.27.2.tgz",
2808 + "integrity": "sha512-jZfsrLhqqettpsRjKSiD+2AgIt7PfBQIX8X3qyiwSZrIjtcP6adb/hopj5tCXKYCbXA1bPe1T5QwNfylKSUvkw==",
2809 "license": "MIT",
2810 "dependencies": {
2811 "markdown-it": "^14.1.0",
2682 - "shiki": "1.26.1"
2812 + "shiki": "1.27.2"
2813 }
2814 },
2815 "node_modules/@shikijs/themes": {
2686 - "version": "1.26.1",
2687 - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-1.26.1.tgz",
2688 - "integrity": "sha512-JDxVn+z+wgLCiUhBGx2OQrLCkKZQGzNH3nAxFir4PjUcYiyD8Jdms9izyxIogYmSwmoPTatFTdzyrRKbKlSfPA==",
2816 + "version": "1.27.2",
2817 + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-1.27.2.tgz",
2818 + "integrity": "sha512-Yw/uV7EijjWavIIZLoWneTAohcbBqEKj6XMX1bfMqO3llqTKsyXukPp1evf8qPqzUHY7ibauqEaQchhfi857mg==",
2819 "license": "MIT",
2820 "dependencies": {
2691 - "@shikijs/types": "1.26.1"
2821 + "@shikijs/types": "1.27.2"
2822 }
2823 },
2824 "node_modules/@shikijs/types": {
2695 - "version": "1.26.1",
2696 - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.26.1.tgz",
2697 - "integrity": "sha512-d4B00TKKAMaHuFYgRf3L0gwtvqpW4hVdVwKcZYbBfAAQXspgkbWqnFfuFl3MDH6gLbsubOcr+prcnsqah3ny7Q==",
2825 + "version": "1.27.2",
2826 + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.27.2.tgz",
2827 + "integrity": "sha512-DM9OWUyjmdYdnKDpaGB/GEn9XkToyK1tqxuqbmc5PV+5K8WjjwfygL3+cIvbkSw2v1ySwHDgqATq/+98pJ4Kyg==",
2828 "license": "MIT",
2829 "dependencies": {
2830 "@shikijs/vscode-textmate": "^10.0.1",
@@ -2744,9 +2874,9 @@
2874 }
2875 },
2876 "node_modules/@stylistic/eslint-plugin": {
2747 - "version": "2.12.1",
2748 - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.12.1.tgz",
2749 - "integrity": "sha512-fubZKIHSPuo07FgRTn6S4Nl0uXPRPYVNpyZzIDGfp7Fny6JjNus6kReLD7NI380JXi4HtUTSOZ34LBuNPO1XLQ==",
2877 + "version": "2.13.0",
2878 + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.13.0.tgz",
2879 + "integrity": "sha512-RnO1SaiCFHn666wNz2QfZEFxvmiNRqhzaMXHXxXXKt+MEP7aajlPxUSMIQpKAaJfverpovEYqjBOXDq6dDcaOQ==",
2880 "dev": true,
2881 "license": "MIT",
2882 "dependencies": {
@@ -2764,9 +2894,9 @@
2894 }
2895 },
2896 "node_modules/@svgdotjs/svg.draggable.js": {
2767 - "version": "3.0.4",
2768 - "resolved": "https://registry.npmjs.org/@svgdotjs/svg.draggable.js/-/svg.draggable.js-3.0.4.tgz",
2769 - "integrity": "sha512-vWi/Col5Szo74HJVBgMHz23kLVljt3jvngmh0DzST45iO2ubIZ487uUAHIxSZH2tVRyiaaTL+Phaasgp4gUD2g==",
2897 + "version": "3.0.5",
2898 + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.draggable.js/-/svg.draggable.js-3.0.5.tgz",
2899 + "integrity": "sha512-ljL/fB0tAjRfFOJGhXpr7rEx9DJ6D7Pxt3AXvgxjEM17g6wK3Ho9nXhntraOMx8JLZdq4NBMjokeXMvnQzJVYA==",
2900 "license": "MIT",
2901 "peer": true,
2902 "peerDependencies": {
@@ -2874,6 +3004,17 @@
3004 "dev": true,
3005 "license": "MIT"
3006 },
3007 + "node_modules/@types/eslint": {
3008 + "version": "9.6.1",
3009 + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
3010 + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
3011 + "dev": true,
3012 + "license": "MIT",
3013 + "dependencies": {
3014 + "@types/estree": "*",
3015 + "@types/json-schema": "*"
3016 + }
3017 + },
3018 "node_modules/@types/estree": {
3019 "version": "1.0.6",
3020 "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
@@ -2981,9 +3122,9 @@
3122 "license": "MIT"
3123 },
3124 "node_modules/@types/node": {
2984 - "version": "22.10.5",
2985 - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz",
2986 - "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==",
3125 + "version": "22.10.7",
3126 + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz",
3127 + "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==",
3128 "dev": true,
3129 "license": "MIT",
3130 "dependencies": {
@@ -3056,17 +3197,17 @@
3197 }
3198 },
3199 "node_modules/@typescript-eslint/eslint-plugin": {
3059 - "version": "8.19.1",
3060 - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.19.1.tgz",
3061 - "integrity": "sha512-tJzcVyvvb9h/PB96g30MpxACd9IrunT7GF9wfA9/0TJ1LxGOJx1TdPzSbBBnNED7K9Ka8ybJsnEpiXPktolTLg==",
3200 + "version": "8.20.0",
3201 + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.20.0.tgz",
3202 + "integrity": "sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==",
3203 "dev": true,
3204 "license": "MIT",
3205 "dependencies": {
3206 "@eslint-community/regexpp": "^4.10.0",
3066 - "@typescript-eslint/scope-manager": "8.19.1",
3067 - "@typescript-eslint/type-utils": "8.19.1",
3068 - "@typescript-eslint/utils": "8.19.1",
3069 - "@typescript-eslint/visitor-keys": "8.19.1",
3207 + "@typescript-eslint/scope-manager": "8.20.0",
3208 + "@typescript-eslint/type-utils": "8.20.0",
3209 + "@typescript-eslint/utils": "8.20.0",
3210 + "@typescript-eslint/visitor-keys": "8.20.0",
3211 "graphemer": "^1.4.0",
3212 "ignore": "^5.3.1",
3213 "natural-compare": "^1.4.0",
@@ -3086,16 +3227,16 @@
3227 }
3228 },
3229 "node_modules/@typescript-eslint/parser": {
3089 - "version": "8.19.1",
3090 - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.19.1.tgz",
3091 - "integrity": "sha512-67gbfv8rAwawjYx3fYArwldTQKoYfezNUT4D5ioWetr/xCrxXxvleo3uuiFuKfejipvq+og7mjz3b0G2bVyUCw==",
3230 + "version": "8.20.0",
3231 + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.20.0.tgz",
3232 + "integrity": "sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==",
3233 "dev": true,
3234 "license": "MIT",
3235 "dependencies": {
3095 - "@typescript-eslint/scope-manager": "8.19.1",
3096 - "@typescript-eslint/types": "8.19.1",
3097 - "@typescript-eslint/typescript-estree": "8.19.1",
3098 - "@typescript-eslint/visitor-keys": "8.19.1",
3236 + "@typescript-eslint/scope-manager": "8.20.0",
3237 + "@typescript-eslint/types": "8.20.0",
3238 + "@typescript-eslint/typescript-estree": "8.20.0",
3239 + "@typescript-eslint/visitor-keys": "8.20.0",
3240 "debug": "^4.3.4"
3241 },
3242 "engines": {
@@ -3111,14 +3252,14 @@
3252 }
3253 },
3254 "node_modules/@typescript-eslint/scope-manager": {
3114 - "version": "8.19.1",
3115 - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.19.1.tgz",
3116 - "integrity": "sha512-60L9KIuN/xgmsINzonOcMDSB8p82h95hoBfSBtXuO4jlR1R9L1xSkmVZKgCPVfavDlXihh4ARNjXhh1gGnLC7Q==",
3255 + "version": "8.20.0",
3256 + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.20.0.tgz",
3257 + "integrity": "sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==",
3258 "dev": true,
3259 "license": "MIT",
3260 "dependencies": {
3120 - "@typescript-eslint/types": "8.19.1",
3121 - "@typescript-eslint/visitor-keys": "8.19.1"
3261 + "@typescript-eslint/types": "8.20.0",
3262 + "@typescript-eslint/visitor-keys": "8.20.0"
3263 },
3264 "engines": {
3265 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3129,14 +3270,14 @@
3270 }
3271 },
3272 "node_modules/@typescript-eslint/type-utils": {
3132 - "version": "8.19.1",
3133 - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.19.1.tgz",
3134 - "integrity": "sha512-Rp7k9lhDKBMRJB/nM9Ksp1zs4796wVNyihG9/TU9R6KCJDNkQbc2EOKjrBtLYh3396ZdpXLtr/MkaSEmNMtykw==",
3273 + "version": "8.20.0",
3274 + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.20.0.tgz",
3275 + "integrity": "sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==",
3276 "dev": true,
3277 "license": "MIT",
3278 "dependencies": {
3138 - "@typescript-eslint/typescript-estree": "8.19.1",
3139 - "@typescript-eslint/utils": "8.19.1",
3279 + "@typescript-eslint/typescript-estree": "8.20.0",
3280 + "@typescript-eslint/utils": "8.20.0",
3281 "debug": "^4.3.4",
3282 "ts-api-utils": "^2.0.0"
3283 },
@@ -3153,9 +3294,9 @@
3294 }
3295 },
3296 "node_modules/@typescript-eslint/types": {
3156 - "version": "8.19.1",
3157 - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.19.1.tgz",
3158 - "integrity": "sha512-JBVHMLj7B1K1v1051ZaMMgLW4Q/jre5qGK0Ew6UgXz1Rqh+/xPzV1aW581OM00X6iOfyr1be+QyW8LOUf19BbA==",
3297 + "version": "8.20.0",
3298 + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.20.0.tgz",
3299 + "integrity": "sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==",
3300 "dev": true,
3301 "license": "MIT",
3302 "engines": {
@@ -3167,14 +3308,14 @@
3308 }
3309 },
3310 "node_modules/@typescript-eslint/typescript-estree": {
3170 - "version": "8.19.1",
3171 - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.1.tgz",
3172 - "integrity": "sha512-jk/TZwSMJlxlNnqhy0Eod1PNEvCkpY6MXOXE/WLlblZ6ibb32i2We4uByoKPv1d0OD2xebDv4hbs3fm11SMw8Q==",
3311 + "version": "8.20.0",
3312 + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.20.0.tgz",
3313 + "integrity": "sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==",
3314 "dev": true,
3315 "license": "MIT",
3316 "dependencies": {
3176 - "@typescript-eslint/types": "8.19.1",
3177 - "@typescript-eslint/visitor-keys": "8.19.1",
3317 + "@typescript-eslint/types": "8.20.0",
3318 + "@typescript-eslint/visitor-keys": "8.20.0",
3319 "debug": "^4.3.4",
3320 "fast-glob": "^3.3.2",
3321 "is-glob": "^4.0.3",
@@ -3194,16 +3335,16 @@
3335 }
3336 },
3337 "node_modules/@typescript-eslint/utils": {
3197 - "version": "8.19.1",
3198 - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.19.1.tgz",
3199 - "integrity": "sha512-IxG5gLO0Ne+KaUc8iW1A+XuKLd63o4wlbI1Zp692n1xojCl/THvgIKXJXBZixTh5dd5+yTJ/VXH7GJaaw21qXA==",
3338 + "version": "8.20.0",
3339 + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.20.0.tgz",
3340 + "integrity": "sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==",
3341 "dev": true,
3342 "license": "MIT",
3343 "dependencies": {
3344 "@eslint-community/eslint-utils": "^4.4.0",
3204 - "@typescript-eslint/scope-manager": "8.19.1",
3205 - "@typescript-eslint/types": "8.19.1",
3206 - "@typescript-eslint/typescript-estree": "8.19.1"
3345 + "@typescript-eslint/scope-manager": "8.20.0",
3346 + "@typescript-eslint/types": "8.20.0",
3347 + "@typescript-eslint/typescript-estree": "8.20.0"
3348 },
3349 "engines": {
3350 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3218,13 +3359,13 @@
3359 }
3360 },
3361 "node_modules/@typescript-eslint/visitor-keys": {
3221 - "version": "8.19.1",
3222 - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.1.tgz",
3223 - "integrity": "sha512-fzmjU8CHK853V/avYZAvuVut3ZTfwN5YtMaoi+X9Y9MA9keaWNHC3zEQ9zvyX/7Hj+5JkNyK1l7TOR2hevHB6Q==",
3362 + "version": "8.20.0",
3363 + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.20.0.tgz",
3364 + "integrity": "sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==",
3365 "dev": true,
3366 "license": "MIT",
3367 "dependencies": {
3227 - "@typescript-eslint/types": "8.19.1",
3368 + "@typescript-eslint/types": "8.20.0",
3369 "eslint-visitor-keys": "^4.2.0"
3370 },
3371 "engines": {
@@ -3275,9 +3416,9 @@
3416 }
3417 },
3418 "node_modules/@vitest/eslint-plugin": {
3278 - "version": "1.1.24",
3279 - "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.24.tgz",
3280 - "integrity": "sha512-7IaENe4NNy33g0iuuy5bHY69JYYRjpv4lMx6H5Wp30W7ez2baLHwxsXF5TM4wa8JDYZt8ut99Ytoj7GiDO01hw==",
3419 + "version": "1.1.25",
3420 + "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.25.tgz",
3421 + "integrity": "sha512-u8DpDnMbPcqBmJOB4PeEtn6q7vKmLVTLFMpzoxSAo0hjYdl4iYSHRleqwPQo0ywc7UV0S6RKIahYRQ3BnZdMVw==",
3422 "dev": true,
3423 "license": "MIT",
3424 "peerDependencies": {
@@ -3338,6 +3479,13 @@
3479 "url": "https://opencollective.com/vitest"
3480 }
3481 },
3482 + "node_modules/@vitest/runner/node_modules/pathe": {
3483 + "version": "1.1.2",
3484 + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
3485 + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
3486 + "dev": true,
3487 + "license": "MIT"
3488 + },
3489 "node_modules/@vitest/snapshot": {
3490 "version": "2.1.8",
3491 "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz",
@@ -3353,6 +3501,13 @@
3501 "url": "https://opencollective.com/vitest"
3502 }
3503 },
3504 + "node_modules/@vitest/snapshot/node_modules/pathe": {
3505 + "version": "1.1.2",
3506 + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
3507 + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
3508 + "dev": true,
3509 + "license": "MIT"
3510 + },
3511 "node_modules/@vitest/spy": {
3512 "version": "2.1.8",
3513 "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz",
@@ -3529,14 +3684,14 @@
3684 "license": "MIT"
3685 },
3686 "node_modules/@vue/devtools-core": {
3532 - "version": "7.6.8",
3533 - "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.6.8.tgz",
3534 - "integrity": "sha512-8X4roysTwzQ94o7IobjVcOd1aZF5iunikrMrHPI2uUdigZCi2kFTQc7ffYiFiTNaLElCpjOhCnM7bo7aK1yU7A==",
3687 + "version": "7.7.0",
3688 + "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.7.0.tgz",
3689 + "integrity": "sha512-tSO3pghV5RZGSonZ87S2fOGru3X93epmar5IjZOWjHxH6XSwnK5UbR2aW5puZV+LgLoVYrcNou3krSo5k1F31g==",
3690 "dev": true,
3691 "license": "MIT",
3692 "dependencies": {
3538 - "@vue/devtools-kit": "^7.6.8",
3539 - "@vue/devtools-shared": "^7.6.8",
3693 + "@vue/devtools-kit": "^7.7.0",
3694 + "@vue/devtools-shared": "^7.7.0",
3695 "mitt": "^3.0.1",
3696 "nanoid": "^5.0.9",
3697 "pathe": "^1.1.2",
@@ -3546,14 +3701,21 @@
3701 "vue": "^3.0.0"
3702 }
3703 },
3704 + "node_modules/@vue/devtools-core/node_modules/pathe": {
3705 + "version": "1.1.2",
3706 + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
3707 + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
3708 + "dev": true,
3709 + "license": "MIT"
3710 + },
3711 "node_modules/@vue/devtools-kit": {
3550 - "version": "7.6.8",
3551 - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.6.8.tgz",
3552 - "integrity": "sha512-JhJ8M3sPU+v0P2iZBF2DkdmR9L0dnT5RXJabJqX6o8KtFs3tebdvfoXV2Dm3BFuqeECuMJIfF1aCzSt+WQ4wrw==",
3712 + "version": "7.7.0",
3713 + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.0.tgz",
3714 + "integrity": "sha512-5cvZ+6SA88zKC8XiuxUfqpdTwVjJbvYnQZY5NReh7qlSGPvVDjjzyEtW+gdzLXNSd8tStgOjAdMCpvDQamUXtA==",
3715 "dev": true,
3716 "license": "MIT",
3717 "dependencies": {
3556 - "@vue/devtools-shared": "^7.6.8",
3718 + "@vue/devtools-shared": "^7.7.0",
3719 "birpc": "^0.2.19",
3720 "hookable": "^5.5.3",
3721 "mitt": "^3.0.1",
@@ -3563,9 +3725,9 @@
3725 }
3726 },
3727 "node_modules/@vue/devtools-shared": {
3566 - "version": "7.6.8",
3567 - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.6.8.tgz",
3568 - "integrity": "sha512-9MBPO5Z3X1nYGFqTJyohl6Gmf/J7UNN1oicHdyzBVZP4jnhZ4c20MgtaHDIzWmHDHCMYVS5bwKxT3jxh7gOOKA==",
3728 + "version": "7.7.0",
3729 + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.0.tgz",
3730 + "integrity": "sha512-jtlQY26R5thQxW9YQTpXbI0HoK0Wf9Rd4ekidOkRvSy7ChfK0kIU6vvcBtjj87/EcpeOSK49fZAicaFNJcoTcQ==",
3731 "dev": true,
3732 "license": "MIT",
3733 "dependencies": {
@@ -3678,14 +3840,14 @@
3840 }
3841 },
3842 "node_modules/@vueuse/core": {
3681 - "version": "12.3.0",
3682 - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.3.0.tgz",
3683 - "integrity": "sha512-cnV8QDKZrsyKC7tWjPbeEUz2cD9sa9faxF2YkR8QqNwfofgbOhmfIgvSYmkp+ttSvfOw4E6hLcQx15mRPr0yBA==",
3843 + "version": "12.4.0",
3844 + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.4.0.tgz",
3845 + "integrity": "sha512-XnjQYcJwCsyXyIafyA6SvyN/OBtfPnjvJmbxNxQjCcyWD198urwm5TYvIUUyAxEAN0K7HJggOgT15cOlWFyLeA==",
3846 "license": "MIT",
3847 "dependencies": {
3848 "@types/web-bluetooth": "^0.0.20",
3687 - "@vueuse/metadata": "12.3.0",
3688 - "@vueuse/shared": "12.3.0",
3849 + "@vueuse/metadata": "12.4.0",
3850 + "@vueuse/shared": "12.4.0",
3851 "vue": "^3.5.13"
3852 },
3853 "funding": {
@@ -3693,18 +3855,18 @@
3855 }
3856 },
3857 "node_modules/@vueuse/metadata": {
3696 - "version": "12.3.0",
3697 - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.3.0.tgz",
3698 - "integrity": "sha512-M/iQHHjMffOv2npsw2ihlUx1CTiBwPEgb7DzByLq7zpg1+Ke8r7s9p5ybUWc5OIeGewtpY4Xy0R2cKqFqM8hFg==",
3858 + "version": "12.4.0",
3859 + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.4.0.tgz",
3860 + "integrity": "sha512-AhPuHs/qtYrKHUlEoNO6zCXufu8OgbR8S/n2oMw1OQuBQJ3+HOLQ+EpvXs+feOlZMa0p8QVvDWNlmcJJY8rW2g==",
3861 "license": "MIT",
3862 "funding": {
3863 "url": "https://github.com/sponsors/antfu"
3864 }
3865 },
3866 "node_modules/@vueuse/shared": {
3705 - "version": "12.3.0",
3706 - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.3.0.tgz",
3707 - "integrity": "sha512-X3YD35GUeW0d5Gajcwv9jdLAJTV2Jdb/Ll6Ii2JIYcKLYZqv5wxyLeKtiQkqWmHg3v0J0ZWjDUMVOw2E7RCXfA==",
3867 + "version": "12.4.0",
3868 + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.4.0.tgz",
3869 + "integrity": "sha512-9yLgbHVIF12OSCojnjTIoZL1+UA10+O4E1aD6Hpfo/DKVm5o3SZIwz6CupqGy3+IcKI8d6Jnl26EQj/YucnW0Q==",
3870 "license": "MIT",
3871 "dependencies": {
3872 "vue": "^3.5.13"
@@ -3808,9 +3970,9 @@
3970 }
3971 },
3972 "node_modules/alien-signals": {
3811 - "version": "0.4.12",
3812 - "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.12.tgz",
3813 - "integrity": "sha512-Og0PgAihxlp1R22bsoBsyhhMG4+qhU+fkkLPoGBQkYVc3qt9rYnrwYTf+M6kqUqUZpf3rXDnpL90iKa0QcSVVg==",
3973 + "version": "0.4.14",
3974 + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz",
3975 + "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==",
3976 "dev": true,
3977 "license": "MIT"
3978 },
@@ -4237,9 +4399,9 @@
4399 }
4400 },
4401 "node_modules/browserslist": {
4240 - "version": "4.24.3",
4241 - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz",
4242 - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==",
4402 + "version": "4.24.4",
4403 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
4404 + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
4405 "funding": [
4406 {
4407 "type": "opencollective",
@@ -4385,6 +4547,12 @@
4547 }
4548 }
4549 },
4550 + "node_modules/c12/node_modules/pathe": {
4551 + "version": "1.1.2",
4552 + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
4553 + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
4554 + "license": "MIT"
4555 + },
4556 "node_modules/cac": {
4557 "version": "6.7.14",
4558 "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
@@ -4492,9 +4660,9 @@
4660 }
4661 },
4662 "node_modules/caniuse-lite": {
4495 - "version": "1.0.30001690",
4496 - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz",
4497 - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==",
4663 + "version": "1.0.30001692",
4664 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz",
4665 + "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==",
4666 "funding": [
4667 {
4668 "type": "opencollective",
@@ -4642,12 +4810,12 @@
4810 }
4811 },
4812 "node_modules/chokidar/node_modules/readdirp": {
4645 - "version": "4.0.2",
4646 - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz",
4647 - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
4813 + "version": "4.1.1",
4814 + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz",
4815 + "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==",
4816 "license": "MIT",
4817 "engines": {
4650 - "node": ">= 14.16.0"
4818 + "node": ">= 14.18.0"
4819 },
4820 "funding": {
4821 "type": "individual",
@@ -4932,9 +5100,9 @@
5100 "license": "ISC"
5101 },
5102 "node_modules/consola": {
4935 - "version": "3.3.3",
4936 - "resolved": "https://registry.npmjs.org/consola/-/consola-3.3.3.tgz",
4937 - "integrity": "sha512-Qil5KwghMzlqd51UXM0b6fyaGHtOC22scxrwrz4A2882LyUMwQjnvaedN1HAeXzphspQ6CpHkzMAWxBTUruDLg==",
5103 + "version": "3.4.0",
5104 + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz",
5105 + "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==",
5106 "license": "MIT",
5107 "engines": {
5108 "node": "^14.18.0 || >=16.10.0"
@@ -5000,13 +5168,13 @@
5168 }
5169 },
5170 "node_modules/core-js-compat": {
5003 - "version": "3.39.0",
5004 - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz",
5005 - "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==",
5171 + "version": "3.40.0",
5172 + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz",
5173 + "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==",
5174 "dev": true,
5175 "license": "MIT",
5176 "dependencies": {
5009 - "browserslist": "^4.24.2"
5177 + "browserslist": "^4.24.3"
5178 },
5179 "funding": {
5180 "type": "opencollective",
@@ -5176,13 +5344,14 @@
5344 "license": "CC0-1.0"
5345 },
5346 "node_modules/cssstyle": {
5179 - "version": "4.1.0",
5180 - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz",
5181 - "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==",
5347 + "version": "4.2.1",
5348 + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz",
5349 + "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==",
5350 "dev": true,
5351 "license": "MIT",
5352 "dependencies": {
5185 - "rrweb-cssom": "^0.7.1"
5353 + "@asamuzakjp/css-color": "^2.8.2",
5354 + "rrweb-cssom": "^0.8.0"
5355 },
5356 "engines": {
5357 "node": ">=18"
@@ -5874,9 +6043,9 @@
6043 "license": "MIT"
6044 },
6045 "node_modules/electron-to-chromium": {
5877 - "version": "1.5.78",
5878 - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.78.tgz",
5879 - "integrity": "sha512-UmwIt7HRKN1rsJfddG5UG7rCTCTAKoS9JeOy/R0zSenAyaZ8SU3RuXlwcratxhdxGRNpk03iq8O7BA3W7ibLVw==",
6046 + "version": "1.5.83",
6047 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.83.tgz",
6048 + "integrity": "sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ==",
6049 "license": "ISC"
6050 },
6051 "node_modules/emoji-regex": {
@@ -5999,9 +6168,9 @@
6168 "license": "MIT"
6169 },
6170 "node_modules/es-object-atoms": {
6002 - "version": "1.0.0",
6003 - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
6004 - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
6171 + "version": "1.1.1",
6172 + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
6173 + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
6174 "dev": true,
6175 "license": "MIT",
6176 "dependencies": {
@@ -6082,19 +6251,19 @@
6251 }
6252 },
6253 "node_modules/eslint": {
6085 - "version": "9.17.0",
6086 - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz",
6087 - "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==",
6254 + "version": "9.18.0",
6255 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.18.0.tgz",
6256 + "integrity": "sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==",
6257 "dev": true,
6258 "license": "MIT",
6259 "dependencies": {
6260 "@eslint-community/eslint-utils": "^4.2.0",
6261 "@eslint-community/regexpp": "^4.12.1",
6262 "@eslint/config-array": "^0.19.0",
6094 - "@eslint/core": "^0.9.0",
6263 + "@eslint/core": "^0.10.0",
6264 "@eslint/eslintrc": "^3.2.0",
6096 - "@eslint/js": "9.17.0",
6097 - "@eslint/plugin-kit": "^0.2.3",
6265 + "@eslint/js": "9.18.0",
6266 + "@eslint/plugin-kit": "^0.2.5",
6267 "@humanfs/node": "^0.16.6",
6268 "@humanwhocodes/module-importer": "^1.0.1",
6269 "@humanwhocodes/retry": "^0.4.1",
@@ -6158,13 +6327,13 @@
6327 }
6328 },
6329 "node_modules/eslint-config-flat-gitignore": {
6161 - "version": "0.3.0",
6162 - "resolved": "https://registry.npmjs.org/eslint-config-flat-gitignore/-/eslint-config-flat-gitignore-0.3.0.tgz",
6163 - "integrity": "sha512-0Ndxo4qGhcewjTzw52TK06Mc00aDtHNTdeeW2JfONgDcLkRO/n/BteMRzNVpLQYxdCC/dFEilfM9fjjpGIJ9Og==",
6330 + "version": "1.0.0",
6331 + "resolved": "https://registry.npmjs.org/eslint-config-flat-gitignore/-/eslint-config-flat-gitignore-1.0.0.tgz",
6332 + "integrity": "sha512-EWpSLrAP80IdcYK5sIhq/qAY0pmUdBnbzqzpE3QAn6H6wLBN26cMRoMNU9Di8upTzUSL6TXeYRxWhTYuz8+UQA==",
6333 "dev": true,
6334 "license": "MIT",
6335 "dependencies": {
6167 - "@eslint/compat": "^1.1.1",
6336 + "@eslint/compat": "^1.2.4",
6337 "find-up-simple": "^1.0.0"
6338 },
6339 "funding": {
@@ -6175,13 +6344,13 @@
6344 }
6345 },
6346 "node_modules/eslint-flat-config-utils": {
6178 - "version": "0.4.0",
6179 - "resolved": "https://registry.npmjs.org/eslint-flat-config-utils/-/eslint-flat-config-utils-0.4.0.tgz",
6180 - "integrity": "sha512-kfd5kQZC+BMO0YwTol6zxjKX1zAsk8JfSAopbKjKqmENTJcew+yBejuvccAg37cvOrN0Mh+DVbeyznuNWEjt4A==",
6347 + "version": "1.0.0",
6348 + "resolved": "https://registry.npmjs.org/eslint-flat-config-utils/-/eslint-flat-config-utils-1.0.0.tgz",
6349 + "integrity": "sha512-tmzcXeCsa24/u3glyw1Mo7KfC/r9a5Vsu1nPCkX7uefD7C5Z4x922Q2KP/drhTLbOI5lcFHYpfXjKhqqnUWObw==",
6350 "dev": true,
6351 "license": "MIT",
6352 "dependencies": {
6184 - "pathe": "^1.1.2"
6353 + "pathe": "^2.0.0"
6354 },
6355 "funding": {
6356 "url": "https://github.com/sponsors/antfu"
@@ -6232,9 +6401,9 @@
6401 }
6402 },
6403 "node_modules/eslint-merge-processors": {
6235 - "version": "0.1.0",
6236 - "resolved": "https://registry.npmjs.org/eslint-merge-processors/-/eslint-merge-processors-0.1.0.tgz",
6237 - "integrity": "sha512-IvRXXtEajLeyssvW4wJcZ2etxkR9mUf4zpNwgI+m/Uac9RfXHskuJefkHUcawVzePnd6xp24enp5jfgdHzjRdQ==",
6404 + "version": "1.0.0",
6405 + "resolved": "https://registry.npmjs.org/eslint-merge-processors/-/eslint-merge-processors-1.0.0.tgz",
6406 + "integrity": "sha512-4GybyHmhXtT7/W8RAouQzNM0791sYasJCTYHIAYjuiJvbNFY0jMKkoESREhX+mjX37dxiN6v4EqhZ1nc0tJF7A==",
6407 "dev": true,
6408 "license": "MIT",
6409 "funding": {
@@ -6261,13 +6430,13 @@
6430 }
6431 },
6432 "node_modules/eslint-plugin-command": {
6264 - "version": "0.2.7",
6265 - "resolved": "https://registry.npmjs.org/eslint-plugin-command/-/eslint-plugin-command-0.2.7.tgz",
6266 - "integrity": "sha512-UXJ/1R6kdKDcHhiRqxHJ9RZ3juMR1IWQuSrnwt56qCjxt/am+5+YDt6GKs1FJPnppe6/geEYsO3CR9jc63i0xw==",
6433 + "version": "2.1.0",
6434 + "resolved": "https://registry.npmjs.org/eslint-plugin-command/-/eslint-plugin-command-2.1.0.tgz",
6435 + "integrity": "sha512-S3gvDSCRHLdRG7NYaevLvGA0g/txOju7NEB2di7SE80NtbCwsvpi/fft045YuTZpOzqCRUfuye39raldmpXXYQ==",
6436 "dev": true,
6437 "license": "MIT",
6438 "dependencies": {
6270 - "@es-joy/jsdoccomment": "^0.49.0"
6439 + "@es-joy/jsdoccomment": "^0.50.0"
6440 },
6441 "funding": {
6442 "url": "https://github.com/sponsors/antfu"
@@ -6375,6 +6544,21 @@
6544 "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
6545 }
6546 },
6547 + "node_modules/eslint-plugin-jsdoc/node_modules/@es-joy/jsdoccomment": {
6548 + "version": "0.49.0",
6549 + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz",
6550 + "integrity": "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==",
6551 + "dev": true,
6552 + "license": "MIT",
6553 + "dependencies": {
6554 + "comment-parser": "1.4.1",
6555 + "esquery": "^1.6.0",
6556 + "jsdoc-type-pratt-parser": "~4.1.0"
6557 + },
6558 + "engines": {
6559 + "node": ">=16"
6560 + }
6561 + },
6562 "node_modules/eslint-plugin-jsonc": {
6563 "version": "2.18.2",
6564 "resolved": "https://registry.npmjs.org/eslint-plugin-jsonc/-/eslint-plugin-jsonc-2.18.2.tgz",
@@ -6676,9 +6860,9 @@
6860 }
6861 },
6862 "node_modules/eslint-processor-vue-blocks": {
6679 - "version": "0.1.2",
6680 - "resolved": "https://registry.npmjs.org/eslint-processor-vue-blocks/-/eslint-processor-vue-blocks-0.1.2.tgz",
6681 - "integrity": "sha512-PfpJ4uKHnqeL/fXUnzYkOax3aIenlwewXRX8jFinA1a2yCFnLgMuiH3xvCgvHHUlV2xJWQHbCTdiJWGwb3NqpQ==",
6863 + "version": "1.0.0",
6864 + "resolved": "https://registry.npmjs.org/eslint-processor-vue-blocks/-/eslint-processor-vue-blocks-1.0.0.tgz",
6865 + "integrity": "sha512-q+Wn9bCml65NwYtuINVCE5dUqZa/uVoY4jfc8qEDwWbcGqdRyfJJmAONNZsreA4Q9EJqjYGjk8Hk1QuwAktgkw==",
6866 "dev": true,
6867 "license": "MIT",
6868 "funding": {
@@ -7270,9 +7454,9 @@
7454 "license": "MIT"
7455 },
7456 "node_modules/fs-extra": {
7273 - "version": "11.2.0",
7274 - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
7275 - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
7457 + "version": "11.3.0",
7458 + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz",
7459 + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==",
7460 "dev": true,
7461 "license": "MIT",
7462 "dependencies": {
@@ -7470,6 +7654,12 @@
7654 "giget": "dist/cli.mjs"
7655 }
7656 },
7657 + "node_modules/giget/node_modules/pathe": {
7658 + "version": "1.1.2",
7659 + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
7660 + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
7661 + "license": "MIT"
7662 + },
7663 "node_modules/glob": {
7664 "version": "10.4.5",
7665 "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
@@ -8074,6 +8264,13 @@
8264 "url": "https://github.com/sponsors/antfu"
8265 }
8266 },
8267 + "node_modules/importx/node_modules/pathe": {
8268 + "version": "1.1.2",
8269 + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
8270 + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
8271 + "dev": true,
8272 + "license": "MIT"
8273 + },
8274 "node_modules/imurmurhash": {
8275 "version": "0.1.4",
8276 "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -8553,23 +8750,23 @@
8750 }
8751 },
8752 "node_modules/jsdom": {
8556 - "version": "25.0.1",
8557 - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz",
8558 - "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==",
8753 + "version": "26.0.0",
8754 + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.0.0.tgz",
8755 + "integrity": "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==",
8756 "dev": true,
8757 "license": "MIT",
8758 "dependencies": {
8562 - "cssstyle": "^4.1.0",
8759 + "cssstyle": "^4.2.1",
8760 "data-urls": "^5.0.0",
8761 "decimal.js": "^10.4.3",
8565 - "form-data": "^4.0.0",
8762 + "form-data": "^4.0.1",
8763 "html-encoding-sniffer": "^4.0.0",
8764 "http-proxy-agent": "^7.0.2",
8568 - "https-proxy-agent": "^7.0.5",
8765 + "https-proxy-agent": "^7.0.6",
8766 "is-potential-custom-element-name": "^1.0.1",
8570 - "nwsapi": "^2.2.12",
8571 - "parse5": "^7.1.2",
8572 - "rrweb-cssom": "^0.7.1",
8767 + "nwsapi": "^2.2.16",
8768 + "parse5": "^7.2.1",
8769 + "rrweb-cssom": "^0.8.0",
8770 "saxes": "^6.0.0",
8771 "symbol-tree": "^3.2.4",
8772 "tough-cookie": "^5.0.0",
@@ -8577,7 +8774,7 @@
8774 "webidl-conversions": "^7.0.0",
8775 "whatwg-encoding": "^3.1.1",
8776 "whatwg-mimetype": "^4.0.0",
8580 - "whatwg-url": "^14.0.0",
8777 + "whatwg-url": "^14.1.0",
8778 "ws": "^8.18.0",
8779 "xml-name-validator": "^5.0.0"
8780 },
@@ -8585,7 +8782,7 @@
8782 "node": ">=18"
8783 },
8784 "peerDependencies": {
8588 - "canvas": "^2.11.2"
8785 + "canvas": "^3.0.0"
8786 },
8787 "peerDependenciesMeta": {
8788 "canvas": {
@@ -9070,13 +9267,13 @@
9267 }
9268 },
9269 "node_modules/local-pkg": {
9073 - "version": "0.5.1",
9074 - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz",
9075 - "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==",
9270 + "version": "1.0.0",
9271 + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz",
9272 + "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==",
9273 "license": "MIT",
9274 "dependencies": {
9275 "mlly": "^1.7.3",
9079 - "pkg-types": "^1.2.1"
9276 + "pkg-types": "^1.3.0"
9277 },
9278 "engines": {
9279 "node": ">=14"
@@ -10319,14 +10516,14 @@
10516 }
10517 },
10518 "node_modules/mlly": {
10322 - "version": "1.7.3",
10323 - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.3.tgz",
10324 - "integrity": "sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==",
10519 + "version": "1.7.4",
10520 + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz",
10521 + "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==",
10522 "license": "MIT",
10523 "dependencies": {
10524 "acorn": "^8.14.0",
10328 - "pathe": "^1.1.2",
10329 - "pkg-types": "^1.2.1",
10525 + "pathe": "^2.0.1",
10526 + "pkg-types": "^1.3.0",
10527 "ufo": "^1.5.4"
10528 }
10529 },
@@ -10800,6 +10997,12 @@
10997 "url": "https://github.com/sponsors/sindresorhus"
10998 }
10999 },
11000 + "node_modules/nypm/node_modules/pathe": {
11001 + "version": "1.1.2",
11002 + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
11003 + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
11004 + "license": "MIT"
11005 + },
11006 "node_modules/nypm/node_modules/signal-exit": {
11007 "version": "4.1.0",
11008 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
@@ -10913,9 +11116,9 @@
11116 }
11117 },
11118 "node_modules/oniguruma-to-es": {
10916 - "version": "0.10.0",
10917 - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-0.10.0.tgz",
10918 - "integrity": "sha512-zapyOUOCJxt+xhiNRPPMtfJkHGsZ98HHB9qJEkdT8BGytO/+kpe4m1Ngf0MzbzTmhacn11w9yGeDP6tzDhnCdg==",
11119 + "version": "2.0.0",
11120 + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-2.0.0.tgz",
11121 + "integrity": "sha512-pE7+9jQgomy10aK6BJKRNHj1Nth0YLOzb3iRuhlz4gRzNSBSd7hga6U8BE6o0SoSuSkqv+PPtt511Msd1Hkl0w==",
11122 "license": "MIT",
11123 "dependencies": {
11124 "emoji-regex-xs": "^1.0.0",
@@ -11235,9 +11438,9 @@
11438 }
11439 },
11440 "node_modules/pathe": {
11238 - "version": "1.1.2",
11239 - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
11240 - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
11441 + "version": "2.0.1",
11442 + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.1.tgz",
11443 + "integrity": "sha512-6jpjMpOth5S9ITVu5clZ7NOgHNsv5vRQdheL9ztp2vZmM6fRbLvyua1tiBIL4lk8SAe3ARzeXEly6siXCjDHDw==",
11444 "license": "MIT"
11445 },
11446 "node_modules/pathval": {
@@ -11379,14 +11582,14 @@
11582 }
11583 },
11584 "node_modules/pkg-types": {
11382 - "version": "1.3.0",
11383 - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.0.tgz",
11384 - "integrity": "sha512-kS7yWjVFCkIw9hqdJBoMxDdzEngmkr5FXeWZZfQ6GoYacjVnsW6l2CcYW/0ThD0vF4LPJgVYnrg4d0uuhwYQbg==",
11585 + "version": "1.3.1",
11586 + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
11587 + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
11588 "license": "MIT",
11589 "dependencies": {
11590 "confbox": "^0.1.8",
11388 - "mlly": "^1.7.3",
11389 - "pathe": "^1.1.2"
11591 + "mlly": "^1.7.4",
11592 + "pathe": "^2.0.1"
11593 }
11594 },
11595 "node_modules/please-upgrade-node": {
@@ -11445,9 +11648,9 @@
11648 }
11649 },
11650 "node_modules/postcss": {
11448 - "version": "8.4.49",
11449 - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
11450 - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
11651 + "version": "8.5.1",
11652 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz",
11653 + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==",
11654 "funding": [
11655 {
11656 "type": "opencollective",
@@ -11464,7 +11667,7 @@
11667 ],
11668 "license": "MIT",
11669 "dependencies": {
11467 - "nanoid": "^3.3.7",
11670 + "nanoid": "^3.3.8",
11671 "picocolors": "^1.1.1",
11672 "source-map-js": "^1.2.1"
11673 },
@@ -11632,9 +11835,9 @@
11835 }
11836 },
11837 "node_modules/prettier-plugin-tailwindcss": {
11635 - "version": "0.6.9",
11636 - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.9.tgz",
11637 - "integrity": "sha512-r0i3uhaZAXYP0At5xGfJH876W3HHGHDp+LCRUJrs57PBeQ6mYHMwr25KH8NPX44F2yGTvdnH7OqCshlQx183Eg==",
11838 + "version": "0.6.10",
11839 + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.10.tgz",
11840 + "integrity": "sha512-ndj2WLDaMzACnr1gAYZiZZLs5ZdOeBYgOsbBmHj3nvW/6q8h8PymsXiEnKvj/9qgCCAoHyvLOisoQdIcsDvIgw==",
11841 "dev": true,
11842 "license": "MIT",
11843 "engines": {
@@ -11645,7 +11848,7 @@
11848 "@prettier/plugin-pug": "*",
11849 "@shopify/prettier-plugin-liquid": "*",
11850 "@trivago/prettier-plugin-sort-imports": "*",
11648 - "@zackad/prettier-plugin-twig-melody": "*",
11851 + "@zackad/prettier-plugin-twig": "*",
11852 "prettier": "^3.0",
11853 "prettier-plugin-astro": "*",
11854 "prettier-plugin-css-order": "*",
@@ -11672,7 +11875,7 @@
11875 "@trivago/prettier-plugin-sort-imports": {
11876 "optional": true
11877 },
11675 - "@zackad/prettier-plugin-twig-melody": {
11878 + "@zackad/prettier-plugin-twig": {
11879 "optional": true
11880 },
11881 "prettier-plugin-astro": {
@@ -12356,9 +12559,9 @@
12559 "license": "MIT"
12560 },
12561 "node_modules/rollup": {
12359 - "version": "4.30.0",
12360 - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.0.tgz",
12361 - "integrity": "sha512-sDnr1pcjTgUT69qBksNF1N1anwfbyYG6TBQ22b03bII8EdiUQ7J0TlozVaTMjT/eEJAO49e1ndV7t+UZfL1+vA==",
12562 + "version": "4.30.1",
12563 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz",
12564 + "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==",
12565 "devOptional": true,
12566 "license": "MIT",
12567 "dependencies": {
@@ -12372,25 +12575,25 @@
12575 "npm": ">=8.0.0"
12576 },
12577 "optionalDependencies": {
12375 - "@rollup/rollup-android-arm-eabi": "4.30.0",
12376 - "@rollup/rollup-android-arm64": "4.30.0",
12377 - "@rollup/rollup-darwin-arm64": "4.30.0",
12378 - "@rollup/rollup-darwin-x64": "4.30.0",
12379 - "@rollup/rollup-freebsd-arm64": "4.30.0",
12380 - "@rollup/rollup-freebsd-x64": "4.30.0",
12381 - "@rollup/rollup-linux-arm-gnueabihf": "4.30.0",
12382 - "@rollup/rollup-linux-arm-musleabihf": "4.30.0",
12383 - "@rollup/rollup-linux-arm64-gnu": "4.30.0",
12384 - "@rollup/rollup-linux-arm64-musl": "4.30.0",
12385 - "@rollup/rollup-linux-loongarch64-gnu": "4.30.0",
12386 - "@rollup/rollup-linux-powerpc64le-gnu": "4.30.0",
12387 - "@rollup/rollup-linux-riscv64-gnu": "4.30.0",
12388 - "@rollup/rollup-linux-s390x-gnu": "4.30.0",
12389 - "@rollup/rollup-linux-x64-gnu": "4.30.0",
12390 - "@rollup/rollup-linux-x64-musl": "4.30.0",
12391 - "@rollup/rollup-win32-arm64-msvc": "4.30.0",
12392 - "@rollup/rollup-win32-ia32-msvc": "4.30.0",
12393 - "@rollup/rollup-win32-x64-msvc": "4.30.0",
12578 + "@rollup/rollup-android-arm-eabi": "4.30.1",
12579 + "@rollup/rollup-android-arm64": "4.30.1",
12580 + "@rollup/rollup-darwin-arm64": "4.30.1",
12581 + "@rollup/rollup-darwin-x64": "4.30.1",
12582 + "@rollup/rollup-freebsd-arm64": "4.30.1",
12583 + "@rollup/rollup-freebsd-x64": "4.30.1",
12584 + "@rollup/rollup-linux-arm-gnueabihf": "4.30.1",
12585 + "@rollup/rollup-linux-arm-musleabihf": "4.30.1",
12586 + "@rollup/rollup-linux-arm64-gnu": "4.30.1",
12587 + "@rollup/rollup-linux-arm64-musl": "4.30.1",
12588 + "@rollup/rollup-linux-loongarch64-gnu": "4.30.1",
12589 + "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1",
12590 + "@rollup/rollup-linux-riscv64-gnu": "4.30.1",
12591 + "@rollup/rollup-linux-s390x-gnu": "4.30.1",
12592 + "@rollup/rollup-linux-x64-gnu": "4.30.1",
12593 + "@rollup/rollup-linux-x64-musl": "4.30.1",
12594 + "@rollup/rollup-win32-arm64-msvc": "4.30.1",
12595 + "@rollup/rollup-win32-ia32-msvc": "4.30.1",
12596 + "@rollup/rollup-win32-x64-msvc": "4.30.1",
12597 "fsevents": "~2.3.2"
12598 }
12599 },
@@ -12444,9 +12647,9 @@
12647 }
12648 },
12649 "node_modules/rrweb-cssom": {
12447 - "version": "0.7.1",
12448 - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz",
12449 - "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==",
12650 + "version": "0.8.0",
12651 + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz",
12652 + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==",
12653 "dev": true,
12654 "license": "MIT"
12655 },
@@ -12543,9 +12746,9 @@
12746 "license": "MIT"
12747 },
12748 "node_modules/sass": {
12546 - "version": "1.83.1",
12547 - "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.1.tgz",
12548 - "integrity": "sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==",
12749 + "version": "1.83.4",
12750 + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.4.tgz",
12751 + "integrity": "sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA==",
12752 "dev": true,
12753 "license": "MIT",
12754 "dependencies": {
@@ -12677,17 +12880,17 @@
12880 }
12881 },
12882 "node_modules/shiki": {
12680 - "version": "1.26.1",
12681 - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.26.1.tgz",
12682 - "integrity": "sha512-Gqg6DSTk3wYqaZ5OaYtzjcdxcBvX5kCy24yvRJEgjT5U+WHlmqCThLuBUx0juyxQBi+6ug53IGeuQS07DWwpcw==",
12883 + "version": "1.27.2",
12884 + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.27.2.tgz",
12885 + "integrity": "sha512-QtA1C41oEVixKog+V8I3ia7jjGls7oCZ8Yul8vdHrVBga5uPoyTtMvFF4lMMXIyAZo5A5QbXq91bot2vA6Q+eQ==",
12886 "license": "MIT",
12887 "dependencies": {
12685 - "@shikijs/core": "1.26.1",
12686 - "@shikijs/engine-javascript": "1.26.1",
12687 - "@shikijs/engine-oniguruma": "1.26.1",
12688 - "@shikijs/langs": "1.26.1",
12689 - "@shikijs/themes": "1.26.1",
12690 - "@shikijs/types": "1.26.1",
12888 + "@shikijs/core": "1.27.2",
12889 + "@shikijs/engine-javascript": "1.27.2",
12890 + "@shikijs/engine-oniguruma": "1.27.2",
12891 + "@shikijs/langs": "1.27.2",
12892 + "@shikijs/themes": "1.27.2",
12893 + "@shikijs/types": "1.27.2",
12894 "@shikijs/vscode-textmate": "^10.0.1",
12895 "@types/hast": "^3.0.4"
12896 }
@@ -12914,9 +13117,9 @@
13117 }
13118 },
13119 "node_modules/spdx-license-ids": {
12917 - "version": "3.0.20",
12918 - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz",
12919 - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==",
13120 + "version": "3.0.21",
13121 + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz",
13122 + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==",
13123 "dev": true,
13124 "license": "CC0-1.0"
13125 },
@@ -12991,9 +13194,9 @@
13194 "license": "MIT"
13195 },
13196 "node_modules/start-server-and-test": {
12994 - "version": "2.0.9",
12995 - "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-2.0.9.tgz",
12996 - "integrity": "sha512-DDceIvc4wdpr+z3Aqkot2QMho8TcUBh5qH0wEHDpEexBTzlheOcmh53d3dExABY4J5C7qS2UbSXqRWLtxpbWIQ==",
13197 + "version": "2.0.10",
13198 + "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-2.0.10.tgz",
13199 + "integrity": "sha512-nZphcfcqGqwk74lbZkqSwClkYz+M5ZPGOMgWxNVJrdztPKN96qe6HooRu6L3TpwITn0lKJJdKACqHbJtqythOQ==",
13200 "dev": true,
13201 "license": "MIT",
13202 "dependencies": {
@@ -13004,7 +13207,7 @@
13207 "execa": "5.1.1",
13208 "lazy-ass": "1.6.0",
13209 "ps-tree": "1.2.0",
13007 - "wait-on": "8.0.1"
13210 + "wait-on": "8.0.2"
13211 },
13212 "bin": {
13213 "server-test": "src/bin/start.js",
@@ -13535,17 +13738,17 @@
13738 "license": "ISC"
13739 },
13740 "node_modules/taze": {
13538 - "version": "0.18.0",
13539 - "resolved": "https://registry.npmjs.org/taze/-/taze-0.18.0.tgz",
13540 - "integrity": "sha512-aL8g+4tZvfhsn147u9dRP2eUE2MV+HfJe1sAtSJp46b0Gd8AjyqlJ2uDwnJfM1XNv301Mvh98RkXQw27sco5tQ==",
13741 + "version": "18.2.0",
13742 + "resolved": "https://registry.npmjs.org/taze/-/taze-18.2.0.tgz",
13743 + "integrity": "sha512-rjKW+/AJ8KTBl27cyCo6jtk6j9r3axN8olOOBhA12UciMLDXn79wZG09Nb3t1r51m1pqV8nOz98vKaFDerTe2g==",
13744 "dev": true,
13745 "license": "MIT",
13746 "dependencies": {
13544 - "@antfu/ni": "^0.23.0",
13747 + "@antfu/ni": "^23.2.0",
13748 "js-yaml": "^4.1.0",
13749 "ofetch": "^1.4.1",
13547 - "package-manager-detector": "^0.2.2",
13548 - "tinyexec": "^0.3.1",
13750 + "package-manager-detector": "^0.2.8",
13751 + "tinyexec": "^0.3.2",
13752 "unconfig": "^0.6.0",
13753 "yargs": "^17.7.2"
13754 },
@@ -13659,22 +13862,22 @@
13862 }
13863 },
13864 "node_modules/tldts": {
13662 - "version": "6.1.71",
13663 - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.71.tgz",
13664 - "integrity": "sha512-LQIHmHnuzfZgZWAf2HzL83TIIrD8NhhI0DVxqo9/FdOd4ilec+NTNZOlDZf7EwrTNoutccbsHjvWHYXLAtvxjw==",
13865 + "version": "6.1.72",
13866 + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.72.tgz",
13867 + "integrity": "sha512-QNtgIqSUb9o2CoUjX9T5TwaIvUUJFU1+12PJkgt42DFV2yf9J6549yTF2uGloQsJ/JOC8X+gIB81ind97hRiIQ==",
13868 "dev": true,
13869 "license": "MIT",
13870 "dependencies": {
13668 - "tldts-core": "^6.1.71"
13871 + "tldts-core": "^6.1.72"
13872 },
13873 "bin": {
13874 "tldts": "bin/cli.js"
13875 }
13876 },
13877 "node_modules/tldts-core": {
13675 - "version": "6.1.71",
13676 - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.71.tgz",
13677 - "integrity": "sha512-LRbChn2YRpic1KxY+ldL1pGXN/oVvKfCVufwfVzEQdFYNo39uF7AJa/WXdo+gYO7PTvdfkCPCed6Hkvz/kR7jg==",
13878 + "version": "6.1.72",
13879 + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.72.tgz",
13880 + "integrity": "sha512-FW3H9aCaGTJ8l8RVCR3EX8GxsxDbQXuwetwwgXA2chYdsX+NY1ytCBl61narjjehWmCw92tc1AxlcY3668CU8g==",
13881 "dev": true,
13882 "license": "MIT"
13883 },
@@ -13750,9 +13953,9 @@
13953 }
13954 },
13955 "node_modules/tough-cookie": {
13753 - "version": "5.0.0",
13754 - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz",
13755 - "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==",
13956 + "version": "5.1.0",
13957 + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.0.tgz",
13958 + "integrity": "sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==",
13959 "dev": true,
13960 "license": "BSD-3-Clause",
13961 "dependencies": {
@@ -14338,9 +14541,9 @@
14541 }
14542 },
14543 "node_modules/type-fest": {
14341 - "version": "4.31.0",
14342 - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.31.0.tgz",
14343 - "integrity": "sha512-yCxltHW07Nkhv/1F6wWBr8kz+5BGMfP+RbRSYFnegVb0qV/UMT0G0ElBloPVerqn4M2ZV80Ir1FtCcYv1cT6vQ==",
14544 + "version": "4.32.0",
14545 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.32.0.tgz",
14546 + "integrity": "sha512-rfgpoi08xagF3JSdtJlCwMq9DGNDE0IMh3Mkpc1wUypg9vPi786AiqeBBKcqvIkq42azsBM85N490fyZjeUftw==",
14547 "dev": true,
14548 "license": "(MIT OR CC0-1.0)",
14549 "engines": {
@@ -14365,9 +14568,9 @@
14568 }
14569 },
14570 "node_modules/typescript": {
14368 - "version": "5.7.2",
14369 - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz",
14370 - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==",
14571 + "version": "5.7.3",
14572 + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
14573 + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
14574 "devOptional": true,
14575 "license": "Apache-2.0",
14576 "bin": {
@@ -14446,25 +14649,25 @@
14649 }
14650 },
14651 "node_modules/unimport": {
14449 - "version": "3.14.5",
14450 - "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.14.5.tgz",
14451 - "integrity": "sha512-tn890SwFFZxqaJSKQPPd+yygfKSATbM8BZWW1aCR2TJBTs1SDrmLamBueaFtYsGjHtQaRgqEbQflOjN2iW12gA==",
14652 + "version": "3.14.6",
14653 + "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.14.6.tgz",
14654 + "integrity": "sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==",
14655 "license": "MIT",
14656 "dependencies": {
14454 - "@rollup/pluginutils": "^5.1.3",
14657 + "@rollup/pluginutils": "^5.1.4",
14658 "acorn": "^8.14.0",
14659 "escape-string-regexp": "^5.0.0",
14660 "estree-walker": "^3.0.3",
14458 - "fast-glob": "^3.3.2",
14459 - "local-pkg": "^0.5.1",
14460 - "magic-string": "^0.30.14",
14461 - "mlly": "^1.7.3",
14462 - "pathe": "^1.1.2",
14661 + "fast-glob": "^3.3.3",
14662 + "local-pkg": "^1.0.0",
14663 + "magic-string": "^0.30.17",
14664 + "mlly": "^1.7.4",
14665 + "pathe": "^2.0.1",
14666 "picomatch": "^4.0.2",
14464 - "pkg-types": "^1.2.1",
14667 + "pkg-types": "^1.3.0",
14668 "scule": "^1.3.0",
14669 "strip-literal": "^2.1.1",
14467 - "unplugin": "^1.16.0"
14670 + "unplugin": "^1.16.1"
14671 }
14672 },
14673 "node_modules/unimport/node_modules/escape-string-regexp": {
@@ -14489,9 +14692,9 @@
14692 }
14693 },
14694 "node_modules/unimport/node_modules/unplugin": {
14492 - "version": "1.16.0",
14493 - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.0.tgz",
14494 - "integrity": "sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==",
14695 + "version": "1.16.1",
14696 + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz",
14697 + "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==",
14698 "license": "MIT",
14699 "dependencies": {
14700 "acorn": "^8.14.0",
@@ -14592,82 +14795,6 @@
14795 "node": ">=18.12.0"
14796 }
14797 },
14595 - "node_modules/unplugin-vue-components": {
14596 - "version": "0.28.0",
14597 - "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.28.0.tgz",
14598 - "integrity": "sha512-jiTGtJ3JsRFBjgvyilfrX7yUoGKScFgbdNw+6p6kEXU+Spf/rhxzgvdfuMcvhCcLmflB/dY3pGQshYBVGOUx7Q==",
14599 - "dev": true,
14600 - "license": "MIT",
14601 - "dependencies": {
14602 - "@antfu/utils": "^0.7.10",
14603 - "@rollup/pluginutils": "^5.1.4",
14604 - "chokidar": "^3.6.0",
14605 - "debug": "^4.4.0",
14606 - "fast-glob": "^3.3.2",
14607 - "local-pkg": "^0.5.1",
14608 - "magic-string": "^0.30.15",
14609 - "minimatch": "^9.0.5",
14610 - "mlly": "^1.7.3",
14611 - "unplugin": "^2.1.0"
14612 - },
14613 - "engines": {
14614 - "node": ">=14"
14615 - },
14616 - "funding": {
14617 - "url": "https://github.com/sponsors/antfu"
14618 - },
14619 - "peerDependencies": {
14620 - "@babel/parser": "^7.15.8",
14621 - "@nuxt/kit": "^3.2.2",
14622 - "vue": "2 || 3"
14623 - },
14624 - "peerDependenciesMeta": {
14625 - "@babel/parser": {
14626 - "optional": true
14627 - },
14628 - "@nuxt/kit": {
14629 - "optional": true
14630 - }
14631 - }
14632 - },
14633 - "node_modules/unplugin-vue-components/node_modules/chokidar": {
14634 - "version": "3.6.0",
14635 - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
14636 - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
14637 - "dev": true,
14638 - "license": "MIT",
14639 - "dependencies": {
14640 - "anymatch": "~3.1.2",
14641 - "braces": "~3.0.2",
14642 - "glob-parent": "~5.1.2",
14643 - "is-binary-path": "~2.1.0",
14644 - "is-glob": "~4.0.1",
14645 - "normalize-path": "~3.0.0",
14646 - "readdirp": "~3.6.0"
14647 - },
14648 - "engines": {
14649 - "node": ">= 8.10.0"
14650 - },
14651 - "funding": {
14652 - "url": "https://paulmillr.com/funding/"
14653 - },
14654 - "optionalDependencies": {
14655 - "fsevents": "~2.3.2"
14656 - }
14657 - },
14658 - "node_modules/unplugin-vue-components/node_modules/glob-parent": {
14659 - "version": "5.1.2",
14660 - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
14661 - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
14662 - "dev": true,
14663 - "license": "ISC",
14664 - "dependencies": {
14665 - "is-glob": "^4.0.1"
14666 - },
14667 - "engines": {
14668 - "node": ">= 6"
14669 - }
14670 - },
14798 "node_modules/untildify": {
14799 "version": "4.0.0",
14800 "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
@@ -14698,9 +14825,9 @@
14825 }
14826 },
14827 "node_modules/update-browserslist-db": {
14701 - "version": "1.1.1",
14702 - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
14703 - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
14828 + "version": "1.1.2",
14829 + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
14830 + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
14831 "funding": [
14832 {
14833 "type": "opencollective",
@@ -14718,7 +14845,7 @@
14845 "license": "MIT",
14846 "dependencies": {
14847 "escalade": "^3.2.0",
14721 - "picocolors": "^1.1.0"
14848 + "picocolors": "^1.1.1"
14849 },
14850 "bin": {
14851 "update-browserslist-db": "cli.js"
@@ -15406,6 +15533,13 @@
15533 "@esbuild/win32-x64": "0.21.5"
15534 }
15535 },
15536 + "node_modules/vite-node/node_modules/pathe": {
15537 + "version": "1.1.2",
15538 + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
15539 + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
15540 + "dev": true,
15541 + "license": "MIT"
15542 + },
15543 "node_modules/vite-node/node_modules/vite": {
15544 "version": "5.4.11",
15545 "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz",
@@ -15547,18 +15681,18 @@
15681 }
15682 },
15683 "node_modules/vite-plugin-vue-devtools": {
15550 - "version": "7.6.8",
15551 - "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.6.8.tgz",
15552 - "integrity": "sha512-32aIps8C1Y7UEoqyWf+ES3J1OozsCYMIqTqd+I5qass+R0Tcf8SaA2bX1/rskAzkcKCteVoBjEENmqwTcMebbw==",
15684 + "version": "7.7.0",
15685 + "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.7.0.tgz",
15686 + "integrity": "sha512-1dWiREwIl4JELwXGHXih80hIgjcViMcZGr3j0edo6NQ9kNzAOxMIUgFqc/TO1ary4ZroJUxoB0YDI6jnDf13iQ==",
15687 "dev": true,
15688 "license": "MIT",
15689 "dependencies": {
15556 - "@vue/devtools-core": "^7.6.8",
15557 - "@vue/devtools-kit": "^7.6.8",
15558 - "@vue/devtools-shared": "^7.6.8",
15690 + "@vue/devtools-core": "^7.7.0",
15691 + "@vue/devtools-kit": "^7.7.0",
15692 + "@vue/devtools-shared": "^7.7.0",
15693 "execa": "^9.5.1",
15694 "sirv": "^3.0.0",
15561 - "vite-plugin-inspect": "~0.8.9",
15695 + "vite-plugin-inspect": "0.8.9",
15696 "vite-plugin-vue-inspector": "^5.3.1"
15697 },
15698 "engines": {
@@ -16313,6 +16447,13 @@
16447 "@types/estree": "^1.0.0"
16448 }
16449 },
16450 + "node_modules/vitest/node_modules/pathe": {
16451 + "version": "1.1.2",
16452 + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
16453 + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
16454 + "dev": true,
16455 + "license": "MIT"
16456 + },
16457 "node_modules/vitest/node_modules/vite": {
16458 "version": "5.4.11",
16459 "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz",
@@ -16686,13 +16827,13 @@
16827 }
16828 },
16829 "node_modules/wait-on": {
16689 - "version": "8.0.1",
16690 - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.1.tgz",
16691 - "integrity": "sha512-1wWQOyR2LVVtaqrcIL2+OM+x7bkpmzVROa0Nf6FryXkS+er5Sa1kzFGjzZRqLnHa3n1rACFLeTwUqE1ETL9Mig==",
16830 + "version": "8.0.2",
16831 + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.2.tgz",
16832 + "integrity": "sha512-qHlU6AawrgAIHlueGQHQ+ETcPLAauXbnoTKl3RKq20W0T8x0DKVAo5xWIYjHSyvHxQlcYbFdR0jp4T9bDVITFA==",
16833 "dev": true,
16834 "license": "MIT",
16835 "dependencies": {
16695 - "axios": "^1.7.7",
16836 + "axios": "^1.7.9",
16837 "joi": "^17.13.3",
16838 "lodash": "^4.17.21",
16839 "minimist": "^1.2.8",
frontend/package.json
+19 -36
@@ -13,15 +13,14 @@
13 "build-only": "vite build",
14 "build-analyzer": "vite-bundle-visualizer -t sunburst",
15 "build-check": "run-s libs-reload build lint type-check format test:e2e test:unit",
16 - "pre-merge": "run-s lint type-check format",
16 "preview": "vite build && echo '' && vite preview --port 4173 --host",
17 "preview-only": "vite preview --port 4173 --host",
18 "test:unit": "vitest",
19 "test:e2e": "start-server-and-test preview http://localhost:4173 'cypress run --e2e'",
20 "test:e2e:dev": "start-server-and-test 'vite dev --port 4173' http://localhost:4173 'cypress open --e2e'",
21 "type-check": "vue-tsc --build --force",
23 - "format": "prettier --write src/",
22 "lint": "eslint . --fix",
23 + "format": "prettier --write src/",
24 "lint-format": "run-s lint type-check format",
25 "tailwind-config-viewer": "tailwind-config-viewer -o",
26 "design-tokens": "node scripts/tokens-tool.js",
@@ -41,9 +40,9 @@
40 "@fontsource/jetbrains-mono": "^5.1.2",
41 "@fontsource/lexend": "^5.1.2",
42 "@fontsource/public-sans": "^5.1.2",
44 - "@shikijs/markdown-it": "^1.26.1",
43 + "@shikijs/markdown-it": "^1.27.2",
44 "@tailwindcss/container-queries": "^0.1.1",
46 - "@vueuse/core": "^12.3.0",
45 + "@vueuse/core": "^12.4.0",
46 "axios": "^1.7.9",
47 "bytes": "^3.1.2",
48 "colord": "^2.9.3",
@@ -62,7 +61,7 @@
61 "pinia": "^2.3.0",
62 "pinia-plugin-persistedstate": "^4.2.0",
63 "secure-ls": "^2.0.0",
65 - "shiki": "^1.26.1",
64 + "shiki": "^1.27.2",
65 "validator": "^13.12.0",
66 "vue": "^3.5.13",
67 "vue-advanced-cropper": "^2.8.9",
@@ -75,11 +74,13 @@
74 "vuedraggable": "^4.1.0"
75 },
76 "optionalDependencies": {
78 - "@rollup/rollup-linux-x64-gnu": "^4.30.0"
77 + "@rollup/rollup-linux-x64-gnu": "^4.30.1",
78 + "treemate": "^0.3.11",
79 + "vueuc": "^0.4.64"
80 },
81 "devDependencies": {
81 - "@antfu/eslint-config": "^3.12.1",
82 - "@clack/prompts": "^0.9.0",
82 + "@antfu/eslint-config": "^3.14.0",
83 + "@clack/prompts": "^0.9.1",
84 "@iconify/vue": "^4.3.0",
85 "@tsconfig/node20": "^20.1.4",
86 "@types/bytes": "^3.1.5",
@@ -87,7 +88,7 @@
88 "@types/fs-extra": "^11.0.4",
89 "@types/jsdom": "^21.1.7",
90 "@types/lodash": "^4.17.14",
90 - "@types/node": "^22.10.5",
91 + "@types/node": "^22.10.6",
92 "@types/validator": "^13.12.2",
93 "@vitejs/plugin-vue": "^5.2.1",
94 "@vitejs/plugin-vue-jsx": "^4.1.1",
@@ -96,44 +97,26 @@
97 "autoprefixer": "^10.4.20",
98 "cypress": "^13.17.0",
99 "depcheck": "^1.4.7",
99 - "eslint": "^9.17.0",
100 + "eslint": "^9.18.0",
101 "flourite": "^1.3.0",
102 "fs-extra": "^11.2.0",
102 - "jsdom": "^25.0.1",
103 + "jsdom": "^26.0.0",
104 "npm-run-all2": "^7.0.2",
104 - "postcss": "^8.4.49",
105 + "postcss": "^8.5.1",
106 "prettier": "^3.4.2",
107 "prettier-plugin-tailwindcss": "^0.6.9",
107 - "sass": "^1.83.1",
108 - "start-server-and-test": "^2.0.9",
108 + "sass": "^1.83.4",
109 + "start-server-and-test": "^2.0.10",
110 "tailwind-config-viewer": "^2.0.4",
111 "tailwindcss": "^3.4.17",
111 - "taze": "^0.18.0",
112 - "type-fest": "^4.31.0",
113 - "typescript": "~5.7.2",
112 + "taze": "^18.2.0",
113 + "type-fest": "^4.32.0",
114 + "typescript": "~5.7.3",
115 "vite": "^6.0.7",
116 "vite-bundle-visualizer": "^1.2.1",
116 - "vite-plugin-vue-devtools": "^7.6.8",
117 + "vite-plugin-vue-devtools": "^7.7.0",
118 "vite-svg-loader": "^5.1.0",
119 "vitest": "^2.1.8",
120 "vue-tsc": "^2.2.0"
120 - },
121 - "pnpm": {
122 - "overrides": {
123 - "@typescript-eslint/eslint-plugin": "^8.19.1",
124 - "@typescript-eslint/eslint-plugin>eslint": "$eslint",
125 - "@typescript-eslint/parser": "^8.19.1",
126 - "@typescript-eslint/parser>eslint": "$eslint",
127 - "eslint": "$eslint"
128 - }
129 - },
130 - "overrides": {
131 - "@typescript-eslint/eslint-plugin": {
132 - "eslint": "^9.17.0"
133 - },
134 - "@typescript-eslint/parser": {
135 - "eslint": "^9.17.0"
136 - },
137 - "@typescript-eslint/typescript-estree": "^8.19.1"
121 }
122 }
frontend/scripts/tokens-tool.js
+42 -12
@@ -2,12 +2,14 @@ import os from "node:os"
2 import path from "node:path"
3 import process from "node:process"
4 import { cancel, intro, isCancel, outro, select, spinner, text } from "@clack/prompts"
5 +import { colord } from "colord"
6 import fs from "fs-extra"
7 import _ from "lodash"
8
8 -const GLOBAL_KEYS = ["border-radius", "line-heights", "font-sizes", "font-families"]
9 +const GLOBAL_KEYS = ["border-radius", "line-heights", "font-sizes", "font-families", "font-weights"]
10 const TYPO_KEYS = ["typo"]
10 -const SET_KEYS = ["color"]
11 +const COLOR_KEYS = ["color"]
12 +const COLOR_OPACITY_LIST = [] // [5, 10, 15, 20, 30, 40, 50, 60, 70, 80, 90]
13 const TOKENS_MAP = [
14 {
15 token: "colors",
@@ -17,6 +19,10 @@ const TOKENS_MAP = [
19 token: "fontFamily",
20 type: "fontFamilies"
21 },
22 + {
23 + token: "fontWeight",
24 + type: "fontWeights"
25 + },
26 {
27 token: "fontSize",
28 type: "fontSizes"
@@ -79,7 +85,7 @@ async function importTokens(tokensPath) {
85 const projectFile = {}
86
87 const globalTokens = tokens.global
82 - const setTokens = [
88 + const colorTokens = [
89 { key: "light", value: tokens.light },
90 { key: "dark", value: tokens.dark }
91 ]
@@ -121,14 +127,15 @@ async function importTokens(tokensPath) {
127 }
128 }
129
124 - for (const set of setTokens) {
130 + for (const set of colorTokens) {
131 const setName = set.key
132 const group = set.value
133
134 for (const k in group) {
129 - for (const sk of SET_KEYS) {
130 - const kIndex = k.indexOf(sk)
131 - if (kIndex !== -1) {
135 + for (const sk of COLOR_KEYS) {
136 + const regex = /-\d{3}$/
137 + // exclude opacity variants
138 + if (k.includes(sk) && !regex.test(k)) {
139 const skParsed = tokenNameSanitize(_.camelCase(sk), "type")
140 const name = _.camelCase(k.replace(`${sk}-`, ""))
141 let value = group[k].value
@@ -141,6 +148,8 @@ async function importTokens(tokensPath) {
148 }
149 }
150
151 + value = colord(value).toRgbString()
152 +
153 _.set(projectFile, `${skParsed}.${setName}.${name}`, value)
154 }
155 }
@@ -172,7 +181,7 @@ async function exportTokens() {
181 }
182
183 const globalTokens = groups.filter(o => !["colors", "typography"].includes(o.key))
175 - const setsTokens = groups.filter(o => ["colors"].includes(o.key))
184 + const colorTokens = groups.filter(o => ["colors"].includes(o.key))
185 const typoTokens = groups.filter(o => ["typography"].includes(o.key))
186
187 for (const group of globalTokens) {
@@ -188,7 +197,7 @@ async function exportTokens() {
197 }
198 }
199
191 - for (const group of setsTokens) {
200 + for (const group of colorTokens) {
201 const type = tokenNameSanitize(group.key, "token")
202 const set = group.value
203
@@ -197,8 +206,10 @@ async function exportTokens() {
206 const globalName = _.kebabCase(`${type}-${setName}-${name}`)
207 const tokenName = _.kebabCase(`${type}-${name}`)
208
209 + const value = colord(set[setName][name]).toRgbString()
210 +
211 exportFile.global[globalName] = {
201 - value: set[setName][name],
212 + value,
213 type
214 }
215
@@ -206,6 +217,25 @@ async function exportTokens() {
217 value: `{${globalName}}`,
218 type
219 }
220 +
221 + for (const opacity of COLOR_OPACITY_LIST) {
222 + const opacityName = opacity.toString().padStart(3, "0")
223 + const globalNameOpacity = _.kebabCase(`${type}-${setName}-${name}-${opacityName}`)
224 + const tokenNameOpacity = _.kebabCase(`${type}-${name}-${opacityName}`)
225 + const valueOpacity = colord(value)
226 + .alpha(opacity / 100)
227 + .toRgbString()
228 +
229 + exportFile.global[globalNameOpacity] = {
230 + value: valueOpacity,
231 + type
232 + }
233 +
234 + exportFile[setName][tokenNameOpacity] = {
235 + value: `{${globalNameOpacity}}`,
236 + type
237 + }
238 + }
239 }
240 }
241 }
@@ -232,9 +262,9 @@ async function exportTokens() {
262 }
263
264 // sanitize lineHeight for figma
235 - if (value.fontSize && tokens?.lineHeight?.base) {
265 + if (value.fontSize && tokens?.lineHeight?.default) {
266 newValue.lineHeight = Math.round(
237 - Number.parseInt(getValue(tokens, value.fontSize)) * Number.parseFloat(tokens.lineHeight.base)
267 + Number.parseInt(getValue(tokens, value.fontSize)) * Number.parseFloat(tokens.lineHeight.default)
268 ).toString()
269 }
270
frontend/src/App.vue
+17 -14
@@ -2,15 +2,17 @@
2 <Provider>
3 <component
4 :is="layoutComponent"
5 - :class="[`theme-${themeName}`, `layout-${layoutComponentName}`, themeName, { 'opacity-0': loading }]"
5 + id="app-layout"
6 + :class="[
7 + `theme-${themeName}`,
8 + `layout-${layoutComponentName}`,
9 + `route-${routeName}`,
10 + { 'opacity-0': loading }
11 + ]"
12 >
13 <RouterView v-slot="{ Component: RouterComponent }">
14 <transition :name="`router-${routerTransition}`" mode="out-in" appear>
9 - <component
10 - :is="RouterComponent"
11 - :key="(route?.name?.toString() || '') + forceRefresh"
12 - :class="[`theme-${themeName}`, `layout-${layoutComponentName}`, themeName]"
13 - />
15 + <component :is="RouterComponent" id="app-page" :key="routeName + forceRefresh" />
16 </transition>
17 </RouterView>
18 </component>
@@ -22,10 +24,10 @@
24
25 <script lang="ts" setup>
26 import type { Layout, RouterTransition, ThemeNameEnum } from "@/types/theme.d"
25 -import Blank from "@/app-layouts/Blank/index.vue"
27 +import Blank from "@/app-layouts/Blank"
28 import Provider from "@/app-layouts/common/Provider.vue"
29 import SplashScreen from "@/app-layouts/common/SplashScreen.vue"
28 -import HorizontalNav from "@/app-layouts/HorizontalNav/index.vue"
30 +import HorizontalNav from "@/app-layouts/HorizontalNav"
31 import SearchDialog from "@/components/common/SearchDialog.vue"
32 import { useAuthStore } from "@/stores/auth"
33 import { useMainStore } from "@/stores/main"
@@ -47,6 +49,7 @@ const themeStore = useThemeStore()
49 const mainStore = useMainStore()
50 const authStore = useAuthStore()
51
52 +const routeName = computed<string>(() => route?.name?.toString() || "")
53 const forceRefresh = computed<number>(() => mainStore.forceRefresh)
54 const forceLayout = ref<Layout | null>(null)
55 const layout = computed<Layout>(() => themeStore.layout)
@@ -56,9 +59,9 @@ const routerTransition = computed<RouterTransition>(() => themeStore.routerTrans
59 const themeName = computed<ThemeNameEnum>(() => themeStore.themeName)
60 const isLogged = computed(() => authStore.isLogged)
61
59 -function checkForcedLayout(route: RouteLocationNormalized) {
60 - if (route.meta?.forceLayout) {
61 - forceLayout.value = route.meta.forceLayout
62 +function checkThemeOverrides(currentRoute: RouteLocationNormalized) {
63 + if (currentRoute.meta?.theme?.layout !== undefined) {
64 + forceLayout.value = currentRoute.meta.theme.layout
65 } else {
66 forceLayout.value = null
67 }
@@ -68,12 +71,12 @@ watch(layoutComponentName, () => {
71 loading.value = false
72 })
73
71 -router.afterEach(route => {
72 - checkForcedLayout(route)
74 +router.afterEach(currentRoute => {
75 + checkThemeOverrides(currentRoute)
76 })
77
78 onBeforeMount(() => {
76 - checkForcedLayout(useRoute())
79 + checkThemeOverrides(route)
80
81 setTimeout(() => {
82 loading.value = false
frontend/src/app-layouts/Blank/Blank.vue renamed
+2 -1
@@ -8,13 +8,14 @@
8
9 <script lang="ts" setup>
10 import MainContainer from "./MainContainer.vue"
11 +import "./main.scss"
12 </script>
13
14 <style lang="scss" scoped>
15 .layout {
16 width: 100vw;
17 height: 100vh;
17 - height: 100dvh;
18 + height: 100svh;
19 overflow: hidden;
20 perspective: 1000px;
21 }
frontend/src/app-layouts/Blank/MainContainer.vue
+37 -10
@@ -1,7 +1,11 @@
1 <template>
2 - <div class="main">
2 + <div id="app-main" class="main">
3 <n-scrollbar ref="scrollbar">
4 - <div class="view" :class="[{ boxed }, `route-${routeName}`]">
4 + <div
5 + id="app-view"
6 + class="view"
7 + :class="{ boxed, 'view-padded': overridePadded === true, 'view-no-padded': overridePadded === false }"
8 + >
9 <slot />
10 </div>
11 </n-scrollbar>
@@ -12,16 +16,36 @@
16 import { useThemeStore } from "@/stores/theme"
17 import { NScrollbar } from "naive-ui"
18 import { computed, onMounted, ref } from "vue"
15 -import { useRoute, useRouter } from "vue-router"
19 +import { type RouteLocationNormalizedGeneric, useRoute, useRouter } from "vue-router"
20
21 const themeStore = useThemeStore()
22 const router = useRouter()
23 const route = useRoute()
20 -const routeName = computed<string>(() => route.name?.toString() || "")
21 -const boxed = computed(() => themeStore.isBoxed)
24 +const themeBoxed = computed<boolean>(() => themeStore.isBoxed)
25 +const overrideBoxed = ref<boolean | undefined>(undefined)
26 +const overridePadded = ref<boolean | undefined>(undefined)
27 +const boxed = computed<boolean>(() => (overrideBoxed.value !== undefined ? overrideBoxed.value : themeBoxed.value))
28 const scrollbar = ref()
29
30 +function checkThemeOverrides(currentRoute: RouteLocationNormalizedGeneric) {
31 + if (currentRoute.meta?.theme?.boxed?.enabled !== undefined) {
32 + overrideBoxed.value = currentRoute.meta.theme.boxed.enabled
33 + } else {
34 + overrideBoxed.value = undefined
35 + }
36 +
37 + if (currentRoute.meta?.theme?.padded?.enabled !== undefined) {
38 + overridePadded.value = currentRoute.meta.theme.padded.enabled
39 + } else {
40 + overridePadded.value = undefined
41 + }
42 +}
43 +
44 +router.beforeEach(checkThemeOverrides)
45 +
46 onMounted(() => {
47 + checkThemeOverrides(route)
48 +
49 router.afterEach(() => {
50 if (scrollbar?.value?.scrollTo) {
51 scrollbar?.value.scrollTo({ top: 0, behavior: "smooth" })
@@ -34,17 +58,20 @@ onMounted(() => {
58 .main {
59 width: 100%;
60 position: relative;
37 - background-color: var(--bg-body);
61 + background-color: var(--bg-body-color);
62
39 - /*
63 .view {
41 - padding: var(--view-padding);
64 + padding: 0 var(--view-padding);
65 + flex-grow: 1;
66 + width: 100%;
67 + margin: 0 auto;
68
69 &.boxed {
70 max-width: var(--boxed-width);
45 - margin: 0 auto;
71 + }
72 + &.view-no-padded {
73 + padding: 0;
74 }
75 }
48 - */
76 }
77 </style>
frontend/src/app-layouts/Blank/index.ts new
+1
@@ -0,0 +1 @@
1 +export { default } from "./Blank.vue"
frontend/src/app-layouts/Blank/main.scss new
+8
@@ -0,0 +1,8 @@
1 +.layout-Blank {
2 + .page-wrapped {
3 + height: 100svh;
4 + }
5 + .page-min-wrapped {
6 + min-height: 100svh;
7 + }
8 +}
frontend/src/app-layouts/HorizontalNav/HeaderBar.vue
+3 -3
@@ -9,7 +9,7 @@
9
10 <script lang="ts" setup>
11 import Logo from "@/app-layouts/common/Logo.vue"
12 -import Navbar from "@/app-layouts/common/Navbar/index.vue"
12 +import Navbar from "@/app-layouts/common/Navbar"
13 import { useThemeStore } from "@/stores/theme"
14 import { NScrollbar } from "naive-ui"
15 import { computed } from "vue"
@@ -19,14 +19,14 @@ const isDark = computed<boolean>(() => themeStore.isThemeDark)
19 </script>
20
21 <style lang="scss" scoped>
22 -@import "variables";
22 +@import "./variables";
23
24 .header-bar {
25 padding-left: var(--view-padding);
26 min-height: var(--header-bar-height);
27 height: var(--header-bar-height);
28 max-height: var(--header-bar-height);
29 - background-color: var(--bg-sidebar);
29 + background-color: var(--bg-sidebar-color);
30
31 :deep(.n-scrollbar-rail) {
32 opacity: 0.15;
frontend/src/app-layouts/HorizontalNav/HorizontalNav.vue renamed
+1 -1
@@ -19,7 +19,7 @@ import "./main.scss"
19 .layout {
20 width: 100vw;
21 height: 100vh;
22 - height: 100dvh;
22 + height: 100svh;
23 overflow: hidden;
24 perspective: 1000px;
25 }
frontend/src/app-layouts/HorizontalNav/MainContainer.vue
+61 -43
@@ -1,34 +1,73 @@
1 <template>
2 - <div id="main" class="main" :class="{ 'sidebar-collapsed': sidebarCollapsed, 'sidebar-opened': !sidebarCollapsed }">
3 - <n-scrollbar ref="scrollbar">
2 + <div
3 + id="app-main"
4 + class="main"
5 + :class="{ 'sidebar-collapsed': sidebarCollapsed, 'sidebar-opened': !sidebarCollapsed }"
6 + >
7 + <n-scrollbar
8 + ref="scrollbar"
9 + trigger="none"
10 + :y-placement="isRTL ? 'left' : 'right'"
11 + content-class="min-h-full flex flex-col"
12 + :theme-overrides="{
13 + railInsetVerticalRight: `${toolbarHeight}px 4px 4px auto`,
14 + railInsetVerticalLeft: `${toolbarHeight}px auto 4px 4px`
15 + }"
16 + >
17 <Toolbar :boxed="toolbarBoxed" class="gradient-bg-sidebar" />
5 - <div class="view" :class="[{ boxed }, `route-${routeName}`]">
18 + <div
19 + id="app-view"
20 + class="view"
21 + :class="{ boxed, 'view-padded': overridePadded === true, 'view-no-padded': overridePadded === false }"
22 + >
23 <slot />
24 </div>
8 - <MainFooter v-if="footerShown" :boxed="boxed" />
25 + <MainFooter v-if="footerShown" :boxed />
26 </n-scrollbar>
27 </div>
28 </template>
29
30 <script lang="ts" setup>
31 import MainFooter from "@/app-layouts/common/MainFooter.vue"
15 -import Toolbar from "@/app-layouts/common/Toolbar/index.vue"
32 +import Toolbar from "@/app-layouts/common/Toolbar"
33 import { useThemeStore } from "@/stores/theme"
34 import { NScrollbar } from "naive-ui"
35 import { computed, onMounted, ref } from "vue"
19 -import { useRoute, useRouter } from "vue-router"
36 +import { type RouteLocationNormalizedGeneric, useRoute, useRouter } from "vue-router"
37
38 const themeStore = useThemeStore()
39 const router = useRouter()
40 const route = useRoute()
24 -const routeName = computed<string>(() => route.name?.toString() || "")
41 const sidebarCollapsed = computed<boolean>(() => themeStore.sidebar.collapsed)
42 const footerShown = computed(() => themeStore.isFooterShown)
27 -const boxed = computed<boolean>(() => themeStore.isBoxed)
43 +const themeBoxed = computed<boolean>(() => themeStore.isBoxed)
44 +const overrideBoxed = ref<boolean | undefined>(undefined)
45 +const overridePadded = ref<boolean | undefined>(undefined)
46 +const boxed = computed<boolean>(() => (overrideBoxed.value !== undefined ? overrideBoxed.value : themeBoxed.value))
47 +const isRTL = computed<boolean>(() => themeStore.isRTL)
48 const toolbarBoxed = computed(() => themeStore.isToolbarBoxed)
49 +const toolbarHeight = computed(() => themeStore.toolbarHeight)
50 const scrollbar = ref()
51
52 +function checkThemeOverrides(currentRoute: RouteLocationNormalizedGeneric) {
53 + if (currentRoute.meta?.theme?.boxed?.enabled !== undefined) {
54 + overrideBoxed.value = currentRoute.meta.theme.boxed.enabled
55 + } else {
56 + overrideBoxed.value = undefined
57 + }
58 +
59 + if (currentRoute.meta?.theme?.padded?.enabled !== undefined) {
60 + overridePadded.value = currentRoute.meta.theme.padded.enabled
61 + } else {
62 + overridePadded.value = undefined
63 + }
64 +}
65 +
66 +router.beforeEach(checkThemeOverrides)
67 +
68 onMounted(() => {
69 + checkThemeOverrides(route)
70 +
71 router.afterEach(() => {
72 if (scrollbar?.value?.scrollTo) {
73 scrollbar?.value.scrollTo({ top: 0, behavior: "smooth" })
@@ -38,57 +77,36 @@ onMounted(() => {
77 </script>
78
79 <style lang="scss" scoped>
41 -@import "variables";
80 +@import "./variables";
81
82 .main {
83 width: 100%;
45 - height: 100%;
84 overflow: hidden;
47 - position: relative;
48 - transition: padding var(--sidebar-anim-ease) var(--sidebar-anim-duration);
49 - background-color: var(--bg-body);
50 -
51 - :deep() {
52 - & > .n-scrollbar {
53 - & > .n-scrollbar-rail {
54 - top: calc(var(--toolbar-height) + 2px);
55 - }
56 -
57 - & > .n-scrollbar-container {
58 - & > .n-scrollbar-content {
59 - min-height: 100%;
60 - display: flex;
61 - flex-direction: column;
62 - }
63 - }
64 - }
65 - }
85 + background-color: var(--bg-body-color);
86 + transition: all var(--sidebar-anim-ease) var(--sidebar-anim-duration);
87
88 .view {
68 - padding: var(--view-padding);
69 - padding-top: 0;
89 + padding: 0 var(--view-padding);
90 flex-grow: 1;
91 width: 100%;
72 - display: flex;
73 - flex-direction: column;
92 + margin: 0 auto;
93
94 &.boxed {
95 max-width: var(--boxed-width);
77 - margin: 0 auto;
96 + }
97 + &.view-no-padded {
98 + padding: 0;
99 }
100 }
101
102 @media (max-width: $sidebar-bp) {
82 - transition: all var(--sidebar-anim-ease) var(--sidebar-anim-duration);
83 -
84 - .view {
85 - padding-top: calc(var(--view-padding) / 2);
86 - }
87 -
103 &.sidebar-opened {
89 - //transform: scale(0.8) translateX(100%) rotateY(35deg);
90 - //transform-origin: center left;
91 - //border-radius: 16px;
104 + /*
105 + transform: scale(0.8) translateX(100%) rotateY(35deg);
106 + transform-origin: center left;
107 + border-radius: 16px;
108 + */
109 +
110 overflow: hidden;
111 opacity: 0.5;
112 }
frontend/src/app-layouts/HorizontalNav/Sidebar.vue
+5 -8
@@ -1,6 +1,6 @@
1 <template>
2 <aside
3 - id="sidebar"
3 + id="app-sidebar"
4 class="sidebar flex flex-col"
5 :class="{ collapsed: sidebarCollapsed, opened: !sidebarCollapsed }"
6 >
@@ -15,7 +15,7 @@
15 </template>
16
17 <script lang="ts" setup>
18 -import Navbar from "@/app-layouts/common/Navbar/index.vue"
18 +import Navbar from "@/app-layouts/common/Navbar"
19 import { useThemeStore } from "@/stores/theme"
20 import { isMobile } from "@/utils"
21 import { onClickOutside, useElementHover } from "@vueuse/core"
@@ -62,22 +62,19 @@ onMounted(() => {
62 </script>
63
64 <style lang="scss" scoped>
65 -@import "variables";
65 +@import "./variables";
66
67 .sidebar {
68 position: fixed;
69 z-index: 4;
70 top: 0;
71 left: 0;
72 - //bottom: 0;
73 - //border-right:var(--border-small-100);
74 - //padding-right: 1px;
72 width: var(--sidebar-open-width);
73 height: 100vh;
77 - height: 100dvh;
74 + height: 100svh;
75 overflow-x: hidden;
76 overflow-y: auto;
80 - background-color: var(--bg-sidebar);
77 + background-color: var(--bg-sidebar-color);
78 transition:
79 width var(--sidebar-anim-ease) var(--sidebar-anim-duration),
80 box-shadow var(--sidebar-anim-ease) var(--sidebar-anim-duration),
frontend/src/app-layouts/HorizontalNav/SidebarFooter.vue
+1 -1
@@ -37,7 +37,7 @@ const collapsedWidth = computed<number>(() => themeStore.sidebar.closeWidth - 16
37 <style lang="scss" scoped>
38 .sidebar-footer {
39 margin: 8px;
40 - background-color: var(--bg-body);
40 + background-color: var(--bg-body-color);
41 border-radius: var(--border-radius);
42 padding: 3px 0;
43 transition: all 0.3s;
frontend/src/app-layouts/HorizontalNav/SidebarHeader.vue
+7 -61
@@ -1,12 +1,7 @@
1 <template>
2 - <div class="sidebar-header flex items-center justify-between">
3 - <div class="logo-box grow" :class="{ mini: logoMini }">
4 - <Transition name="fade" mode="out-in">
5 - <Logo v-if="isDark && !logoMini" :mini="false" :dark="true" class="anim-wrap" />
6 - <Logo v-else-if="isLight && !logoMini" :mini="false" :dark="false" class="anim-wrap" />
7 - <Logo v-else-if="isDark && logoMini" :mini="true" :dark="true" class="anim-wrap" />
8 - <Logo v-else-if="isLight && logoMini" :mini="true" :dark="false" class="anim-wrap" />
9 - </Transition>
2 + <div class="sidebar-header flex items-center justify-between gap-4 px-4">
3 + <div class="grow">
4 + <Logo :mini="logoMini" :dark="isDark" />
5 </div>
6 <Transition name="fade" mode="out-in">
7 <div v-if="showPin" class="sidebar-pin flex items-center">
@@ -29,18 +24,17 @@ import Logo from "@/app-layouts/common/Logo.vue"
24 import Icon from "@/components/common/Icon.vue"
25 import { useThemeStore } from "@/stores/theme"
26 import { Icon as Iconify } from "@iconify/vue"
32 -import { computed, toRefs } from "vue"
27 +import { computed } from "vue"
28
34 -const props = defineProps<{
29 +const { logoMini } = defineProps<{
30 logoMini?: boolean
31 }>()
37 -const { logoMini } = toRefs(props)
32
33 const CircleRegular = "fa6-regular:circle"
34 const DotCircleRegular = "fa6-regular:circle-dot"
35 const CloseOutline = "carbon:chevron-left"
36 const themeStore = useThemeStore()
43 -const showPin = computed<boolean>(() => !logoMini.value)
37 +const showPin = computed<boolean>(() => !logoMini)
38 const sidebarCollapsed = computed({
39 get(): boolean {
40 return themeStore.sidebar.collapsed
@@ -50,64 +44,16 @@ const sidebarCollapsed = computed({
44 }
45 })
46 const isDark = computed<boolean>(() => themeStore.isThemeDark)
53 -const isLight = computed(() => themeStore.isThemeLight)
47 </script>
48
49 <style lang="scss" scoped>
57 -@import "variables";
50 +@import "./variables";
51
52 .sidebar-header {
53 height: var(--toolbar-height);
54 min-height: var(--toolbar-height);
55
63 - :deep() {
64 - .logo-box {
65 - height: 100%;
66 - width: 100%;
67 - position: relative;
68 -
69 - .anim-wrap {
70 - padding: 16px 0px;
71 - position: absolute;
72 - top: 0;
73 - left: 0;
74 - right: 0;
75 - bottom: 0;
76 - display: flex;
77 - align-items: center;
78 -
79 - img {
80 - max-height: 32px;
81 - display: block;
82 - height: calc(var(--toolbar-height) - 32px);
83 - transform: translateX(32px);
84 - transition: transform var(--sidebar-anim-ease) var(--sidebar-anim-duration);
85 - }
86 - }
87 -
88 - &.fade-enter-active,
89 - &.fade-leave-active {
90 - transition: opacity var(--sidebar-anim-ease) var(--sidebar-anim-duration);
91 - }
92 -
93 - &.fade-enter-from,
94 - &.fade-leave-to {
95 - opacity: 0;
96 - }
97 - }
98 -
99 - &.mini {
100 - width: 100%;
101 - .anim-wrap {
102 - img {
103 - transform: translateX(22px);
104 - }
105 - }
106 - }
107 - }
108 -
56 .sidebar-pin {
110 - padding-right: 16px;
57 height: 100%;
58
59 :deep() {
frontend/src/app-layouts/HorizontalNav/_mixin.scss new
+6
@@ -0,0 +1,6 @@
1 +@mixin page-full-view {
2 + height: calc(100svh - var(--toolbar-height));
3 + position: relative;
4 + left: calc(var(--view-padding) * -1);
5 + width: 100vw;
6 +}
frontend/src/app-layouts/HorizontalNav/index.ts new
+1
@@ -0,0 +1 @@
1 +export { default } from "./HorizontalNav.vue"
frontend/src/app-layouts/HorizontalNav/main.scss
+25 -9
@@ -1,16 +1,32 @@
1 -@use "variables";
1 +@import "variables";
2 +@import "mixin";
3
3 -.page-wrapped {
4 - @media (min-width: calc(variables.$sidebar-bp + 1px)) {
5 - &.layout-HorizontalNav {
6 - height: calc(100dvh - var(--toolbar-height) - var(--view-padding) - var(--header-bar-height));
4 +.layout-HorizontalNav {
5 + .page {
6 + padding-bottom: var(--view-padding);
7 + }
8 + .page-wrapped {
9 + padding-bottom: 0;
10 + height: calc(100svh - var(--toolbar-height) - var(--view-padding) - var(--header-bar-height));
11 + }
12 + .page-min-wrapped {
13 + padding-bottom: 0;
14 + min-height: calc(100svh - var(--toolbar-height) - var(--view-padding) - var(--header-bar-height));
15 + }
16 + .page-mobile-full {
17 + @media (max-width: $sidebar-bp) {
18 + padding-bottom: 0;
19 + @include page-full-view;
20 }
21 }
22 }
10 -.page-min-wrapped {
11 - @media (min-width: calc(variables.$sidebar-bp + 1px)) {
12 - &.layout-HorizontalNav {
13 - min-height: calc(100dvh - var(--toolbar-height) - var(--view-padding) - var(--header-bar-height));
23 +.direction-rtl {
24 + .layout-HorizontalNav {
25 + .page-mobile-full {
26 + @media (max-width: $sidebar-bp) {
27 + right: calc(var(--view-padding) * -1);
28 + left: unset;
29 + }
30 }
31 }
32 }
frontend/src/app-layouts/common/MainFooter.vue
+6 -14
@@ -1,9 +1,9 @@
1 <template>
2 - <footer class="footer" :class="{ boxed }">
2 + <footer class="footer py-4" :class="{ boxed }">
3 <div class="wrap flex items-center justify-end gap-3">
4 <div class="copy">
5 Made with
6 - <Icon :size="22" :color="style['primary-color']" class="mx-1">
6 + <Icon :size="22" class="text-primary mx-1">
7 <BrainIcon />
8 </Icon>
9 By
@@ -25,16 +25,12 @@
25 <script lang="ts" setup>
26 import BrainIcon from "@/assets/icons/brain-icon.svg"
27 import Icon from "@/components/common/Icon.vue"
28 -import { useThemeStore } from "@/stores/theme"
29 -import { computed, ref, toRefs } from "vue"
28 +import { ref } from "vue"
29
31 -const props = defineProps<{
30 +const { boxed } = defineProps<{
31 boxed: boolean
32 }>()
34 -const { boxed } = toRefs(props)
33
36 -const themeStore = useThemeStore()
37 -const style = computed(() => themeStore.style)
34 const year = ref(new Date().getFullYear())
35 </script>
36
@@ -42,8 +38,6 @@ const year = ref(new Date().getFullYear())
38 .footer {
39 width: 100%;
40 max-width: 100%;
45 - padding: var(--view-padding);
46 - padding-top: 0;
41 overflow: hidden;
42 font-size: 13px;
43
@@ -51,6 +45,8 @@ const year = ref(new Date().getFullYear())
45 overflow: hidden;
46 width: 100%;
47 max-width: 100%;
48 + margin: 0 auto;
49 + padding: 0 var(--view-padding);
50
51 .copy {
52 line-height: 1.6;
@@ -69,12 +65,8 @@ const year = ref(new Date().getFullYear())
65 }
66
67 &.boxed {
72 - padding: 0;
68 .wrap {
74 - padding: var(--view-padding);
75 - padding-top: 0;
69 max-width: var(--boxed-width);
77 - margin: 0 auto;
70 }
71 }
72
frontend/src/app-layouts/common/Navbar/Navbar.vue renamed
+14 -12
@@ -4,9 +4,9 @@
4 ref="menu"
5 v-model:value="selectedKey"
6 :options="menuOptions"
7 - :collapsed="collapsed"
7 + :collapsed
8 :mode
9 - :accordion="true"
9 + accordion
10 :collapsed-width="collapsedWidth"
11 :dropdown-props="{
12 scrollable: true,
@@ -14,7 +14,7 @@
14 class: 'main-nav'
15 })
16 }"
17 - :expanded-keys="expandedKeys"
17 + :expanded-keys
18 @update:expanded-keys="handleUpdateExpandedKeys"
19 />
20 </nav>
@@ -33,6 +33,7 @@ const { mode = "horizontal", collapsed = false } = defineProps<{
33 mode?: "vertical" | "horizontal"
34 collapsed?: boolean
35 }>()
36 +
37 const route = useRoute()
38 const router = useRouter()
39 const selectedKey = ref<string | null>(null)
@@ -116,8 +117,8 @@ function handleUpdateExpandedKeys(value: string[]) {
117 }
118
119 :nth-child(2) {
119 - color: var(--fg-color);
120 - background: var(--hover-005-color);
120 + color: var(--fg-default-color);
121 + background: var(--hover-color);
122 height: 22px;
123 line-height: 24px;
124 border-radius: 15px;
@@ -167,7 +168,7 @@ function handleUpdateExpandedKeys(value: string[]) {
168 &::before {
169 content: "";
170 display: block;
170 - background-color: var(--divider-010-color);
171 + background-color: var(--border-color);
172 width: var(--dash-height);
173 position: absolute;
174 top: 0px;
@@ -179,10 +180,11 @@ function handleUpdateExpandedKeys(value: string[]) {
180 &::after {
181 content: "";
182 display: block;
182 - background-color: var(--divider-010-color);
183 + background-color: var(--border-color);
184 width: var(--dash-width);
185 height: var(--dash-height);
186 position: absolute;
187 + z-index: -1;
188 top: calc(50% - calc(ar(--dash-height) / 2));
189 left: calc(var(--dash-offset) + var(--dash-height));
190 }
@@ -203,8 +205,8 @@ function handleUpdateExpandedKeys(value: string[]) {
205 width: calc(var(--dash-width) * 3);
206 background: repeating-linear-gradient(
207 90deg,
206 - var(--divider-010-color) 0px,
207 - var(--divider-010-color) 5px,
208 + var(--border-color) 0px,
209 + var(--border-color) 5px,
210 transparent 5px,
211 transparent 8px
212 );
@@ -252,8 +254,8 @@ function handleUpdateExpandedKeys(value: string[]) {
254 }
255
256 :nth-child(2) {
255 - color: var(--fg-color);
256 - background: var(--hover-005-color);
257 + color: var(--fg-default-color);
258 + background: var(--hover-color);
259 font-weight: bold;
260 font-family: var(--font-family-mono);
261 font-size: 10px;
@@ -270,7 +272,7 @@ function handleUpdateExpandedKeys(value: string[]) {
272 .item-badge {
273 :nth-child(2) {
274 color: var(--n-item-text-color-active);
273 - background: var(--primary-010-color);
275 + background: rgba(var(--primary-color-rgb) / 0.1);
276 }
277 }
278 }
frontend/src/app-layouts/common/Navbar/index.ts new
+1
@@ -0,0 +1 @@
1 +export { default } from "./Navbar.vue"
frontend/src/app-layouts/common/SplashScreen.vue
+1 -3
@@ -8,12 +8,10 @@
8
9 <script lang="ts" setup>
10 import { NSpin } from "naive-ui"
11 -import { toRefs } from "vue"
11
13 -const props = defineProps<{
12 +const { show } = defineProps<{
13 show: boolean
14 }>()
16 -const { show } = toRefs(props)
15 </script>
16
17 <style scoped lang="scss">
frontend/src/app-layouts/common/Toolbar/Notifications.vue
+2 -5
@@ -43,12 +43,9 @@ import { NBadge, NButton, NDrawer, NDrawerContent, NPopover, NText } from "naive
43 import { computed, onBeforeMount, ref } from "vue"
44
45 const BellIcon = "ph:bell"
46 -
46 const themeStore = useThemeStore()
48 -
49 -const primaryColor = computed(() => themeStore.primaryColor)
47 +const primaryColor = computed(() => themeStore.style["primary-color"])
48 const hasUnread = useNotifications().hasUnread
51 -
49 const showDrawer = ref(false)
50 const list = useNotifications().list
51
@@ -61,6 +58,6 @@ onBeforeMount(() => {
58
59 <style lang="scss" scoped>
60 .trigger-icon {
64 - color: var(--fg-color);
61 + color: var(--fg-default-color);
62 }
63 </style>
frontend/src/app-layouts/common/Toolbar/PinnedPages.vue
+27 -9
@@ -24,9 +24,9 @@
24 <div v-if="pinned.length" class="flex items-center">
25 <n-popover :show-arrow="false" placement="bottom" trigger="hover" class="!p-1">
26 <template #trigger>
27 - <button class="shortcuts-btn flex items-center gap-2">
27 + <button class="shortcuts-btn flex items-center gap-2 text-sm">
28 <span>Shortcuts</span>
29 - <n-badge :value="pinned.length" color="var(--divider-030-color)" />
29 + <n-badge :value="pinned.length" />
30 </button>
31 </template>
32 <div class="flex flex-col">
@@ -161,7 +161,7 @@ router.afterEach(route => {
161
162 &.n-tag--closable {
163 &:hover {
164 - background-color: var(--hover-color);
164 + background-color: var(--bg-sidebar-color);
165
166 &.n-tag--round {
167 padding: 0 calc(var(--n-height) / 3.6) 0 calc(var(--n-height) / 3.6);
@@ -178,19 +178,37 @@ router.afterEach(route => {
178
179 .shortcuts-btn {
180 border-radius: 50px;
181 - background-color: var(--bg-color);
181 + background-color: var(--bg-sidebar-color);
182 gap: 10px;
183 height: 32px;
184 cursor: pointer;
185 - padding: 0px 8px;
186 - padding-left: 10px;
185 + padding: 0px 6px;
186 + padding-left: 12px;
187 outline: none;
188 transition: all 0.2s var(--bezier-ease);
189 - border: none;
189 + border: 1px solid var(--border-color);
190
191 &:hover {
192 background-color: var(--hover-color);
193 }
194 +
195 + :deep() {
196 + .n-badge {
197 + .n-badge-sup {
198 + --size: 22px;
199 + background-color: var(--bg-body-color);
200 + color: var(--fg-secondary-color);
201 + font-weight: 700;
202 + height: var(--size);
203 + line-height: var(--size);
204 + min-width: var(--size);
205 + border-radius: var(--size);
206 + font-variant-numeric: tabular-nums;
207 + justify-content: center;
208 + padding: 0;
209 + }
210 + }
211 + }
212 }
213
214 .page-name {
@@ -246,8 +264,8 @@ router.afterEach(route => {
264 .direction-rtl {
265 .pinned-pages {
266 .shortcuts-btn {
249 - padding-right: 10px;
250 - padding-left: 8px;
267 + padding-right: 12px;
268 + padding-left: 6px;
269 }
270 }
271 }
frontend/src/app-layouts/common/Toolbar/Search.vue
+2 -2
@@ -32,7 +32,7 @@ onMounted(() => {
32 <style lang="scss" scoped>
33 .search-btn {
34 border-radius: 50px;
35 - background-color: var(--bg-body);
35 + background-color: var(--bg-body-color);
36 gap: 10px;
37 height: 32px;
38 cursor: pointer;
@@ -72,7 +72,7 @@ onMounted(() => {
72
73 :deep() {
74 & > code {
75 - background-color: var(--hover-005-color);
75 + background-color: var(--bg-sidebar-color);
76 border-top-right-radius: 10px;
77 border-bottom-right-radius: 10px;
78 padding-right: 10px;
frontend/src/app-layouts/common/Toolbar/Toolbar.vue renamed
+36 -37
@@ -25,7 +25,7 @@ import Icon from "@/components/common/Icon.vue"
25 import { useMainStore } from "@/stores/main"
26 import { useThemeStore } from "@/stores/theme"
27 import { useLoadingBar } from "naive-ui"
28 -import { onMounted, toRefs } from "vue"
28 +import { onMounted } from "vue"
29 import { useRouter } from "vue-router"
30 import Logo from "../Logo.vue"
31 import Avatar from "./Avatar.vue"
@@ -36,10 +36,9 @@ import PinnedPages from "./PinnedPages.vue"
36 import Search from "./Search.vue"
37 import ThemeSwitch from "./ThemeSwitch.vue"
38
39 -const props = defineProps<{
39 +const { boxed } = defineProps<{
40 boxed: boolean
41 }>()
42 -const { boxed } = toRefs(props)
42
43 const router = useRouter()
44 const themeStore = useThemeStore()
@@ -97,9 +96,9 @@ onMounted(() => {
96 z-index: 0;
97
98 .bubble {
100 - background-color: var(--bg-sidebar);
101 - border: var(--border-small-050);
102 - color: var(--fg-color);
99 + background-color: var(--bg-sidebar-color);
100 + border: 1px solid var(--border-color);
101 + color: var(--fg-default-color);
102 border-radius: 50px;
103 padding: 6px;
104 transition: all 0.3s;
@@ -139,25 +138,25 @@ onMounted(() => {
138 top: 0;
139 left: 0;
140 z-index: -1;
142 - background-color: var(--bg-sidebar);
141 + background-color: var(--bg-sidebar-color);
142 background: linear-gradient(
143 to bottom,
145 - rgba(var(--bg-sidebar-rgb), 1) 0%,
146 - rgba(var(--bg-sidebar-rgb), 0.945) 8.6%,
147 - rgba(var(--bg-sidebar-rgb), 0.888) 16.2%,
148 - rgba(var(--bg-sidebar-rgb), 0.83) 22.9%,
149 - rgba(var(--bg-sidebar-rgb), 0.769) 28.9%,
150 - rgba(var(--bg-sidebar-rgb), 0.707) 34.4%,
151 - rgba(var(--bg-sidebar-rgb), 0.644) 39.5%,
152 - rgba(var(--bg-sidebar-rgb), 0.578) 44.5%,
153 - rgba(var(--bg-sidebar-rgb), 0.511) 49.5%,
154 - rgba(var(--bg-sidebar-rgb), 0.443) 54.7%,
155 - rgba(var(--bg-sidebar-rgb), 0.373) 60.3%,
156 - rgba(var(--bg-sidebar-rgb), 0.301) 66.4%,
157 - rgba(var(--bg-sidebar-rgb), 0.228) 73.3%,
158 - rgba(var(--bg-sidebar-rgb), 0.153) 81%,
159 - rgba(var(--bg-sidebar-rgb), 0.077) 89.9%,
160 - rgba(var(--bg-sidebar-rgb), 0) 100%
144 + rgba(var(--bg-sidebar-color-rgb) / 1) 0%,
145 + rgba(var(--bg-sidebar-color-rgb) / 0.945) 8.6%,
146 + rgba(var(--bg-sidebar-color-rgb) / 0.888) 16.2%,
147 + rgba(var(--bg-sidebar-color-rgb) / 0.83) 22.9%,
148 + rgba(var(--bg-sidebar-color-rgb) / 0.769) 28.9%,
149 + rgba(var(--bg-sidebar-color-rgb) / 0.707) 34.4%,
150 + rgba(var(--bg-sidebar-color-rgb) / 0.644) 39.5%,
151 + rgba(var(--bg-sidebar-color-rgb) / 0.578) 44.5%,
152 + rgba(var(--bg-sidebar-color-rgb) / 0.511) 49.5%,
153 + rgba(var(--bg-sidebar-color-rgb) / 0.443) 54.7%,
154 + rgba(var(--bg-sidebar-color-rgb) / 0.373) 60.3%,
155 + rgba(var(--bg-sidebar-color-rgb) / 0.301) 66.4%,
156 + rgba(var(--bg-sidebar-color-rgb) / 0.228) 73.3%,
157 + rgba(var(--bg-sidebar-color-rgb) / 0.153) 81%,
158 + rgba(var(--bg-sidebar-color-rgb) / 0.077) 89.9%,
159 + rgba(var(--bg-sidebar-color-rgb) / 0) 100%
160 );
161 }
162 }
@@ -171,22 +170,22 @@ onMounted(() => {
170 top: 0;
171 left: 0;
172 z-index: -1;
174 - background-color: var(--bg-body);
173 + background-color: var(--bg-body-color);
174 background: linear-gradient(
175 to bottom,
177 - rgba(var(--bg-body-rgb), 1) 0%,
178 - rgba(var(--bg-body-rgb), 0.738) 19%,
179 - rgba(var(--bg-body-rgb), 0.541) 34%,
180 - rgba(var(--bg-body-rgb), 0.382) 47%,
181 - rgba(var(--bg-body-rgb), 0.278) 56.5%,
182 - rgba(var(--bg-body-rgb), 0.194) 65%,
183 - rgba(var(--bg-body-rgb), 0.126) 73%,
184 - rgba(var(--bg-body-rgb), 0.075) 80.2%,
185 - rgba(var(--bg-body-rgb), 0.042) 86.1%,
186 - rgba(var(--bg-body-rgb), 0.021) 91%,
187 - rgba(var(--bg-body-rgb), 0.008) 95.2%,
188 - rgba(var(--bg-body-rgb), 0.002) 98.2%,
189 - rgba(var(--bg-body-rgb), 0) 100%
176 + rgba(var(--bg-body-color-rgb) / 1) 0%,
177 + rgba(var(--bg-body-color-rgb) / 0.738) 19%,
178 + rgba(var(--bg-body-color-rgb) / 0.541) 34%,
179 + rgba(var(--bg-body-color-rgb) / 0.382) 47%,
180 + rgba(var(--bg-body-color-rgb) / 0.278) 56.5%,
181 + rgba(var(--bg-body-color-rgb) / 0.194) 65%,
182 + rgba(var(--bg-body-color-rgb) / 0.126) 73%,
183 + rgba(var(--bg-body-color-rgb) / 0.075) 80.2%,
184 + rgba(var(--bg-body-color-rgb) / 0.042) 86.1%,
185 + rgba(var(--bg-body-color-rgb) / 0.021) 91%,
186 + rgba(var(--bg-body-color-rgb) / 0.008) 95.2%,
187 + rgba(var(--bg-body-color-rgb) / 0.002) 98.2%,
188 + rgba(var(--bg-body-color-rgb) / 0) 100%
189 );
190 }
191 }
frontend/src/app-layouts/common/Toolbar/index.ts new
+1
@@ -0,0 +1 @@
1 +export { default } from "./Toolbar.vue"
frontend/src/assets/scss/_mixin.scss deleted
-8
@@ -1,8 +0,0 @@
1 -@mixin page-full-view {
2 - height: calc(100dvh - var(--toolbar-height));
3 - position: relative;
4 - top: calc(var(--view-padding) * -0.5);
5 - left: calc(var(--view-padding) * -1);
6 - margin-bottom: calc(var(--view-padding) * -1.5);
7 - width: 100vw;
8 -}
frontend/src/assets/scss/_variables.scss deleted
-4
@@ -1,4 +0,0 @@
1 -:root {
2 - --border-small-050: 1px solid var(--border-color);
3 - --border-small-100: 1px solid var(--divider-010-color);
4 -}
frontend/src/assets/scss/common.scss
+4 -26
@@ -1,5 +1,3 @@
1 -@use "mixin";
2 -
1 .custom-label {
2 color: var(--label-color);
3 font-size: 10px;
@@ -23,26 +21,6 @@
21 }
22 }
23
26 -.page-wrapped {
27 - height: calc(100dvh - var(--toolbar-height) - var(--view-padding) - (var(--view-padding) / 2));
28 -}
29 -.page-min-wrapped {
30 - min-height: calc(100dvh - var(--toolbar-height) - var(--view-padding) - (var(--view-padding) / 2));
31 -}
32 -.page-mobile-full {
33 - @media (max-width: 700px) {
34 - @include mixin.page-full-view;
35 - }
36 -}
37 -.direction-rtl {
38 - .page-mobile-full {
39 - @media (max-width: 700px) {
40 - right: calc(var(--view-padding) * -1);
41 - left: unset;
42 - }
43 - }
44 -}
45 -
24 .page {
25 .page-header {
26 margin-bottom: 20px;
@@ -122,7 +100,7 @@
100 /* Works on Firefox */
101
102 scrollbar-width: thin;
125 - scrollbar-color: var(--hover-010-color) var(--bg-secondary-color);
103 + scrollbar-color: var(--hover-color) var(--bg-secondary-color);
104
105 /* Works on Chrome, Edge, and Safari */
106 &::-webkit-scrollbar,
@@ -137,7 +115,7 @@
115
116 &::-webkit-scrollbar-thumb,
117 ::-webkit-scrollbar-thumb {
140 - background-color: var(--hover-010-color);
118 + background-color: var(--hover-color);
119 border-radius: 20px;
120 border: 2px solid var(--bg-secondary-color);
121 }
@@ -150,7 +128,7 @@
128 }
129
130 .over-layer {
153 - background-color: rgba(var(--bg-body-rgb), 0.8);
131 + background-color: rgba(var(--bg-body-color-rgb), 0.8);
132 position: absolute;
133 top: 0;
134 left: 0;
@@ -164,7 +142,7 @@
142 .n-alert {
143 width: 90vw;
144 max-width: 500px;
167 - background-color: var(--bg-color);
145 + background-color: var(--bg-default-color);
146 }
147 }
148
frontend/src/assets/scss/index.scss
+7 -7
@@ -18,7 +18,7 @@ body {
18 -moz-osx-font-smoothing: grayscale;
19 text-rendering: optimizeLegibility;
20 line-height: 1.35;
21 - font-size: 16px;
21 + font-size: var(--font-size);
22 text-wrap: pretty;
23
24 margin: 0;
@@ -53,7 +53,7 @@ body {
53 }
54
55 ::selection {
56 - background-color: var(--primary-020-color);
56 + background-color: rgba(var(--primary-color-rgb) / 0.2);
57 }
58
59 #app {
@@ -62,8 +62,8 @@ body {
62 overflow: auto;
63 }
64
65 -* {
66 - //user-select: none;
65 +svg {
66 + touch-action: initial !important;
67 }
68
69 input {
@@ -84,7 +84,7 @@ pre {
84 code {
85 padding: 1px 6px;
86 border-radius: var(--border-radius-small);
87 - background-color: var(--hover-005-color);
87 + background-color: rgba(var(--hover-color-rgb) / 0.4);
88 font-size: 13px;
89 }
90 pre {
@@ -148,8 +148,8 @@ ol {
148 mark {
149 padding: 2px 0px;
150 border-radius: var(--border-radius-small);
151 - background-color: var(--primary-030-color);
152 - color: var(--fg-color);
151 + background-color: rgba(var(--primary-color-rgb) / 0.3);
152 + color: var(--fg-default-color);
153 }
154
155 @media print {
frontend/src/assets/scss/overrides/naive-override.scss
+22 -27
@@ -3,18 +3,19 @@
3 }
4 .n-modal,
5 .n-card.n-modal[role] {
6 - //background-color: rgba(var(--modal-color-rgb), 0.7);
6 + // background-color: rgba(var(--bg-default-color-rgb) / 0.7);
7 backdrop-filter: blur(20px);
8 max-width: 90%;
9 margin: 10vh auto;
10 -
10 +}
11 +.n-card {
12 .n-card-header {
12 - flex-wrap: wrap-reverse;
13 + flex-wrap: wrap;
14 gap: 12px;
15 justify-content: flex-end;
16
17 .n-card-header__main {
17 - min-width: auto;
18 + min-width: auto !important;
19 }
20 }
21 }
@@ -57,12 +58,6 @@
58 }
59
60 .n-card {
60 - & > .n-card-header {
61 - div.n-card-header__main {
62 - //font-family: var(--font-family-display);
63 - font-weight: 700;
64 - }
65 - }
61 & > .n-card__content {
62 max-height: 100%;
63 }
@@ -79,23 +74,7 @@
74
75 .n-data-table {
76 .n-data-table-resize-button {
82 - --n-merged-border-color: var(--divider-010-color) !important;
83 - }
84 -}
85 -
86 -.n-space.n-space--rtl {
87 - .n-layout {
88 - aside.n-layout-sider.n-layout-sider--left-placement.n-layout-sider--bordered {
89 - .n-layout-toggle-button {
90 - right: unset;
91 - left: 0;
92 - transform: translateX(-50%) translateY(-50%) rotate(180deg);
93 - }
94 - .n-layout-sider__border {
95 - right: unset;
96 - left: 0;
97 - }
98 - }
77 + --n-merged-border-color: rgba(var(--fg-secondary-color-rgb) / 0.35);
78 }
79 }
80
@@ -130,6 +109,22 @@
109 }
110 }
111
112 +.n-space.n-space--rtl {
113 + .n-layout {
114 + aside.n-layout-sider.n-layout-sider--left-placement.n-layout-sider--bordered {
115 + .n-layout-toggle-button {
116 + right: unset;
117 + left: 0;
118 + transform: translateX(-50%) translateY(-50%) rotate(180deg);
119 + }
120 + .n-layout-sider__border {
121 + right: unset;
122 + left: 0;
123 + }
124 + }
125 + }
126 +}
127 +
128 .direction-rtl {
129 .v-binder-follower-container {
130 direction: ltr;
frontend/src/assets/scss/overrides/vue-md-it-override.scss
+3 -3
@@ -2,7 +2,7 @@
2 img {
3 max-width: 100%;
4 width: 100%;
5 - border: var(--border-small-100);
5 + border: 1px solid var(--border-color);
6 border-radius: var(--border-radius);
7 }
8
@@ -10,7 +10,7 @@
10 --cell-padding: 8px 12px;
11
12 width: 100%;
13 - border: var(--border-small-100);
13 + border: 1px solid var(--border-color);
14 border-radius: var(--border-radius);
15 text-align: left;
16 font-variant-numeric: tabular-nums;
@@ -33,7 +33,7 @@
33 tr {
34 td {
35 padding: var(--cell-padding);
36 - background-color: var(--bg-color);
36 + background-color: var(--bg-default-color);
37 border-bottom: 1px solid var(--border-color);
38 }
39
frontend/src/assets/scss/overrides/vuesjv-override.scss
+4 -4
@@ -1,5 +1,5 @@
1 .vuesjv-override {
2 - color: var(--fg-color) !important;
2 + color: var(--fg-default-color) !important;
3 font-family: var(--font-family-mono) !important;
4 line-height: 1.7 !important;
5
@@ -16,13 +16,13 @@
16 }
17
18 .bg-gray-200 {
19 - background-color: var(--divider-010-color);
19 + background-color: rgba(var(--border-color-rgb) / 0.1);
20 }
21 .c-gray-400 {
22 color: var(--fg-secondary-color);
23 }
24 .c-indigo-600 {
25 - color: var(--secondary2-color);
25 + color: var(--extra2-color);
26 }
27 .c-blue-600,
28 .c-purple-600,
@@ -41,7 +41,7 @@
41 }
42
43 .cursor-pointer {
44 - color: var(--fg-color);
44 + color: var(--fg-default-color);
45 background-color: transparent;
46 height: 18px;
47 border-radius: 0;
frontend/src/components/agents/sca/ScaResults.vue
+2 -2
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-5">
5 <n-popover overlap placement="bottom-start">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
@@ -43,7 +43,7 @@
43 />
44 <n-popover overlap placement="right" class="!px-0">
45 <template #trigger>
46 - <div class="bg-default rounded-default">
46 + <div class="bg-default rounded-lg">
47 <n-button size="small">
48 <template #icon>
49 <Icon :name="FilterIcon"></Icon>
frontend/src/components/agents/vulnerabilities/VulnerabilityCard.vue
+5 -5
@@ -171,8 +171,8 @@ const showDialog = ref(false)
171 <style lang="scss" scoped>
172 .vulnerability-card {
173 overflow: visible;
174 - border: 2px solid var(--bg-body);
175 - background-color: var(--bg-color);
174 + border: 2px solid var(--bg-body-color);
175 + background-color: var(--bg-default-color);
176 max-width: 100%;
177 box-sizing: border-box;
178 transition: all 0.3s;
@@ -185,7 +185,7 @@ const showDialog = ref(false)
185 position: absolute;
186 top: -10px;
187 right: -2px;
188 - border: 2px solid var(--bg-body);
188 + border: 2px solid var(--bg-body-color);
189 border-radius: var(--border-radius);
190 line-height: 1;
191 text-transform: uppercase;
@@ -193,7 +193,7 @@ const showDialog = ref(false)
193 @apply px-2 py-0.5 text-xs;
194 white-space: nowrap;
195 text-overflow: ellipsis;
196 - background-color: var(--bg-color);
196 + background-color: var(--bg-default-color);
197 transition: all 0.3s;
198
199 &::before {
@@ -204,7 +204,7 @@ const showDialog = ref(false)
204 z-index: 1;
205 width: calc(100% + 2px);
206 height: 13px;
207 - background-color: var(--bg-color);
207 + background-color: var(--bg-default-color);
208 transition: all 0.3s;
209 }
210 &::after {
frontend/src/components/alerts/AlertWazuhRules.vue
+1 -1
@@ -42,7 +42,7 @@ const wazuh_rule = computed(() => data.value.wazuh_rule.replace(/\\\\/g, "\\\\\\
42 pre {
43 background-color: var(--bg-secondary-color) !important;
44 border-radius: var(--border-radius);
45 - border: var(--border-small-050);
45 + border: 1px solid var(--border-color);
46 overflow: hidden;
47 }
48 code {
frontend/src/components/alerts/AlertsGraylogList.vue
+1 -1
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-5">
5 <n-popover overlap placement="bottom-start">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
frontend/src/components/alerts/AlertsList.vue
+1 -1
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-5">
5 <n-popover overlap placement="bottom-start">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
frontend/src/components/alerts/AlertsStatsItem.vue
+3 -3
@@ -31,16 +31,16 @@ const { summary } = defineProps<{ summary: Partial<AlertsByHost & AlertsByRule &
31 border-radius: var(--border-radius);
32 overflow: hidden;
33 background-color: var(--bg-secondary-color);
34 - border: var(--border-small-100);
34 + border: 1px solid var(--border-color);
35
36 .info {
37 - border-right: var(--border-small-100);
37 + border-right: 1px solid var(--border-color);
38 padding: 16px 20px;
39 }
40
41 .count {
42 min-width: 50px;
43 - background-color: var(--bg-color);
43 + background-color: var(--bg-default-color);
44 font-weight: bold;
45 }
46 }
frontend/src/components/alerts/AlertsSummary.vue
+3 -3
@@ -80,7 +80,7 @@ const { gotoIndex } = useGoto()
80 transition: all 0.2s var(--bezier-ease);
81
82 .alert-details {
83 - border-bottom: var(--border-small-100);
83 + border-bottom: 1px solid var(--border-color);
84
85 &:last-child {
86 border-bottom: none;
@@ -97,8 +97,8 @@ const { gotoIndex } = useGoto()
97 right: 0;
98 height: 100%;
99 width: 100%;
100 - background: rgba(var(--bg-color-rgb), 0.6);
101 - background: linear-gradient(transparent 0%, var(--bg-color) 85%);
100 + background: rgba(var(--bg-default-color-rgb), 0.6);
101 + background: linear-gradient(transparent 0%, var(--bg-default-color) 85%);
102 display: flex;
103 align-items: center;
104 text-align: center;
frontend/src/components/artifacts/ArtifactsCollect.vue
+1 -1
@@ -4,7 +4,7 @@
4 <div v-if="isDirty" class="info flex gap-5">
5 <n-popover overlap placement="bottom-start">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
frontend/src/components/artifacts/ArtifactsList.vue
+2 -2
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-2">
5 <n-popover overlap placement="bottom-start">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
@@ -31,7 +31,7 @@
31 />
32 <n-popover :show="showFilters" trigger="manual" overlap placement="right" class="!px-0">
33 <template #trigger>
34 - <div class="bg-default rounded-default">
34 + <div class="bg-default rounded-lg">
35 <n-badge
36 :show="!!lastFilters.hostname || !!lastFilters.os"
37 dot
frontend/src/components/auth/AuthForm.vue
+6 -6
@@ -2,7 +2,7 @@
2 <div class="w-full min-w-64 max-w-96">
3 <div>
4 <Logo mini :dark="isDark" class="mb-4" max-height="40px" />
5 - <div class="font-display mb-4 text-4xl font-bold">
5 + <div class="font-display mb-4 text-4xl font-bold" data-test="login-title">
6 {{ title }}
7 </div>
8 <div class="text-secondary text-lg">
@@ -11,7 +11,7 @@
11 </div>
12
13 <transition name="form-fade" mode="out-in" appear class="my-10">
14 - <SignIn v-if="typeRef === 'signin'" key="signin" />
14 + <SignIn v-if="type === 'signin'" key="signin" />
15 </transition>
16 </div>
17 </template>
@@ -27,20 +27,20 @@ const props = defineProps<{
27 type?: FormType
28 }>()
29
30 -const typeRef = ref<FormType>("signin")
30 +const type = ref<FormType>("signin")
31 const themeStore = useThemeStore()
32 const isDark = computed<boolean>(() => themeStore.isThemeDark)
33 const title = computed<string>(() =>
34 - typeRef.value === "signin"
34 + type.value === "signin"
35 ? "SOCFortress CoPilot"
36 - : typeRef.value === "signup"
36 + : type.value === "signup"
37 ? "SOCFortress CoPilot"
38 : "Forgot Password"
39 )
40
41 onBeforeMount(() => {
42 if (props.type) {
43 - typeRef.value = props.type
43 + type.value = props.type
44 }
45 })
46 </script>
frontend/src/components/auth/ForgotPassword.vue
+27 -6
@@ -1,16 +1,18 @@
1 <template>
2 <n-form ref="formRef" :model="model" :rules="rules">
3 - <n-form-item path="email" label="Email">
3 + <n-form-item path="email" label="Email" first>
4 <n-input
5 v-model:value="model.email"
6 - placeholder="Example@email.com"
6 + placeholder="Input your email"
7 size="large"
8 @keydown.enter="forgotPassword"
9 />
10 </n-form-item>
11 <div class="flex flex-col items-end gap-6">
12 <div class="w-full">
13 - <n-button type="primary" class="!w-full" size="large" @click="forgotPassword">Send Reset Link</n-button>
13 + <n-button type="primary" class="!w-full" size="large" :disabled="!isValid" @click="forgotPassword">
14 + Send Reset Link
15 + </n-button>
16 </div>
17 </div>
18 </n-form>
@@ -19,6 +21,7 @@
21 <script lang="ts" setup>
22 import {
23 type FormInst,
24 + type FormItemRule,
25 type FormRules,
26 type FormValidationError,
27 NButton,
@@ -27,7 +30,8 @@ import {
30 NInput,
31 useMessage
32 } from "naive-ui"
30 -import { ref } from "vue"
33 +import isEmail from "validator/es/lib/isEmail"
34 +import { computed, ref, watch } from "vue"
35
36 interface ModelType {
37 email: string | null
@@ -36,7 +40,7 @@ interface ModelType {
40 const formRef = ref<FormInst | null>(null)
41 const message = useMessage()
42 const model = ref<ModelType>({
39 - email: ""
43 + email: null
44 })
45
46 const rules: FormRules = {
@@ -44,11 +48,22 @@ const rules: FormRules = {
48 {
49 required: true,
50 trigger: ["blur"],
47 - message: "Email is required"
51 + message: "The email is mandatory"
52 + },
53 + {
54 + validator: (rule: FormItemRule, value: string): boolean => {
55 + return isEmail(value)
56 + },
57 + message: "The email is not formatted correctly",
58 + trigger: ["blur"]
59 }
60 ]
61 }
62
63 +const isValid = computed(() => {
64 + return isEmail(model.value.email || "")
65 +})
66 +
67 function forgotPassword(e: Event) {
68 e.preventDefault()
69 formRef.value?.validate((errors: Array<FormValidationError> | undefined) => {
@@ -57,4 +72,10 @@ function forgotPassword(e: Event) {
72 }
73 })
74 }
75 +
76 +watch(isValid, val => {
77 + if (val) {
78 + formRef.value?.validate()
79 + }
80 +})
81 </script>
frontend/src/components/auth/SignIn.vue
+2 -2
@@ -3,7 +3,7 @@
3 <n-form-item path="username" label="Username">
4 <n-input
5 v-model:value="model.username"
6 - placeholder="Username..."
6 + placeholder="Insert your Username"
7 size="large"
8 autocomplete="on"
9 @keydown.enter="signIn"
@@ -14,7 +14,7 @@
14 v-model:value="model.password"
15 type="password"
16 show-password-on="click"
17 - placeholder="Password..."
17 + placeholder="Insert your password"
18 autocomplete="on"
19 size="large"
20 @keydown.enter="signIn"
frontend/src/components/cloudSecurityAssessment/AvailableReportsList.vue
+1 -1
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-5">
5 <n-popover overlap placement="bottom-start">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
frontend/src/components/common/Badge.vue
+14 -14
@@ -32,7 +32,7 @@ const { type, hintCursor, pointCursor, color, href, fluid } = defineProps<{
32 <style lang="scss" scoped>
33 .badge {
34 border-radius: var(--border-radius);
35 - border: var(--border-small-100);
35 + border: 1px solid var(--border-color);
36 display: flex;
37 align-items: center;
38 font-size: 14px;
@@ -51,7 +51,7 @@ const { type, hintCursor, pointCursor, color, href, fluid } = defineProps<{
51
52 &.active {
53 color: var(--success-color);
54 - background-color: var(--success-005-color);
54 + background-color: rgba(var(--success-color-rgb) / 0.05);
55 border-color: var(--success-color);
56 }
57
@@ -65,7 +65,7 @@ const { type, hintCursor, pointCursor, color, href, fluid } = defineProps<{
65 }
66
67 span:not(:last-child) {
68 - border-right: var(--border-small-100);
68 + border-right: 1px solid var(--border-color);
69 padding-right: 8px;
70 }
71
@@ -80,7 +80,7 @@ const { type, hintCursor, pointCursor, color, href, fluid } = defineProps<{
80 line-height: 24px;
81
82 &:first-child {
83 - background-color: var(--divider-005-color);
83 + background-color: rgba(var(--border-color-rgb) / 0.05);
84 white-space: nowrap;
85 }
86 &:last-child {
@@ -92,48 +92,48 @@ const { type, hintCursor, pointCursor, color, href, fluid } = defineProps<{
92 &.danger {
93 & > span {
94 &:first-child {
95 - background-color: var(--secondary4-opacity-010-color);
95 + background-color: rgba(var(--error-color-rgb) / 0.1);
96 }
97 }
98 }
99 &.warning {
100 & > span {
101 &:first-child {
102 - background-color: var(--secondary3-opacity-010-color);
102 + background-color: rgba(var(--warning-color-rgb) / 0.1);
103 }
104 }
105 }
106 &.success {
107 & > span {
108 &:first-child {
109 - background-color: var(--success-005-color);
109 + background-color: rgba(var(--success-color-rgb) / 0.1);
110 }
111 }
112 }
113 &.primary {
114 & > span {
115 &:first-child {
116 - background-color: var(--primary-005-color);
116 + background-color: rgba(var(--primary-color-rgb) / 0.1);
117 }
118 }
119 }
120
121 &.bright {
122 &.danger {
123 - border-color: var(--secondary4-opacity-030-color);
123 + border-color: rgba(var(--error-color-rgb) / 0.3);
124
125 & > span {
126 &:first-child {
127 - background-color: var(--secondary4-opacity-020-color);
127 + background-color: rgba(var(--error-color-rgb) / 0.2);
128 }
129 }
130 }
131 &.warning {
132 - border-color: var(--secondary3-opacity-030-color);
132 + border-color: rgba(var(--warning-color-rgb) / 0.3);
133
134 & > span {
135 &:first-child {
136 - background-color: var(--secondary3-opacity-020-color);
136 + background-color: rgba(var(--warning-color-rgb) / 0.2);
137 }
138 }
139 }
@@ -147,11 +147,11 @@ const { type, hintCursor, pointCursor, color, href, fluid } = defineProps<{
147 }
148 }
149 &.primary {
150 - border-color: var(--primary-030-color);
150 + border-color: rgba(var(--primary-color-rgb) / 0.3);
151
152 & > span {
153 &:first-child {
154 - background-color: var(--primary-020-color);
154 + background-color: rgba(var(--primary-color-rgb) / 0.2);
155 }
156 }
157 }
frontend/src/components/common/LayoutSettings.vue deleted
-464
@@ -1,464 +0,0 @@
1 -<template>
2 - <div class="layout-settings flex items-center justify-center shadow-xl" :class="{ open }">
3 - <Transition mode="out-in" name="anim">
4 - <div v-if="!open" key="btn" class="open-btn flex items-center justify-center" @click="open = true">
5 - <Icon :size="24" :name="SettingsIcon" />
6 - </div>
7 -
8 - <div v-else key="form" class="ls-form flex flex-col">
9 - <div class="ls-header flex items-center justify-between">
10 - <div class="ls-title">Layout settings</div>
11 - <div class="ls-icon flex items-center">
12 - <Icon :size="20" :name="CloseIcon" @click="open = false" />
13 - </div>
14 - </div>
15 - <n-scrollbar class="ls-main">
16 - <div class="ls-section ls-color-selection">
17 - <div class="ls-label">Primary color</div>
18 - <div class="color-picker-box">
19 - <n-color-picker
20 - v-if="theme === ThemeNameEnum.Dark"
21 - v-model:value="darkColor"
22 - :modes="['hex']"
23 - :show-alpha="false"
24 - />
25 - <n-color-picker v-else v-model:value="lightColor" :modes="['hex']" :show-alpha="false" />
26 - </div>
27 - <div class="palette mt-3 flex justify-around">
28 - <n-button v-for="color of palette" :key="color.light" text @click="setPrimary(color)">
29 - <template #icon>
30 - <Icon
31 - :color="theme === ThemeNameEnum.Dark ? color.dark : color.light"
32 - :size="24"
33 - :name="ColorIcon"
34 - />
35 - </template>
36 - </n-button>
37 - </div>
38 - </div>
39 -
40 - <div class="ls-section ls-theme-selection">
41 - <div class="ls-label">Theme</div>
42 - <div class="flex items-center gap-2">
43 - <div class="basis-1/2">
44 - <n-button
45 - class="!w-full"
46 - :type="theme === ThemeNameEnum.Light ? 'primary' : 'default'"
47 - @click="theme = ThemeNameEnum.Light"
48 - >
49 - <template #icon>
50 - <Icon v-if="theme === ThemeNameEnum.Light" :name="LightIcon" />
51 - <Icon v-else :name="LightOutlineIcon" />
52 - </template>
53 - Light
54 - </n-button>
55 - </div>
56 - <div class="basis-1/2">
57 - <n-button
58 - class="!w-full"
59 - :type="theme === ThemeNameEnum.Dark ? 'primary' : 'default'"
60 - @click="theme = ThemeNameEnum.Dark"
61 - >
62 - <template #icon>
63 - <Icon v-if="theme === ThemeNameEnum.Dark" :name="DarkIcon" />
64 - <Icon v-else :name="DarkOutlineIcon" />
65 - </template>
66 - Dark
67 - </n-button>
68 - </div>
69 - </div>
70 - </div>
71 -
72 - <div class="ls-section ls-nav-selection">
73 - <div class="ls-label">
74 - Navbar
75 - <span v-if="isMobileView" class="px-1 opacity-50">desktop only</span>
76 - </div>
77 - <div class="flex items-center gap-2">
78 - <div class="basis-1/2">
79 - <!--
80 - <n-button
81 - class="!w-full"
82 - :type="layout === Layout.VerticalNav ? 'primary' : 'default'"
83 - :disabled="isMobileView"
84 - @click="layout = Layout.VerticalNav"
85 - >
86 - Vertical
87 - </n-button>
88 - -->
89 - </div>
90 - <div class="basis-1/2">
91 - <n-button
92 - class="!w-full"
93 - :type="layout === Layout.HorizontalNav ? 'primary' : 'default'"
94 - :disabled="isMobileView"
95 - @click="layout = Layout.HorizontalNav"
96 - >
97 - Horizontal
98 - </n-button>
99 - </div>
100 - </div>
101 - </div>
102 - <div class="ls-section ls-boxed-selection">
103 - <div class="flex flex-col gap-3">
104 - <div class="flex items-center justify-between">
105 - <div class="switch-label">
106 - View boxed
107 - <span v-if="isMobileView" class="px-1 opacity-50">desktop only</span>
108 - </div>
109 - <n-switch v-model:value="boxed" :disabled="isMobileView" size="small" />
110 - </div>
111 - <div class="flex items-center justify-between">
112 - <div class="switch-label">
113 - Toolbar boxed
114 - <span v-if="isMobileView" class="px-1 opacity-50">desktop only</span>
115 - </div>
116 - <n-switch
117 - v-model:value="toolbarBoxed"
118 - :disabled="!boxed || isMobileView"
119 - size="small"
120 - />
121 - </div>
122 - <div class="flex items-center justify-between">
123 - <div class="switch-label">Footer visible</div>
124 - <n-switch v-model:value="footerShown" size="small" />
125 - </div>
126 - <div class="flex items-center justify-between">
127 - <div class="switch-label">
128 - RTL
129 - <span class="px-1 opacity-50">beta</span>
130 - </div>
131 - <n-switch v-model:value="rtl" size="small" />
132 - </div>
133 - </div>
134 - </div>
135 -
136 - <div class="ls-section ls-transition-selection">
137 - <div class="ls-label">Router transition</div>
138 - <div class="ls-input flex justify-between">
139 - <n-select v-model:value="routerTransition" :options="transitionOptions" />
140 - </div>
141 - </div>
142 - <div class="ls-section ls-reset-selection items-center">
143 - <n-button class="!mb-3 !w-full" strong secondary type="primary" @click="reset()">
144 - Restore default
145 - </n-button>
146 - <a
147 - href="https://pinx-docs.vercel.app/layout"
148 - target="_blank"
149 - alt="docs"
150 - rel="nofollow noopener noreferrer"
151 - >
152 - Other settings
153 - </a>
154 - </div>
155 - </n-scrollbar>
156 - </div>
157 - </Transition>
158 - </div>
159 -</template>
160 -
161 -<script setup lang="ts">
162 -import Icon from "@/components/common/Icon.vue"
163 -import { useThemeStore } from "@/stores/theme"
164 -import { Layout, RouterTransition, ThemeNameEnum } from "@/types/theme.d"
165 -import { useWindowSize } from "@vueuse/core"
166 -import { NButton, NColorPicker, NScrollbar, NSelect, NSwitch, useOsTheme } from "naive-ui"
167 -import { computed, ref } from "vue"
168 -
169 -interface ColorPalette {
170 - light: string
171 - dark: string
172 -}
173 -
174 -type Palette = ColorPalette[]
175 -
176 -const SettingsIcon = "carbon:settings-adjust"
177 -const CloseIcon = "carbon:close"
178 -const LightIcon = "ion:sunny"
179 -const DarkIcon = "ion:moon"
180 -const LightOutlineIcon = "ion:sunny-outline"
181 -const DarkOutlineIcon = "ion:moon-outline"
182 -const ColorIcon = "carbon:circle-solid"
183 -
184 -const themeStore = useThemeStore()
185 -const { width: winWidth } = useWindowSize()
186 -const isMobileView = computed<boolean>(() => winWidth.value < 700)
187 -const open = ref(false)
188 -const transitionOptions = [
189 - {
190 - label: "Fade",
191 - value: "fade"
192 - },
193 - {
194 - label: "FadeUp",
195 - value: "fade-up"
196 - },
197 - {
198 - label: "FadeBottom",
199 - value: "fade-bottom"
200 - },
201 - {
202 - label: "FadeLeft",
203 - value: "fade-left"
204 - },
205 - {
206 - label: "FadeRight",
207 - value: "fade-right"
208 - }
209 -]
210 -
211 -const layout = computed({
212 - get: () => themeStore.layout,
213 - set: val => themeStore.setLayout(val)
214 -})
215 -
216 -const routerTransition = computed({
217 - get: () => themeStore.routerTransition,
218 - set: val => themeStore.setRouterTransition(val)
219 -})
220 -
221 -const theme = computed({
222 - get: () => themeStore.themeName,
223 - set: val => themeStore.setTheme(val)
224 -})
225 -
226 -const darkColor = computed({
227 - get: () => themeStore.darkPrimaryColor,
228 - set: val => themeStore.setColor(ThemeNameEnum.Dark, "primary", val)
229 -})
230 -
231 -const lightColor = computed({
232 - get: () => themeStore.lightPrimaryColor,
233 - set: val => themeStore.setColor(ThemeNameEnum.Light, "primary", val)
234 -})
235 -
236 -const rtl = computed({
237 - get: () => themeStore.isRTL,
238 - set: val => themeStore.setRTL(val)
239 -})
240 -
241 -const boxed = computed({
242 - get: () => themeStore.isBoxed,
243 - set: val => themeStore.setBoxed(val)
244 -})
245 -
246 -const toolbarBoxed = computed({
247 - get: () => themeStore.isToolbarBoxed,
248 - set: val => themeStore.setToolbarBoxed(val)
249 -})
250 -
251 -const footerShown = computed({
252 - get: () => themeStore.isFooterShown,
253 - set: val => themeStore.setFooterShow(val)
254 -})
255 -
256 -const palette = ref<Palette>([
257 - { light: "#00B27B", dark: "#00E19B" },
258 - { light: "#6267FF", dark: "#6267FF" },
259 - { light: "#FF61C9", dark: "#FF61C9" },
260 - { light: "#FFB600", dark: "#FFB600" },
261 - { light: "#FF0156", dark: "#FF0156" }
262 -])
263 -
264 -function setPrimary(color: ColorPalette) {
265 - themeStore.setColor(ThemeNameEnum.Dark, "primary", color.dark)
266 - themeStore.setColor(ThemeNameEnum.Light, "primary", color.light)
267 -}
268 -
269 -function reset() {
270 - themeStore.setColor(ThemeNameEnum.Dark, "primary", "#00E19B")
271 - themeStore.setColor(ThemeNameEnum.Light, "primary", "#00B27B")
272 - themeStore.setTheme(useOsTheme().value === "dark" ? ThemeNameEnum.Dark : ThemeNameEnum.Light)
273 - themeStore.setLayout(Layout.HorizontalNav)
274 - themeStore.setRouterTransition(RouterTransition.FadeUp)
275 - themeStore.setRTL(false)
276 - themeStore.setBoxed(true)
277 - themeStore.setToolbarBoxed(true)
278 - themeStore.setFooterShow(true)
279 -}
280 -</script>
281 -
282 -<style scoped lang="scss">
283 -.layout-settings {
284 - position: fixed;
285 - right: 10px;
286 - top: 50%;
287 - width: 50px;
288 - height: 50px;
289 - border-radius: 50px;
290 - background-color: var(--primary-color);
291 - color: var(--bg-color);
292 - transform: translateY(-50%);
293 - transition: all 0.3s;
294 - overflow: hidden;
295 - border: 1px solid transparent;
296 -
297 - .open-btn {
298 - cursor: pointer;
299 - width: 100%;
300 - height: 100%;
301 - position: absolute;
302 - will-change: opacity;
303 - }
304 - .ls-form {
305 - position: absolute;
306 - height: 100%;
307 - width: 100%;
308 - will-change: opacity;
309 -
310 - .ls-header {
311 - border-bottom: var(--border-small-050);
312 - font-size: 14px;
313 - text-transform: uppercase;
314 - font-weight: 700;
315 - padding: 10px 14px;
316 - line-height: 1;
317 - transition: all 0.3s;
318 -
319 - .ls-icon {
320 - cursor: pointer;
321 - opacity: 0.6;
322 -
323 - &:hover {
324 - opacity: 1;
325 - color: var(--primary-color);
326 - }
327 - }
328 - }
329 -
330 - .ls-main {
331 - .ls-section {
332 - padding: 14px;
333 - font-size: 12px;
334 - display: flex;
335 - flex-direction: column;
336 -
337 - &:not(:last-child) {
338 - border-bottom: var(--border-small-050);
339 - }
340 -
341 - .ls-label {
342 - font-size: 12px;
343 - margin-bottom: 8px;
344 - font-weight: 600;
345 - color: var(--fg-secondary-color);
346 - }
347 -
348 - &.ls-color-selection {
349 - .color-picker-box {
350 - line-height: 0;
351 - .n-color-picker {
352 - height: 28px;
353 - :deep() {
354 - .n-color-picker-trigger {
355 - .n-color-picker-trigger__fill {
356 - left: 5px;
357 - right: 5px;
358 - top: 5px;
359 - bottom: 5px;
360 - justify-content: flex-start;
361 - line-height: 0;
362 -
363 - .n-color-picker-checkboard {
364 - background: transparent;
365 - &::after {
366 - background-image: none;
367 - }
368 -
369 - & ~ div {
370 - width: 32px;
371 - border-radius: var(--border-radius-small);
372 - height: 100%;
373 - }
374 - }
375 - .n-color-picker-trigger__value {
376 - color: var(--fg-color) !important;
377 - margin-left: 44px;
378 - font-size: 12px;
379 - font-weight: 600;
380 - width: initial !important;
381 - height: initial !important;
382 - }
383 - }
384 - }
385 - }
386 - }
387 - }
388 - }
389 -
390 - &.ls-boxed-selection {
391 - .switch-label {
392 - font-size: 12px;
393 - font-weight: 600;
394 - color: var(--fg-secondary-color);
395 - }
396 - }
397 -
398 - &.ls-reset-selection {
399 - a {
400 - color: var(--fg-secondary-color);
401 - text-decoration-color: var(--fg-secondary-color);
402 - }
403 - }
404 - }
405 - }
406 - }
407 -
408 - &.open {
409 - width: 230px;
410 - height: 645px;
411 - right: 16px;
412 - border-radius: var(--border-radius);
413 - max-height: 90vh;
414 - max-height: 90svh;
415 - background-color: var(--bg-color);
416 - color: var(--fg-color);
417 - border-color: var(--border-color);
418 - }
419 -
420 - .anim-enter-active,
421 - .anim-leave-active {
422 - transition:
423 - opacity 0.1s var(--bezier-ease),
424 - transform 0.2s var(--bezier-ease);
425 - }
426 -
427 - .anim-enter-from,
428 - .anim-leave-to {
429 - opacity: 0;
430 - // transform: translateY(1%);
431 - }
432 -}
433 -
434 -.direction-rtl {
435 - .layout-settings {
436 - right: unset;
437 - left: 10px;
438 -
439 - .ls-form {
440 - .ls-header {
441 - direction: rtl;
442 - }
443 -
444 - :deep() {
445 - .n-color-picker {
446 - .n-color-picker-trigger {
447 - .n-color-picker-trigger__fill {
448 - .n-color-picker-trigger__value {
449 - margin-left: unset !important;
450 - margin-right: 44px;
451 - }
452 - }
453 - }
454 - }
455 - }
456 - }
457 -
458 - &.open {
459 - right: unset;
460 - left: 16px;
461 - }
462 - }
463 -}
464 -</style>
frontend/src/components/common/ListPercentage.vue
+4 -4
@@ -23,9 +23,9 @@
23 type="line"
24 :percentage="parseInt(item[percentageKey as keyof typeof item], 10)"
25 indicator-placement="inside"
26 - :indicator-text-color="style['bg-color']"
27 - :color="style['fg-color']"
28 - :rail-color="style['divider-020-color']"
26 + :indicator-text-color="style['bg-default-color']"
27 + :color="style['fg-default-color']"
28 + :rail-color="style['border-color']"
29 class="font-mono font-bold"
30 />
31 </div>
@@ -53,7 +53,7 @@ const style = computed(() => themeStore.style)
53 <style scoped lang="scss">
54 .list-header {
55 & > * {
56 - border-bottom: var(--border-small-100);
56 + border-bottom: 1px solid var(--border-color);
57 @apply pb-1;
58 }
59 }
frontend/src/components/common/Notifications/List.vue
+8 -7
@@ -8,7 +8,7 @@
8 @click="item.action ? preformAction(item.id, item.action) : () => {}"
9 >
10 <div class="icon-box">
11 - <Icon v-if="item.category === 'alert'" :name="AlertIcon" :size="21"></Icon>
11 + <Icon v-if="item.category === 'alert'" :name="AlertIcon" :size="21" />
12 <n-tooltip v-if="!item.read" trigger="hover" class="!p-0" content-class="!p-0" placement="right">
13 <template #trigger>
14 <div class="read-badge" @click.stop="setRead(item.id)" />
@@ -87,6 +87,7 @@ function formatDatetime(date: Date | string) {
87 position: relative;
88 padding: 14px 12px;
89 gap: 4px;
90 + transition: background-color 0.2s linear;
91
92 .icon-box {
93 width: 45px;
@@ -149,7 +150,7 @@ function formatDatetime(date: Date | string) {
150 &.success {
151 .icon-box {
152 .n-icon {
152 - background-color: var(--success-005-color);
153 + background-color: rgba(var(--success-color-rgb) / 0.1);
154 color: var(--success-color);
155 }
156 }
@@ -160,7 +161,7 @@ function formatDatetime(date: Date | string) {
161 &.info {
162 .icon-box {
163 .n-icon {
163 - background-color: var(--secondary1-opacity-010-color);
164 + background-color: rgba(var(--info-color-rgb) / 0.1);
165 color: var(--info-color);
166 }
167 }
@@ -171,7 +172,7 @@ function formatDatetime(date: Date | string) {
172 &.warning {
173 .icon-box {
174 .n-icon {
174 - background-color: var(--secondary3-opacity-010-color);
175 + background-color: rgba(var(--warning-color-rgb) / 0.1);
176 color: var(--warning-color);
177 }
178 }
@@ -182,7 +183,7 @@ function formatDatetime(date: Date | string) {
183 &.error {
184 .icon-box {
185 .n-icon {
185 - background-color: var(--secondary4-opacity-010-color);
186 + background-color: rgba(var(--error-color-rgb) / 0.1);
187 color: var(--error-color);
188 }
189 }
@@ -196,11 +197,11 @@ function formatDatetime(date: Date | string) {
197 }
198
199 &:not(:last-child) {
199 - border-bottom: var(--border-small-050);
200 + border-bottom: 1px solid var(--border-color);
201 }
202
203 &:hover {
203 - background-color: var(--hover-005-color);
204 + background-color: var(--hover-color);
205
206 .delete-btn {
207 opacity: 0.5;
frontend/src/components/common/SearchDialog.vue
+4 -3
@@ -117,6 +117,7 @@ const commandIcon = ref("⌘")
117 const scrollContent = ref<(ScrollbarInst & { $el: HTMLElement }) | null>(null)
118 const { gotoCustomer, gotoSocAlerts, gotoAlerts, gotoConnectors } = useGoto()
119
120 +// TODO: review the groups and items
121 const groups = ref<Groups>([
122 {
123 name: "Applications",
@@ -348,7 +349,7 @@ onMounted(() => {
349 width: 28px;
350 height: 28px;
351 border-radius: 50%;
351 - background-color: var(--primary-005-color);
352 + background-color: rgba(var(--primary-color-rgb) / 0.15);
353 display: flex;
354 justify-content: center;
355 align-items: center;
@@ -362,7 +363,7 @@ onMounted(() => {
363 }
364
365 &.active {
365 - background-color: var(--hover-005-color);
366 + background-color: var(--hover-color);
367 }
368 &:hover {
369 box-shadow: 0px 0px 0px 1px var(--primary-color) inset;
@@ -378,7 +379,7 @@ onMounted(() => {
379 padding: 10px 0;
380
381 .icon {
381 - background-color: var(--code-color);
382 + background-color: rgba(255, 255, 255, 0.3);
383 width: 18px;
384 height: 18px;
385 padding-top: 1px;
frontend/src/components/common/SegmentedPage.vue
+17 -10
@@ -186,7 +186,7 @@ onMounted(() => {
186 overflow: hidden;
187 border-radius: var(--border-radius);
188 border: 1px solid var(--border-color);
189 - background-color: var(--bg-color);
189 + background-color: var(--bg-default-color);
190 direction: ltr;
191
192 .split-trigger {
@@ -213,10 +213,10 @@ onMounted(() => {
213 }
214
215 &:hover {
216 - background-color: var(--primary-010-color);
216 + background-color: rgba(var(--primary-color-rgb) / 0.1);
217
218 .split-trigger-icon {
219 - background-color: var(--primary-010-color);
219 + background-color: rgba(var(--primary-color-rgb) / 0.1);
220 }
221 }
222 }
@@ -228,7 +228,7 @@ onMounted(() => {
228 border-right: 1px solid var(--border-color);
229
230 .sidebar-header {
231 - border-block-end: var(--border-small-050);
231 + border-block-end: 1px solid var(--border-color);
232 min-height: var(--mb-toolbar-height);
233 height: var(--mb-toolbar-height);
234 padding: 0 30px;
@@ -243,14 +243,14 @@ onMounted(() => {
243 }
244
245 .sidebar-footer {
246 - border-block-start: var(--border-small-050);
246 + border-block-start: 1px solid var(--border-color);
247 min-height: var(--mb-toolbar-height);
248 padding: 0 30px;
249 }
250 }
251
252 .main {
253 - background-color: var(--bg-color);
253 + background-color: var(--bg-default-color);
254 position: relative;
255 height: 100%;
256
@@ -264,7 +264,7 @@ onMounted(() => {
264 }
265
266 .main-toolbar {
267 - border-block-end: var(--border-small-050);
267 + border-block-end: 1px solid var(--border-color);
268 min-height: var(--mb-toolbar-height);
269 height: var(--mb-toolbar-height);
270 padding: 0 30px;
@@ -290,7 +290,7 @@ onMounted(() => {
290
291 .main-footer {
292 container-type: inline-size;
293 - border-block-start: var(--border-small-050);
293 + border-block-start: 1px solid var(--border-color);
294 padding: 0 30px;
295
296 .wrap {
@@ -302,6 +302,13 @@ onMounted(() => {
302 }
303 }
304
305 + &.sidebar-position-right {
306 + .sidebar {
307 + border-right: none;
308 + border-left: 1px solid var(--border-color);
309 + }
310 + }
311 +
312 @media (max-width: 700px) {
313 --mb-toolbar-height: 62px;
314 height: 100%;
@@ -313,7 +320,7 @@ onMounted(() => {
320 content: "";
321 width: 100vw;
322 display: block;
316 - background-color: var(--bg-body);
323 + background-color: var(--bg-body-color);
324 position: absolute;
325 top: 0;
326 left: 0;
@@ -342,7 +349,7 @@ onMounted(() => {
349 width: 100%;
350 height: 100%;
351 display: block;
345 - background-color: var(--bg-color);
352 + background-color: var(--bg-default-color);
353 z-index: -1;
354 position: absolute;
355 }
frontend/src/components/common/TestScope.vue
+1 -4
@@ -4,8 +4,5 @@
4
5 <script setup lang="ts">
6 // THIS COMPONENT IS USED FOR VITEST TESTING PURPOSES
7 -import { toRefs } from "vue"
8 -
9 -const props = defineProps<{ msg: string }>()
10 -const { msg } = toRefs(props)
7 +const { msg } = defineProps<{ msg: string }>()
8 </script>
frontend/src/components/common/cards/CardEntity.vue
+13 -13
@@ -95,11 +95,11 @@ const { size, status, embedded, highlighted, clickable, hoverable, disabled, loa
95 }
96
97 .extra-box {
98 - border-top: var(--border-small-050);
98 + border-top: 1px solid var(--border-color);
99 }
100
101 .footer-box {
102 - border-top: var(--border-small-050);
102 + border-top: 1px solid var(--border-color);
103 font-size: 13px;
104 background-color: var(--bg-secondary-color);
105 }
@@ -155,39 +155,39 @@ const { size, status, embedded, highlighted, clickable, hoverable, disabled, loa
155
156 &.embedded {
157 background-color: var(--bg-secondary-color);
158 - border: var(--border-small-100);
158 + border: 1px solid var(--border-color);
159
160 .footer-box {
161 - background-color: var(--bg-body);
161 + background-color: var(--bg-body-color);
162 }
163 }
164
165 &.card-status-success {
166 - background-color: var(--success-005-color);
167 - border-color: var(--success-030-color);
166 + background-color: rgba(var(--success-color-rgb) / 0.05);
167 + border-color: rgba(var(--success-color-rgb) / 0.3);
168 }
169
170 &.card-status-warning {
171 - background-color: var(--warning-005-color);
172 - border-color: var(--warning-030-color);
171 + background-color: rgba(var(--warning-color-rgb) / 0.05);
172 + border-color: rgba(var(--warning-color-rgb) / 0.3);
173 }
174
175 &.card-status-error {
176 - background-color: var(--error-005-color);
177 - border-color: var(--error-030-color);
176 + background-color: rgba(var(--error-color-rgb) / 0.05);
177 + border-color: rgba(var(--error-color-rgb) / 0.3);
178 }
179
180 &.hoverable {
181 &:not(.disabled) {
182 &:hover {
183 - border-color: var(--primary-040-color);
183 + border-color: rgba(var(--primary-color-rgb) / 0.4);
184 }
185 }
186 }
187
188 &.highlighted {
189 - background-color: var(--primary-005-color);
190 - border-color: var(--primary-030-color);
189 + background-color: rgba(var(--primary-color-rgb) / 0.05);
190 + border-color: rgba(var(--primary-color-rgb) / 0.3);
191
192 &:not(.disabled) {
193 &:hover {
frontend/src/components/common/cards/CardKV.vue
+12 -12
@@ -19,7 +19,7 @@ const { color, size, valueClass } = defineProps<{
19
20 <style lang="scss" scoped>
21 .kv-card {
22 - border: var(--border-small-100);
22 + border: 1px solid var(--border-color);
23 background-color: var(--bg-secondary-color);
24 border-radius: var(--border-radius);
25 overflow: hidden;
@@ -27,14 +27,14 @@ const { color, size, valueClass } = defineProps<{
27 flex-direction: column;
28
29 .key {
30 - border-bottom: var(--border-small-050);
30 + border-bottom: 1px solid var(--border-color);
31 padding: 8px 12px;
32 font-size: 12px;
33 }
34 .value {
35 font-size: 14px;
36 padding: 8px 12px;
37 - background-color: var(--bg-color);
37 + background-color: var(--bg-default-color);
38 font-family: var(--font-family-mono);
39 height: 100%;
40 flex-grow: 1;
@@ -56,20 +56,20 @@ const { color, size, valueClass } = defineProps<{
56
57 &.kv-color- {
58 &danger {
59 - border-color: var(--secondary4-opacity-030-color);
60 - background-color: var(--secondary4-opacity-020-color);
59 + border-color: rgba(var(--error-color-rgb) / 0.3);
60 + background-color: rgba(var(--error-color-rgb) / 0.2);
61
62 .key {
63 - border-color: var(--secondary4-opacity-030-color);
63 + border-color: rgba(var(--error-color-rgb) / 0.3);
64 }
65 }
66
67 &warning {
68 - border-color: var(--secondary3-opacity-030-color);
69 - background-color: var(--secondary3-opacity-020-color);
68 + border-color: rgba(var(--warning-color-rgb) / 0.3);
69 + background-color: rgba(var(--warning-color-rgb) / 0.2);
70
71 .key {
72 - border-color: var(--secondary3-opacity-030-color);
72 + border-color: rgba(var(--warning-color-rgb) / 0.3);
73 }
74 }
75
@@ -83,11 +83,11 @@ const { color, size, valueClass } = defineProps<{
83 }
84
85 &primary {
86 - border-color: var(--primary-030-color);
87 - background-color: var(--primary-020-color);
86 + border-color: rgba(var(--primary-color-rgb) / 0.3);
87 + background-color: rgba(var(--primary-color-rgb) / 0.2);
88
89 .key {
90 - border-color: var(--primary-030-color);
90 + border-color: rgba(var(--primary-color-rgb) / 0.3);
91 }
92 }
93 }
frontend/src/components/common/cards/CardStatsBars.vue
+4 -4
@@ -109,7 +109,7 @@ const barValues = computed<ItemPropsExt[]>(() => sanitizedValues.value.filter(o
109 overflow: hidden;
110
111 .card-header {
112 - border-bottom: var(--border-small-050);
112 + border-bottom: 1px solid var(--border-color);
113 overflow: hidden;
114 padding: 10px 16px;
115
@@ -139,7 +139,7 @@ const barValues = computed<ItemPropsExt[]>(() => sanitizedValues.value.filter(o
139
140 .fill {
141 border-radius: var(--border-radius-small);
142 - background-color: var(--fg-color);
142 + background-color: var(--fg-default-color);
143 height: 100%;
144 width: 100%;
145 }
@@ -185,12 +185,12 @@ const barValues = computed<ItemPropsExt[]>(() => sanitizedValues.value.filter(o
185 width: 10px;
186 min-width: 10px;
187 border-radius: var(--border-radius-small);
188 - background-color: var(--fg-color);
188 + background-color: var(--fg-default-color);
189 }
190
191 .divider {
192 height: 1px;
193 - background-color: var(--hover-010-color);
193 + background-color: rgba(var(--border-color-rgb) / 0.1);
194 }
195
196 &.success {
frontend/src/components/common/cards/CardStatsMulti.vue
+3 -3
@@ -55,7 +55,7 @@ const ArrowRightIcon = "carbon:arrow-right"
55 overflow: hidden;
56
57 .card-header {
58 - border-bottom: var(--border-small-050);
58 + border-bottom: 1px solid var(--border-color);
59 overflow: hidden;
60 padding: 10px 16px;
61
@@ -73,7 +73,7 @@ const ArrowRightIcon = "carbon:arrow-right"
73 overflow: hidden;
74
75 &:not(:last-child) {
76 - border-right: var(--border-small-050);
76 + border-right: 1px solid var(--border-color);
77 }
78
79 .value {
@@ -92,7 +92,7 @@ const ArrowRightIcon = "carbon:arrow-right"
92
93 .label {
94 font-family: var(--font-family-mono);
95 - border-top: var(--border-small-050);
95 + border-top: 1px solid var(--border-color);
96 color: var(--fg-secondary-color);
97 font-size: 13px;
98 padding: 6px;
frontend/src/components/connectors/ConfigForm/ConfigForm.vue
+1 -1
@@ -308,7 +308,7 @@ onMounted(() => {
308 @apply mb-7 gap-5;
309
310 .connector-image {
311 - border: 2px solid var(--bg-body);
311 + border: 2px solid var(--bg-body-color);
312 }
313 }
314 }
frontend/src/components/customers/CustomerCreationButton.vue
+15
@@ -117,4 +117,19 @@ watch(
117 },
118 { immediate: true }
119 )
120 +
121 +watch(
122 + () => customersCount,
123 + () => {
124 + if (customersCount === undefined) {
125 + return
126 + }
127 + if (customersCount >= 5) {
128 + isMSSP5Enabled.value = true
129 + }
130 + if (customersCount >= 10) {
131 + isMSSP10Enabled.value = true
132 + }
133 + }
134 +)
135 </script>
frontend/src/components/graylog/Alerts/List.vue
+2 -2
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-5">
5 <n-popover overlap placement="bottom-start">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
@@ -36,7 +36,7 @@
36 <n-select v-if="!compactMode" v-model:value="timerange" size="small" :options="timeOptions" class="!w-32" />
37 <n-popover v-if="compactMode" overlap placement="right">
38 <template #trigger>
39 - <div class="bg-default rounded-default">
39 + <div class="bg-default rounded-lg">
40 <n-button size="small">
41 <template #icon>
42 <Icon :name="FilterIcon"></Icon>
frontend/src/components/graylog/Events/Item.vue
+2 -2
@@ -85,8 +85,8 @@ const showDetails = ref(false)
85
86 <style lang="scss" scoped>
87 .priority {
88 - background-color: var(--hover-005-color);
89 - border: var(--border-small-100);
88 + background-color: rgba(var(--hover-color-rgb) / 0.05);
89 + border: 1px solid var(--border-color);
90 width: 20px;
91 height: 20px;
92 border-radius: 99999px;
frontend/src/components/graylog/Events/List.vue
+1 -1
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-5">
5 <n-popover overlap placement="bottom-start">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
frontend/src/components/graylog/Inputs/List.vue
+1 -1
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-5">
5 <n-popover overlap placement="bottom-start">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
frontend/src/components/graylog/Messages/List.vue
+1 -1
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-5">
5 <n-popover overlap placement="bottom-start">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
frontend/src/components/graylog/Metrics/List.vue
+1 -1
@@ -99,7 +99,7 @@ function sanitizeMetrics(metrics: ThroughputMetric[]): Metrics[] {
99 }
100
101 &:not(:last-child) {
102 - border-bottom: var(--border-small-100);
102 + border-bottom: 1px solid var(--border-color);
103 }
104 }
105 }
frontend/src/components/graylog/Metrics/UncommittedEntries.vue
+5 -5
@@ -137,10 +137,10 @@ watch(isThemeDark, () => {
137 width: 100%;
138
139 .uncommitted-entries {
140 - background-color: var(--bg-color);
140 + background-color: var(--bg-default-color);
141 display: flex;
142 border-radius: var(--border-radius);
143 - border: var(--border-small-050);
143 + border: 1px solid var(--border-color);
144
145 .label {
146 padding: 18px 22px;
@@ -149,7 +149,7 @@ watch(isThemeDark, () => {
149 font-weight: 700;
150
151 i {
152 - color: var(--secondary3-color);
152 + color: var(--warning-color);
153 }
154 }
155 .value {
@@ -163,8 +163,8 @@ watch(isThemeDark, () => {
163 border-bottom-right-radius: var(--border-radius);
164
165 &.warning {
166 - color: var(--secondary3-color);
167 - background-color: var(--secondary3-opacity-005-color);
166 + color: var(--warning-color);
167 + background-color: rgba(var(--warning-color-rgb) / 0.05);
168 }
169 }
170 }
frontend/src/components/graylog/MonitoringAlerts/List.vue
+1 -1
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-2">
5 <n-popover overlap placement="bottom-start">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
frontend/src/components/graylog/Streams/List.vue
+2 -2
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-5">
5 <n-popover overlap placement="bottom-start">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
@@ -35,7 +35,7 @@
35 />
36 <n-popover overlap placement="right" class="!px-0">
37 <template #trigger>
38 - <div class="bg-default rounded-default">
38 + <div class="bg-default rounded-lg">
39 <n-button size="small">
40 <template #icon>
41 <Icon :name="FilterIcon"></Icon>
frontend/src/components/healthcheck/HealthcheckList.vue
+1 -1
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-2">
5 <n-popover overlap placement="bottom-start">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
frontend/src/components/incidentManagement/alerts/AlertComment.vue
+2 -2
@@ -201,8 +201,8 @@ onBeforeMount(() => {
201
202 .comment-message {
203 border-radius: var(--border-radius);
204 - background-color: var(--bg-color);
205 - border: var(--border-small-050);
204 + background-color: var(--bg-default-color);
205 + border: 1px solid var(--border-color);
206 padding: 6px 10px;
207 }
208 }
frontend/src/components/incidentManagement/alerts/AlertOverview.vue
+1 -1
@@ -222,6 +222,6 @@ function handleDelete() {
222
223 <style lang="scss" scoped>
224 .footer-box {
225 - border-top: var(--border-small-100);
225 + border-top: 1px solid var(--border-color);
226 }
227 </style>
frontend/src/components/incidentManagement/alerts/AlertsList.vue
+2 -2
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-2 lg:!hidden">
5 <n-popover overlap placement="left">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
@@ -128,7 +128,7 @@
128 <span>Selected</span>
129 <n-badge
130 :value="checkedAlerts.length"
131 - color="var(--divider-030-color)"
131 + color="rgba(var(--border-color-rgb) / 0.3)"
132 class="!font-mono"
133 />
134 </div>
frontend/src/components/incidentManagement/cases/CaseOverview.vue
+1 -1
@@ -204,6 +204,6 @@ function handleDelete() {
204
205 <style lang="scss" scoped>
206 .footer-box {
207 - border-top: var(--border-small-100);
207 + border-top: 1px solid var(--border-color);
208 }
209 </style>
frontend/src/components/incidentManagement/cases/CasesList.vue
+3 -3
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-2">
5 <n-popover overlap placement="left">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
@@ -38,7 +38,7 @@
38
39 <n-popover v-if="showMobileMenu" overlap placement="left" display-directive="show">
40 <template #trigger>
41 - <div class="bg-default rounded-default">
41 + <div class="bg-default rounded-lg">
42 <n-button size="small" class="!cursor-pointer">
43 <template #icon>
44 <Icon :name="MenuIcon"></Icon>
@@ -72,7 +72,7 @@
72 />
73 <n-popover v-if="!hideFilters" :show="showFilters" trigger="manual" overlap placement="right" class="!px-0">
74 <template #trigger>
75 - <div class="bg-default rounded-default">
75 + <div class="bg-default rounded-lg">
76 <n-badge :show="filtered" dot type="success" :offset="[-4, 0]">
77 <n-button size="small" @click="showFilters = true">
78 <template #icon>
frontend/src/components/incidentManagement/sources/ConfiguredSourcesList.vue
+1 -1
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-5">
5 <n-popover overlap placement="bottom-start">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
frontend/src/components/indices/Marquee.vue
+5 -5
@@ -6,10 +6,10 @@
6 v-if="list?.length"
7 class="marquee-wrap"
8 :duration="(list?.length || 0) * 1"
9 - :pause-on-hover="true"
9 + pause-on-hover
10 :clone="false"
11 - :gradient="true"
12 - :gradient-color="gradientColor"
11 + gradient
12 + :gradient-color
13 gradient-length="10%"
14 >
15 <span
@@ -61,8 +61,8 @@ const emit = defineEmits<{
61 const { indices } = toRefs(props)
62 const list = ref(indices.value)
63 const message = useMessage()
64 -const style = computed(() => useThemeStore().style)
65 -const gradientColor = computed(() => style.value["bg-color-rgb"].split(", "))
64 +const themeStore = useThemeStore()
65 +const gradientColor = computed(() => themeStore.style["bg-default-color-rgb"].split(" "))
66 const loading = ref(false)
67
68 function getIndices() {
frontend/src/components/indices/TopIndices.vue
+6 -6
@@ -63,10 +63,10 @@ function getOptions() {
63 left: "left",
64 type: "scroll",
65 textStyle: {
66 - color: style.value["fg-color"]
66 + color: style.value["fg-default-color"]
67 },
68 pageTextStyle: {
69 - color: style.value["fg-color"]
69 + color: style.value["fg-default-color"]
70 }
71 },
72 grid: {
@@ -86,7 +86,7 @@ function getOptions() {
86 show: false
87 },
88 itemStyle: {
89 - borderColor: style.value["bg-color"],
89 + borderColor: style.value["bg-default-color"],
90 borderWidth: 2
91 },
92 data: [
@@ -139,13 +139,13 @@ function getOptions() {
139 // alignTo: "edge",
140 rich: {
141 name: {
142 - color: style.value["fg-color"],
142 + color: style.value["fg-default-color"],
143 fontSize: window.innerWidth > 1000 ? 13 : 11
144 },
145 per: {
146 fontSize: window.innerWidth > 1000 ? 13 : 11,
147 fontWeight: "bold",
148 - color: style.value["fg-color"]
148 + color: style.value["fg-default-color"]
149 }
150 }
151 },
@@ -162,7 +162,7 @@ function getOptions() {
162 }
163 },
164 itemStyle: {
165 - borderColor: style.value["bg-color"],
165 + borderColor: style.value["bg-default-color"],
166 borderWidth: 1
167 },
168 data: sizeData
frontend/src/components/license/LicenseFeatures.vue
+2 -2
@@ -260,9 +260,9 @@ onMounted(() => {
260 }
261
262 .license-features-box {
263 - background-color: var(--bg-color);
263 + background-color: var(--bg-default-color);
264 border-radius: var(--border-radius);
265 - border: var(--border-small-100);
265 + border: 1px solid var(--border-color);
266 padding: 18px;
267 flex-grow: 1;
268 overflow: hidden;
frontend/src/components/license/deprecated/LicenseCheckout.vue
+1 -1
@@ -92,7 +92,7 @@ onBeforeMount(() => {
92
93 <style lang="scss" scoped>
94 .license-box {
95 - background-color: var(--bg-color);
95 + background-color: var(--bg-default-color);
96 border-radius: var(--border-radius);
97 padding: 14px 18px;
98 .section {
frontend/src/components/logs/LogItem.vue
+4 -4
@@ -113,19 +113,19 @@ function formatDate(timestamp: string | number | Date, utc: boolean = true): str
113
114 .method {
115 &-get {
116 - color: var(--secondary1-color);
116 + color: var(--extra1-color);
117 }
118 &-option {
119 - color: var(--secondary3-color);
119 + color: var(--extra3-color);
120 }
121 &-put {
122 - color: var(--secondary2-color);
122 + color: var(--extra2-color);
123 }
124 &-post {
125 color: var(--primary-color);
126 }
127 &-delete {
128 - color: var(--secondary4-color);
128 + color: var(--error-color);
129 }
130 }
131 </style>
frontend/src/components/logs/LogsList.vue
+2 -2
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-2">
5 <n-popover overlap placement="bottom-start">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
@@ -46,7 +46,7 @@
46 />
47 <n-popover :show="showFilters" trigger="manual" overlap placement="right" class="!px-0">
48 <template #trigger>
49 - <div class="bg-default rounded-default">
49 + <div class="bg-default rounded-lg">
50 <n-badge :show="filtered" dot type="success" :offset="[-4, 0]">
51 <n-button size="small" @click="showFilters = true">
52 <template #icon>
frontend/src/components/monitoringAlerts/List.vue
+1 -1
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-2">
5 <n-popover overlap placement="bottom-start">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
frontend/src/components/reportCreation/Panels.vue
+12 -12
@@ -447,8 +447,8 @@ onMounted(() => {
447
448 .content {
449 border-radius: var(--border-radius);
450 - background-color: var(--bg-color);
451 - border: var(--border-small-050);
450 + background-color: var(--bg-default-color);
451 + border: 1px solid var(--border-color);
452 overflow: hidden;
453 display: flex;
454 align-items: center;
@@ -464,13 +464,13 @@ onMounted(() => {
464
465 &:hover {
466 .content {
467 - border-color: var(--primary-040-color);
467 + border-color: rgba(var(--primary-color-rgb) / 0.4);
468 }
469 }
470
471 &.ghost-panel {
472 .content {
473 - border: 2px dashed var(--primary-040-color) !important;
473 + border: 2px dashed rgba(var(--primary-color-rgb) / 0.4) !important;
474 }
475 }
476 }
@@ -490,7 +490,7 @@ onMounted(() => {
490 .row {
491 border-radius: var(--border-radius);
492 background-color: var(--bg-secondary-color);
493 - border: var(--border-small-050);
493 + border: 1px solid var(--border-color);
494 height: 155px;
495 position: relative;
496 transition: border-color 0.2s;
@@ -519,7 +519,7 @@ onMounted(() => {
519 left: -32px;
520 bottom: 0;
521 width: 25px;
522 - border: var(--border-small-050);
522 + border: 1px solid var(--border-color);
523 background-color: var(--bg-secondary-color);
524 border-radius: var(--border-radius);
525
@@ -536,7 +536,7 @@ onMounted(() => {
536 top: 0px;
537 left: 0px;
538 right: 0;
539 - background-color: rgba(var(--secondary4-color-rgb), 0.1);
539 + background-color: rgba(var(--error-color-rgb), 0.1);
540 border-top-left-radius: var(--border-radius);
541 border-top-right-radius: var(--border-radius);
542 text-align: center;
@@ -548,7 +548,7 @@ onMounted(() => {
548 bottom: 0px;
549 left: 0px;
550 right: 0;
551 - background-color: var(--hover-005-color);
551 + background-color: rgba(var(--hover-color-rgb) / 0.05);
552 border-bottom-left-radius: var(--border-radius);
553 border-bottom-right-radius: var(--border-radius);
554 text-align: center;
@@ -556,7 +556,7 @@ onMounted(() => {
556 }
557
558 &:hover {
559 - border-color: var(--primary-020-color);
559 + border-color: rgba(var(--primary-color-rgb) / 0.2);
560 }
561 }
562
@@ -587,11 +587,11 @@ onMounted(() => {
587 }
588
589 &:hover {
590 - border-color: var(--primary-020-color);
590 + border-color: rgba(var(--primary-color-rgb) / 0.2);
591 }
592
593 &.ghost-row {
594 - border: 2px dashed var(--primary-040-color) !important;
594 + border: 2px dashed rgba(var(--primary-color-rgb) / 0.4) !important;
595 }
596 }
597 }
@@ -599,7 +599,7 @@ onMounted(() => {
599
600 .panels-sidebar {
601 border-radius: var(--border-radius);
602 - border: var(--border-small-050);
602 + border: 1px solid var(--border-color);
603 width: 200px;
604
605 :deep() {
frontend/src/components/sigma/QueriesList.vue
+2 -2
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-2">
5 <n-popover overlap placement="bottom-start">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
@@ -54,7 +54,7 @@
54 />
55 <n-popover :show="showFilters" trigger="manual" overlap placement="right" class="!px-0">
56 <template #trigger>
57 - <div class="bg-default rounded-default">
57 + <div class="bg-default rounded-lg">
58 <n-badge :show="filtered" dot type="success" :offset="[-4, 0]">
59 <n-button size="small" @click="showFilters = true">
60 <template #icon>
frontend/src/components/sigma/QueryOverview.vue
+1 -1
@@ -163,6 +163,6 @@ function updateQuery(updatedQuery: SigmaQuery) {
163
164 <style lang="scss" scoped>
165 .footer-box {
166 - border-top: var(--border-small-100);
166 + border-top: 1px solid var(--border-color);
167 }
168 </style>
frontend/src/components/soc/SocCases/SocCasesList.vue
+2 -2
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-2">
5 <n-popover overlap placement="bottom-start">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
@@ -45,7 +45,7 @@
45 />
46 <n-popover :show="showFilters" trigger="manual" overlap placement="right" class="!px-0">
47 <template #trigger>
48 - <div class="bg-default rounded-default">
48 + <div class="bg-default rounded-lg">
49 <n-badge :show="filtered" dot type="success" :offset="[-4, 0]">
50 <n-button size="small" @click="showFilters = true">
51 <template #icon>
frontend/src/components/soc/SocUsers/SocUsersList.vue
+4 -4
@@ -137,15 +137,15 @@ onBeforeMount(() => {
137
138 tr:hover {
139 td {
140 - background-color: var(--primary-005-color);
140 + background-color: rgba(var(--primary-color-rgb) / 0.05);
141 }
142 }
143
144 .highlight {
145 td {
146 - border-top: 1px solid var(--primary-030-color);
147 - border-bottom: 1px solid var(--primary-030-color);
148 - background-color: var(--primary-005-color);
146 + border-top: 1px solid rgba(var(--primary-color-rgb) / 0.3);
147 + border-bottom: 1px solid rgba(var(--primary-color-rgb) / 0.3);
148 + background-color: rgba(var(--primary-color-rgb) / 0.05);
149 }
150 }
151 }
frontend/src/components/threatIntel/ThreatIntelForm.vue
+1 -1
@@ -165,7 +165,7 @@ onMounted(() => {
165 }
166
167 &:not(:last-child) {
168 - border-bottom: var(--border-small-100);
168 + border-bottom: 1px solid var(--border-color);
169 }
170 }
171 }
frontend/src/components/users/UsersList.vue
+4 -4
@@ -169,15 +169,15 @@ onBeforeMount(() => {
169
170 tr:hover {
171 td {
172 - background-color: var(--primary-005-color);
172 + background-color: rgba(var(--primary-color-rgb) / 0.05);
173 }
174 }
175
176 .highlight {
177 td {
178 - border-top: 1px solid var(--primary-030-color);
179 - border-bottom: 1px solid var(--primary-030-color);
180 - background-color: var(--primary-005-color);
178 + border-top: 1px solid rgba(var(--primary-color-rgb) / 0.3);
179 + border-bottom: 1px solid rgba(var(--primary-color-rgb) / 0.3);
180 + background-color: rgba(var(--primary-color-rgb) / 0.05);
181 }
182 }
183 }
frontend/src/components/webVulnerabilityAssessment/ReportsList.vue
+1 -1
@@ -4,7 +4,7 @@
4 <div class="info flex grow gap-5">
5 <n-popover overlap placement="bottom-start">
6 <template #trigger>
7 - <div class="bg-default rounded-default">
7 + <div class="bg-default rounded-lg">
8 <n-button size="small" class="!cursor-help">
9 <template #icon>
10 <Icon :name="InfoIcon"></Icon>
frontend/src/design-tokens.json
+53 -190
@@ -1,17 +1,22 @@
1 {
2 "borderRadius": {
3 - "base": "8px",
3 + "default": "8px",
4 "small": "4px"
5 },
6 "lineHeight": {
7 - "base": "1.35"
7 + "default": "1.25"
8 },
9 "fontSize": {
10 - "base": "16px",
10 + "default": "16px",
11 "cardTitle": "18px"
12 },
13 + "fontWeight": {
14 + "default": "400",
15 + "strong": "600",
16 + "cardTitle": "600"
17 + },
18 "fontFamily": {
14 - "base": "'Public Sans', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'",
19 + "default": "'Public Sans', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'",
20 "display": "'Lexend', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'",
21 "mono": "'JetBrains Mono', SFMono-Regular, Menlo, Consolas, Courier, monospace"
22 },
@@ -20,226 +25,84 @@
25 "fontFamily": "{fontFamily.display}",
26 "fontSize": "30px",
27 "fontWeight": "700",
23 - "lineHeight": "41"
28 + "lineHeight": "38"
29 },
30 "h2": {
31 "fontFamily": "{fontFamily.display}",
32 "fontSize": "26px",
33 "fontWeight": "700",
29 - "lineHeight": "35"
34 + "lineHeight": "33"
35 },
36 "h3": {
37 "fontFamily": "{fontFamily.display}",
38 "fontSize": "22px",
39 "fontWeight": "700",
35 - "lineHeight": "30"
40 + "lineHeight": "28"
41 },
42 "h4": {
43 "fontFamily": "{fontFamily.display}",
44 "fontSize": "18px",
45 "fontWeight": "500",
41 - "lineHeight": "24"
46 + "lineHeight": "23"
47 },
48 "h5": {
49 "fontFamily": "{fontFamily.display}",
50 "fontSize": "14px",
51 "fontWeight": "700",
47 - "lineHeight": "19"
52 + "lineHeight": "18"
53 },
54 "h6": {
50 - "fontFamily": "{fontFamily.base}",
55 + "fontFamily": "{fontFamily.default}",
56 "fontSize": "12px",
57 "fontWeight": "500",
53 - "lineHeight": "16"
58 + "lineHeight": "15"
59 },
60 "p": {
56 - "fontFamily": "{fontFamily.base}",
57 - "fontSize": "{fontSize.base}",
61 + "fontFamily": "{fontFamily.default}",
62 + "fontSize": "{fontSize.default}",
63 "lineHeight": "20"
64 }
65 },
66 "colors": {
67 "light": {
63 - "sidebarBackground": "#ffffff",
64 - "bodyBackground": "#f5f7f9",
65 - "text": "#000000",
66 - "textSecondary": "#495465",
67 - "background": "#ffffff",
68 - "backgroundSecondary": "#fafbfc",
69 - "primary": "rgb(255, 182, 0)",
70 - "primary005": "rgba(255, 182, 0, 0.05)",
71 - "primary010": "rgba(255, 182, 0, 0.1)",
72 - "primary015": "rgba(255, 182, 0, 0.15)",
73 - "primary020": "rgba(255, 182, 0, 0.2)",
74 - "primary030": "rgba(255, 182, 0, 0.3)",
75 - "primary040": "rgba(255, 182, 0, 0.4)",
76 - "primary050": "rgba(255, 182, 0, 0.5)",
77 - "primary060": "rgba(255, 182, 0, 0.6)",
78 - "primary070": "rgba(255, 182, 0, 0.7)",
79 - "primary080": "rgba(255, 182, 0, 0.8)",
80 - "primary090": "rgba(255, 182, 0, 0.9)",
81 - "info": "#6267FF",
82 - "success": "#00B27B",
83 - "warning": "#E3C22F",
84 - "error": "#FF0156",
85 - "info005": "rgba(98, 103, 255, 0.05)",
86 - "info010": "rgba(98, 103, 255, 0.1)",
87 - "info020": "rgba(98, 103, 255, 0.2)",
88 - "info030": "rgba(98, 103, 255, 0.3)",
89 - "info040": "rgba(98, 103, 255, 0.4)",
90 - "info050": "rgba(98, 103, 255, 0.5)",
91 - "info060": "rgba(98, 103, 255, 0.6)",
92 - "info070": "rgba(98, 103, 255, 0.7)",
93 - "info080": "rgba(98, 103, 255, 0.8)",
94 - "info090": "rgba(98, 103, 255, 0.9)",
95 - "success005": "rgba(0, 178, 123, 0.05)",
96 - "success010": "rgba(0, 178, 123, 0.1)",
97 - "success020": "rgba(0, 178, 123, 0.2)",
98 - "success030": "rgba(0, 178, 123, 0.3)",
99 - "success040": "rgba(0, 178, 123, 0.4)",
100 - "success050": "rgba(0, 178, 123, 0.5)",
101 - "success060": "rgba(0, 178, 123, 0.6)",
102 - "success070": "rgba(0, 178, 123, 0.7)",
103 - "success080": "rgba(0, 178, 123, 0.8)",
104 - "success090": "rgba(0, 178, 123, 0.9)",
105 - "warning005": "rgba(227, 194, 47, 0.05)",
106 - "warning010": "rgba(227, 194, 47, 0.1)",
107 - "warning020": "rgba(227, 194, 47, 0.2)",
108 - "warning030": "rgba(227, 194, 47, 0.3)",
109 - "warning040": "rgba(227, 194, 47, 0.4)",
110 - "warning050": "rgba(227, 194, 47, 0.5)",
111 - "warning060": "rgba(227, 194, 47, 0.6)",
112 - "warning070": "rgba(227, 194, 47, 0.7)",
113 - "warning080": "rgba(227, 194, 47, 0.8)",
114 - "warning090": "rgba(227, 194, 47, 0.9)",
115 - "error005": "rgba(255, 1, 86, 0.05)",
116 - "error010": "rgba(255, 1, 86, 0.1)",
117 - "error020": "rgba(255, 1, 86, 0.2)",
118 - "error030": "rgba(255, 1, 86, 0.3)",
119 - "error040": "rgba(255, 1, 86, 0.4)",
120 - "error050": "rgba(255, 1, 86, 0.5)",
121 - "error060": "rgba(255, 1, 86, 0.6)",
122 - "error070": "rgba(255, 1, 86, 0.7)",
123 - "error080": "rgba(255, 1, 86, 0.8)",
124 - "error090": "rgba(255, 1, 86, 0.9)",
125 - "secondary1": "rgb(98, 103, 255)",
126 - "secondary1Opacity005": "rgba(98, 103, 255, 0.05)",
127 - "secondary1Opacity010": "rgba(98, 103, 255, 0.1)",
128 - "secondary1Opacity020": "rgba(98, 103, 255, 0.2)",
129 - "secondary1Opacity030": "rgba(98, 103, 255, 0.3)",
130 - "secondary2": "rgb(255, 97, 201)",
131 - "secondary2Opacity005": "rgba(255, 97, 201, 0.05)",
132 - "secondary2Opacity010": "rgba(255, 97, 201, 0.1)",
133 - "secondary2Opacity020": "rgba(255, 97, 201, 0.2)",
134 - "secondary2Opacity030": "rgba(255, 97, 201, 0.3)",
135 - "secondary3": "rgb(227, 194, 47)",
136 - "secondary3Opacity005": "rgba(227, 194, 47, 0.05)",
137 - "secondary3Opacity010": "rgba(227, 194, 47, 0.1)",
138 - "secondary3Opacity020": "rgba(227, 194, 47, 0.2)",
139 - "secondary3Opacity030": "rgba(227, 194, 47, 0.3)",
140 - "secondary4": "rgb(255, 1, 86)",
141 - "secondary4Opacity005": "rgba(255, 1, 86, 0.05)",
142 - "secondary4Opacity010": "rgba(255, 1, 86, 0.1)",
143 - "secondary4Opacity020": "rgba(255, 1, 86, 0.2)",
144 - "secondary4Opacity030": "rgba(255, 1, 86, 0.3)",
145 - "divider005": "rgba(0, 0, 0, 0.05)",
146 - "divider010": "rgba(0, 0, 0, 0.1)",
147 - "divider020": "rgba(0, 0, 0, 0.2)",
148 - "divider030": "rgba(0, 0, 0, 0.3)",
149 - "hover005": "rgba(0, 0, 0, 0.05)",
150 - "hover010": "rgba(0, 0, 0, 0.1)",
151 - "hover050": "rgba(0, 0, 0, 0.5)"
68 + "sidebarBackground": "rgb(255, 255, 255)",
69 + "bodyBackground": "rgb(245, 247, 249)",
70 + "text": "rgb(0, 0, 0)",
71 + "textSecondary": "rgb(73, 84, 101)",
72 + "textTertiary": "rgb(114, 115, 115)",
73 + "background": "rgb(255, 255, 255)",
74 + "backgroundSecondary": "rgb(250, 251, 252)",
75 + "border": "rgb(226, 230, 233)",
76 + "hover": "rgba(221, 224, 225, 0.5)",
77 + "primary": "rgb(219, 157, 0)",
78 + "info": "rgb(98, 103, 255)",
79 + "success": "rgb(0, 178, 123)",
80 + "warning": "rgb(227, 194, 47)",
81 + "error": "rgb(255, 1, 86)",
82 + "extra1": "rgb(98, 103, 255)",
83 + "extra2": "rgb(255, 97, 201)",
84 + "extra3": "rgb(227, 194, 47)",
85 + "extra4": "rgb(255, 1, 86)"
86 },
87 "dark": {
154 - "sidebarBackground": "#1D1F25",
155 - "bodyBackground": "#14161A",
156 - "text": "#ffffff",
157 - "textSecondary": "#ACB5BE",
158 - "background": "#26282d",
159 - "backgroundSecondary": "#1D1F25",
88 + "sidebarBackground": "rgb(29, 31, 37)",
89 + "bodyBackground": "rgb(20, 22, 26)",
90 + "text": "rgb(255, 255, 255)",
91 + "textSecondary": "rgb(172, 181, 190)",
92 + "textTertiary": "rgb(172, 181, 190)",
93 + "background": "rgb(38, 40, 45)",
94 + "backgroundSecondary": "rgb(29, 31, 37)",
95 + "border": "rgb(67, 68, 76)",
96 + "hover": "rgba(59, 61, 68, 0.5)",
97 "primary": "rgb(255, 182, 0)",
161 - "primary005": "rgba(255, 182, 0, 0.05)",
162 - "primary010": "rgba(255, 182, 0, 0.1)",
163 - "primary015": "rgba(255, 182, 0, 0.15)",
164 - "primary020": "rgba(255, 182, 0, 0.2)",
165 - "primary030": "rgba(255, 182, 0, 0.3)",
166 - "primary040": "rgba(255, 182, 0, 0.4)",
167 - "primary050": "rgba(255, 182, 0, 0.5)",
168 - "primary060": "rgba(255, 182, 0, 0.6)",
169 - "primary070": "rgba(255, 182, 0, 0.7)",
170 - "primary080": "rgba(255, 182, 0, 0.8)",
171 - "primary090": "rgba(255, 182, 0, 0.9)",
172 - "info": "#6267FF",
173 - "success": "#00E19B",
174 - "warning": "#E3C22F",
175 - "error": "#FF0156",
176 - "info005": "rgba(98, 103, 255, 0.05)",
177 - "info010": "rgba(98, 103, 255, 0.1)",
178 - "info020": "rgba(98, 103, 255, 0.2)",
179 - "info030": "rgba(98, 103, 255, 0.3)",
180 - "info040": "rgba(98, 103, 255, 0.4)",
181 - "info050": "rgba(98, 103, 255, 0.5)",
182 - "info060": "rgba(98, 103, 255, 0.6)",
183 - "info070": "rgba(98, 103, 255, 0.7)",
184 - "info080": "rgba(98, 103, 255, 0.8)",
185 - "info090": "rgba(98, 103, 255, 0.9)",
186 - "success005": "rgba(0, 178, 123, 0.05)",
187 - "success010": "rgba(0, 178, 123, 0.1)",
188 - "success020": "rgba(0, 178, 123, 0.2)",
189 - "success030": "rgba(0, 178, 123, 0.3)",
190 - "success040": "rgba(0, 178, 123, 0.4)",
191 - "success050": "rgba(0, 178, 123, 0.5)",
192 - "success060": "rgba(0, 178, 123, 0.6)",
193 - "success070": "rgba(0, 178, 123, 0.7)",
194 - "success080": "rgba(0, 178, 123, 0.8)",
195 - "success090": "rgba(0, 178, 123, 0.9)",
196 - "warning005": "rgba(227, 194, 47, 0.05)",
197 - "warning010": "rgba(227, 194, 47, 0.1)",
198 - "warning020": "rgba(227, 194, 47, 0.2)",
199 - "warning030": "rgba(227, 194, 47, 0.3)",
200 - "warning040": "rgba(227, 194, 47, 0.4)",
201 - "warning050": "rgba(227, 194, 47, 0.5)",
202 - "warning060": "rgba(227, 194, 47, 0.6)",
203 - "warning070": "rgba(227, 194, 47, 0.7)",
204 - "warning080": "rgba(227, 194, 47, 0.8)",
205 - "warning090": "rgba(227, 194, 47, 0.9)",
206 - "error005": "rgba(255, 1, 86, 0.05)",
207 - "error010": "rgba(255, 1, 86, 0.1)",
208 - "error020": "rgba(255, 1, 86, 0.2)",
209 - "error030": "rgba(255, 1, 86, 0.3)",
210 - "error040": "rgba(255, 1, 86, 0.4)",
211 - "error050": "rgba(255, 1, 86, 0.5)",
212 - "error060": "rgba(255, 1, 86, 0.6)",
213 - "error070": "rgba(255, 1, 86, 0.7)",
214 - "error080": "rgba(255, 1, 86, 0.8)",
215 - "error090": "rgba(255, 1, 86, 0.9)",
216 - "secondary1": "rgb(98, 103, 255)",
217 - "secondary1Opacity005": "rgba(98, 103, 255, 0.05)",
218 - "secondary1Opacity010": "rgba(98, 103, 255, 0.1)",
219 - "secondary1Opacity020": "rgba(98, 103, 255, 0.2)",
220 - "secondary1Opacity030": "rgba(98, 103, 255, 0.3)",
221 - "secondary2": "rgb(255, 97, 201)",
222 - "secondary2Opacity005": "rgba(255, 97, 201, 0.05)",
223 - "secondary2Opacity010": "rgba(255, 97, 201, 0.1)",
224 - "secondary2Opacity020": "rgba(255, 97, 201, 0.2)",
225 - "secondary2Opacity030": "rgba(255, 97, 201, 0.3)",
226 - "secondary3": "rgb(227, 194, 47)",
227 - "secondary3Opacity005": "rgba(227, 194, 47, 0.05)",
228 - "secondary3Opacity010": "rgba(227, 194, 47, 0.1)",
229 - "secondary3Opacity020": "rgba(227, 194, 47, 0.2)",
230 - "secondary3Opacity030": "rgba(227, 194, 47, 0.3)",
231 - "secondary4": "rgb(255, 1, 86)",
232 - "secondary4Opacity005": "rgba(255, 1, 86, 0.05)",
233 - "secondary4Opacity010": "rgba(255, 1, 86, 0.1)",
234 - "secondary4Opacity020": "rgba(255, 1, 86, 0.2)",
235 - "secondary4Opacity030": "rgba(255, 1, 86, 0.3)",
236 - "divider005": "rgba(255, 255, 255, 0.05)",
237 - "divider010": "rgba(255, 255, 255, 0.1)",
238 - "divider020": "rgba(255, 255, 255, 0.2)",
239 - "divider030": "rgba(255, 255, 255, 0.3)",
240 - "hover005": "rgba(255, 255, 255, 0.05)",
241 - "hover010": "rgba(255, 255, 255, 0.1)",
242 - "hover050": "rgba(255, 255, 255, 0.5)"
98 + "info": "rgb(98, 103, 255)",
99 + "success": "rgb(0, 225, 155)",
100 + "warning": "rgb(227, 194, 47)",
101 + "error": "rgb(255, 1, 86)",
102 + "extra1": "rgb(98, 103, 255)",
103 + "extra2": "rgb(255, 97, 201)",
104 + "extra3": "rgb(227, 194, 47)",
105 + "extra4": "rgb(255, 1, 86)"
106 }
107 }
108 }
frontend/src/router-env.d.ts
+5 -1
@@ -8,7 +8,11 @@ export {}
8 declare module "vue-router" {
9 interface RouteMeta extends RouteMetaAuth {
10 title?: string
11 - forceLayout?: Layout
11 + theme?: {
12 + layout?: Layout
13 + boxed?: { enabled?: boolean }
14 + padded?: { enabled?: boolean }
15 + }
16 skipPin?: boolean
17 }
18 }
frontend/src/router/index.ts
+18 -3
@@ -271,15 +271,27 @@ const router = createRouter({
271 name: "Login",
272 component: AuthPage,
273 props: { formType: "signin" as FormType },
274 - meta: { title: "Login", forceLayout: Layout.Blank, checkAuth: true, skipPin: true }
274 + meta: {
275 + title: "Login",
276 + theme: { layout: Layout.Blank, boxed: { enabled: false }, padded: { enabled: false } },
277 + checkAuth: true,
278 + skipPin: true
279 + }
280 },
281 + /*
282 {
283 path: "/register",
284 name: "Register",
285 component: AuthPage,
286 props: { formType: "signup" as FormType },
281 - meta: { title: "Register", forceLayout: Layout.Blank, checkAuth: true, skipPin: true }
287 + meta: {
288 + title: "Register",
289 + theme: { layout: Layout.Blank, boxed: { enabled: false }, padded: { enabled: false } },
290 + checkAuth: true,
291 + skipPin: true
292 + }
293 },
294 + */
295 {
296 path: "/logout",
297 name: "Logout",
@@ -289,7 +301,10 @@ const router = createRouter({
301 path: "/:pathMatch(.*)*",
302 name: "NotFound",
303 component: () => import("@/views/NotFound.vue"),
292 - meta: { forceLayout: Layout.Blank, skipPin: true }
304 + meta: {
305 + theme: { layout: Layout.Blank, boxed: { enabled: false }, padded: { enabled: false } },
306 + skipPin: true
307 + }
308 }
309 ]
310 })
frontend/src/stores/theme.ts
+6 -139
@@ -1,11 +1,9 @@
1 -import type { ColorType, Layout, RouterTransition } from "@/types/theme.d"
1 +import type { Layout, RouterTransition } from "@/types/theme.d"
2 import type { BuiltInGlobalTheme } from "naive-ui/es/themes/interface"
3 -import { getCssVars, getDefaultState } from "@/theme"
3 +import { getCssVars, getDefaultState, getThemeOverrides } from "@/theme"
4 import { ThemeNameEnum } from "@/types/theme.d"
5 -import { exportPrimaryShades, getThemeColors, getTypeValue, type PrimaryShade } from "@/utils/theme"
5 import { useWindowSize } from "@vueuse/core"
6 import _get from "lodash/get"
8 -import _pick from "lodash/pick"
7 import _set from "lodash/set"
8 import { darkTheme, type GlobalThemeOverrides, lightTheme, type ThemeCommonVars } from "naive-ui"
9 import { acceptHMRUpdate, defineStore } from "pinia"
@@ -41,20 +39,8 @@ export const useThemeStore = defineStore("theme", {
39 setThemeDark(): void {
40 this.themeName = ThemeNameEnum.Dark
41 },
44 - setColor(theme: ThemeNameEnum, colorType: ColorType, color: string): void {
45 - this.colors[theme][colorType] = color
46 -
47 - if (colorType === "primary") {
48 - const primaryShades = exportPrimaryShades(color)
49 -
50 - for (const k in primaryShades) {
51 - const name = k as PrimaryShade
52 - const shade = primaryShades[name]
53 -
54 - const colorKey = `${colorType}${name}` as keyof (typeof this.colors)[typeof theme]
55 - this.colors[theme][colorKey] = shade
56 - }
57 - }
42 + setColor(theme: ThemeNameEnum, colorName: string, color: string): void {
43 + ;(this.colors[theme] as Record<string, string>)[colorName] = color
44 },
45 toggleTheme(): void {
46 if (this.isThemeDark) {
@@ -109,7 +95,7 @@ export const useThemeStore = defineStore("theme", {
95 html.classList.add(`theme-${val}`)
96 }
97 },
112 - // This function allows you to utilize the values in the style object as variables within your CSS/SCSS code like: var(-–bg-color)
98 + // This function allows you to utilize the values in the style object as variables within your CSS/SCSS code like: var(--bg-default-color)
99 setCssGlobalVars() {
100 if (document) {
101 const html = document.children[0] as HTMLElement
@@ -160,68 +146,7 @@ export const useThemeStore = defineStore("theme", {
146 return state.themeName === ThemeNameEnum.Dark ? darkTheme : lightTheme
147 },
148 themeOverrides(state): GlobalThemeOverrides {
163 - const {
164 - primary,
165 - success,
166 - warning,
167 - error,
168 - info,
169 - background,
170 - backgroundSecondary,
171 - bodyBackground,
172 - text,
173 - textSecondary,
174 - divider005,
175 - hover010
176 - } = state.colors[state.themeName]
177 -
178 - const themeColors = getThemeColors({ primary, success, warning, error, info })
179 -
180 - const lineHeight = state.lineHeight.base
181 - const borderRadius = state.borderRadius.base
182 - const borderRadiusSmall = state.borderRadius.small
183 -
184 - return {
185 - common: {
186 - ...themeColors,
187 - textColorBase: text,
188 - textColor1: text,
189 - textColor2: text,
190 - textColor3: textSecondary,
191 - bodyColor: bodyBackground,
192 - baseColor: background,
193 - popoverColor: background,
194 - cardColor: background,
195 - modalColor: background,
196 - lineHeight,
197 - borderRadius,
198 - borderRadiusSmall,
199 - fontSize: state.fontSize.base,
200 - fontFamily: state.fontFamily.base,
201 - fontFamilyMono: state.fontFamily.mono,
202 - dividerColor: divider005,
203 - hoverColor: hover010
204 - },
205 - Card: {
206 - color: background,
207 - colorEmbedded: backgroundSecondary,
208 - titleFontSizeSmall: state.fontSize.cardTitle,
209 - titleFontSizeMedium: state.fontSize.cardTitle,
210 - titleFontSizeLarge: state.fontSize.cardTitle,
211 - titleFontSizeHuge: state.fontSize.cardTitle
212 - },
213 - LoadingBar: {
214 - colorLoading: primary
215 - },
216 - Typography: {
217 - headerFontSize1: getTypeValue(state, state.typography.h1.fontSize),
218 - headerFontSize2: getTypeValue(state, state.typography.h2.fontSize),
219 - headerFontSize3: getTypeValue(state, state.typography.h3.fontSize),
220 - headerFontSize4: getTypeValue(state, state.typography.h4.fontSize),
221 - headerFontSize5: getTypeValue(state, state.typography.h5.fontSize),
222 - headerFontSize6: getTypeValue(state, state.typography.h6.fontSize)
223 - }
224 - }
149 + return getThemeOverrides(state)
150 },
151 darkPrimaryColor(state): string {
152 return state.colors.dark.primary
@@ -229,64 +154,6 @@ export const useThemeStore = defineStore("theme", {
154 lightPrimaryColor(state): string {
155 return state.colors.light.primary
156 },
232 - primaryColor(state): string {
233 - return state.colors[state.themeName].primary
234 - },
235 - sidebarBackground(state): string {
236 - return state.colors[state.themeName].sidebarBackground
237 - },
238 - bodyBackground(state): string {
239 - return state.colors[state.themeName].bodyBackground
240 - },
241 - backgroundSecondaryColor(state): string {
242 - return state.colors[state.themeName].backgroundSecondary
243 - },
244 - secondaryColors(state): { [key: string]: string } {
245 - const pick = ["secondary1", "secondary2", "secondary3", "secondary4"]
246 - return _pick(state.colors[state.themeName], pick)
247 - },
248 - secondaryOpacityColors(state): { [key: string]: string } {
249 - const pick = [
250 - "secondary1Opacity005",
251 - "secondary1Opacity010",
252 - "secondary1Opacity020",
253 - "secondary1Opacity030",
254 - "secondary2Opacity005",
255 - "secondary2Opacity010",
256 - "secondary2Opacity020",
257 - "secondary2Opacity030",
258 - "secondary3Opacity005",
259 - "secondary3Opacity010",
260 - "secondary3Opacity020",
261 - "secondary3Opacity030",
262 - "secondary4Opacity005",
263 - "secondary4Opacity010",
264 - "secondary4Opacity020",
265 - "secondary4Opacity030"
266 - ]
267 - return _pick(state.colors[state.themeName], pick)
268 - },
269 - dividerColors(state): { [key: string]: string } {
270 - const pick = ["divider005", "divider010", "divider020", "divider030"]
271 - return _pick(state.colors[state.themeName], pick)
272 - },
273 - hoverColors(state): { [key: string]: string } {
274 - const pick = ["hover005", "hover010", "hover050"]
275 - return _pick(state.colors[state.themeName], pick)
276 - },
277 - primaryColors(state): { [key: string]: string } {
278 - const pick = [
279 - "primary005",
280 - "primary010",
281 - "primary015",
282 - "primary020",
283 - "primary030",
284 - "primary040",
285 - "primary050",
286 - "primary060"
287 - ]
288 - return _pick(state.colors[state.themeName], pick)
289 - },
157 naiveCommon(): ThemeCommonVars {
158 return { ...this.naiveTheme.common, ...this.themeOverrides.common }
159 },
frontend/src/theme/index.ts
+106 -241
@@ -1,19 +1,11 @@
1 import tokens from "@/design-tokens.json"
2 import { Layout, RouterTransition, ThemeNameEnum } from "@/types/theme.d"
3 -import { hex2rgb } from "@/utils/theme"
4 -import { type ThemeCommonVars, useOsTheme } from "naive-ui"
3 +import { colorToArray, expandPattern, getThemeColors, getTypeValue } from "@/utils/theme"
4 +import { type GlobalThemeOverrides, type ThemeCommonVars, useOsTheme } from "naive-ui"
5
6 type ThemeState = ReturnType<typeof getDefaultState>
7
8 interface ThemeGetters {
9 - dividerColors: { [key: string]: string }
10 - hoverColors: { [key: string]: string }
11 - primaryColors: { [key: string]: string }
12 - secondaryOpacityColors: { [key: string]: string }
13 - secondaryColors: { [key: string]: string }
14 - sidebarBackground: string
15 - bodyBackground: string
16 - backgroundSecondaryColor: string
9 naiveCommon: ThemeCommonVars
10 }
11
@@ -64,92 +56,94 @@ export function getDefaultState() {
56 borderRadius: tokens.borderRadius, // Border radius from the token
57 lineHeight: tokens.lineHeight, // Line height from the token
58 fontSize: tokens.fontSize, // Font size from the token
59 + fontWeight: tokens.fontWeight, // Font weight from the token
60 fontFamily: tokens.fontFamily, // Font family from the token
61 typography: tokens.typography // Typography configurations from the token
62 }
63 }
64
72 -export function getCssVars(state: ThemeState, getters: ThemeGetters): { [key: string]: string } {
73 - const naive = getters.naiveCommon
74 -
75 - const bgColor = naive.baseColor
76 - const bgColorRGB = hex2rgb(bgColor).join(", ")
77 - const bgSecondaryColor = getters.backgroundSecondaryColor
78 - const fgColor = naive.textColorBase
79 - const fgSecondaryColor = naive.textColor3
65 +export function getThemeOverrides(state: ThemeState): GlobalThemeOverrides {
66 + const {
67 + primary,
68 + success,
69 + warning,
70 + error,
71 + info,
72 + background,
73 + backgroundSecondary,
74 + bodyBackground,
75 + text,
76 + textTertiary,
77 + border,
78 + hover
79 + } = state.colors[state.themeName]
80
81 - const tabFgColorActive = naive.textColor2
82 - const borderColor = naive.dividerColor
83 - const hoverColor = naive.hoverColor
84 - const primaryColor = naive.primaryColor
81 + const themeColors = getThemeColors({ primary, success, warning, error, info })
82
86 - const successColor = naive.successColor
87 - const errorColor = naive.errorColor
88 - const warningColor = naive.warningColor
89 - const infoColor = naive.infoColor
90 - const successColorRGB = hex2rgb(successColor).join(", ")
91 - const errorColorRGB = hex2rgb(errorColor).join(", ")
92 - const warningColorRGB = hex2rgb(warningColor).join(", ")
93 - const infoColorRGB = hex2rgb(infoColor).join(", ")
83 + const lineHeight = state.lineHeight.default
84 + const borderRadius = state.borderRadius.default
85 + const borderRadiusSmall = state.borderRadius.small
86 + const borderColor = border
87 + const hoverColor = hover
88
95 - const {
96 - success005,
97 - warning005,
98 - error005,
99 - info005,
100 - success010,
101 - warning010,
102 - error010,
103 - info010,
104 - success020,
105 - warning020,
106 - error020,
107 - info020,
108 - success030,
109 - warning030,
110 - error030,
111 - info030,
112 - success040,
113 - warning040,
114 - error040,
115 - info040,
116 - success050,
117 - warning050,
118 - error050,
119 - info050,
120 - success060,
121 - warning060,
122 - error060,
123 - info060,
124 - success070,
125 - warning070,
126 - error070,
127 - info070,
128 - success080,
129 - warning080,
130 - error080,
131 - info080,
132 - success090,
133 - warning090,
134 - error090,
135 - info090
136 - } = state.colors[state.themeName]
89 + return {
90 + common: {
91 + ...themeColors,
92 + textColorBase: text,
93 + textColor1: text,
94 + textColor2: text,
95 + textColor3: textTertiary,
96 + bodyColor: bodyBackground,
97 + baseColor: background,
98 + popoverColor: background,
99 + cardColor: background,
100 + modalColor: background,
101 + lineHeight,
102 + borderRadius,
103 + borderRadiusSmall,
104 + fontSize: state.fontSize.default,
105 + fontWeight: state.fontWeight.default,
106 + fontWeightStrong: state.fontWeight.strong,
107 + fontFamily: state.fontFamily.default,
108 + fontFamilyMono: state.fontFamily.mono,
109 + borderColor,
110 + hoverColor,
111 + dividerColor: borderColor
112 + },
113 + Card: {
114 + color: background,
115 + colorEmbedded: backgroundSecondary,
116 + titleFontSizeSmall: state.fontSize.cardTitle,
117 + titleFontSizeMedium: state.fontSize.cardTitle,
118 + titleFontSizeLarge: state.fontSize.cardTitle,
119 + titleFontSizeHuge: state.fontSize.cardTitle,
120 + titleFontWeight: state.fontWeight.cardTitle
121 + },
122 + LoadingBar: {
123 + colorLoading: primary
124 + },
125 + Typography: {
126 + headerFontSize1: getTypeValue(state, state.typography.h1.fontSize),
127 + headerFontSize2: getTypeValue(state, state.typography.h2.fontSize),
128 + headerFontSize3: getTypeValue(state, state.typography.h3.fontSize),
129 + headerFontSize4: getTypeValue(state, state.typography.h4.fontSize),
130 + headerFontSize5: getTypeValue(state, state.typography.h5.fontSize),
131 + headerFontSize6: getTypeValue(state, state.typography.h6.fontSize)
132 + }
133 + }
134 +}
135
138 - const modalColor = naive.modalColor
139 - const modalColorRGB = hex2rgb(modalColor).join(", ")
140 - const codeColor = naive.codeColor
141 - const tabColor = naive.tabColor
142 - const tabColorActive = naive.inputColor
143 - const bezierEase = naive.cubicBezierEaseInOut
136 +export function getCssVars(state: ThemeState, getters: ThemeGetters): { [key: string]: string } {
137 + const naive = getters.naiveCommon
138
145 - const buttonColorSecondary = naive.buttonColor2
146 - const buttonColorSecondaryHover = naive.buttonColor2Hover
147 - const buttonColorSecondaryPressed = naive.buttonColor2Pressed
139 + const bgColor = naive.baseColor
140 + const bgSecondaryColor = state.colors[state.themeName].backgroundSecondary
141 + const fgColor = state.colors[state.themeName].text
142 + const fgSecondaryColor = state.colors[state.themeName].textSecondary
143 + const fgTertiaryColor = state.colors[state.themeName].textTertiary
144
149 - const bgSidebar = getters.sidebarBackground
150 - const bgSidebarRGB = hex2rgb(bgSidebar).join(", ")
151 - const bgBody = getters.bodyBackground
152 - const bgBodyRGB = hex2rgb(bgBody).join(", ")
145 + const bgSidebar = state.colors[state.themeName].sidebarBackground
146 + const bgBody = state.colors[state.themeName].bodyBackground
147
148 const boxedWidth = state.boxed.width
149 const routerTransitionDuration = state.routerTransitionDuration
@@ -160,57 +154,27 @@ export function getCssVars(state: ThemeState, getters: ThemeGetters): { [key: st
154 const toolbarHeight = state.toolbarHeight
155 const viewPadding = state.viewPadding
156 const headerBarHeight = state.headerBarHeight
163 - const fontFamily = state.fontFamily.base
157 + const fontFamily = state.fontFamily.default
158 const fontFamilyDisplay = state.fontFamily.display
159 const fontFamilyMono = state.fontFamily.mono
160 + const fontSize = state.fontSize.default
161
167 - const borderRadius = state.borderRadius.base
162 + const borderRadius = state.borderRadius.default
163 const borderRadiusSmall = state.borderRadius.small
164
170 - const { divider005, divider010, divider020, divider030 } = getters.dividerColors
171 - const { hover005, hover010, hover050 } = getters.hoverColors
172 - const { primary005, primary010, primary015, primary020, primary030, primary040, primary050, primary060 } =
173 - getters.primaryColors
174 - const {
175 - secondary1Opacity005,
176 - secondary1Opacity010,
177 - secondary1Opacity020,
178 - secondary1Opacity030,
179 - secondary2Opacity005,
180 - secondary2Opacity010,
181 - secondary2Opacity020,
182 - secondary2Opacity030,
183 - secondary3Opacity005,
184 - secondary3Opacity010,
185 - secondary3Opacity020,
186 - secondary3Opacity030,
187 - secondary4Opacity005,
188 - secondary4Opacity010,
189 - secondary4Opacity020,
190 - secondary4Opacity030
191 - } = getters.secondaryOpacityColors
192 -
193 - const { secondary1, secondary2, secondary3, secondary4 } = getters.secondaryColors
194 - const secondary1RGB = hex2rgb(secondary1).join(", ")
195 - const secondary2RGB = hex2rgb(secondary2).join(", ")
196 - const secondary3RGB = hex2rgb(secondary3).join(", ")
197 - const secondary4RGB = hex2rgb(secondary4).join(", ")
165 + const bezierEase = naive.cubicBezierEaseInOut
166
199 - // This style object, imported via the themeStore, will be available application-wide and is exposed in the HTML tag as a list of CSS variables, which you can use in your CSS/SCSS code like: var(-–bg-color)
200 - return {
201 - "bg-body": `${bgBody}`,
202 - "bg-body-rgb": `${bgBodyRGB}`,
203 - "bg-sidebar": `${bgSidebar}`,
204 - "bg-sidebar-rgb": `${bgSidebarRGB}`,
167 + // This style object, imported via the themeStore, will be available application-wide and is exposed in the HTML tag as a list of CSS variables, which you can use in your CSS/SCSS code like: var(--bg-default-color)
168 + const styleObject: Record<string, string> = {
169 + "bg-body-color": `${bgBody}`,
170 + "bg-sidebar-color": `${bgSidebar}`,
171
206 - "fg-color": `${fgColor}`,
172 + "fg-default-color": `${fgColor}`,
173 "fg-secondary-color": `${fgSecondaryColor}`,
208 - "bg-color": `${bgColor}`,
209 - "bg-color-rgb": `${bgColorRGB}`,
174 + "fg-tertiary-color": `${fgTertiaryColor}`,
175 + "bg-default-color": `${bgColor}`,
176 "bg-secondary-color": `${bgSecondaryColor}`,
177
212 - "border-color": `${borderColor}`,
213 - "hover-color": `${hoverColor}`,
178 "bezier-ease": `${bezierEase}`,
179 "router-transition-duration": `${routerTransitionDuration}s`,
180 "sidebar-anim-ease": `${sidebarAnimEase}`,
@@ -227,123 +191,24 @@ export function getCssVars(state: ThemeState, getters: ThemeGetters): { [key: st
191 "font-family": `${fontFamily}`,
192 "font-family-display": `${fontFamilyDisplay}`,
193 "font-family-mono": `${fontFamilyMono}`,
194 + "font-size": `${fontSize}`
195 + }
196
231 - "code-color": `${codeColor}`,
232 - "primary-color": `${primaryColor}`,
233 - "tab-color": `${tabColor}`,
234 - "tab-color-active": `${tabColorActive}`,
235 - "tab-fg-color-active": `${tabFgColorActive}`,
236 - "modal-color": `${modalColor}`,
237 - "modal-color-rgb": `${modalColorRGB}`,
238 -
239 - "button-color-secondary": `${buttonColorSecondary}`,
240 - "button-color-secondary-hover": `${buttonColorSecondaryHover}`,
241 - "button-color-secondary-pressed": `${buttonColorSecondaryPressed}`,
242 -
243 - "primary-005-color": `${primary005}`,
244 - "primary-010-color": `${primary010}`,
245 - "primary-015-color": `${primary015}`,
246 - "primary-020-color": `${primary020}`,
247 - "primary-030-color": `${primary030}`,
248 - "primary-040-color": `${primary040}`,
249 - "primary-050-color": `${primary050}`,
250 - "primary-060-color": `${primary060}`,
251 -
252 - "hover-005-color": `${hover005}`,
253 - "hover-010-color": `${hover010}`,
254 - "hover-050-color": `${hover050}`,
255 -
256 - "divider-005-color": `${divider005}`,
257 - "divider-010-color": `${divider010}`,
258 - "divider-020-color": `${divider020}`,
259 - "divider-030-color": `${divider030}`,
260 -
261 - "success-color": `${successColor}`,
262 - "error-color": `${errorColor}`,
263 - "warning-color": `${warningColor}`,
264 - "info-color": `${infoColor}`,
265 - "success-005-color": `${success005}`,
266 - "error-005-color": `${error005}`,
267 - "warning-005-color": `${warning005}`,
268 - "info-005-color": `${info005}`,
269 -
270 - "success-010-color": `${success010}`,
271 - "error-010-color": `${error010}`,
272 - "warning-010-color": `${warning010}`,
273 - "info-010-color": `${info010}`,
274 -
275 - "success-020-color": `${success020}`,
276 - "error-020-color": `${error020}`,
277 - "warning-020-color": `${warning020}`,
278 - "info-020-color": `${info020}`,
279 -
280 - "success-030-color": `${success030}`,
281 - "error-030-color": `${error030}`,
282 - "warning-030-color": `${warning030}`,
283 - "info-030-color": `${info030}`,
284 -
285 - "success-040-color": `${success040}`,
286 - "error-040-color": `${error040}`,
287 - "warning-040-color": `${warning040}`,
288 - "info-040-color": `${info040}`,
289 -
290 - "success-050-color": `${success050}`,
291 - "error-050-color": `${error050}`,
292 - "warning-050-color": `${warning050}`,
293 - "info-050-color": `${info050}`,
294 -
295 - "success-060-color": `${success060}`,
296 - "error-060-color": `${error060}`,
297 - "warning-060-color": `${warning060}`,
298 - "info-060-color": `${info060}`,
299 -
300 - "success-070-color": `${success070}`,
301 - "error-070-color": `${error070}`,
302 - "warning-070-color": `${warning070}`,
303 - "info-070-color": `${info070}`,
304 -
305 - "success-080-color": `${success080}`,
306 - "error-080-color": `${error080}`,
307 - "warning-080-color": `${warning080}`,
308 - "info-080-color": `${info080}`,
309 -
310 - "success-090-color": `${success090}`,
311 - "error-090-color": `${error090}`,
312 - "warning-090-color": `${warning090}`,
313 - "info-090-color": `${info090}`,
314 -
315 - "success-color-rgb": `${successColorRGB}`,
316 - "error-color-rgb": `${errorColorRGB}`,
317 - "warning-color-rgb": `${warningColorRGB}`,
318 - "info-color-rgb": `${infoColorRGB}`,
319 -
320 - "secondary1-color": `${secondary1}`,
321 - "secondary1-color-rgb": `${secondary1RGB}`,
322 - "secondary2-color": `${secondary2}`,
323 - "secondary2-color-rgb": `${secondary2RGB}`,
324 - "secondary3-color": `${secondary3}`,
325 - "secondary3-color-rgb": `${secondary3RGB}`,
326 - "secondary4-color": `${secondary4}`,
327 - "secondary4-color-rgb": `${secondary4RGB}`,
197 + // import colors by patterns
198 + for (const pattern of ["extra(1|2|3|4)", "primary", "success", "warning", "error", "info", "border", "hover"]) {
199 + const keys = expandPattern(pattern)
200
329 - "secondary1-opacity-005-color": `${secondary1Opacity005}`,
330 - "secondary1-opacity-010-color": `${secondary1Opacity010}`,
331 - "secondary1-opacity-020-color": `${secondary1Opacity020}`,
332 - "secondary1-opacity-030-color": `${secondary1Opacity030}`,
333 - "secondary2-opacity-005-color": `${secondary2Opacity005}`,
334 - "secondary2-opacity-010-color": `${secondary2Opacity010}`,
335 - "secondary2-opacity-020-color": `${secondary2Opacity020}`,
336 - "secondary2-opacity-030-color": `${secondary2Opacity030}`,
337 - "secondary3-opacity-005-color": `${secondary3Opacity005}`,
338 - "secondary3-opacity-010-color": `${secondary3Opacity010}`,
339 - "secondary3-opacity-020-color": `${secondary3Opacity020}`,
340 - "secondary3-opacity-030-color": `${secondary3Opacity030}`,
341 - "secondary4-opacity-005-color": `${secondary4Opacity005}`,
342 - "secondary4-opacity-010-color": `${secondary4Opacity010}`,
343 - "secondary4-opacity-020-color": `${secondary4Opacity020}`,
344 - "secondary4-opacity-030-color": `${secondary4Opacity030}`,
201 + for (const key of keys) {
202 + styleObject[`${key}-color`] = (state.colors[state.themeName] as Record<string, string>)[key]
203 + }
204 + }
205
346 - "border-small-050": `1px solid ${borderColor}`,
347 - "border-small-100": `1px solid ${divider010}`
206 + // add RGB values variant
207 + for (const [key, value] of Object.entries(styleObject)) {
208 + if (key.endsWith("-color")) {
209 + styleObject[`${key}-rgb`] = colorToArray(value, "rgb").join(" ")
210 + }
211 }
212 +
213 + return styleObject
214 }
frontend/src/types/theme.d.ts
-1
@@ -16,7 +16,6 @@ export enum ThemeNameEnum {
16 Light = "light"
17 }
18
19 -export type ColorType = "primary" | "info" | "success" | "warning" | "error"
19 export type ColorScene = "" | "Suppl" | "Hover" | "Pressed"
20 export type ColorKey = `${ColorType}Color${ColorScene}`
21 export type ThemeColor = Partial<Record<ColorKey, string>>
frontend/src/utils/auth.ts
+2
@@ -27,8 +27,10 @@ export function authCheck(route: RouteLocationNormalized) {
27 const { checkAuth, authRedirect, auth, roles }: RouteMetaAuth = route.meta
28 const authStore = useAuthStore()
29
30 + // Logout handling
31 if (route?.redirectedFrom?.name === "Logout") authStore.setLogout()
32
33 + // Auth check: if not logged or role not granted
34 const loginPath = `/login${window.location.search}`
35
36 if (auth && !authStore.isLogged) {
frontend/src/utils/index.ts
+1
@@ -16,6 +16,7 @@ export function file2Base64(blob: Blob): Promise<string> {
16 reader.onerror = error => reject(error)
17 })
18 }
19 +
20 export function isEnvDev() {
21 return process.env.NODE_ENV === "development"
22 }
frontend/src/utils/theme.ts
+58 -32
@@ -1,8 +1,10 @@
1 -import type { ColorAction, ColorKey, ColorType, ThemeColor } from "@/types/theme.d"
1 +import type { ColorAction, ColorKey, ThemeColor } from "@/types/theme.d"
2 import { colord } from "colord"
3 import _get from "lodash/get"
4
5 -export type PrimaryShade = "005" | "010" | "015" | "020" | "030" | "040" | "050" | "060"
5 +export const COLOR_SHADES = ["005", "010", "015", "020", "030", "040", "050", "060", "070", "080", "090"] as const
6 +
7 +export type ColorShade = (typeof COLOR_SHADES)[number]
8
9 export function toggleSidebarClass(
10 sidebarCollapsed: boolean,
@@ -17,37 +19,39 @@ export function toggleSidebarClass(
19 el.classList.toggle(classClose, sidebarCollapsed)
20 }
21
20 -export function hex2rgb(hex: string): number[] {
21 - const rgba = colord(hex).toRgb()
22 - return [rgba.r, rgba.g, rgba.b]
23 -}
24 -export function hex2hsl(hex: string): number[] {
25 - const hsl = colord(hex).toHsl()
26 - return [hsl.h, hsl.s, hsl.l]
22 +export function colorToArray(color: string, output: "rgb" | "hsl"): number[] {
23 + const colorObject = colord(color)
24 +
25 + switch (output) {
26 + case "rgb": {
27 + const { r, g, b } = colorObject.toRgb()
28 + return [r, g, b]
29 + }
30 + case "hsl": {
31 + const { h, s, l } = colorObject.toHsl()
32 + return [h, s, l]
33 + }
34 + default:
35 + throw new Error("Invalid output type")
36 + }
37 }
38
39 export function exposure(color: string, amount: number): string {
30 - if (amount >= 0) {
31 - return colord(color).lighten(amount).desaturate(amount).toHex()
32 - }
40 return colord(color)
34 - .lighten(amount)
35 - .desaturate(amount * -1)
41 + .lighten(amount) /* .desaturate(Math.abs(amount)) */
42 .toHex()
43 }
44
39 -export function exportPrimaryShades(color: string): { [key: string]: string } {
40 - const rgba = colord(color).toRgb()
41 - return {
42 - "005": colord({ r: rgba.r, g: rgba.g, b: rgba.b, a: 0.05 }).toRgbString(),
43 - "010": colord({ r: rgba.r, g: rgba.g, b: rgba.b, a: 0.1 }).toRgbString(),
44 - "015": colord({ r: rgba.r, g: rgba.g, b: rgba.b, a: 0.15 }).toRgbString(),
45 - "020": colord({ r: rgba.r, g: rgba.g, b: rgba.b, a: 0.2 }).toRgbString(),
46 - "030": colord({ r: rgba.r, g: rgba.g, b: rgba.b, a: 0.3 }).toRgbString(),
47 - "040": colord({ r: rgba.r, g: rgba.g, b: rgba.b, a: 0.4 }).toRgbString(),
48 - "050": colord({ r: rgba.r, g: rgba.g, b: rgba.b, a: 0.5 }).toRgbString(),
49 - "060": colord({ r: rgba.r, g: rgba.g, b: rgba.b, a: 0.6 }).toRgbString()
50 - }
45 +export function getColorAlphaShades(color: string): { [key in ColorShade]: string } {
46 + return COLOR_SHADES.reduce<{ [key in ColorShade]: string }>(
47 + (acc, shade) => {
48 + acc[shade] = colord(color)
49 + .alpha(Number.parseInt(shade, 10) / 100)
50 + .toRgbString()
51 + return acc
52 + },
53 + {} as { [key in ColorShade]: string }
54 + )
55 }
56
57 export function getTypeValue(origin: object, val: string) {
@@ -59,24 +63,46 @@ export function getTypeValue(origin: object, val: string) {
63 return val
64 }
65
62 -export function getThemeColors(colors: Record<ColorType, string>) {
66 +export function getThemeColors(colors: Record<string, string>) {
67 const colorActions: ColorAction[] = [
68 { scene: "", handler: color => color },
69 { scene: "Suppl", handler: color => exposure(color, 0.1) },
66 - { scene: "Hover", handler: color => exposure(color, 0.05) },
67 - { scene: "Pressed", handler: color => exposure(color, -0.2) }
70 + { scene: "Hover", handler: color => exposure(color, 0.08) },
71 + { scene: "Pressed", handler: color => exposure(color, -0.05) }
72 ]
73
74 const themeColor: ThemeColor = {}
75
72 - for (const colorType in colors) {
73 - const colorValue = colors[colorType as ColorType]
76 + for (const colorName in colors) {
77 + const colorValue = colors[colorName]
78
79 colorActions.forEach(action => {
76 - const colorKey: ColorKey = `${colorType as ColorType}Color${action.scene}`
80 + const colorKey: ColorKey = `${colorName}Color${action.scene}`
81 themeColor[colorKey] = action.handler(colorValue)
82 })
83 }
84
85 return themeColor
86 }
87 +
88 +/**
89 + * Generates an array of strings by expanding all values enclosed in parentheses
90 + *
91 + * @param input - The string to process, e.g. "brand-(seablue|green)-(10|20|50)"
92 + * @returns An array of expanded strings, e.g.
93 + * ["brand-seablue-10", "brand-seablue-20", ..., "brand-green-50"]
94 + */
95 +export function expandPattern(input: string): string[] {
96 + const match = input.match(/\(([^)]+)\)/)
97 + if (!match) {
98 + // If there are no more parentheses, returns the input as an array
99 + return [input]
100 + }
101 +
102 + // Expands the first group found
103 + const [fullMatch, options] = match
104 + const variants = options.split("|") // Splits the options by "|"
105 +
106 + // Replaces the first group with each option and calls recursively
107 + return variants.flatMap(option => expandPattern(input.replace(fullMatch, option)))
108 +}
frontend/src/views/Auth.vue
+2 -2
@@ -35,7 +35,7 @@ const align = ref<Align>("left")
35 const type = ref<FormType | undefined>(formType.value || undefined)
36
37 const themeStore = useThemeStore()
38 -const activeColor = computed(() => themeStore.primaryColor)
38 +const activeColor = computed(() => themeStore.style["primary-color"])
39 const authStore = useAuthStore()
40 const isLogged = computed(() => authStore.isLogged)
41
@@ -92,7 +92,7 @@ onBeforeMount(() => {
92 padding: 60px;
93 width: 100%;
94 max-width: 500px;
95 - background-color: var(--bg-color);
95 + background-color: var(--bg-default-color);
96 border-radius: 20px;
97 @apply shadow-xl;
98 }
frontend/src/views/Profile.vue
+4 -4
@@ -3,7 +3,7 @@
3 <n-card class="header flex flex-col" content-class="!p-0">
4 <div class="user-info flex flex-wrap">
5 <div class="propic">
6 - <n-avatar :size="100" :src="userPic" round />
6 + <n-avatar :size="100" :src="userPic" round :img-props="{ alt: 'avatar' }" />
7 <ImageCropper
8 v-if="propicEnabled"
9 v-slot="{ openCropper }"
@@ -104,7 +104,7 @@ function setCroppedImage(result: ImageCropperResult) {
104 gap: 30px;
105 padding: 30px;
106 padding-bottom: 20px;
107 - border-block-end: var(--border-small-050);
107 + border-block-end: 1px solid var(--border-color);
108 container-type: inline-size;
109
110 .propic {
@@ -116,14 +116,14 @@ function setCroppedImage(result: ImageCropperResult) {
116 align-items: center;
117 justify-content: center;
118 background-color: var(--primary-color);
119 - color: var(--bg-color);
119 + color: var(--bg-default-color);
120 position: absolute;
121 width: 26px;
122 height: 26px;
123 border-radius: 50%;
124 top: -1px;
125 right: -1px;
126 - border: 1px solid var(--bg-color);
126 + border: 1px solid var(--bg-default-color);
127 cursor: pointer;
128 }
129 }
frontend/src/views/agents/Agents.vue
+2 -2
@@ -229,7 +229,7 @@ onBeforeMount(() => {
229 position: absolute;
230 bottom: 0;
231 right: 0;
232 - background-color: var(--bg-body);
232 + background-color: var(--bg-body-color);
233 padding-left: var(--size);
234 padding-top: var(--size);
235 border-top-left-radius: var(--size);
@@ -247,7 +247,7 @@ onBeforeMount(() => {
247 background-image: radial-gradient(
248 circle at 0 0,
249 rgba(0, 0, 0, 0) calc(var(--size) - 1px),
250 - var(--bg-body) calc(var(--size) + 0px)
250 + var(--bg-body-color) calc(var(--size) + 0px)
251 );
252 }
253
frontend/tailwind.config.js
+49 -30
@@ -14,9 +14,16 @@ function getValue(origin, val) {
14 return val
15 }
16
17 +function remFromPX(px) {
18 + return {
19 + key: Number.parseFloat(_.toNumber(px / 4).toFixed(4)),
20 + rem: `${Number.parseFloat(_.toNumber(px / 16).toFixed(4))}rem`
21 + }
22 +}
23 +
24 export default {
25 content: ["./index.html", "./src/**/*.{vue,js,ts,jsx,tsx}"],
19 - darkMode: ["class"],
26 + darkMode: ["selector", `.theme-dark`],
27 theme: {
28 fontFamily: {
29 sans: ["var(--font-family)", "sans-serif"],
@@ -26,7 +33,30 @@ export default {
33 },
34 extend: {
35 colors: {
29 - primary: "var(--primary-color)"
36 + primary: "rgb(var(--primary-color-rgb))",
37 + success: "rgb(var(--success-color-rgb))",
38 + error: "rgb(var(--error-color-rgb))",
39 + warning: "rgb(var(--warning-color-rgb))",
40 + info: "rgb(var(--info-color-rgb))",
41 + border: "rgb(var(--border-color-rgb))",
42 + hover: "rgb(var(--hover-color-rgb))",
43 + extra: {
44 + 1: "rgb(var(--extra1-color-rgb))",
45 + 2: "rgb(var(--extra2-color-rgb))",
46 + 3: "rgb(var(--extra3-color-rgb))",
47 + 4: "rgb(var(--extra4-color-rgb))"
48 + }
49 + },
50 + backgroundColor: {
51 + default: "rgb(var(--bg-default-color-rgb))",
52 + secondary: "rgb(var(--bg-secondary-color-rgb))",
53 + body: "rgb(var(--bg-body-color-rgb))",
54 + sidebar: "rgb(var(--bg-sidebar-color-rgb))"
55 + },
56 + textColor: {
57 + default: "rgb(var(--fg-default-color-rgb))",
58 + secondary: "rgb(var(--fg-secondary-color-rgb))",
59 + tertiary: "rgb(var(--fg-tertiary-color-rgb))"
60 },
61 animation: {
62 fade: "fade 0.3s forwards"
@@ -37,55 +67,42 @@ export default {
67 to: { opacity: 1 }
68 }
69 },
40 - backgroundColor: {
41 - default: "var(--bg-color)",
42 - secondary: "var(--bg-secondary-color)"
43 - },
44 - textColor: {
45 - default: "var(--fg-color)",
46 - secondary: "var(--fg-secondary-color)",
47 - warning: "var(--warning-color)",
48 - error: "var(--error-color)",
49 - success: "var(--success-color)"
50 - },
51 - borderRadius: {
52 - default: "var(--border-radius)",
53 - small: "var(--border-radius-small)"
54 - },
70 screens: {
71 xs: "460px"
72 },
73 height: {
59 - 0.75: "0.1875rem",
60 - 150: "37.5rem",
74 + [remFromPX(3).key]: remFromPX(3).rem, // 0.75
75 + [remFromPX(600).key]: remFromPX(600).rem, // 150
76 "60vh": "60vh"
77 },
78 minHeight: {
79 114: "28.5rem",
65 - 120: "30rem"
66 - },
67 - width: {
68 - 5.5: "1.375rem",
69 - 150: "37.5rem",
70 - "90vw": "90vw"
71 - },
72 - spacing: {
73 - "20vh": "20vh",
74 - "50vw": "50vw"
80 + 120: "30rem",
81 + [remFromPX(548).key]: remFromPX(548).rem // 137
82 },
83 maxHeight: {
84 "50vh": "50vh",
85 106: "26.5rem",
86 125: "31.25rem",
80 - 150: "37.5rem"
87 + [remFromPX(600).key]: remFromPX(600).rem // 150
88 + },
89 + width: {
90 + [remFromPX(22).key]: remFromPX(22).rem, // 5.5
91 + [remFromPX(600).key]: remFromPX(600).rem, // 150
92 + "90vw": "90vw"
93 },
94 maxWidth: {
95 "90vw": "90vw"
96 + },
97 + spacing: {
98 + "20vh": "20vh",
99 + "50vw": "50vw"
100 }
101 }
102 },
103 safelist: [
104 "p-4",
105 + "py-4",
106 "!p-1",
107 "flex",
108 "flex-col",
@@ -99,6 +116,8 @@ export default {
116 "max-h-50vh",
117 "max-w-90vw",
118 "!h-0.75",
119 + "text-primary",
120 + "mx-1",
121 "basis-1/4",
122 "basis-1/5"
123 ],