@proyecto-viviana/ui 0.3.2 → 0.3.3

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 (76) hide show
  1. package/dist/components.css +1077 -1077
  2. package/dist/index.js +236 -249
  3. package/dist/index.js.map +3 -3
  4. package/dist/index.ssr.js +78 -81
  5. package/dist/index.ssr.js.map +3 -3
  6. package/dist/radio/index.d.ts +12 -27
  7. package/dist/radio/index.d.ts.map +1 -1
  8. package/dist/test-utils/index.d.ts +2 -2
  9. package/dist/test-utils/index.d.ts.map +1 -1
  10. package/package.json +13 -12
  11. package/src/alert/index.tsx +48 -0
  12. package/src/assets/favicon.png +0 -0
  13. package/src/assets/fire.gif +0 -0
  14. package/src/autocomplete/index.tsx +313 -0
  15. package/src/avatar/index.tsx +75 -0
  16. package/src/badge/index.tsx +43 -0
  17. package/src/breadcrumbs/index.tsx +207 -0
  18. package/src/button/Button.tsx +74 -0
  19. package/src/button/index.ts +2 -0
  20. package/src/button/types.ts +24 -0
  21. package/src/calendar/DateField.tsx +200 -0
  22. package/src/calendar/DatePicker.tsx +298 -0
  23. package/src/calendar/RangeCalendar.tsx +236 -0
  24. package/src/calendar/TimeField.tsx +196 -0
  25. package/src/calendar/index.tsx +223 -0
  26. package/src/checkbox/index.tsx +257 -0
  27. package/src/color/index.tsx +687 -0
  28. package/src/combobox/index.tsx +383 -0
  29. package/src/components.css +1077 -0
  30. package/src/custom/calendar-card/index.tsx +66 -0
  31. package/src/custom/chip/index.tsx +46 -0
  32. package/src/custom/conversation/index.tsx +105 -0
  33. package/src/custom/event-card/index.tsx +132 -0
  34. package/src/custom/header/index.tsx +33 -0
  35. package/src/custom/lateral-nav/index.tsx +88 -0
  36. package/src/custom/logo/index.tsx +58 -0
  37. package/src/custom/nav-header/index.tsx +42 -0
  38. package/src/custom/page-layout/index.tsx +29 -0
  39. package/src/custom/profile-card/index.tsx +64 -0
  40. package/src/custom/project-card/index.tsx +59 -0
  41. package/src/custom/timeline-item/index.tsx +105 -0
  42. package/src/dialog/Dialog.tsx +260 -0
  43. package/src/dialog/index.tsx +3 -0
  44. package/src/disclosure/index.tsx +307 -0
  45. package/src/gridlist/index.tsx +403 -0
  46. package/src/icon/icons/GitHubIcon.tsx +20 -0
  47. package/src/icon/index.tsx +48 -0
  48. package/src/index.ts +322 -0
  49. package/src/landmark/index.tsx +231 -0
  50. package/src/link/index.tsx +130 -0
  51. package/src/listbox/index.tsx +231 -0
  52. package/src/menu/index.tsx +297 -0
  53. package/src/meter/index.tsx +163 -0
  54. package/src/numberfield/index.tsx +482 -0
  55. package/src/popover/index.tsx +260 -0
  56. package/src/progress-bar/index.tsx +169 -0
  57. package/src/radio/index.tsx +173 -0
  58. package/src/searchfield/index.tsx +453 -0
  59. package/src/select/index.tsx +349 -0
  60. package/src/separator/index.tsx +141 -0
  61. package/src/slider/index.tsx +382 -0
  62. package/src/styles.css +450 -0
  63. package/src/switch/ToggleSwitch.tsx +112 -0
  64. package/src/switch/index.tsx +90 -0
  65. package/src/table/index.tsx +531 -0
  66. package/src/tabs/index.tsx +273 -0
  67. package/src/tag-group/index.tsx +240 -0
  68. package/src/test-utils/index.ts +40 -0
  69. package/src/textfield/index.tsx +211 -0
  70. package/src/theme.css +101 -0
  71. package/src/toast/index.tsx +324 -0
  72. package/src/toolbar/index.tsx +108 -0
  73. package/src/tooltip/index.tsx +197 -0
  74. package/src/tree/index.tsx +494 -0
  75. package/dist/index.jsx +0 -6658
  76. package/dist/index.jsx.map +0 -7
