@jjlmoya/utils-developer 1.17.0 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +4 -1
  4. package/src/index.ts +2 -0
  5. package/src/tests/locale_completeness.test.ts +2 -2
  6. package/src/tests/tool_validation.test.ts +2 -2
  7. package/src/tool/calculadoraTiempoDatos/data-time-calculator-web-speed-impact.css +498 -499
  8. package/src/tool/visualCssGridFlexboxGenerator/bibliography.astro +14 -0
  9. package/src/tool/visualCssGridFlexboxGenerator/bibliography.ts +20 -0
  10. package/src/tool/visualCssGridFlexboxGenerator/canvas.ts +103 -0
  11. package/src/tool/visualCssGridFlexboxGenerator/component.astro +218 -0
  12. package/src/tool/visualCssGridFlexboxGenerator/entry.ts +30 -0
  13. package/src/tool/visualCssGridFlexboxGenerator/i18n/de.ts +110 -0
  14. package/src/tool/visualCssGridFlexboxGenerator/i18n/en.ts +256 -0
  15. package/src/tool/visualCssGridFlexboxGenerator/i18n/es.ts +110 -0
  16. package/src/tool/visualCssGridFlexboxGenerator/i18n/fr.ts +110 -0
  17. package/src/tool/visualCssGridFlexboxGenerator/i18n/id.ts +110 -0
  18. package/src/tool/visualCssGridFlexboxGenerator/i18n/it.ts +110 -0
  19. package/src/tool/visualCssGridFlexboxGenerator/i18n/ja.ts +110 -0
  20. package/src/tool/visualCssGridFlexboxGenerator/i18n/ko.ts +110 -0
  21. package/src/tool/visualCssGridFlexboxGenerator/i18n/nl.ts +110 -0
  22. package/src/tool/visualCssGridFlexboxGenerator/i18n/pl.ts +110 -0
  23. package/src/tool/visualCssGridFlexboxGenerator/i18n/pt.ts +110 -0
  24. package/src/tool/visualCssGridFlexboxGenerator/i18n/ru.ts +110 -0
  25. package/src/tool/visualCssGridFlexboxGenerator/i18n/sv.ts +110 -0
  26. package/src/tool/visualCssGridFlexboxGenerator/i18n/tr.ts +110 -0
  27. package/src/tool/visualCssGridFlexboxGenerator/i18n/zh.ts +110 -0
  28. package/src/tool/visualCssGridFlexboxGenerator/index.ts +11 -0
  29. package/src/tool/visualCssGridFlexboxGenerator/interactions.ts +45 -0
  30. package/src/tool/visualCssGridFlexboxGenerator/logic.ts +49 -0
  31. package/src/tool/visualCssGridFlexboxGenerator/presets.ts +63 -0
  32. package/src/tool/visualCssGridFlexboxGenerator/seo.astro +15 -0
  33. package/src/tool/visualCssGridFlexboxGenerator/ui.ts +58 -0
  34. package/src/tool/visualCssGridFlexboxGenerator/visual-css-grid-flexbox-generator.css +816 -0
  35. package/src/tool/visualCssGridFlexboxGenerator/workspace.ts +192 -0
  36. package/src/tools.ts +2 -1
@@ -0,0 +1,816 @@
1
+ .vcg-root {
2
+ width: 100%;
3
+ min-height: 100%;
4
+ }
5
+
6
+ /* ---- Keyframes ---- */
7
+
8
+ @keyframes vcg-gradient-shift {
9
+ 0%, 100% { background-position: 0% 50%; }
10
+ 50% { background-position: 100% 50%; }
11
+ }
12
+
13
+ @keyframes vcg-item-enter {
14
+ from {
15
+ opacity: 0;
16
+ transform: scale(0.5) rotate(6deg);
17
+ }
18
+ to {
19
+ opacity: 1;
20
+ transform: scale(1) rotate(0deg);
21
+ }
22
+ }
23
+
24
+ @keyframes vcg-item-exit {
25
+ from {
26
+ opacity: 1;
27
+ transform: scale(1);
28
+ }
29
+ to {
30
+ opacity: 0;
31
+ transform: scale(0.5) rotate(-6deg);
32
+ }
33
+ }
34
+
35
+ @keyframes vcg-shake {
36
+ 0%, 100% { transform: translateX(0); }
37
+ 20% { transform: translateX(-7px); }
38
+ 40% { transform: translateX(7px); }
39
+ 60% { transform: translateX(-5px); }
40
+ 80% { transform: translateX(5px); }
41
+ }
42
+
43
+ @keyframes vcg-confetti-piece {
44
+ 0% {
45
+ opacity: 1;
46
+ transform: translate(0, 0) rotate(0deg) scale(1);
47
+ }
48
+ 100% {
49
+ opacity: 0;
50
+ transform: translate(var(--cx), var(--cy)) rotate(var(--cr)) scale(0);
51
+ }
52
+ }
53
+
54
+ @keyframes vcg-pulse-glow {
55
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(45, 212, 191, 0.5); }
56
+ 50% { box-shadow: 0 0 0 2px rgba(45, 212, 191, 0.25); }
57
+ }
58
+
59
+ @keyframes vcg-bounce-in {
60
+ 0% {
61
+ transform: scale(0.3);
62
+ opacity: 0;
63
+ }
64
+ 50% { transform: scale(1.08); }
65
+ 70% { transform: scale(0.94); }
66
+ 100% {
67
+ transform: scale(1);
68
+ opacity: 1;
69
+ }
70
+ }
71
+
72
+ @keyframes vcg-float {
73
+ 0%, 100% { transform: translateY(0); }
74
+ 50% { transform: translateY(-4px); }
75
+ }
76
+
77
+ /* ---- Card ---- */
78
+
79
+ .vcg-card {
80
+ display: grid;
81
+ gap: 1rem;
82
+ width: 100%;
83
+ padding: 0.85rem;
84
+ overflow: hidden;
85
+ background:
86
+ radial-gradient(circle at 12% 18%, rgba(45, 212, 191, 0.22), transparent 30%),
87
+ radial-gradient(circle at 88% 12%, rgba(251, 191, 36, 0.22), transparent 26%),
88
+ radial-gradient(circle at 50% 90%, rgba(99, 102, 241, 0.14), transparent 32%),
89
+ linear-gradient(135deg, rgb(248, 250, 252), rgb(239, 246, 255));
90
+ background-size: 100% 100%, 100% 100%, 100% 100%, 200% 200%;
91
+ border: 1px solid rgb(191, 219, 254);
92
+ border-radius: 1.25rem;
93
+ animation: vcg-gradient-shift 8s ease-in-out infinite;
94
+ }
95
+
96
+ .theme-dark .vcg-card {
97
+ background:
98
+ radial-gradient(circle at 12% 18%, rgba(45, 212, 191, 0.16), transparent 30%),
99
+ radial-gradient(circle at 88% 12%, rgba(251, 191, 36, 0.13), transparent 26%),
100
+ radial-gradient(circle at 50% 90%, rgba(99, 102, 241, 0.1), transparent 32%),
101
+ linear-gradient(135deg, rgb(8, 13, 24), rgb(15, 23, 42));
102
+ border-color: rgb(51, 65, 85);
103
+ }
104
+
105
+ /* ---- Panels ---- */
106
+
107
+ .vcg-stage-panel,
108
+ .vcg-control-panel {
109
+ min-width: 0;
110
+ background: rgba(255, 255, 255, 0.82);
111
+ border: 1px solid rgba(148, 163, 184, 0.32);
112
+ border-radius: 1rem;
113
+ box-shadow: 0 18px 46px rgba(15, 23, 42, 0.08);
114
+ }
115
+
116
+ .theme-dark .vcg-stage-panel,
117
+ .theme-dark .vcg-control-panel {
118
+ background: rgba(15, 23, 42, 0.8);
119
+ border-color: rgba(71, 85, 105, 0.7);
120
+ box-shadow: none;
121
+ }
122
+
123
+ .vcg-stage-panel {
124
+ display: grid;
125
+ gap: 0.8rem;
126
+ padding: 0.85rem;
127
+ align-self: start;
128
+ grid-template-rows: auto auto 1fr;
129
+ min-height: calc(100vh - 4rem);
130
+ }
131
+
132
+ /* ---- Toolbar ---- */
133
+
134
+ .vcg-toolbar,
135
+ .vcg-actions,
136
+ .vcg-mode {
137
+ display: flex;
138
+ gap: 0.5rem;
139
+ align-items: center;
140
+ }
141
+
142
+ .vcg-toolbar {
143
+ justify-content: space-between;
144
+ flex-wrap: wrap;
145
+ }
146
+
147
+ .vcg-mode {
148
+ padding: 0.25rem;
149
+ background: rgb(226, 232, 240);
150
+ border-radius: 0.85rem;
151
+ }
152
+
153
+ .theme-dark .vcg-mode {
154
+ background: rgb(30, 41, 59);
155
+ }
156
+
157
+ .vcg-mode-button,
158
+ .vcg-icon-button,
159
+ .vcg-copy-button,
160
+ .vcg-preset-button {
161
+ display: inline-flex;
162
+ align-items: center;
163
+ justify-content: center;
164
+ min-height: 2.35rem;
165
+ color: rgb(30, 41, 59);
166
+ cursor: pointer;
167
+ background: #fff;
168
+ border: 1px solid rgb(203, 213, 225);
169
+ border-radius: 0.7rem;
170
+ transition: transform 0.15s, box-shadow 0.15s, background 0.15s;
171
+ }
172
+
173
+ .vcg-mode-button,
174
+ .vcg-preset-button {
175
+ gap: 0.35rem;
176
+ padding: 0 0.8rem;
177
+ font-weight: 800;
178
+ }
179
+
180
+ .vcg-mode-button svg,
181
+ .vcg-icon-button svg,
182
+ .vcg-copy-button svg,
183
+ .vcg-preset-button svg {
184
+ width: 1rem;
185
+ height: 1rem;
186
+ }
187
+
188
+ .vcg-mode-button.vcg-active {
189
+ color: #fff;
190
+ background: rgb(8, 145, 178);
191
+ border-color: rgb(8, 145, 178);
192
+ }
193
+
194
+ .vcg-icon-button,
195
+ .vcg-copy-button {
196
+ width: 2.35rem;
197
+ }
198
+
199
+ .vcg-icon-button:hover,
200
+ .vcg-mode-button:hover,
201
+ .vcg-preset-button:hover {
202
+ transform: translateY(-1px);
203
+ box-shadow: 0 4px 12px rgba(15, 23, 42, 0.1);
204
+ }
205
+
206
+ .vcg-icon-button:active,
207
+ .vcg-preset-button:active {
208
+ transform: translateY(0) scale(0.96);
209
+ }
210
+
211
+ .theme-dark .vcg-mode-button,
212
+ .theme-dark .vcg-icon-button,
213
+ .theme-dark .vcg-copy-button,
214
+ .theme-dark .vcg-preset-button {
215
+ color: rgb(226, 232, 240);
216
+ background: rgb(15, 23, 42);
217
+ border-color: rgb(51, 65, 85);
218
+ }
219
+
220
+ .theme-dark .vcg-mode-button.vcg-active {
221
+ color: rgb(8, 13, 24);
222
+ background: rgb(45, 212, 191);
223
+ border-color: rgb(45, 212, 191);
224
+ }
225
+
226
+ /* ---- Presets ---- */
227
+
228
+ .vcg-presets {
229
+ display: flex;
230
+ flex-wrap: nowrap;
231
+ gap: 0.4rem;
232
+ margin-top: 0.35rem;
233
+ overflow-x: auto;
234
+ }
235
+
236
+ .vcg-preset-button {
237
+ flex: none;
238
+ width: 82px;
239
+ font-size: 0.72rem;
240
+ font-weight: 750;
241
+ padding: 0 0.4rem;
242
+ min-height: 2rem;
243
+ white-space: nowrap;
244
+ text-overflow: ellipsis;
245
+ background: rgba(248, 250, 252, 0.9);
246
+ transition: transform 0.15s, box-shadow 0.15s, background 0.15s, border-color 0.15s, color 0.15s;
247
+ }
248
+
249
+ .vcg-preset-button:hover {
250
+ background: rgb(224, 231, 255);
251
+ border-color: rgb(99, 102, 241);
252
+ color: rgb(99, 102, 241);
253
+ }
254
+
255
+ .vcg-preset-button.vcg-preset-active {
256
+ background: rgb(99, 102, 241);
257
+ color: #fff;
258
+ border-color: rgb(99, 102, 241);
259
+ }
260
+
261
+ .theme-dark .vcg-preset-button {
262
+ background: rgba(30, 41, 59, 0.9);
263
+ }
264
+
265
+ .theme-dark .vcg-preset-button:hover {
266
+ background: rgba(99, 102, 241, 0.2);
267
+ border-color: rgb(99, 102, 241);
268
+ color: rgb(165, 180, 252);
269
+ }
270
+
271
+ .theme-dark .vcg-preset-button.vcg-preset-active {
272
+ background: rgb(99, 102, 241);
273
+ color: #fff;
274
+ }
275
+
276
+ /* ---- Canvas ---- */
277
+
278
+ .vcg-canvas-shell {
279
+ display: grid;
280
+ place-items: center;
281
+ min-height: 25rem;
282
+ padding: 1rem;
283
+ overflow: auto;
284
+ background:
285
+ linear-gradient(90deg, rgba(148, 163, 184, 0.16) 1px, transparent 1px),
286
+ linear-gradient(rgba(148, 163, 184, 0.16) 1px, transparent 1px);
287
+ background-color: rgba(241, 245, 249, 0.88);
288
+ background-size: 24px 24px;
289
+ background-position: 0 0;
290
+ border: 1px dashed rgb(148, 163, 184);
291
+ border-radius: 1rem;
292
+ transition: background-color 0.3s;
293
+ }
294
+
295
+ .theme-dark .vcg-canvas-shell {
296
+ background-color: rgba(15, 23, 42, 0.75);
297
+ border-color: rgb(71, 85, 105);
298
+ }
299
+
300
+ .vcg-canvas-shell.vcg-drag-over {
301
+ background-color: rgba(45, 212, 191, 0.08);
302
+ border-color: rgb(45, 212, 191);
303
+ border-style: solid;
304
+ }
305
+
306
+ .vcg-canvas {
307
+ position: relative;
308
+ display: flex;
309
+ flex-wrap: wrap;
310
+ gap: 24px;
311
+ align-items: center;
312
+ justify-content: center;
313
+ box-sizing: border-box;
314
+ width: min(760px, 100%);
315
+ min-height: 380px;
316
+ padding: 1rem;
317
+ resize: both;
318
+ overflow: auto;
319
+ background: rgba(255, 255, 255, 0.9);
320
+ border: 2px solid rgb(14, 165, 233);
321
+ border-radius: 1rem;
322
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.8), 0 18px 40px rgba(15, 23, 42, 0.12);
323
+ transition: border-color 0.25s;
324
+ }
325
+
326
+ .theme-dark .vcg-canvas {
327
+ background: rgba(2, 6, 23, 0.9);
328
+ border-color: rgb(45, 212, 191);
329
+ box-shadow: inset 0 0 0 1px rgba(45, 212, 191, 0.15);
330
+ }
331
+
332
+ .vcg-canvas::after {
333
+ position: absolute;
334
+ right: 0.55rem;
335
+ bottom: 0.45rem;
336
+ width: 1rem;
337
+ height: 1rem;
338
+ content: "";
339
+ border-right: 3px solid rgb(14, 165, 233);
340
+ border-bottom: 3px solid rgb(14, 165, 233);
341
+ opacity: 0.8;
342
+ transition: opacity 0.2s;
343
+ }
344
+
345
+ .vcg-canvas:hover::after {
346
+ opacity: 1;
347
+ }
348
+
349
+ /* ---- Items ---- */
350
+
351
+ .vcg-item {
352
+ display: grid;
353
+ place-items: center;
354
+ min-width: 104px;
355
+ min-height: 104px;
356
+ color: rgb(15, 23, 42);
357
+ cursor: default;
358
+ user-select: none;
359
+ background:
360
+ linear-gradient(135deg, rgba(255, 255, 255, 0.74), rgba(255, 255, 255, 0.28)),
361
+ linear-gradient(135deg, rgb(45, 212, 191), rgb(251, 191, 36));
362
+ border: 2px solid rgba(15, 23, 42, 0.14);
363
+ border-radius: 1rem;
364
+ box-shadow: 0 16px 30px rgba(15, 23, 42, 0.16);
365
+ transition: transform 0.22s cubic-bezier(0.34, 1.56, 0.64, 1),
366
+ box-shadow 0.22s,
367
+ opacity 0.22s,
368
+ border-color 0.22s;
369
+ will-change: transform;
370
+ }
371
+
372
+ .vcg-item:nth-child(1) {
373
+ background:
374
+ linear-gradient(135deg, rgba(255, 255, 255, 0.74), rgba(255, 255, 255, 0.28)),
375
+ linear-gradient(135deg, rgb(45, 212, 191), rgb(20, 184, 166));
376
+ }
377
+
378
+ .vcg-item:nth-child(2) {
379
+ background:
380
+ linear-gradient(135deg, rgba(255, 255, 255, 0.74), rgba(255, 255, 255, 0.28)),
381
+ linear-gradient(135deg, rgb(96, 165, 250), rgb(99, 102, 241));
382
+ }
383
+
384
+ .vcg-item:nth-child(3) {
385
+ background:
386
+ linear-gradient(135deg, rgba(255, 255, 255, 0.74), rgba(255, 255, 255, 0.28)),
387
+ linear-gradient(135deg, rgb(251, 191, 36), rgb(245, 158, 11));
388
+ }
389
+
390
+ .vcg-item:nth-child(4) {
391
+ background:
392
+ linear-gradient(135deg, rgba(255, 255, 255, 0.74), rgba(255, 255, 255, 0.28)),
393
+ linear-gradient(135deg, rgb(244, 114, 182), rgb(217, 70, 239));
394
+ }
395
+
396
+ .vcg-item:nth-child(5) {
397
+ background:
398
+ linear-gradient(135deg, rgba(255, 255, 255, 0.74), rgba(255, 255, 255, 0.28)),
399
+ linear-gradient(135deg, rgb(52, 211, 153), rgb(16, 185, 129));
400
+ }
401
+
402
+ .vcg-item:nth-child(6) {
403
+ background:
404
+ linear-gradient(135deg, rgba(255, 255, 255, 0.74), rgba(255, 255, 255, 0.28)),
405
+ linear-gradient(135deg, rgb(251, 146, 60), rgb(234, 88, 12));
406
+ }
407
+
408
+ .vcg-item:nth-child(7) {
409
+ background:
410
+ linear-gradient(135deg, rgba(255, 255, 255, 0.74), rgba(255, 255, 255, 0.28)),
411
+ linear-gradient(135deg, rgb(167, 139, 250), rgb(139, 92, 246));
412
+ }
413
+
414
+ .vcg-item:nth-child(8) {
415
+ background:
416
+ linear-gradient(135deg, rgba(255, 255, 255, 0.74), rgba(255, 255, 255, 0.28)),
417
+ linear-gradient(135deg, rgb(34, 211, 238), rgb(14, 165, 233));
418
+ }
419
+
420
+ .vcg-item:nth-child(9) {
421
+ background:
422
+ linear-gradient(135deg, rgba(255, 255, 255, 0.74), rgba(255, 255, 255, 0.28)),
423
+ linear-gradient(135deg, rgb(253, 224, 71), rgb(250, 204, 21));
424
+ }
425
+
426
+ .vcg-item:hover {
427
+ transform: translateY(-3px);
428
+ box-shadow: 0 22px 42px rgba(15, 23, 42, 0.2);
429
+ }
430
+
431
+ .vcg-item span {
432
+ padding: 0.35rem 0.65rem;
433
+ font-size: 0.9rem;
434
+ font-weight: 900;
435
+ background: rgba(255, 255, 255, 0.72);
436
+ border-radius: 999px;
437
+ pointer-events: none;
438
+ }
439
+
440
+ .vcg-item.vcg-enter {
441
+ animation: vcg-item-enter 0.35s cubic-bezier(0.34, 1.56, 0.64, 1) both;
442
+ }
443
+
444
+ .vcg-item.vcg-exit {
445
+ animation: vcg-item-exit 0.25s ease-in both;
446
+ }
447
+
448
+ .vcg-item.vcg-insert-before {
449
+ border-left: 4px solid rgb(45, 212, 191);
450
+ }
451
+
452
+ .vcg-item.vcg-insert-after {
453
+ border-right: 4px solid rgb(45, 212, 191);
454
+ }
455
+
456
+ .vcg-item.vcg-spanned {
457
+ position: relative;
458
+ }
459
+
460
+ .vcg-item.vcg-spanned::before {
461
+ position: absolute;
462
+ top: 0.35rem;
463
+ right: 0.5rem;
464
+ padding: 0.1rem 0.4rem;
465
+ font-size: 0.68rem;
466
+ font-weight: 900;
467
+ color: #fff;
468
+ content: attr(data-span) 'x';
469
+ background: rgba(15, 23, 42, 0.55);
470
+ border-radius: 999px;
471
+ }
472
+
473
+ .theme-dark .vcg-item.vcg-insert-before {
474
+ border-left-color: rgb(45, 212, 191);
475
+ }
476
+
477
+ .theme-dark .vcg-item.vcg-insert-after {
478
+ border-right-color: rgb(45, 212, 191);
479
+ }
480
+
481
+ /* ---- Theme-dark items ---- */
482
+
483
+ .theme-dark .vcg-item {
484
+ color: rgb(226, 232, 240);
485
+ border-color: rgba(226, 232, 240, 0.12);
486
+ }
487
+
488
+ .theme-dark .vcg-item:nth-child(1) {
489
+ background:
490
+ linear-gradient(135deg, rgba(15, 23, 42, 0.64), rgba(15, 23, 42, 0.18)),
491
+ linear-gradient(135deg, rgb(20, 184, 166), rgb(13, 148, 136));
492
+ }
493
+
494
+ .theme-dark .vcg-item:nth-child(2) {
495
+ background:
496
+ linear-gradient(135deg, rgba(15, 23, 42, 0.64), rgba(15, 23, 42, 0.18)),
497
+ linear-gradient(135deg, rgb(96, 165, 250), rgb(79, 70, 229));
498
+ }
499
+
500
+ .theme-dark .vcg-item:nth-child(3) {
501
+ background:
502
+ linear-gradient(135deg, rgba(15, 23, 42, 0.64), rgba(15, 23, 42, 0.18)),
503
+ linear-gradient(135deg, rgb(251, 191, 36), rgb(217, 119, 6));
504
+ }
505
+
506
+ .theme-dark .vcg-item:nth-child(4) {
507
+ background:
508
+ linear-gradient(135deg, rgba(15, 23, 42, 0.64), rgba(15, 23, 42, 0.18)),
509
+ linear-gradient(135deg, rgb(236, 72, 153), rgb(192, 38, 211));
510
+ }
511
+
512
+ .theme-dark .vcg-item:nth-child(5) {
513
+ background:
514
+ linear-gradient(135deg, rgba(15, 23, 42, 0.64), rgba(15, 23, 42, 0.18)),
515
+ linear-gradient(135deg, rgb(52, 211, 153), rgb(4, 120, 87));
516
+ }
517
+
518
+ .theme-dark .vcg-item:nth-child(6) {
519
+ background:
520
+ linear-gradient(135deg, rgba(15, 23, 42, 0.64), rgba(15, 23, 42, 0.18)),
521
+ linear-gradient(135deg, rgb(251, 146, 60), rgb(194, 65, 12));
522
+ }
523
+
524
+ .theme-dark .vcg-item:nth-child(7) {
525
+ background:
526
+ linear-gradient(135deg, rgba(15, 23, 42, 0.64), rgba(15, 23, 42, 0.18)),
527
+ linear-gradient(135deg, rgb(167, 139, 250), rgb(109, 40, 217));
528
+ }
529
+
530
+ .theme-dark .vcg-item:nth-child(8) {
531
+ background:
532
+ linear-gradient(135deg, rgba(15, 23, 42, 0.64), rgba(15, 23, 42, 0.18)),
533
+ linear-gradient(135deg, rgb(34, 211, 238), rgb(8, 145, 178));
534
+ }
535
+
536
+ .theme-dark .vcg-item:nth-child(9) {
537
+ background:
538
+ linear-gradient(135deg, rgba(15, 23, 42, 0.64), rgba(15, 23, 42, 0.18)),
539
+ linear-gradient(135deg, rgb(253, 224, 71), rgb(202, 138, 4));
540
+ }
541
+
542
+ .theme-dark .vcg-item span {
543
+ background: rgba(15, 23, 42, 0.62);
544
+ }
545
+
546
+ /* ---- Hint ---- */
547
+
548
+ .vcg-hint {
549
+ margin: 0;
550
+ font-size: 0.84rem;
551
+ color: rgb(71, 85, 105);
552
+ transition: color 0.3s;
553
+ }
554
+
555
+ .theme-dark .vcg-hint {
556
+ color: rgb(148, 163, 184);
557
+ }
558
+
559
+ .vcg-hint.vcg-shake {
560
+ animation: vcg-shake 0.5s ease-in-out;
561
+ color: rgb(239, 68, 68);
562
+ }
563
+
564
+ /* ---- Controls ---- */
565
+
566
+ .vcg-control-panel {
567
+ display: grid;
568
+ gap: 1rem;
569
+ padding: 0.85rem;
570
+ }
571
+
572
+ .vcg-slider-grid,
573
+ .vcg-select-grid {
574
+ display: grid;
575
+ gap: 0.75rem;
576
+ }
577
+
578
+ .vcg-control,
579
+ .vcg-select-wrap {
580
+ display: grid;
581
+ gap: 0.45rem;
582
+ padding: 0.75rem;
583
+ background: rgba(248, 250, 252, 0.86);
584
+ border: 1px solid rgba(203, 213, 225, 0.86);
585
+ border-radius: 0.9rem;
586
+ transition: border-color 0.2s, box-shadow 0.2s;
587
+ }
588
+
589
+ .vcg-control:focus-within,
590
+ .vcg-select-wrap:focus-within {
591
+ border-color: rgb(45, 212, 191);
592
+ box-shadow: 0 0 0 3px rgba(45, 212, 191, 0.15);
593
+ }
594
+
595
+ .theme-dark .vcg-control,
596
+ .theme-dark .vcg-select-wrap {
597
+ background: rgba(30, 41, 59, 0.76);
598
+ border-color: rgba(71, 85, 105, 0.76);
599
+ }
600
+
601
+ .theme-dark .vcg-control:focus-within,
602
+ .theme-dark .vcg-select-wrap:focus-within {
603
+ border-color: rgb(45, 212, 191);
604
+ box-shadow: 0 0 0 3px rgba(45, 212, 191, 0.18);
605
+ }
606
+
607
+ .vcg-control span,
608
+ .vcg-select-wrap span {
609
+ font-size: 0.76rem;
610
+ font-weight: 850;
611
+ color: rgb(71, 85, 105);
612
+ }
613
+
614
+ .vcg-control strong {
615
+ font-size: 1rem;
616
+ color: rgb(15, 23, 42);
617
+ }
618
+
619
+ .theme-dark .vcg-control span,
620
+ .theme-dark .vcg-select-wrap span {
621
+ color: rgb(148, 163, 184);
622
+ }
623
+
624
+ .theme-dark .vcg-control strong {
625
+ color: rgb(226, 232, 240);
626
+ }
627
+
628
+ .vcg-control input[type="range"] {
629
+ width: 100%;
630
+ accent-color: rgb(8, 145, 178);
631
+ cursor: pointer;
632
+ }
633
+
634
+ .vcg-select {
635
+ width: 100%;
636
+ min-height: 2.35rem;
637
+ padding: 0 0.65rem;
638
+ color: rgb(15, 23, 42);
639
+ background: #fff;
640
+ border: 1px solid rgb(203, 213, 225);
641
+ border-radius: 0.65rem;
642
+ cursor: pointer;
643
+ font-size: 0.85rem;
644
+ transition: border-color 0.2s;
645
+ }
646
+
647
+ .theme-dark .vcg-select {
648
+ color: rgb(226, 232, 240);
649
+ background: rgb(15, 23, 42);
650
+ border-color: rgb(51, 65, 85);
651
+ }
652
+
653
+ .vcg-grid-only,
654
+ .vcg-flex-only {
655
+ transition: opacity 0.25s, max-height 0.25s, margin 0.25s, padding 0.25s;
656
+ }
657
+
658
+ .vcg-grid-only.vcg-hidden,
659
+ .vcg-flex-only.vcg-hidden {
660
+ overflow: hidden;
661
+ max-height: 0;
662
+ margin: 0;
663
+ padding: 0;
664
+ opacity: 0;
665
+ border-width: 0;
666
+ }
667
+
668
+ .vcg-grid-only:not(.vcg-hidden),
669
+ .vcg-flex-only:not(.vcg-hidden) {
670
+ max-height: 10rem;
671
+ opacity: 1;
672
+ }
673
+
674
+ /* ---- Code panel ---- */
675
+
676
+ .vcg-code-panel {
677
+ overflow: hidden;
678
+ background: rgb(15, 23, 42);
679
+ border-radius: 0.95rem;
680
+ transition: box-shadow 0.3s;
681
+ }
682
+
683
+ .vcg-code-panel.vcg-code-updated {
684
+ animation: vcg-pulse-glow 0.6s ease-in-out;
685
+ }
686
+
687
+ .vcg-code-header {
688
+ display: flex;
689
+ align-items: center;
690
+ justify-content: space-between;
691
+ padding: 0.75rem 0.85rem;
692
+ border-bottom: 1px solid rgba(148, 163, 184, 0.24);
693
+ }
694
+
695
+ .vcg-code-header h2 {
696
+ margin: 0;
697
+ font-size: 0.92rem;
698
+ color: rgb(226, 232, 240);
699
+ }
700
+
701
+ .vcg-copy-button {
702
+ position: relative;
703
+ color: rgb(226, 232, 240);
704
+ background: rgba(30, 41, 59, 0.9);
705
+ border-color: rgba(148, 163, 184, 0.32);
706
+ transition: background 0.2s, border-color 0.2s, transform 0.15s;
707
+ }
708
+
709
+ .vcg-copy-button:hover {
710
+ background: rgba(45, 212, 191, 0.2);
711
+ border-color: rgb(45, 212, 191);
712
+ }
713
+
714
+ .vcg-copy-button.vcg-copied {
715
+ animation: vcg-bounce-in 0.4s ease-in-out;
716
+ background: rgb(45, 212, 191);
717
+ border-color: rgb(45, 212, 191);
718
+ color: rgb(15, 23, 42);
719
+ }
720
+
721
+ .vcg-copy-button[data-copied]::after {
722
+ position: absolute;
723
+ right: 0;
724
+ bottom: calc(100% + 0.35rem);
725
+ padding: 0.25rem 0.5rem;
726
+ font-size: 0.72rem;
727
+ color: rgb(15, 23, 42);
728
+ white-space: nowrap;
729
+ content: attr(data-copied);
730
+ background: rgb(45, 212, 191);
731
+ border-radius: 0.45rem;
732
+ animation: vcg-bounce-in 0.3s ease-in-out;
733
+ }
734
+
735
+ .vcg-code {
736
+ min-height: 15rem;
737
+ padding: 1rem;
738
+ margin: 0;
739
+ overflow: auto;
740
+ font-size: 0.8rem;
741
+ line-height: 1.58;
742
+ color: rgb(226, 232, 240);
743
+ white-space: pre-wrap;
744
+ }
745
+
746
+ /* ---- Confetti container ---- */
747
+
748
+ .vcg-confetti-container {
749
+ position: fixed;
750
+ inset: 0;
751
+ z-index: 99999;
752
+ pointer-events: none;
753
+ overflow: hidden;
754
+ }
755
+
756
+ .vcg-confetti-piece {
757
+ position: absolute;
758
+ width: 8px;
759
+ height: 8px;
760
+ border-radius: 2px;
761
+ animation: vcg-confetti-piece 0.8s ease-out both;
762
+ }
763
+
764
+ /* ---- Responsive ---- */
765
+
766
+ @media (min-width: 980px) {
767
+ .vcg-card {
768
+ grid-template-columns: minmax(0, 1.35fr) minmax(23rem, 0.65fr);
769
+ padding: 1rem;
770
+ }
771
+
772
+ .vcg-slider-grid {
773
+ grid-template-columns: repeat(2, minmax(0, 1fr));
774
+ }
775
+
776
+ .vcg-select-grid {
777
+ grid-template-columns: repeat(2, minmax(0, 1fr));
778
+ }
779
+ }
780
+
781
+ @media (max-width: 640px) {
782
+ .vcg-toolbar,
783
+ .vcg-actions,
784
+ .vcg-mode {
785
+ flex-wrap: wrap;
786
+ }
787
+
788
+ .vcg-mode,
789
+ .vcg-mode-button {
790
+ flex: 1 1 auto;
791
+ }
792
+
793
+ .vcg-canvas-shell {
794
+ min-height: 20rem;
795
+ padding: 0.55rem;
796
+ }
797
+
798
+ .vcg-canvas {
799
+ resize: vertical;
800
+ }
801
+
802
+ .vcg-presets {
803
+ gap: 0.25rem;
804
+ }
805
+
806
+ .vcg-preset-button {
807
+ font-size: 0.68rem;
808
+ padding: 0 0.4rem;
809
+ min-height: 1.75rem;
810
+ }
811
+
812
+ .vcg-preset-button svg {
813
+ width: 0.8rem;
814
+ height: 0.8rem;
815
+ }
816
+ }