@@ -1,1077 +1,1077 @@
1
- /*
2
- * Viviana UI Component Styles
3
- *
4
- * Pure CSS component styles that use theme CSS variables.
5
- * These styles work with any theme that defines the required variables.
6
- */
7
-
8
- /* ===== BASE TYPOGRAPHY ===== */
9
- /* Sen = body text, paragraphs, descriptions */
10
- /* Jost = titles, headings, labels, buttons */
11
-
12
- .font-sen {
13
- font-family: 'Sen', sans-serif;
14
- }
15
-
16
- .font-jost {
17
- font-family: 'Jost', sans-serif;
18
- }
19
-
20
- /* Base body font */
21
- .vui-body {
22
- font-family: 'Sen', sans-serif;
23
- }
24
-
25
- /* Titles and headings */
26
- .vui-title {
27
- font-family: 'Jost', sans-serif;
28
- }
29
-
30
- /* ===== CUSTOM SHADOWS ===== */
31
- .drop-shadow-title-card {
32
- text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
33
- }
34
-
35
- .drop-shadow-logo {
36
- filter: drop-shadow(0 0 10px rgba(223, 92, 154, 0.8));
37
- }
38
-
39
-
40
- /* ===== BUTTON COMPONENT ===== */
41
- .vui-button {
42
- position: relative;
43
- font-family: 'Jost', sans-serif;
44
- display: inline-flex;
45
- align-items: center;
46
- justify-content: center;
47
- white-space: nowrap;
48
- letter-spacing: 0.05em;
49
- font-weight: 500;
50
- text-transform: uppercase;
51
- border-radius: 0.5rem;
52
- transition: all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
53
- cursor: pointer;
54
- border: none;
55
- outline: none;
56
- overflow: hidden;
57
- }
58
-
59
- /* Shimmer overlay for hover effect */
60
- .vui-button::before {
61
- content: '';
62
- position: absolute;
63
- inset: 0;
64
- background: linear-gradient(
65
- 90deg,
66
- transparent 0%,
67
- rgba(255, 255, 255, 0.1) 50%,
68
- transparent 100%
69
- );
70
- transform: translateX(-100%);
71
- transition: transform 0.5s ease;
72
- }
73
-
74
- .vui-button:hover::before {
75
- transform: translateX(100%);
76
- }
77
-
78
- .vui-button:focus-visible {
79
- outline: none;
80
- box-shadow: 0 0 0 2px var(--color-bg-400),
81
- 0 0 0 4px var(--color-accent-300),
82
- 0 0 20px rgba(223, 92, 154, 0.3);
83
- }
84
-
85
- .vui-button:disabled {
86
- opacity: 0.5;
87
- cursor: not-allowed;
88
- }
89
-
90
- .vui-button:disabled::before {
91
- display: none;
92
- }
93
-
94
- .vui-button.is-pressed {
95
- transform: scale(0.97);
96
- }
97
-
98
- /* Size variants */
99
- .vui-button--sm {
100
- padding: 0.375rem 0.75rem;
101
- font-size: 0.875rem;
102
- }
103
-
104
- .vui-button--md {
105
- padding: 0.5rem 1rem;
106
- font-size: 1rem;
107
- }
108
-
109
- .vui-button--lg {
110
- padding: 0.75rem 1.5rem;
111
- font-size: 1.125rem;
112
- }
113
-
114
- /* Full width */
115
- .vui-button--full-width {
116
- width: 100%;
117
- }
118
-
119
- /* ===== FILL VARIANTS ===== */
120
-
121
- /* Primary = bg-primary-700, text-primary-200, border-bottom-primary-200 */
122
- .vui-button--fill.vui-button--primary {
123
- background: var(--color-primary-700);
124
- color: var(--color-primary-200);
125
- border-bottom: 1px solid var(--color-primary-200);
126
- }
127
-
128
- /* Secondary = bg-primary-600, text-primary-100 */
129
- .vui-button--fill.vui-button--secondary {
130
- background: var(--color-primary-600);
131
- color: var(--color-primary-100);
132
- }
133
-
134
- /* Accent = bg-accent, text-white */
135
- .vui-button--fill.vui-button--accent {
136
- background: var(--color-accent);
137
- color: white;
138
- }
139
-
140
- .vui-button--fill.vui-button--accent:hover:not(:disabled) {
141
- box-shadow: 0 0 20px rgba(223, 92, 154, 0.4),
142
- 0 4px 12px rgba(223, 92, 154, 0.3);
143
- }
144
-
145
- /* Positive = bg-success-600, text-success-100, border-success-400 */
146
- .vui-button--fill.vui-button--positive {
147
- background: var(--color-success-600);
148
- color: var(--color-success-100);
149
- border: 1px solid var(--color-success-400);
150
- }
151
-
152
- /* Negative = bg-danger-600, text-danger-100, border-danger-400 */
153
- .vui-button--fill.vui-button--negative {
154
- background: var(--color-danger-600);
155
- color: var(--color-danger-100);
156
- border: 1px solid var(--color-danger-400);
157
- }
158
-
159
- /* Ghost = transparent, text-primary-300, hover:bg-bg-200 */
160
- .vui-button--fill.vui-button--ghost,
161
- .vui-button--outline.vui-button--ghost {
162
- background: transparent;
163
- color: var(--color-primary-300);
164
- }
165
- .vui-button--fill.vui-button--ghost:hover:not(:disabled),
166
- .vui-button--outline.vui-button--ghost:hover:not(:disabled) {
167
- background: var(--color-bg-200);
168
- }
169
-
170
- /* Link = transparent, text-accent-200, hover:text-accent-300 */
171
- .vui-button--fill.vui-button--link,
172
- .vui-button--outline.vui-button--link {
173
- background: transparent;
174
- color: var(--color-accent-200);
175
- }
176
- .vui-button--fill.vui-button--link:hover:not(:disabled),
177
- .vui-button--outline.vui-button--link:hover:not(:disabled) {
178
- color: var(--color-accent-300);
179
- }
180
-
181
- /* ===== OUTLINE VARIANTS ===== */
182
-
183
- /* Primary outline = bg-bg-400, text-primary-500, border-primary-500 */
184
- .vui-button--outline.vui-button--primary {
185
- background: var(--color-bg-400);
186
- color: var(--color-primary-500);
187
- border: 1px solid var(--color-primary-500);
188
- }
189
-
190
- /* Secondary outline = transparent, text-primary-300, border-primary-600 */
191
- .vui-button--outline.vui-button--secondary {
192
- background: transparent;
193
- color: var(--color-primary-300);
194
- border: 1px solid var(--color-primary-600);
195
- }
196
-
197
- /* Accent outline = transparent, text-accent-200, border-accent */
198
- .vui-button--outline.vui-button--accent {
199
- background: transparent;
200
- color: var(--color-accent-200);
201
- border: 1px solid var(--color-accent);
202
- }
203
-
204
- /* Positive outline = transparent, text-success-400, border-success-400 */
205
- .vui-button--outline.vui-button--positive {
206
- background: transparent;
207
- color: var(--color-success-400);
208
- border: 1px solid var(--color-success-400);
209
- }
210
-
211
- /* Negative outline = transparent, text-danger-400, border-danger-400 */
212
- .vui-button--outline.vui-button--negative {
213
- background: transparent;
214
- color: var(--color-danger-400);
215
- border: 1px solid var(--color-danger-400);
216
- }
217
-
218
- /* ===== ICON COMPONENT ===== */
219
- .vui-icon {
220
- position: relative;
221
- display: inline-flex;
222
- align-items: center;
223
- justify-content: center;
224
- }
225
-
226
- .vui-icon__main {
227
- position: relative;
228
- z-index: 1;
229
- display: flex;
230
- align-items: center;
231
- justify-content: center;
232
- }
233
-
234
- .vui-icon__shadow {
235
- position: absolute;
236
- top: 2px;
237
- left: 0;
238
- z-index: 0;
239
- display: flex;
240
- align-items: center;
241
- justify-content: center;
242
- opacity: 0.8;
243
- }
244
-
245
- /* ===== CHIP COMPONENT ===== */
246
- .vui-chip {
247
- display: inline-flex;
248
- align-items: center;
249
- justify-content: center;
250
- padding: 0.125rem 0.5rem;
251
- font-size: 0.75rem;
252
- font-weight: 600;
253
- border-radius: 9999px;
254
- text-transform: uppercase;
255
- }
256
-
257
- .vui-chip--primary {
258
- background: var(--color-primary-700);
259
- color: var(--color-primary-100);
260
- border-bottom: 1px solid var(--color-primary-200);
261
- }
262
-
263
- .vui-chip--accent {
264
- background: var(--color-accent);
265
- color: white;
266
- }
267
-
268
- .vui-chip--success {
269
- background: var(--color-success-600);
270
- color: var(--color-success-100);
271
- }
272
-
273
- .vui-chip--warning {
274
- background: var(--color-warning-600);
275
- color: var(--color-warning-100);
276
- }
277
-
278
- .vui-chip--danger {
279
- background: var(--color-danger-600);
280
- color: var(--color-danger-100);
281
- }
282
-
283
- /* ===== BADGE COMPONENT ===== */
284
- .vui-badge {
285
- display: inline-flex;
286
- align-items: center;
287
- justify-content: center;
288
- padding: 0.25rem 0.75rem;
289
- font-size: 0.875rem;
290
- font-weight: 500;
291
- border-radius: 0.375rem;
292
- }
293
-
294
- .vui-badge--primary {
295
- background: var(--color-primary-700);
296
- color: var(--color-primary-100);
297
- }
298
-
299
- .vui-badge--accent {
300
- background: var(--color-accent);
301
- color: white;
302
- }
303
-
304
- .vui-badge--success {
305
- background: var(--color-success-600);
306
- color: var(--color-success-100);
307
- }
308
-
309
- .vui-badge--warning {
310
- background: var(--color-warning-600);
311
- color: var(--color-warning-100);
312
- }
313
-
314
- .vui-badge--danger {
315
- background: var(--color-danger-600);
316
- color: var(--color-danger-100);
317
- }
318
-
319
- /* ===== ALERT COMPONENT ===== */
320
- .vui-alert {
321
- display: flex;
322
- align-items: flex-start;
323
- gap: 0.75rem;
324
- padding: 1rem;
325
- border-radius: 0.5rem;
326
- border-width: 1px;
327
- }
328
-
329
- .vui-alert--info {
330
- background: color-mix(in srgb, var(--color-primary-700) 20%, transparent);
331
- border-color: var(--color-primary-600);
332
- color: var(--color-primary-200);
333
- }
334
-
335
- .vui-alert--success {
336
- background: color-mix(in srgb, var(--color-success-600) 20%, transparent);
337
- border-color: var(--color-success-600);
338
- color: var(--color-success-100);
339
- }
340
-
341
- .vui-alert--warning {
342
- background: color-mix(in srgb, var(--color-warning-600) 20%, transparent);
343
- border-color: var(--color-warning-600);
344
- color: var(--color-warning-100);
345
- }
346
-
347
- .vui-alert--error {
348
- background: color-mix(in srgb, var(--color-danger-600) 20%, transparent);
349
- border-color: var(--color-danger-400);
350
- color: var(--color-danger-100);
351
- }
352
-
353
- /* ===== AVATAR COMPONENT ===== */
354
- .vui-avatar {
355
- display: inline-flex;
356
- align-items: center;
357
- justify-content: center;
358
- border-radius: 9999px;
359
- overflow: hidden;
360
- background: var(--color-bg-300);
361
- color: var(--color-primary-300);
362
- font-weight: 600;
363
- }
364
-
365
- .vui-avatar--sm {
366
- width: 2rem;
367
- height: 2rem;
368
- font-size: 0.75rem;
369
- }
370
-
371
- .vui-avatar--md {
372
- width: 2.5rem;
373
- height: 2.5rem;
374
- font-size: 0.875rem;
375
- }
376
-
377
- .vui-avatar--lg {
378
- width: 3rem;
379
- height: 3rem;
380
- font-size: 1rem;
381
- }
382
-
383
- .vui-avatar--xl {
384
- width: 4rem;
385
- height: 4rem;
386
- font-size: 1.25rem;
387
- }
388
-
389
- /* ===== CARD COMPONENT ===== */
390
- .vui-card {
391
- background: var(--color-bg-300);
392
- border: 1px solid var(--color-primary-600);
393
- border-radius: 0.75rem;
394
- overflow: hidden;
395
- }
396
-
397
- .vui-card--accent-border {
398
- border-bottom-color: var(--color-accent-500);
399
- }
400
-
401
- /* ===== GRADIENTS ===== */
402
- .hero-gradient {
403
- background: linear-gradient(135deg, var(--color-bg-300) 0%, var(--color-bg-400) 100%);
404
- }
405
-
406
- .gradient-text {
407
- background: linear-gradient(135deg, var(--color-primary-300), var(--color-accent-300));
408
- -webkit-background-clip: text;
409
- -webkit-text-fill-color: transparent;
410
- background-clip: text;
411
- }
412
-
413
- /* ===== PROSE/DOCS ===== */
414
- .prose {
415
- max-width: 65ch;
416
- }
417
-
418
- .prose h1 {
419
- font-family: 'Jost', sans-serif;
420
- font-size: 2.25rem;
421
- font-weight: 700;
422
- margin-bottom: 1rem;
423
- color: var(--color-primary-100);
424
- }
425
-
426
- .prose h2 {
427
- font-family: 'Jost', sans-serif;
428
- font-size: 1.5rem;
429
- font-weight: 600;
430
- margin-top: 2rem;
431
- margin-bottom: 0.75rem;
432
- color: var(--color-primary-200);
433
- }
434
-
435
- .prose h3 {
436
- font-family: 'Jost', sans-serif;
437
- font-size: 1.25rem;
438
- font-weight: 600;
439
- margin-top: 1.5rem;
440
- margin-bottom: 0.5rem;
441
- color: var(--color-primary-200);
442
- }
443
-
444
- .prose p {
445
- margin-bottom: 1rem;
446
- line-height: 1.75;
447
- color: var(--color-primary-300);
448
- }
449
-
450
- .prose code {
451
- background: var(--color-bg-300);
452
- padding: 0.125rem 0.375rem;
453
- border-radius: 0.25rem;
454
- font-family: var(--font-mono);
455
- font-size: 0.875em;
456
- color: var(--color-accent-200);
457
- }
458
-
459
- .prose pre {
460
- background: var(--color-bg-400);
461
- color: var(--color-primary-100);
462
- padding: 1rem;
463
- border-radius: 0.5rem;
464
- overflow-x: auto;
465
- margin: 1rem 0;
466
- }
467
-
468
- .prose pre code {
469
- background: transparent;
470
- padding: 0;
471
- color: inherit;
472
- }
473
-
474
- /* ===== SIDEBAR ===== */
475
- .sidebar-link {
476
- position: relative;
477
- display: block;
478
- padding: 0.5rem 1rem;
479
- border-radius: 0.5rem;
480
- color: var(--color-primary-400);
481
- font-size: 0.875rem;
482
- transition: all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
483
- }
484
-
485
- .sidebar-link::before {
486
- content: '';
487
- position: absolute;
488
- left: 0;
489
- top: 50%;
490
- transform: translateY(-50%);
491
- width: 3px;
492
- height: 0;
493
- background: var(--color-accent);
494
- border-radius: 0 2px 2px 0;
495
- transition: height 0.2s ease;
496
- }
497
-
498
- .sidebar-link:hover {
499
- background: rgba(117, 171, 199, 0.08);
500
- color: var(--color-primary-200);
501
- padding-left: 1.25rem;
502
- }
503
-
504
- .sidebar-link:hover::before {
505
- height: 60%;
506
- }
507
-
508
- .sidebar-link.active {
509
- background: rgba(223, 92, 154, 0.1);
510
- color: var(--color-accent-200);
511
- font-weight: 500;
512
- padding-left: 1.25rem;
513
- }
514
-
515
- .sidebar-link.active::before {
516
- height: 70%;
517
- box-shadow: 0 0 8px rgba(223, 92, 154, 0.5);
518
- }
519
-
520
- /* ===== LOGO COMPONENT ===== */
521
- .vui-logo {
522
- display: inline-flex;
523
- align-items: baseline;
524
- font-family: 'Jost', sans-serif;
525
- text-transform: uppercase;
526
- letter-spacing: 0.01em;
527
- }
528
-
529
- .vui-logo__first {
530
- color: var(--color-primary-800);
531
- font-weight: 300;
532
- }
533
-
534
- .vui-logo__second {
535
- position: relative;
536
- color: var(--color-primary-500);
537
- font-weight: 900;
538
- -webkit-text-stroke: 2px rgba(255, 255, 255, 0.9);
539
- paint-order: stroke fill;
540
- }
541
-
542
- .vui-logo__second::before {
543
- content: attr(data-text);
544
- position: absolute;
545
- left: 0;
546
- top: 0;
547
- z-index: -1;
548
- color: transparent;
549
- -webkit-text-stroke: 0;
550
- text-shadow: 4px 3px 0 var(--color-accent);
551
- }
552
-
553
- /* Logo size variants */
554
- .vui-logo--sm {
555
- font-size: 2.5rem;
556
- }
557
-
558
- .vui-logo--md {
559
- font-size: 3.5rem;
560
- }
561
-
562
- .vui-logo--lg {
563
- font-size: 2.0rem;
564
- }
565
-
566
- .vui-logo--lg .vui-logo__second::before {
567
- text-shadow: 5px 4px 0 var(--color-accent);
568
- }
569
-
570
- .vui-logo--xl {
571
- font-size: 6rem;
572
- }
573
-
574
- .vui-logo--xl .vui-logo__second::before {
575
- text-shadow: 6px 5px 0 var(--color-accent);
576
- }
577
-
578
- /* Inverted variant - first word gets the 3D effect, second word is muted */
579
- .vui-logo.vui-logo--inverted .vui-logo__first {
580
- position: relative;
581
- color: var(--color-primary-500);
582
- font-weight: 900;
583
- -webkit-text-stroke: 2px rgba(255, 255, 255, 0.9);
584
- paint-order: stroke fill;
585
- }
586
-
587
- .vui-logo.vui-logo--inverted .vui-logo__first::before {
588
- content: attr(data-text);
589
- position: absolute;
590
- left: 0;
591
- top: 0;
592
- z-index: -1;
593
- color: transparent;
594
- -webkit-text-stroke: 0;
595
- text-shadow: 4px 3px 0 var(--color-accent);
596
- }
597
-
598
- .vui-logo.vui-logo--inverted .vui-logo__second {
599
- position: static;
600
- color: var(--color-primary-800);
601
- font-weight: 300;
602
- -webkit-text-stroke: 0;
603
- paint-order: normal;
604
- }
605
-
606
- .vui-logo.vui-logo--inverted .vui-logo__second::before {
607
- content: none;
608
- }
609
-
610
- .vui-logo.vui-logo--inverted.vui-logo--lg .vui-logo__first::before {
611
- text-shadow: 5px 4px 0 var(--color-accent);
612
- }
613
-
614
- .vui-logo.vui-logo--inverted.vui-logo--xl .vui-logo__first::before {
615
- text-shadow: 6px 5px 0 var(--color-accent);
616
- }
617
-
618
- /* ===== HEADER COMPONENT ===== */
619
- .vui-header {
620
- position: fixed;
621
- top: 0;
622
- left: 0;
623
- right: 0;
624
- z-index: 50;
625
- border-bottom: 4px solid var(--color-accent);
626
- background: color-mix(in srgb, var(--color-bg-400) 80%, transparent);
627
- backdrop-filter: blur(8px);
628
- -webkit-backdrop-filter: blur(8px);
629
- }
630
-
631
- .vui-header__container {
632
- height: 70px;
633
- padding-left: 32px;
634
- padding-right: 32px;
635
- display: flex;
636
- align-items: center;
637
- justify-content: space-between;
638
- }
639
-
640
- .vui-header__nav {
641
- display: flex;
642
- align-items: center;
643
- gap: 1.5rem;
644
- }
645
-
646
- .vui-header__link {
647
- font-family: 'Jost', sans-serif;
648
- font-size: 0.875rem;
649
- font-weight: 500;
650
- color: var(--color-primary-300);
651
- transition: color 0.15s;
652
- }
653
-
654
- .vui-header__link:hover {
655
- color: var(--color-primary-100);
656
- }
657
-
658
- .vui-header__link--active {
659
- color: var(--color-accent);
660
- }
661
-
662
- .vui-header__link--active:hover {
663
- color: var(--color-accent-300);
664
- }
665
-
666
- /* ===== PAGE LAYOUT ===== */
667
- .vui-page {
668
- display: flex;
669
- flex-direction: column;
670
- min-height: 100vh;
671
- background: var(--color-bg-100);
672
- font-family: 'Sen', sans-serif;
673
- }
674
-
675
- /* Use this modifier for pages with fixed header where content shouldn't go behind it */
676
- .vui-page--with-header {
677
- padding-top: 4rem; /* 64px - matches h-16 header */
678
- }
679
-
680
- .vui-page h1,
681
- .vui-page h2,
682
- .vui-page h3,
683
- .vui-page h4,
684
- .vui-page h5,
685
- .vui-page h6 {
686
- font-family: 'Jost', sans-serif;
687
- }
688
-
689
- /* ===== LANDING PAGE LAYOUT ===== */
690
- .vui-landing {
691
- display: flex;
692
- flex-direction: column;
693
- min-height: 100vh;
694
- background: var(--color-bg-100);
695
- font-family: 'Sen', sans-serif;
696
- }
697
-
698
- /* Hero Section */
699
- .vui-hero {
700
- min-height: 50vh;
701
- padding-top: 7.5rem;
702
- padding-bottom: 2rem;
703
- background: var(--color-bg-200);
704
- border-bottom: 1px solid var(--color-primary-600);
705
- display: flex;
706
- align-items: center;
707
- justify-content: center;
708
- }
709
-
710
- .vui-hero__container {
711
- margin-left: auto;
712
- margin-right: auto;
713
- max-width: 56rem;
714
- padding-left: 1.5rem;
715
- padding-right: 1.5rem;
716
- text-align: center;
717
- width: 100%;
718
- }
719
-
720
- .vui-hero__title {
721
- font-family: 'Jost', sans-serif;
722
- font-size: 3rem;
723
- font-weight: 800;
724
- letter-spacing: -0.025em;
725
- color: var(--color-primary-100);
726
- line-height: 1.1;
727
- }
728
-
729
- @media (min-width: 640px) {
730
- .vui-hero__title {
731
- font-size: 3.75rem;
732
- }
733
- }
734
-
735
- @media (min-width: 1024px) {
736
- .vui-hero__title {
737
- font-size: 4.5rem;
738
- }
739
- }
740
-
741
- .vui-hero__subtitle {
742
- margin-top: 1.5rem;
743
- margin-left: auto;
744
- margin-right: auto;
745
- max-width: 42rem;
746
- font-size: 1.25rem;
747
- color: var(--color-primary-300);
748
- line-height: 1.75;
749
- }
750
-
751
- .vui-hero__actions {
752
- margin-top: 2.5rem;
753
- display: flex;
754
- justify-content: center;
755
- gap: 1rem;
756
- }
757
-
758
- /* Section */
759
- .vui-section {
760
- padding-top: 2rem;
761
- padding-bottom: 2rem;
762
- }
763
-
764
- .vui-section--alt {
765
- background: var(--color-bg-200);
766
- }
767
-
768
- .vui-section__container {
769
- margin-left: auto;
770
- margin-right: auto;
771
- max-width: 72rem;
772
- padding-left: 1.5rem;
773
- padding-right: 1.5rem;
774
- }
775
-
776
- .vui-section__container--narrow {
777
- max-width: 56rem;
778
- }
779
-
780
- .vui-section__header {
781
- text-align: center;
782
- margin-bottom: 3rem;
783
- }
784
-
785
- .vui-section__title {
786
- font-family: 'Jost', sans-serif;
787
- font-size: 1.875rem;
788
- font-weight: 700;
789
- color: var(--color-primary-100);
790
- }
791
-
792
- .vui-section__description {
793
- margin-top: 1rem;
794
- margin-left: auto;
795
- margin-right: auto;
796
- max-width: 42rem;
797
- font-size: 1.125rem;
798
- color: var(--color-primary-300);
799
- }
800
-
801
- /* Feature Grid */
802
- .vui-feature-grid {
803
- display: grid;
804
- gap: 2rem;
805
- }
806
-
807
- @media (min-width: 640px) {
808
- .vui-feature-grid {
809
- grid-template-columns: repeat(2, 1fr);
810
- }
811
- }
812
-
813
- @media (min-width: 1024px) {
814
- .vui-feature-grid {
815
- grid-template-columns: repeat(3, 1fr);
816
- }
817
- }
818
-
819
- /* Feature Card */
820
- .vui-feature-card {
821
- padding: 1.5rem;
822
- border-radius: 0.75rem;
823
- border: 1px solid var(--color-bg-300);
824
- background: var(--color-bg-200);
825
- transition: box-shadow 0.2s, border-color 0.2s;
826
- }
827
-
828
- .vui-feature-card--alt {
829
- background: var(--color-bg-300);
830
- border-color: var(--color-bg-400);
831
- }
832
-
833
- .vui-feature-card:hover {
834
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
835
- border-color: var(--color-primary-600);
836
- }
837
-
838
- .vui-feature-card__icon {
839
- font-size: 1.875rem;
840
- margin-bottom: 1rem;
841
- }
842
-
843
- .vui-feature-card__title {
844
- font-family: 'Jost', sans-serif;
845
- font-size: 1.125rem;
846
- font-weight: 600;
847
- color: var(--color-primary-100);
848
- }
849
-
850
- .vui-feature-card__description {
851
- margin-top: 0.5rem;
852
- color: var(--color-primary-300);
853
- line-height: 1.625;
854
- }
855
-
856
- /* Code Block */
857
- .vui-code-block {
858
- overflow: hidden;
859
- border-radius: 0.75rem;
860
- border: 1px solid var(--color-bg-300);
861
- background: var(--color-bg-400);
862
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
863
- }
864
-
865
- .vui-code-block__header {
866
- display: flex;
867
- align-items: center;
868
- gap: 0.5rem;
869
- padding: 0.75rem 1rem;
870
- border-bottom: 1px solid var(--color-bg-300);
871
- background: var(--color-bg-300);
872
- }
873
-
874
- .vui-code-block__dot {
875
- width: 0.75rem;
876
- height: 0.75rem;
877
- border-radius: 9999px;
878
- }
879
-
880
- .vui-code-block__dot--red {
881
- background: var(--color-danger-400);
882
- }
883
-
884
- .vui-code-block__dot--yellow {
885
- background: var(--color-warning-400);
886
- }
887
-
888
- .vui-code-block__dot--green {
889
- background: var(--color-success-400);
890
- }
891
-
892
- .vui-code-block__filename {
893
- margin-left: 1rem;
894
- font-size: 0.875rem;
895
- color: var(--color-primary-400);
896
- }
897
-
898
- .vui-code-block__content {
899
- padding: 1.5rem;
900
- overflow-x: auto;
901
- }
902
-
903
- .vui-code-block__code {
904
- font-size: 0.875rem;
905
- line-height: 1.625;
906
- color: var(--color-primary-200);
907
- font-family: var(--font-mono);
908
- }
909
-
910
- /* Footer */
911
- .vui-footer {
912
- border-top: 1px solid var(--color-bg-300);
913
- background: var(--color-bg-300);
914
- }
915
-
916
- .vui-footer__container {
917
- margin-left: auto;
918
- margin-right: auto;
919
- max-width: 72rem;
920
- padding: 2rem 1.5rem;
921
- display: flex;
922
- flex-direction: column;
923
- align-items: center;
924
- justify-content: space-between;
925
- gap: 1.5rem;
926
- }
927
-
928
- @media (min-width: 640px) {
929
- .vui-footer__container {
930
- flex-direction: row;
931
- }
932
- }
933
-
934
- .vui-footer__text {
935
- font-size: 0.875rem;
936
- color: var(--color-primary-400);
937
- }
938
-
939
- .vui-footer__links {
940
- display: flex;
941
- gap: 1.5rem;
942
- }
943
-
944
- .vui-footer__link {
945
- font-family: 'Jost', sans-serif;
946
- font-size: 0.875rem;
947
- color: var(--color-primary-300);
948
- transition: color 0.15s;
949
- }
950
-
951
- .vui-footer__link:hover {
952
- color: var(--color-primary-100);
953
- }
954
-
955
- /* Gradient Text Utility */
956
- .vui-gradient-text {
957
- background: linear-gradient(135deg, var(--color-primary-300), var(--color-accent-300));
958
- -webkit-background-clip: text;
959
- -webkit-text-fill-color: transparent;
960
- background-clip: text;
961
- }
962
-
963
- /* ===== TOOLTIP COMPONENT ===== */
964
- .vui-tooltip {
965
- position: relative;
966
- display: inline-flex;
967
- }
968
-
969
- .vui-tooltip__trigger {
970
- display: inline-flex;
971
- }
972
-
973
- .vui-tooltip__content {
974
- position: absolute;
975
- z-index: 10;
976
- padding: 0.5rem 1rem;
977
- background: var(--color-primary-700);
978
- color: var(--color-primary-200);
979
- border: 1px solid var(--color-primary-500);
980
- border-radius: 0.5rem;
981
- font-family: 'Jost', sans-serif;
982
- font-size: 0.875rem;
983
- font-weight: 500;
984
- white-space: nowrap;
985
- opacity: 0;
986
- pointer-events: none;
987
- transition: opacity 0.15s ease-in-out, transform 0.15s ease-in-out;
988
- }
989
-
990
- .vui-tooltip__content--bottom {
991
- top: calc(100% + 0.5rem);
992
- left: 50%;
993
- transform: translateX(-50%) translateY(0.25rem);
994
- }
995
-
996
- .vui-tooltip__content--top {
997
- bottom: calc(100% + 0.5rem);
998
- left: 50%;
999
- transform: translateX(-50%) translateY(-0.25rem);
1000
- }
1001
-
1002
- .vui-tooltip:hover .vui-tooltip__content {
1003
- opacity: 1;
1004
- transform: translateX(-50%) translateY(0);
1005
- }
1006
-
1007
- /* ===== PROJECT CARD COMPONENT ===== */
1008
- .vui-project-card {
1009
- position: relative;
1010
- display: grid;
1011
- place-items: center;
1012
- padding: 1rem;
1013
- border-radius: 0.75rem;
1014
- border: 1px solid var(--color-primary-700);
1015
- background: var(--color-bg-200);
1016
- transition: background 0.15s ease-in-out;
1017
- text-decoration: none;
1018
- }
1019
-
1020
- .vui-project-card:hover {
1021
- background: var(--color-bg-300);
1022
- }
1023
-
1024
- .vui-project-card--sm {
1025
- height: 4rem;
1026
- }
1027
-
1028
- .vui-project-card--md {
1029
- height: 6rem;
1030
- }
1031
-
1032
- .vui-project-card--lg {
1033
- padding: 1rem;
1034
- }
1035
-
1036
- .vui-project-card--inactive {
1037
- filter: grayscale(1);
1038
- background: var(--color-bg-400);
1039
- }
1040
-
1041
- .vui-project-card--inactive:hover {
1042
- background: var(--color-bg-400);
1043
- }
1044
-
1045
- .vui-project-card__tooltip {
1046
- position: absolute;
1047
- top: calc(100% + 0.5rem);
1048
- z-index: 10;
1049
- padding: 0.5rem 1rem;
1050
- background: var(--color-primary-700);
1051
- color: var(--color-primary-200);
1052
- border: 1px solid var(--color-primary-500);
1053
- border-radius: 0.5rem;
1054
- font-family: 'Jost', sans-serif;
1055
- font-size: 0.875rem;
1056
- font-weight: 500;
1057
- white-space: nowrap;
1058
- opacity: 0;
1059
- pointer-events: none;
1060
- transition: opacity 0.15s ease-in-out;
1061
- }
1062
-
1063
- .vui-project-card:hover .vui-project-card__tooltip {
1064
- opacity: 1;
1065
- }
1066
-
1067
- .vui-project-card__image {
1068
- max-height: 2rem;
1069
- max-width: 100%;
1070
- object-fit: contain;
1071
- }
1072
-
1073
- .vui-project-card--lg .vui-project-card__image {
1074
- max-height: none;
1075
- max-width: 300px;
1076
- width: 100%;
1077
- }
1
+ /*
2
+ * Viviana UI Component Styles
3
+ *
4
+ * Pure CSS component styles that use theme CSS variables.
5
+ * These styles work with any theme that defines the required variables.
6
+ */
7
+
8
+ /* ===== BASE TYPOGRAPHY ===== */
9
+ /* Sen = body text, paragraphs, descriptions */
10
+ /* Jost = titles, headings, labels, buttons */
11
+
12
+ .font-sen {
13
+ font-family: 'Sen', sans-serif;
14
+ }
15
+
16
+ .font-jost {
17
+ font-family: 'Jost', sans-serif;
18
+ }
19
+
20
+ /* Base body font */
21
+ .vui-body {
22
+ font-family: 'Sen', sans-serif;
23
+ }
24
+
25
+ /* Titles and headings */
26
+ .vui-title {
27
+ font-family: 'Jost', sans-serif;
28
+ }
29
+
30
+ /* ===== CUSTOM SHADOWS ===== */
31
+ .drop-shadow-title-card {
32
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
33
+ }
34
+
35
+ .drop-shadow-logo {
36
+ filter: drop-shadow(0 0 10px rgba(223, 92, 154, 0.8));
37
+ }
38
+
39
+
40
+ /* ===== BUTTON COMPONENT ===== */
41
+ .vui-button {
42
+ position: relative;
43
+ font-family: 'Jost', sans-serif;
44
+ display: inline-flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+ white-space: nowrap;
48
+ letter-spacing: 0.05em;
49
+ font-weight: 500;
50
+ text-transform: uppercase;
51
+ border-radius: 0.5rem;
52
+ transition: all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
53
+ cursor: pointer;
54
+ border: none;
55
+ outline: none;
56
+ overflow: hidden;
57
+ }
58
+
59
+ /* Shimmer overlay for hover effect */
60
+ .vui-button::before {
61
+ content: '';
62
+ position: absolute;
63
+ inset: 0;
64
+ background: linear-gradient(
65
+ 90deg,
66
+ transparent 0%,
67
+ rgba(255, 255, 255, 0.1) 50%,
68
+ transparent 100%
69
+ );
70
+ transform: translateX(-100%);
71
+ transition: transform 0.5s ease;
72
+ }
73
+
74
+ .vui-button:hover::before {
75
+ transform: translateX(100%);
76
+ }
77
+
78
+ .vui-button:focus-visible {
79
+ outline: none;
80
+ box-shadow: 0 0 0 2px var(--color-bg-400),
81
+ 0 0 0 4px var(--color-accent-300),
82
+ 0 0 20px rgba(223, 92, 154, 0.3);
83
+ }
84
+
85
+ .vui-button:disabled {
86
+ opacity: 0.5;
87
+ cursor: not-allowed;
88
+ }
89
+
90
+ .vui-button:disabled::before {
91
+ display: none;
92
+ }
93
+
94
+ .vui-button.is-pressed {
95
+ transform: scale(0.97);
96
+ }
97
+
98
+ /* Size variants */
99
+ .vui-button--sm {
100
+ padding: 0.375rem 0.75rem;
101
+ font-size: 0.875rem;
102
+ }
103
+
104
+ .vui-button--md {
105
+ padding: 0.5rem 1rem;
106
+ font-size: 1rem;
107
+ }
108
+
109
+ .vui-button--lg {
110
+ padding: 0.75rem 1.5rem;
111
+ font-size: 1.125rem;
112
+ }
113
+
114
+ /* Full width */
115
+ .vui-button--full-width {
116
+ width: 100%;
117
+ }
118
+
119
+ /* ===== FILL VARIANTS ===== */
120
+
121
+ /* Primary = bg-primary-700, text-primary-200, border-bottom-primary-200 */
122
+ .vui-button--fill.vui-button--primary {
123
+ background: var(--color-primary-700);
124
+ color: var(--color-primary-200);
125
+ border-bottom: 1px solid var(--color-primary-200);
126
+ }
127
+
128
+ /* Secondary = bg-primary-600, text-primary-100 */
129
+ .vui-button--fill.vui-button--secondary {
130
+ background: var(--color-primary-600);
131
+ color: var(--color-primary-100);
132
+ }
133
+
134
+ /* Accent = bg-accent, text-white */
135
+ .vui-button--fill.vui-button--accent {
136
+ background: var(--color-accent);
137
+ color: white;
138
+ }
139
+
140
+ .vui-button--fill.vui-button--accent:hover:not(:disabled) {
141
+ box-shadow: 0 0 20px rgba(223, 92, 154, 0.4),
142
+ 0 4px 12px rgba(223, 92, 154, 0.3);
143
+ }
144
+
145
+ /* Positive = bg-success-600, text-success-100, border-success-400 */
146
+ .vui-button--fill.vui-button--positive {
147
+ background: var(--color-success-600);
148
+ color: var(--color-success-100);
149
+ border: 1px solid var(--color-success-400);
150
+ }
151
+
152
+ /* Negative = bg-danger-600, text-danger-100, border-danger-400 */
153
+ .vui-button--fill.vui-button--negative {
154
+ background: var(--color-danger-600);
155
+ color: var(--color-danger-100);
156
+ border: 1px solid var(--color-danger-400);
157
+ }
158
+
159
+ /* Ghost = transparent, text-primary-300, hover:bg-bg-200 */
160
+ .vui-button--fill.vui-button--ghost,
161
+ .vui-button--outline.vui-button--ghost {
162
+ background: transparent;
163
+ color: var(--color-primary-300);
164
+ }
165
+ .vui-button--fill.vui-button--ghost:hover:not(:disabled),
166
+ .vui-button--outline.vui-button--ghost:hover:not(:disabled) {
167
+ background: var(--color-bg-200);
168
+ }
169
+
170
+ /* Link = transparent, text-accent-200, hover:text-accent-300 */
171
+ .vui-button--fill.vui-button--link,
172
+ .vui-button--outline.vui-button--link {
173
+ background: transparent;
174
+ color: var(--color-accent-200);
175
+ }
176
+ .vui-button--fill.vui-button--link:hover:not(:disabled),
177
+ .vui-button--outline.vui-button--link:hover:not(:disabled) {
178
+ color: var(--color-accent-300);
179
+ }
180
+
181
+ /* ===== OUTLINE VARIANTS ===== */
182
+
183
+ /* Primary outline = bg-bg-400, text-primary-500, border-primary-500 */
184
+ .vui-button--outline.vui-button--primary {
185
+ background: var(--color-bg-400);
186
+ color: var(--color-primary-500);
187
+ border: 1px solid var(--color-primary-500);
188
+ }
189
+
190
+ /* Secondary outline = transparent, text-primary-300, border-primary-600 */
191
+ .vui-button--outline.vui-button--secondary {
192
+ background: transparent;
193
+ color: var(--color-primary-300);
194
+ border: 1px solid var(--color-primary-600);
195
+ }
196
+
197
+ /* Accent outline = transparent, text-accent-200, border-accent */
198
+ .vui-button--outline.vui-button--accent {
199
+ background: transparent;
200
+ color: var(--color-accent-200);
201
+ border: 1px solid var(--color-accent);
202
+ }
203
+
204
+ /* Positive outline = transparent, text-success-400, border-success-400 */
205
+ .vui-button--outline.vui-button--positive {
206
+ background: transparent;
207
+ color: var(--color-success-400);
208
+ border: 1px solid var(--color-success-400);
209
+ }
210
+
211
+ /* Negative outline = transparent, text-danger-400, border-danger-400 */
212
+ .vui-button--outline.vui-button--negative {
213
+ background: transparent;
214
+ color: var(--color-danger-400);
215
+ border: 1px solid var(--color-danger-400);
216
+ }
217
+
218
+ /* ===== ICON COMPONENT ===== */
219
+ .vui-icon {
220
+ position: relative;
221
+ display: inline-flex;
222
+ align-items: center;
223
+ justify-content: center;
224
+ }
225
+
226
+ .vui-icon__main {
227
+ position: relative;
228
+ z-index: 1;
229
+ display: flex;
230
+ align-items: center;
231
+ justify-content: center;
232
+ }
233
+
234
+ .vui-icon__shadow {
235
+ position: absolute;
236
+ top: 2px;
237
+ left: 0;
238
+ z-index: 0;
239
+ display: flex;
240
+ align-items: center;
241
+ justify-content: center;
242
+ opacity: 0.8;
243
+ }
244
+
245
+ /* ===== CHIP COMPONENT ===== */
246
+ .vui-chip {
247
+ display: inline-flex;
248
+ align-items: center;
249
+ justify-content: center;
250
+ padding: 0.125rem 0.5rem;
251
+ font-size: 0.75rem;
252
+ font-weight: 600;
253
+ border-radius: 9999px;
254
+ text-transform: uppercase;
255
+ }
256
+
257
+ .vui-chip--primary {
258
+ background: var(--color-primary-700);
259
+ color: var(--color-primary-100);
260
+ border-bottom: 1px solid var(--color-primary-200);
261
+ }
262
+
263
+ .vui-chip--accent {
264
+ background: var(--color-accent);
265
+ color: white;
266
+ }
267
+
268
+ .vui-chip--success {
269
+ background: var(--color-success-600);
270
+ color: var(--color-success-100);
271
+ }
272
+
273
+ .vui-chip--warning {
274
+ background: var(--color-warning-600);
275
+ color: var(--color-warning-100);
276
+ }
277
+
278
+ .vui-chip--danger {
279
+ background: var(--color-danger-600);
280
+ color: var(--color-danger-100);
281
+ }
282
+
283
+ /* ===== BADGE COMPONENT ===== */
284
+ .vui-badge {
285
+ display: inline-flex;
286
+ align-items: center;
287
+ justify-content: center;
288
+ padding: 0.25rem 0.75rem;
289
+ font-size: 0.875rem;
290
+ font-weight: 500;
291
+ border-radius: 0.375rem;
292
+ }
293
+
294
+ .vui-badge--primary {
295
+ background: var(--color-primary-700);
296
+ color: var(--color-primary-100);
297
+ }
298
+
299
+ .vui-badge--accent {
300
+ background: var(--color-accent);
301
+ color: white;
302
+ }
303
+
304
+ .vui-badge--success {
305
+ background: var(--color-success-600);
306
+ color: var(--color-success-100);
307
+ }
308
+
309
+ .vui-badge--warning {
310
+ background: var(--color-warning-600);
311
+ color: var(--color-warning-100);
312
+ }
313
+
314
+ .vui-badge--danger {
315
+ background: var(--color-danger-600);
316
+ color: var(--color-danger-100);
317
+ }
318
+
319
+ /* ===== ALERT COMPONENT ===== */
320
+ .vui-alert {
321
+ display: flex;
322
+ align-items: flex-start;
323
+ gap: 0.75rem;
324
+ padding: 1rem;
325
+ border-radius: 0.5rem;
326
+ border-width: 1px;
327
+ }
328
+
329
+ .vui-alert--info {
330
+ background: color-mix(in srgb, var(--color-primary-700) 20%, transparent);
331
+ border-color: var(--color-primary-600);
332
+ color: var(--color-primary-200);
333
+ }
334
+
335
+ .vui-alert--success {
336
+ background: color-mix(in srgb, var(--color-success-600) 20%, transparent);
337
+ border-color: var(--color-success-600);
338
+ color: var(--color-success-100);
339
+ }
340
+
341
+ .vui-alert--warning {
342
+ background: color-mix(in srgb, var(--color-warning-600) 20%, transparent);
343
+ border-color: var(--color-warning-600);
344
+ color: var(--color-warning-100);
345
+ }
346
+
347
+ .vui-alert--error {
348
+ background: color-mix(in srgb, var(--color-danger-600) 20%, transparent);
349
+ border-color: var(--color-danger-400);
350
+ color: var(--color-danger-100);
351
+ }
352
+
353
+ /* ===== AVATAR COMPONENT ===== */
354
+ .vui-avatar {
355
+ display: inline-flex;
356
+ align-items: center;
357
+ justify-content: center;
358
+ border-radius: 9999px;
359
+ overflow: hidden;
360
+ background: var(--color-bg-300);
361
+ color: var(--color-primary-300);
362
+ font-weight: 600;
363
+ }
364
+
365
+ .vui-avatar--sm {
366
+ width: 2rem;
367
+ height: 2rem;
368
+ font-size: 0.75rem;
369
+ }
370
+
371
+ .vui-avatar--md {
372
+ width: 2.5rem;
373
+ height: 2.5rem;
374
+ font-size: 0.875rem;
375
+ }
376
+
377
+ .vui-avatar--lg {
378
+ width: 3rem;
379
+ height: 3rem;
380
+ font-size: 1rem;
381
+ }
382
+
383
+ .vui-avatar--xl {
384
+ width: 4rem;
385
+ height: 4rem;
386
+ font-size: 1.25rem;
387
+ }
388
+
389
+ /* ===== CARD COMPONENT ===== */
390
+ .vui-card {
391
+ background: var(--color-bg-300);
392
+ border: 1px solid var(--color-primary-600);
393
+ border-radius: 0.75rem;
394
+ overflow: hidden;
395
+ }
396
+
397
+ .vui-card--accent-border {
398
+ border-bottom-color: var(--color-accent-500);
399
+ }
400
+
401
+ /* ===== GRADIENTS ===== */
402
+ .hero-gradient {
403
+ background: linear-gradient(135deg, var(--color-bg-300) 0%, var(--color-bg-400) 100%);
404
+ }
405
+
406
+ .gradient-text {
407
+ background: linear-gradient(135deg, var(--color-primary-300), var(--color-accent-300));
408
+ -webkit-background-clip: text;
409
+ -webkit-text-fill-color: transparent;
410
+ background-clip: text;
411
+ }
412
+
413
+ /* ===== PROSE/DOCS ===== */
414
+ .prose {
415
+ max-width: 65ch;
416
+ }
417
+
418
+ .prose h1 {
419
+ font-family: 'Jost', sans-serif;
420
+ font-size: 2.25rem;
421
+ font-weight: 700;
422
+ margin-bottom: 1rem;
423
+ color: var(--color-primary-100);
424
+ }
425
+
426
+ .prose h2 {
427
+ font-family: 'Jost', sans-serif;
428
+ font-size: 1.5rem;
429
+ font-weight: 600;
430
+ margin-top: 2rem;
431
+ margin-bottom: 0.75rem;
432
+ color: var(--color-primary-200);
433
+ }
434
+
435
+ .prose h3 {
436
+ font-family: 'Jost', sans-serif;
437
+ font-size: 1.25rem;
438
+ font-weight: 600;
439
+ margin-top: 1.5rem;
440
+ margin-bottom: 0.5rem;
441
+ color: var(--color-primary-200);
442
+ }
443
+
444
+ .prose p {
445
+ margin-bottom: 1rem;
446
+ line-height: 1.75;
447
+ color: var(--color-primary-300);
448
+ }
449
+
450
+ .prose code {
451
+ background: var(--color-bg-300);
452
+ padding: 0.125rem 0.375rem;
453
+ border-radius: 0.25rem;
454
+ font-family: var(--font-mono);
455
+ font-size: 0.875em;
456
+ color: var(--color-accent-200);
457
+ }
458
+
459
+ .prose pre {
460
+ background: var(--color-bg-400);
461
+ color: var(--color-primary-100);
462
+ padding: 1rem;
463
+ border-radius: 0.5rem;
464
+ overflow-x: auto;
465
+ margin: 1rem 0;
466
+ }
467
+
468
+ .prose pre code {
469
+ background: transparent;
470
+ padding: 0;
471
+ color: inherit;
472
+ }
473
+
474
+ /* ===== SIDEBAR ===== */
475
+ .sidebar-link {
476
+ position: relative;
477
+ display: block;
478
+ padding: 0.5rem 1rem;
479
+ border-radius: 0.5rem;
480
+ color: var(--color-primary-400);
481
+ font-size: 0.875rem;
482
+ transition: all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
483
+ }
484
+
485
+ .sidebar-link::before {
486
+ content: '';
487
+ position: absolute;
488
+ left: 0;
489
+ top: 50%;
490
+ transform: translateY(-50%);
491
+ width: 3px;
492
+ height: 0;
493
+ background: var(--color-accent);
494
+ border-radius: 0 2px 2px 0;
495
+ transition: height 0.2s ease;
496
+ }
497
+
498
+ .sidebar-link:hover {
499
+ background: rgba(117, 171, 199, 0.08);
500
+ color: var(--color-primary-200);
501
+ padding-left: 1.25rem;
502
+ }
503
+
504
+ .sidebar-link:hover::before {
505
+ height: 60%;
506
+ }
507
+
508
+ .sidebar-link.active {
509
+ background: rgba(223, 92, 154, 0.1);
510
+ color: var(--color-accent-200);
511
+ font-weight: 500;
512
+ padding-left: 1.25rem;
513
+ }
514
+
515
+ .sidebar-link.active::before {
516
+ height: 70%;
517
+ box-shadow: 0 0 8px rgba(223, 92, 154, 0.5);
518
+ }
519
+
520
+ /* ===== LOGO COMPONENT ===== */
521
+ .vui-logo {
522
+ display: inline-flex;
523
+ align-items: baseline;
524
+ font-family: 'Jost', sans-serif;
525
+ text-transform: uppercase;
526
+ letter-spacing: 0.01em;
527
+ }
528
+
529
+ .vui-logo__first {
530
+ color: var(--color-primary-800);
531
+ font-weight: 300;
532
+ }
533
+
534
+ .vui-logo__second {
535
+ position: relative;
536
+ color: var(--color-primary-500);
537
+ font-weight: 900;
538
+ -webkit-text-stroke: 2px rgba(255, 255, 255, 0.9);
539
+ paint-order: stroke fill;
540
+ }
541
+
542
+ .vui-logo__second::before {
543
+ content: attr(data-text);
544
+ position: absolute;
545
+ left: 0;
546
+ top: 0;
547
+ z-index: -1;
548
+ color: transparent;
549
+ -webkit-text-stroke: 0;
550
+ text-shadow: 4px 3px 0 var(--color-accent);
551
+ }
552
+
553
+ /* Logo size variants */
554
+ .vui-logo--sm {
555
+ font-size: 2.5rem;
556
+ }
557
+
558
+ .vui-logo--md {
559
+ font-size: 3.5rem;
560
+ }
561
+
562
+ .vui-logo--lg {
563
+ font-size: 2.0rem;
564
+ }
565
+
566
+ .vui-logo--lg .vui-logo__second::before {
567
+ text-shadow: 5px 4px 0 var(--color-accent);
568
+ }
569
+
570
+ .vui-logo--xl {
571
+ font-size: 6rem;
572
+ }
573
+
574
+ .vui-logo--xl .vui-logo__second::before {
575
+ text-shadow: 6px 5px 0 var(--color-accent);
576
+ }
577
+
578
+ /* Inverted variant - first word gets the 3D effect, second word is muted */
579
+ .vui-logo.vui-logo--inverted .vui-logo__first {
580
+ position: relative;
581
+ color: var(--color-primary-500);
582
+ font-weight: 900;
583
+ -webkit-text-stroke: 2px rgba(255, 255, 255, 0.9);
584
+ paint-order: stroke fill;
585
+ }
586
+
587
+ .vui-logo.vui-logo--inverted .vui-logo__first::before {
588
+ content: attr(data-text);
589
+ position: absolute;
590
+ left: 0;
591
+ top: 0;
592
+ z-index: -1;
593
+ color: transparent;
594
+ -webkit-text-stroke: 0;
595
+ text-shadow: 4px 3px 0 var(--color-accent);
596
+ }
597
+
598
+ .vui-logo.vui-logo--inverted .vui-logo__second {
599
+ position: static;
600
+ color: var(--color-primary-800);
601
+ font-weight: 300;
602
+ -webkit-text-stroke: 0;
603
+ paint-order: normal;
604
+ }
605
+
606
+ .vui-logo.vui-logo--inverted .vui-logo__second::before {
607
+ content: none;
608
+ }
609
+
610
+ .vui-logo.vui-logo--inverted.vui-logo--lg .vui-logo__first::before {
611
+ text-shadow: 5px 4px 0 var(--color-accent);
612
+ }
613
+
614
+ .vui-logo.vui-logo--inverted.vui-logo--xl .vui-logo__first::before {
615
+ text-shadow: 6px 5px 0 var(--color-accent);
616
+ }
617
+
618
+ /* ===== HEADER COMPONENT ===== */
619
+ .vui-header {
620
+ position: fixed;
621
+ top: 0;
622
+ left: 0;
623
+ right: 0;
624
+ z-index: 50;
625
+ border-bottom: 4px solid var(--color-accent);
626
+ background: color-mix(in srgb, var(--color-bg-400) 80%, transparent);
627
+ backdrop-filter: blur(8px);
628
+ -webkit-backdrop-filter: blur(8px);
629
+ }
630
+
631
+ .vui-header__container {
632
+ height: 70px;
633
+ padding-left: 32px;
634
+ padding-right: 32px;
635
+ display: flex;
636
+ align-items: center;
637
+ justify-content: space-between;
638
+ }
639
+
640
+ .vui-header__nav {
641
+ display: flex;
642
+ align-items: center;
643
+ gap: 1.5rem;
644
+ }
645
+
646
+ .vui-header__link {
647
+ font-family: 'Jost', sans-serif;
648
+ font-size: 0.875rem;
649
+ font-weight: 500;
650
+ color: var(--color-primary-300);
651
+ transition: color 0.15s;
652
+ }
653
+
654
+ .vui-header__link:hover {
655
+ color: var(--color-primary-100);
656
+ }
657
+
658
+ .vui-header__link--active {
659
+ color: var(--color-accent);
660
+ }
661
+
662
+ .vui-header__link--active:hover {
663
+ color: var(--color-accent-300);
664
+ }
665
+
666
+ /* ===== PAGE LAYOUT ===== */
667
+ .vui-page {
668
+ display: flex;
669
+ flex-direction: column;
670
+ min-height: 100vh;
671
+ background: var(--color-bg-100);
672
+ font-family: 'Sen', sans-serif;
673
+ }
674
+
675
+ /* Use this modifier for pages with fixed header where content shouldn't go behind it */
676
+ .vui-page--with-header {
677
+ padding-top: 4rem; /* 64px - matches h-16 header */
678
+ }
679
+
680
+ .vui-page h1,
681
+ .vui-page h2,
682
+ .vui-page h3,
683
+ .vui-page h4,
684
+ .vui-page h5,
685
+ .vui-page h6 {
686
+ font-family: 'Jost', sans-serif;
687
+ }
688
+
689
+ /* ===== LANDING PAGE LAYOUT ===== */
690
+ .vui-landing {
691
+ display: flex;
692
+ flex-direction: column;
693
+ min-height: 100vh;
694
+ background: var(--color-bg-100);
695
+ font-family: 'Sen', sans-serif;
696
+ }
697
+
698
+ /* Hero Section */
699
+ .vui-hero {
700
+ min-height: 50vh;
701
+ padding-top: 7.5rem;
702
+ padding-bottom: 2rem;
703
+ background: var(--color-bg-200);
704
+ border-bottom: 1px solid var(--color-primary-600);
705
+ display: flex;
706
+ align-items: center;
707
+ justify-content: center;
708
+ }
709
+
710
+ .vui-hero__container {
711
+ margin-left: auto;
712
+ margin-right: auto;
713
+ max-width: 56rem;
714
+ padding-left: 1.5rem;
715
+ padding-right: 1.5rem;
716
+ text-align: center;
717
+ width: 100%;
718
+ }
719
+
720
+ .vui-hero__title {
721
+ font-family: 'Jost', sans-serif;
722
+ font-size: 3rem;
723
+ font-weight: 800;
724
+ letter-spacing: -0.025em;
725
+ color: var(--color-primary-100);
726
+ line-height: 1.1;
727
+ }
728
+
729
+ @media (min-width: 640px) {
730
+ .vui-hero__title {
731
+ font-size: 3.75rem;
732
+ }
733
+ }
734
+
735
+ @media (min-width: 1024px) {
736
+ .vui-hero__title {
737
+ font-size: 4.5rem;
738
+ }
739
+ }
740
+
741
+ .vui-hero__subtitle {
742
+ margin-top: 1.5rem;
743
+ margin-left: auto;
744
+ margin-right: auto;
745
+ max-width: 42rem;
746
+ font-size: 1.25rem;
747
+ color: var(--color-primary-300);
748
+ line-height: 1.75;
749
+ }
750
+
751
+ .vui-hero__actions {
752
+ margin-top: 2.5rem;
753
+ display: flex;
754
+ justify-content: center;
755
+ gap: 1rem;
756
+ }
757
+
758
+ /* Section */
759
+ .vui-section {
760
+ padding-top: 2rem;
761
+ padding-bottom: 2rem;
762
+ }
763
+
764
+ .vui-section--alt {
765
+ background: var(--color-bg-200);
766
+ }
767
+
768
+ .vui-section__container {
769
+ margin-left: auto;
770
+ margin-right: auto;
771
+ max-width: 72rem;
772
+ padding-left: 1.5rem;
773
+ padding-right: 1.5rem;
774
+ }
775
+
776
+ .vui-section__container--narrow {
777
+ max-width: 56rem;
778
+ }
779
+
780
+ .vui-section__header {
781
+ text-align: center;
782
+ margin-bottom: 3rem;
783
+ }
784
+
785
+ .vui-section__title {
786
+ font-family: 'Jost', sans-serif;
787
+ font-size: 1.875rem;
788
+ font-weight: 700;
789
+ color: var(--color-primary-100);
790
+ }
791
+
792
+ .vui-section__description {
793
+ margin-top: 1rem;
794
+ margin-left: auto;
795
+ margin-right: auto;
796
+ max-width: 42rem;
797
+ font-size: 1.125rem;
798
+ color: var(--color-primary-300);
799
+ }
800
+
801
+ /* Feature Grid */
802
+ .vui-feature-grid {
803
+ display: grid;
804
+ gap: 2rem;
805
+ }
806
+
807
+ @media (min-width: 640px) {
808
+ .vui-feature-grid {
809
+ grid-template-columns: repeat(2, 1fr);
810
+ }
811
+ }
812
+
813
+ @media (min-width: 1024px) {
814
+ .vui-feature-grid {
815
+ grid-template-columns: repeat(3, 1fr);
816
+ }
817
+ }
818
+
819
+ /* Feature Card */
820
+ .vui-feature-card {
821
+ padding: 1.5rem;
822
+ border-radius: 0.75rem;
823
+ border: 1px solid var(--color-bg-300);
824
+ background: var(--color-bg-200);
825
+ transition: box-shadow 0.2s, border-color 0.2s;
826
+ }
827
+
828
+ .vui-feature-card--alt {
829
+ background: var(--color-bg-300);
830
+ border-color: var(--color-bg-400);
831
+ }
832
+
833
+ .vui-feature-card:hover {
834
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
835
+ border-color: var(--color-primary-600);
836
+ }
837
+
838
+ .vui-feature-card__icon {
839
+ font-size: 1.875rem;
840
+ margin-bottom: 1rem;
841
+ }
842
+
843
+ .vui-feature-card__title {
844
+ font-family: 'Jost', sans-serif;
845
+ font-size: 1.125rem;
846
+ font-weight: 600;
847
+ color: var(--color-primary-100);
848
+ }
849
+
850
+ .vui-feature-card__description {
851
+ margin-top: 0.5rem;
852
+ color: var(--color-primary-300);
853
+ line-height: 1.625;
854
+ }
855
+
856
+ /* Code Block */
857
+ .vui-code-block {
858
+ overflow: hidden;
859
+ border-radius: 0.75rem;
860
+ border: 1px solid var(--color-bg-300);
861
+ background: var(--color-bg-400);
862
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
863
+ }
864
+
865
+ .vui-code-block__header {
866
+ display: flex;
867
+ align-items: center;
868
+ gap: 0.5rem;
869
+ padding: 0.75rem 1rem;
870
+ border-bottom: 1px solid var(--color-bg-300);
871
+ background: var(--color-bg-300);
872
+ }
873
+
874
+ .vui-code-block__dot {
875
+ width: 0.75rem;
876
+ height: 0.75rem;
877
+ border-radius: 9999px;
878
+ }
879
+
880
+ .vui-code-block__dot--red {
881
+ background: var(--color-danger-400);
882
+ }
883
+
884
+ .vui-code-block__dot--yellow {
885
+ background: var(--color-warning-400);
886
+ }
887
+
888
+ .vui-code-block__dot--green {
889
+ background: var(--color-success-400);
890
+ }
891
+
892
+ .vui-code-block__filename {
893
+ margin-left: 1rem;
894
+ font-size: 0.875rem;
895
+ color: var(--color-primary-400);
896
+ }
897
+
898
+ .vui-code-block__content {
899
+ padding: 1.5rem;
900
+ overflow-x: auto;
901
+ }
902
+
903
+ .vui-code-block__code {
904
+ font-size: 0.875rem;
905
+ line-height: 1.625;
906
+ color: var(--color-primary-200);
907
+ font-family: var(--font-mono);
908
+ }
909
+
910
+ /* Footer */
911
+ .vui-footer {
912
+ border-top: 1px solid var(--color-bg-300);
913
+ background: var(--color-bg-300);
914
+ }
915
+
916
+ .vui-footer__container {
917
+ margin-left: auto;
918
+ margin-right: auto;
919
+ max-width: 72rem;
920
+ padding: 2rem 1.5rem;
921
+ display: flex;
922
+ flex-direction: column;
923
+ align-items: center;
924
+ justify-content: space-between;
925
+ gap: 1.5rem;
926
+ }
927
+
928
+ @media (min-width: 640px) {
929
+ .vui-footer__container {
930
+ flex-direction: row;
931
+ }
932
+ }
933
+
934
+ .vui-footer__text {
935
+ font-size: 0.875rem;
936
+ color: var(--color-primary-400);
937
+ }
938
+
939
+ .vui-footer__links {
940
+ display: flex;
941
+ gap: 1.5rem;
942
+ }
943
+
944
+ .vui-footer__link {
945
+ font-family: 'Jost', sans-serif;
946
+ font-size: 0.875rem;
947
+ color: var(--color-primary-300);
948
+ transition: color 0.15s;
949
+ }
950
+
951
+ .vui-footer__link:hover {
952
+ color: var(--color-primary-100);
953
+ }
954
+
955
+ /* Gradient Text Utility */
956
+ .vui-gradient-text {
957
+ background: linear-gradient(135deg, var(--color-primary-300), var(--color-accent-300));
958
+ -webkit-background-clip: text;
959
+ -webkit-text-fill-color: transparent;
960
+ background-clip: text;
961
+ }
962
+
963
+ /* ===== TOOLTIP COMPONENT ===== */
964
+ .vui-tooltip {
965
+ position: relative;
966
+ display: inline-flex;
967
+ }
968
+
969
+ .vui-tooltip__trigger {
970
+ display: inline-flex;
971
+ }
972
+
973
+ .vui-tooltip__content {
974
+ position: absolute;
975
+ z-index: 10;
976
+ padding: 0.5rem 1rem;
977
+ background: var(--color-primary-700);
978
+ color: var(--color-primary-200);
979
+ border: 1px solid var(--color-primary-500);
980
+ border-radius: 0.5rem;
981
+ font-family: 'Jost', sans-serif;
982
+ font-size: 0.875rem;
983
+ font-weight: 500;
984
+ white-space: nowrap;
985
+ opacity: 0;
986
+ pointer-events: none;
987
+ transition: opacity 0.15s ease-in-out, transform 0.15s ease-in-out;
988
+ }
989
+
990
+ .vui-tooltip__content--bottom {
991
+ top: calc(100% + 0.5rem);
992
+ left: 50%;
993
+ transform: translateX(-50%) translateY(0.25rem);
994
+ }
995
+
996
+ .vui-tooltip__content--top {
997
+ bottom: calc(100% + 0.5rem);
998
+ left: 50%;
999
+ transform: translateX(-50%) translateY(-0.25rem);
1000
+ }
1001
+
1002
+ .vui-tooltip:hover .vui-tooltip__content {
1003
+ opacity: 1;
1004
+ transform: translateX(-50%) translateY(0);
1005
+ }
1006
+
1007
+ /* ===== PROJECT CARD COMPONENT ===== */
1008
+ .vui-project-card {
1009
+ position: relative;
1010
+ display: grid;
1011
+ place-items: center;
1012
+ padding: 1rem;
1013
+ border-radius: 0.75rem;
1014
+ border: 1px solid var(--color-primary-700);
1015
+ background: var(--color-bg-200);
1016
+ transition: background 0.15s ease-in-out;
1017
+ text-decoration: none;
1018
+ }
1019
+
1020
+ .vui-project-card:hover {
1021
+ background: var(--color-bg-300);
1022
+ }
1023
+
1024
+ .vui-project-card--sm {
1025
+ height: 4rem;
1026
+ }
1027
+
1028
+ .vui-project-card--md {
1029
+ height: 6rem;
1030
+ }
1031
+
1032
+ .vui-project-card--lg {
1033
+ padding: 1rem;
1034
+ }
1035
+
1036
+ .vui-project-card--inactive {
1037
+ filter: grayscale(1);
1038
+ background: var(--color-bg-400);
1039
+ }
1040
+
1041
+ .vui-project-card--inactive:hover {
1042
+ background: var(--color-bg-400);
1043
+ }
1044
+
1045
+ .vui-project-card__tooltip {
1046
+ position: absolute;
1047
+ top: calc(100% + 0.5rem);
1048
+ z-index: 10;
1049
+ padding: 0.5rem 1rem;
1050
+ background: var(--color-primary-700);
1051
+ color: var(--color-primary-200);
1052
+ border: 1px solid var(--color-primary-500);
1053
+ border-radius: 0.5rem;
1054
+ font-family: 'Jost', sans-serif;
1055
+ font-size: 0.875rem;
1056
+ font-weight: 500;
1057
+ white-space: nowrap;
1058
+ opacity: 0;
1059
+ pointer-events: none;
1060
+ transition: opacity 0.15s ease-in-out;
1061
+ }
1062
+
1063
+ .vui-project-card:hover .vui-project-card__tooltip {
1064
+ opacity: 1;
1065
+ }
1066
+
1067
+ .vui-project-card__image {
1068
+ max-height: 2rem;
1069
+ max-width: 100%;
1070
+ object-fit: contain;
1071
+ }
1072
+
1073
+ .vui-project-card--lg .vui-project-card__image {
1074
+ max-height: none;
1075
+ max-width: 300px;
1076
+ width: 100%;
1077
+ }