@vanduo-oss/framework 1.3.9 → 1.4.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 (119) hide show
  1. package/README.md +87 -42
  2. package/css/components/affix.css +1 -1
  3. package/css/components/alerts.css +40 -40
  4. package/css/components/avatar.css +33 -33
  5. package/css/components/badges.css +42 -42
  6. package/css/components/breadcrumbs.css +5 -5
  7. package/css/components/bubble.css +4 -4
  8. package/css/components/buttons.css +124 -124
  9. package/css/components/cards.css +10 -10
  10. package/css/components/chips.css +28 -28
  11. package/css/components/code-snippet.css +18 -18
  12. package/css/components/collapsible.css +20 -20
  13. package/css/components/collections.css +21 -21
  14. package/css/components/datepicker.css +13 -13
  15. package/css/components/doc-search.css +46 -53
  16. package/css/components/doc-tabs.css +10 -10
  17. package/css/components/draggable.css +34 -34
  18. package/css/components/dropdown.css +14 -14
  19. package/css/components/expanding-cards.css +1 -1
  20. package/css/components/fab.css +7 -7
  21. package/css/components/flow.css +3 -3
  22. package/css/components/footer.css +26 -26
  23. package/css/components/forms.css +95 -83
  24. package/css/components/image-box.css +13 -17
  25. package/css/components/modals.css +8 -8
  26. package/css/components/music-player.css +26 -26
  27. package/css/components/navbar.css +27 -27
  28. package/css/components/pagination.css +15 -15
  29. package/css/components/preloader.css +10 -10
  30. package/css/components/progress.css +8 -8
  31. package/css/components/rating.css +4 -4
  32. package/css/components/sidenav.css +14 -14
  33. package/css/components/skeleton.css +10 -9
  34. package/css/components/spinner.css +10 -10
  35. package/css/components/spotlight.css +7 -7
  36. package/css/components/stepper.css +13 -13
  37. package/css/components/suggest.css +10 -10
  38. package/css/components/tabs.css +22 -22
  39. package/css/components/theme-customizer.css +87 -87
  40. package/css/components/timeline.css +14 -14
  41. package/css/components/timepicker.css +7 -7
  42. package/css/components/toast.css +31 -31
  43. package/css/components/tooltips.css +11 -11
  44. package/css/components/transfer.css +12 -12
  45. package/css/components/tree.css +9 -9
  46. package/css/components/waypoint.css +3 -3
  47. package/css/core/colors.css +34 -34
  48. package/css/core/grid.css +1 -6
  49. package/css/core/helpers.css +11 -11
  50. package/css/core/tokens.css +113 -35
  51. package/css/core/typography.css +14 -12
  52. package/css/core/vd-aliases.css +100 -52
  53. package/css/effects/morph.css +5 -5
  54. package/css/utilities/media.css +2 -2
  55. package/css/utilities/table.css +34 -34
  56. package/css/utilities/transitions.css +22 -10
  57. package/css/vanduo.css +14 -34
  58. package/dist/build-info.json +3 -3
  59. package/dist/vanduo.cjs.js +929 -289
  60. package/dist/vanduo.cjs.js.map +3 -3
  61. package/dist/vanduo.cjs.min.js +7 -7
  62. package/dist/vanduo.cjs.min.js.map +3 -3
  63. package/dist/vanduo.css +7914 -7823
  64. package/dist/vanduo.css.map +1 -1
  65. package/dist/vanduo.esm.js +929 -289
  66. package/dist/vanduo.esm.js.map +3 -3
  67. package/dist/vanduo.esm.min.js +7 -7
  68. package/dist/vanduo.esm.min.js.map +3 -3
  69. package/dist/vanduo.js +929 -289
  70. package/dist/vanduo.js.map +3 -3
  71. package/dist/vanduo.min.css +2 -2
  72. package/dist/vanduo.min.css.map +1 -1
  73. package/dist/vanduo.min.js +7 -7
  74. package/dist/vanduo.min.js.map +3 -3
  75. package/js/components/affix.js +2 -2
  76. package/js/components/bubble.js +3 -3
  77. package/js/components/code-snippet.js +129 -5
  78. package/js/components/collapsible.js +2 -3
  79. package/js/components/datepicker.js +2 -2
  80. package/js/components/doc-search.js +69 -11
  81. package/js/components/draggable.js +4 -4
  82. package/js/components/dropdown.js +2 -3
  83. package/js/components/expanding-cards.js +2 -2
  84. package/js/components/flow.js +2 -2
  85. package/js/components/font-switcher.js +23 -13
  86. package/js/components/glass.js +2 -2
  87. package/js/components/grid.js +19 -8
  88. package/js/components/image-box.js +49 -10
  89. package/js/components/lazy-load.js +81 -9
  90. package/js/components/modals.js +28 -12
  91. package/js/components/morph.js +2 -2
  92. package/js/components/music-player.js +2 -2
  93. package/js/components/navbar.js +2 -2
  94. package/js/components/pagination.js +2 -3
  95. package/js/components/parallax.js +9 -10
  96. package/js/components/preloader.js +14 -5
  97. package/js/components/rating.js +2 -2
  98. package/js/components/ripple.js +2 -2
  99. package/js/components/select.js +2 -3
  100. package/js/components/sidenav.js +43 -14
  101. package/js/components/spotlight.js +2 -2
  102. package/js/components/stepper.js +2 -2
  103. package/js/components/suggest.js +9 -3
  104. package/js/components/tabs.js +2 -2
  105. package/js/components/theme-customizer.js +151 -21
  106. package/js/components/theme-switcher.js +27 -16
  107. package/js/components/timeline.js +41 -12
  108. package/js/components/timepicker.js +2 -2
  109. package/js/components/toast.js +1 -1
  110. package/js/components/tooltips.js +4 -4
  111. package/js/components/transfer.js +2 -2
  112. package/js/components/tree.js +2 -2
  113. package/js/components/validate.js +2 -2
  114. package/js/components/vd-hex.js +12 -6
  115. package/js/components/waypoint.js +2 -2
  116. package/js/utils/helpers.js +7 -4
  117. package/js/utils/lifecycle.js +158 -83
  118. package/js/vanduo.js +203 -34
  119. package/package.json +2 -1
@@ -3,6 +3,7 @@
3
3
  * Form components: inputs, textareas, labels, and validation
4
4
  */
5
5
 
6
+ /* stylelint-disable-next-line no-duplicate-selectors -- control-specific tokens stay grouped near their rules. */
6
7
  :root {
7
8
  /* Input Padding (Fibonacci pairs: x/y ratio ~ phi)
8
9
  * sm: 8px/5px = 1.6 ~ phi
@@ -28,18 +29,18 @@
28
29
 
29
30
  /* Input Border */
30
31
  --input-border-width: 1px;
31
- --input-border-color: var(--border-color);
32
+ --input-border-color: var(--vd-border-color);
32
33
  --input-border-radius: var(--btn-border-radius);
33
34
  --input-border-radius-sm: var(--btn-border-radius-sm);
34
35
  --input-border-radius-lg: var(--btn-border-radius-lg);
35
36
 
36
37
  /* Input Background */
37
- --input-bg: var(--color-white);
38
- --input-bg-disabled: var(--bg-secondary);
38
+ --input-bg: var(--vd-color-white);
39
+ --input-bg-disabled: var(--vd-bg-secondary);
39
40
 
40
41
  /* Input Focus */
41
- --input-focus-border-color: var(--color-primary);
42
- --input-focus-box-shadow: 0 0 0 3px var(--color-primary-alpha-20);
42
+ --input-focus-border-color: var(--vd-color-primary);
43
+ --input-focus-box-shadow: 0 0 0 3px var(--vd-color-primary-alpha-20);
43
44
 
44
45
  /* Input Transitions */
45
46
  --input-transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
@@ -47,18 +48,22 @@
47
48
 
48
49
  /* Dark Theme Overrides */
49
50
  [data-theme="dark"] {
50
- --input-bg: var(--bg-secondary);
51
- --input-bg-disabled: var(--bg-tertiary);
51
+ --input-bg: var(--vd-bg-secondary);
52
+ --input-bg-disabled: var(--vd-bg-tertiary);
52
53
  }
53
54
 
54
55
  @media (prefers-color-scheme: dark) {
55
56
  :root:not([data-theme]) {
56
- --input-bg: var(--bg-secondary);
57
- --input-bg-disabled: var(--bg-tertiary);
57
+ --input-bg: var(--vd-bg-secondary);
58
+ --input-bg-disabled: var(--vd-bg-tertiary);
58
59
  }
59
60
  }
60
61
 
61
- /* Base Input */
62
+ /* Base Input
63
+ * The main bundle intentionally styles both `.vd-*` controls and native form
64
+ * elements for full-page framework usage. Keep new raw element selectors in
65
+ * reset/base layers; component-specific styling should prefer `.vd-*` hooks.
66
+ */
62
67
  .vd-input,
63
68
  input[type="text"],
64
69
  input[type="email"],
@@ -77,7 +82,7 @@ input[type="datetime-local"] {
77
82
  font-size: var(--input-font-size);
78
83
  font-weight: var(--font-weight-normal);
79
84
  line-height: var(--line-height-normal);
80
- color: var(--text-primary);
85
+ color: var(--vd-text-primary);
81
86
  background-color: var(--input-bg);
82
87
  border: var(--input-border-width) solid var(--input-border-color);
83
88
  border-radius: var(--input-border-radius);
@@ -103,7 +108,7 @@ input[type="datetime-local"]:focus {
103
108
 
104
109
  .vd-input::placeholder,
105
110
  input::placeholder {
106
- color: var(--text-muted);
111
+ color: var(--vd-text-muted);
107
112
  opacity: 1;
108
113
  }
109
114
 
@@ -126,7 +131,7 @@ textarea {
126
131
  font-size: var(--input-font-size);
127
132
  font-weight: var(--font-weight-normal);
128
133
  line-height: var(--line-height-normal);
129
- color: var(--text-primary);
134
+ color: var(--vd-text-primary);
130
135
  background-color: var(--input-bg);
131
136
  border: var(--input-border-width) solid var(--input-border-color);
132
137
  border-radius: var(--input-border-radius);
@@ -144,7 +149,7 @@ textarea:focus {
144
149
 
145
150
  .textarea::placeholder,
146
151
  textarea::placeholder {
147
- color: var(--text-muted);
152
+ color: var(--vd-text-muted);
148
153
  opacity: 1;
149
154
  }
150
155
 
@@ -197,41 +202,41 @@ textarea.textarea-lg {
197
202
  input.vd-input-error,
198
203
  .vd-input.is-error,
199
204
  input.is-error {
200
- border-color: var(--color-error);
205
+ border-color: var(--vd-color-error);
201
206
  }
202
207
 
203
208
  .vd-input-invalid,
204
209
  input.vd-input-invalid {
205
- border-color: var(--color-error);
210
+ border-color: var(--vd-color-error);
206
211
  }
207
212
 
208
213
  .vd-input-error:focus,
209
214
  input.vd-input-error:focus,
210
215
  .vd-input.is-error:focus,
211
216
  input.is-error:focus {
212
- border-color: var(--color-error);
213
- box-shadow: 0 0 0 3px var(--color-error-alpha-10);
217
+ border-color: var(--vd-color-error);
218
+ box-shadow: 0 0 0 3px var(--vd-color-error-alpha-10);
214
219
  }
215
220
 
216
221
  .vd-input-invalid:focus,
217
222
  input.vd-input-invalid:focus {
218
- border-color: var(--color-error);
219
- box-shadow: 0 0 0 3px var(--color-error-alpha-10);
223
+ border-color: var(--vd-color-error);
224
+ box-shadow: 0 0 0 3px var(--vd-color-error-alpha-10);
220
225
  }
221
226
 
222
227
  .textarea-error,
223
228
  textarea.textarea-error,
224
229
  .textarea.is-error,
225
230
  textarea.is-error {
226
- border-color: var(--color-error);
231
+ border-color: var(--vd-color-error);
227
232
  }
228
233
 
229
234
  .textarea-error:focus,
230
235
  textarea.textarea-error:focus,
231
236
  .textarea.is-error:focus,
232
237
  textarea.is-error:focus {
233
- border-color: var(--color-error);
234
- box-shadow: 0 0 0 3px var(--color-error-alpha-10);
238
+ border-color: var(--vd-color-error);
239
+ box-shadow: 0 0 0 3px var(--vd-color-error-alpha-10);
235
240
  }
236
241
 
237
242
  /* Input States - Success */
@@ -239,41 +244,41 @@ textarea.is-error:focus {
239
244
  input.vd-input-success,
240
245
  .vd-input.is-success,
241
246
  input.is-success {
242
- border-color: var(--color-success);
247
+ border-color: var(--vd-color-success);
243
248
  }
244
249
 
245
250
  .vd-input-valid,
246
251
  input.vd-input-valid {
247
- border-color: var(--color-success);
252
+ border-color: var(--vd-color-success);
248
253
  }
249
254
 
250
255
  .vd-input-success:focus,
251
256
  input.vd-input-success:focus,
252
257
  .vd-input.is-success:focus,
253
258
  input.is-success:focus {
254
- border-color: var(--color-success);
255
- box-shadow: 0 0 0 3px var(--color-success-alpha-10);
259
+ border-color: var(--vd-color-success);
260
+ box-shadow: 0 0 0 3px var(--vd-color-success-alpha-10);
256
261
  }
257
262
 
258
263
  .vd-input-valid:focus,
259
264
  input.vd-input-valid:focus {
260
- border-color: var(--color-success);
261
- box-shadow: 0 0 0 3px var(--color-success-alpha-10);
265
+ border-color: var(--vd-color-success);
266
+ box-shadow: 0 0 0 3px var(--vd-color-success-alpha-10);
262
267
  }
263
268
 
264
269
  .textarea-success,
265
270
  textarea.textarea-success,
266
271
  .textarea.is-success,
267
272
  textarea.is-success {
268
- border-color: var(--color-success);
273
+ border-color: var(--vd-color-success);
269
274
  }
270
275
 
271
276
  .textarea-success:focus,
272
277
  textarea.textarea-success:focus,
273
278
  .textarea.is-success:focus,
274
279
  textarea.is-success:focus {
275
- border-color: var(--color-success);
276
- box-shadow: 0 0 0 3px var(--color-success-alpha-10);
280
+ border-color: var(--vd-color-success);
281
+ box-shadow: 0 0 0 3px var(--vd-color-success-alpha-10);
277
282
  }
278
283
 
279
284
  /* Labels */
@@ -283,14 +288,14 @@ label {
283
288
  margin-bottom: 0.5rem;
284
289
  font-size: var(--font-size-sm);
285
290
  font-weight: var(--font-weight-medium);
286
- color: var(--text-primary);
291
+ color: var(--vd-text-primary);
287
292
  line-height: var(--line-height-normal);
288
293
  }
289
294
 
290
295
  .label-required::after,
291
296
  label.required::after {
292
297
  content: " *";
293
- color: var(--color-error);
298
+ color: var(--vd-color-error);
294
299
  }
295
300
 
296
301
  .label-sm,
@@ -319,7 +324,7 @@ label.label-lg {
319
324
  display: block;
320
325
  margin-top: 0.5rem;
321
326
  font-size: var(--font-size-sm);
322
- color: var(--color-error);
327
+ color: var(--vd-color-error);
323
328
  }
324
329
 
325
330
  .vd-form-feedback {
@@ -329,7 +334,7 @@ label.label-lg {
329
334
  }
330
335
 
331
336
  .vd-form-feedback-invalid {
332
- color: var(--color-error);
337
+ color: var(--vd-color-error);
333
338
  }
334
339
 
335
340
  .vd-form-success,
@@ -337,11 +342,11 @@ label.label-lg {
337
342
  display: block;
338
343
  margin-top: 0.5rem;
339
344
  font-size: var(--font-size-sm);
340
- color: var(--color-success);
345
+ color: var(--vd-color-success);
341
346
  }
342
347
 
343
348
  .vd-form-feedback-valid {
344
- color: var(--color-success);
349
+ color: var(--vd-color-success);
345
350
  }
346
351
 
347
352
  .vd-form-help,
@@ -349,7 +354,7 @@ label.label-lg {
349
354
  display: block;
350
355
  margin-top: 0.5rem;
351
356
  font-size: var(--font-size-sm);
352
- color: var(--text-muted);
357
+ color: var(--vd-text-muted);
353
358
  }
354
359
 
355
360
  /* Input Groups (with prefix/suffix) */
@@ -388,10 +393,10 @@ label.label-lg {
388
393
  font-size: var(--input-font-size);
389
394
  font-weight: var(--font-weight-normal);
390
395
  line-height: var(--line-height-normal);
391
- color: var(--text-secondary);
396
+ color: var(--vd-text-secondary);
392
397
  text-align: center;
393
398
  white-space: nowrap;
394
- background-color: var(--bg-secondary);
399
+ background-color: var(--vd-bg-secondary);
395
400
  border: var(--input-border-width) solid var(--input-border-color);
396
401
  }
397
402
 
@@ -420,6 +425,7 @@ label.label-lg {
420
425
  ============================================ */
421
426
 
422
427
  /* Checkbox Variables */
428
+ /* stylelint-disable-next-line no-duplicate-selectors -- control-specific tokens stay grouped near their rules. */
423
429
  :root {
424
430
  --checkbox-size: 1.3125rem;
425
431
  /* 21px - fib */
@@ -431,9 +437,9 @@ label.label-lg {
431
437
  /* fib(2) */
432
438
  --checkbox-border-radius: var(--radius-fib-3);
433
439
  /* 3px */
434
- --checkbox-check-color: var(--color-white);
435
- --checkbox-bg-checked: var(--color-primary);
436
- --checkbox-bg-indeterminate: var(--color-primary);
440
+ --checkbox-check-color: var(--vd-color-white);
441
+ --checkbox-bg-checked: var(--vd-color-primary);
442
+ --checkbox-bg-indeterminate: var(--vd-color-primary);
437
443
  --checkbox-border-color: var(--input-border-color);
438
444
  --checkbox-transition: var(--transition-base);
439
445
  }
@@ -449,7 +455,7 @@ label.label-lg {
449
455
  cursor: pointer;
450
456
  font-size: var(--input-font-size);
451
457
  line-height: var(--line-height-normal);
452
- color: var(--text-primary);
458
+ color: var(--vd-text-primary);
453
459
  user-select: none;
454
460
  gap: 0.5rem;
455
461
  /* 8px - fib */
@@ -536,7 +542,7 @@ label.label-lg {
536
542
  cursor: pointer;
537
543
  font-size: var(--input-font-size);
538
544
  line-height: var(--line-height-normal);
539
- color: var(--text-primary);
545
+ color: var(--vd-text-primary);
540
546
  user-select: none;
541
547
  padding-left: calc(var(--checkbox-size) + 0.5rem);
542
548
  position: relative;
@@ -675,6 +681,7 @@ label.label-lg {
675
681
  }
676
682
 
677
683
  /* Radio Button Variables */
684
+ /* stylelint-disable-next-line no-duplicate-selectors -- control-specific tokens stay grouped near their rules. */
678
685
  :root {
679
686
  --radio-size: 1.3125rem;
680
687
  /* 21px - fib */
@@ -690,7 +697,7 @@ label.label-lg {
690
697
  /* 5px - fib */
691
698
  --radio-dot-size-lg: 0.8125rem;
692
699
  /* 13px - fib */
693
- --radio-bg-checked: var(--color-primary);
700
+ --radio-bg-checked: var(--vd-color-primary);
694
701
  --radio-border-color: var(--input-border-color);
695
702
  --radio-transition: var(--transition-base);
696
703
  }
@@ -705,7 +712,7 @@ label.label-lg {
705
712
  cursor: pointer;
706
713
  font-size: var(--input-font-size);
707
714
  line-height: var(--line-height-normal);
708
- color: var(--text-primary);
715
+ color: var(--vd-text-primary);
709
716
  user-select: none;
710
717
  gap: 0.5rem;
711
718
  }
@@ -790,7 +797,7 @@ label.label-lg {
790
797
  cursor: pointer;
791
798
  font-size: var(--input-font-size);
792
799
  line-height: var(--line-height-normal);
793
- color: var(--text-primary);
800
+ color: var(--vd-text-primary);
794
801
  user-select: none;
795
802
  padding-left: calc(var(--radio-size) + 0.5rem);
796
803
  position: relative;
@@ -922,6 +929,7 @@ label.label-lg {
922
929
  }
923
930
 
924
931
  /* Range Variables */
932
+ /* stylelint-disable-next-line no-duplicate-selectors -- range tokens stay grouped with range control styles. */
925
933
  :root {
926
934
  --range-track-height: 0.5rem;
927
935
  --range-track-height-sm: 0.375rem;
@@ -929,22 +937,23 @@ label.label-lg {
929
937
  --range-thumb-size: 1.25rem;
930
938
  --range-thumb-size-sm: 1rem;
931
939
  --range-thumb-size-lg: 1.5rem;
932
- --range-track-bg: var(--color-gray-300);
940
+ --range-track-bg: var(--vd-color-gray-300);
933
941
  --range-track-border: none;
934
- --range-track-fill: var(--color-primary);
935
- --range-thumb-bg: var(--color-primary);
936
- --range-thumb-border: 2px solid var(--color-white);
942
+ --range-track-fill: var(--vd-color-primary);
943
+ --range-thumb-bg: var(--vd-color-primary);
944
+ --range-thumb-border: 2px solid var(--vd-color-white);
937
945
  --range-thumb-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
938
946
  }
939
947
 
940
948
  /* Dark Theme Range Overrides - more visible track */
949
+ /* stylelint-disable-next-line no-duplicate-selectors -- dark-mode token overrides stay adjacent to range styles. */
941
950
  [data-theme="dark"] {
942
- --range-track-bg: var(--color-gray-400);
951
+ --range-track-bg: var(--vd-color-gray-400);
943
952
  }
944
953
 
945
954
  @media (prefers-color-scheme: dark) {
946
955
  :root:not([data-theme]) {
947
- --range-track-bg: var(--color-gray-400);
956
+ --range-track-bg: var(--vd-color-gray-400);
948
957
  }
949
958
  }
950
959
 
@@ -977,12 +986,12 @@ input[type="range"]:focus {
977
986
 
978
987
  input[type="range"].range-input:focus::-webkit-slider-thumb,
979
988
  input[type="range"]:focus::-webkit-slider-thumb {
980
- box-shadow: var(--range-thumb-shadow), 0 0 0 3px var(--color-primary-alpha-10);
989
+ box-shadow: var(--range-thumb-shadow), 0 0 0 3px var(--vd-color-primary-alpha-10);
981
990
  }
982
991
 
983
992
  input[type="range"].range-input:focus::-moz-range-thumb,
984
993
  input[type="range"]:focus::-moz-range-thumb {
985
- box-shadow: var(--range-thumb-shadow), 0 0 0 3px var(--color-primary-alpha-10);
994
+ box-shadow: var(--range-thumb-shadow), 0 0 0 3px var(--vd-color-primary-alpha-10);
986
995
  }
987
996
 
988
997
  /* Range Track (Webkit - Chrome, Safari, Edge) */
@@ -1140,11 +1149,11 @@ input[type="range"].range-lg::-moz-range-thumb {
1140
1149
  display: inline-block;
1141
1150
  margin-left: 0.5rem;
1142
1151
  padding: 0.25rem 0.5rem;
1143
- background-color: var(--bg-secondary);
1152
+ background-color: var(--vd-bg-secondary);
1144
1153
  border-radius: var(--btn-border-radius-sm);
1145
1154
  font-size: var(--font-size-sm);
1146
1155
  font-weight: var(--font-weight-medium);
1147
- color: var(--text-primary);
1156
+ color: var(--vd-text-primary);
1148
1157
  min-width: 3rem;
1149
1158
  text-align: center;
1150
1159
  }
@@ -1155,7 +1164,7 @@ input[type="range"].range-lg::-moz-range-thumb {
1155
1164
  margin-bottom: 0.5rem;
1156
1165
  font-size: var(--font-size-sm);
1157
1166
  font-weight: var(--font-weight-medium);
1158
- color: var(--text-primary);
1167
+ color: var(--vd-text-primary);
1159
1168
  }
1160
1169
 
1161
1170
  .range-min-max {
@@ -1163,10 +1172,11 @@ input[type="range"].range-lg::-moz-range-thumb {
1163
1172
  justify-content: space-between;
1164
1173
  margin-top: 0.25rem;
1165
1174
  font-size: var(--font-size-xs);
1166
- color: var(--text-muted);
1175
+ color: var(--vd-text-muted);
1167
1176
  }
1168
1177
 
1169
1178
  /* Switch Variables */
1179
+ /* stylelint-disable-next-line no-duplicate-selectors -- control-specific tokens stay grouped near their rules. */
1170
1180
  :root {
1171
1181
  /* Switch: golden rectangle (55x34 outer, 21px thumb) */
1172
1182
  --switch-width: 3.4375rem;
@@ -1189,23 +1199,24 @@ input[type="range"].range-lg::-moz-range-thumb {
1189
1199
  /* 34px - fib */
1190
1200
  --switch-thumb-offset: 0.1875rem;
1191
1201
  /* 3px - fib */
1192
- --switch-bg-off: var(--color-gray-300);
1193
- --switch-bg-on: var(--color-primary);
1194
- --switch-bg-on-success: var(--color-success);
1195
- --switch-bg-on-warning: var(--color-warning);
1196
- --switch-bg-on-error: var(--color-error);
1197
- --switch-thumb-bg: var(--color-white);
1202
+ --switch-bg-off: var(--vd-color-gray-300);
1203
+ --switch-bg-on: var(--vd-color-primary);
1204
+ --switch-bg-on-success: var(--vd-color-success);
1205
+ --switch-bg-on-warning: var(--vd-color-warning);
1206
+ --switch-bg-on-error: var(--vd-color-error);
1207
+ --switch-thumb-bg: var(--vd-color-white);
1198
1208
  --switch-transition: var(--transition-base);
1199
1209
  }
1200
1210
 
1201
1211
  /* Dark Theme Switch Overrides */
1212
+ /* stylelint-disable-next-line no-duplicate-selectors -- dark-mode token overrides stay adjacent to switch styles. */
1202
1213
  [data-theme="dark"] {
1203
- --switch-bg-off: var(--color-gray-600);
1214
+ --switch-bg-off: var(--vd-color-gray-600);
1204
1215
  }
1205
1216
 
1206
1217
  @media (prefers-color-scheme: dark) {
1207
1218
  :root:not([data-theme]) {
1208
- --switch-bg-off: var(--color-gray-600);
1219
+ --switch-bg-off: var(--vd-color-gray-600);
1209
1220
  }
1210
1221
  }
1211
1222
 
@@ -1219,7 +1230,7 @@ input[type="range"].range-lg::-moz-range-thumb {
1219
1230
  cursor: pointer;
1220
1231
  font-size: var(--input-font-size);
1221
1232
  line-height: var(--line-height-normal);
1222
- color: var(--text-primary);
1233
+ color: var(--vd-text-primary);
1223
1234
  user-select: none;
1224
1235
  gap: 0.75rem;
1225
1236
  }
@@ -1306,7 +1317,7 @@ input[type="range"].range-lg::-moz-range-thumb {
1306
1317
  cursor: pointer;
1307
1318
  font-size: var(--input-font-size);
1308
1319
  line-height: var(--line-height-normal);
1309
- color: var(--text-primary);
1320
+ color: var(--vd-text-primary);
1310
1321
  user-select: none;
1311
1322
  position: relative;
1312
1323
  }
@@ -1479,10 +1490,11 @@ input[type="range"].range-lg::-moz-range-thumb {
1479
1490
  }
1480
1491
 
1481
1492
  /* Select Variables */
1493
+ /* stylelint-disable-next-line no-duplicate-selectors -- control-specific tokens stay grouped near their rules. */
1482
1494
  :root {
1483
1495
  --select-arrow-size: 16px;
1484
- --select-arrow-color: var(--text-secondary);
1485
- --select-arrow-color-focus: var(--color-primary);
1496
+ --select-arrow-color: var(--vd-text-secondary);
1497
+ --select-arrow-color-focus: var(--vd-color-primary);
1486
1498
  }
1487
1499
 
1488
1500
  /* Select Wrapper */
@@ -1504,7 +1516,7 @@ input[type="range"].range-lg::-moz-range-thumb {
1504
1516
  font-size: var(--input-font-size);
1505
1517
  font-weight: var(--font-weight-normal);
1506
1518
  line-height: var(--line-height-normal);
1507
- color: var(--text-primary);
1519
+ color: var(--vd-text-primary);
1508
1520
  text-align: left;
1509
1521
  background-color: var(--input-bg);
1510
1522
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23495057' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");
@@ -1549,7 +1561,7 @@ select,
1549
1561
  font-size: var(--input-font-size);
1550
1562
  font-weight: var(--font-weight-normal);
1551
1563
  line-height: var(--line-height-normal);
1552
- color: var(--text-primary);
1564
+ color: var(--vd-text-primary);
1553
1565
  background-color: var(--input-bg);
1554
1566
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23495057' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");
1555
1567
  background-repeat: no-repeat;
@@ -1587,14 +1599,14 @@ select.vd-input.vd-input-error,
1587
1599
  select.vd-input.is-error,
1588
1600
  .select-input.vd-input-error,
1589
1601
  .select-input.is-error {
1590
- border-color: var(--color-error);
1602
+ border-color: var(--vd-color-error);
1591
1603
  }
1592
1604
 
1593
1605
  select.vd-input.vd-input-success,
1594
1606
  select.vd-input.is-success,
1595
1607
  .select-input.vd-input-success,
1596
1608
  .select-input.is-success {
1597
- border-color: var(--color-success);
1609
+ border-color: var(--vd-color-success);
1598
1610
  }
1599
1611
 
1600
1612
  /* Select Sizes */
@@ -1662,7 +1674,7 @@ select[multiple] option,
1662
1674
  width: 100%;
1663
1675
  padding: var(--input-padding-y) var(--input-padding-x);
1664
1676
  font-size: var(--input-font-size);
1665
- color: var(--text-primary);
1677
+ color: var(--vd-text-primary);
1666
1678
  background-color: transparent;
1667
1679
  border: none;
1668
1680
  text-align: left;
@@ -1672,13 +1684,13 @@ select[multiple] option,
1672
1684
 
1673
1685
  .custom-select-option:hover,
1674
1686
  .custom-select-option:focus {
1675
- background-color: var(--color-primary-alpha-10);
1687
+ background-color: var(--vd-color-primary-alpha-10);
1676
1688
  outline: none;
1677
1689
  }
1678
1690
 
1679
1691
  .custom-select-option.is-selected {
1680
- background-color: var(--color-primary-alpha-10);
1681
- color: var(--color-primary);
1692
+ background-color: var(--vd-color-primary-alpha-10);
1693
+ color: var(--vd-color-primary);
1682
1694
  font-weight: var(--font-weight-medium);
1683
1695
  }
1684
1696
 
@@ -1686,14 +1698,14 @@ select[multiple] option,
1686
1698
  .custom-select-option[data-value=""] {
1687
1699
  opacity: 0.6;
1688
1700
  cursor: not-allowed;
1689
- color: var(--text-muted);
1701
+ color: var(--vd-text-muted);
1690
1702
  }
1691
1703
 
1692
1704
  .custom-select-option-group {
1693
1705
  padding: 0.5rem var(--input-padding-x);
1694
1706
  font-size: var(--font-size-sm);
1695
1707
  font-weight: var(--font-weight-semibold);
1696
- color: var(--text-muted);
1708
+ color: var(--vd-text-muted);
1697
1709
  text-transform: uppercase;
1698
1710
  letter-spacing: 0.05em;
1699
1711
  }
@@ -33,15 +33,18 @@
33
33
  position: relative;
34
34
  min-height: 60px;
35
35
  min-width: 60px;
36
+ cursor: zoom-in;
37
+ transition: transform var(--image-box-transition-duration) var(--image-box-transition-easing),
38
+ box-shadow var(--image-box-transition-duration) var(--image-box-transition-easing);
36
39
  }
37
40
 
38
41
  /* Hide broken image alt text and show styled placeholder */
39
42
  .vd-image-box-trigger.is-broken {
40
43
  /* Gradient background for placeholder */
41
44
  background: linear-gradient(135deg,
42
- var(--bg-tertiary, rgba(128, 128, 128, 0.1)) 0%,
43
- var(--bg-secondary, rgba(128, 128, 128, 0.15)) 100%);
44
- border: 1px dashed var(--border-color, rgba(128, 128, 128, 0.3));
45
+ var(--vd-bg-tertiary, rgba(128, 128, 128, 0.1)) 0%,
46
+ var(--vd-bg-secondary, rgba(128, 128, 128, 0.15)) 100%);
47
+ border: 1px dashed var(--vd-border-color, rgba(128, 128, 128, 0.3));
45
48
 
46
49
  /* Center the icon using background image */
47
50
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' fill='%23888888' viewBox='0 0 256 256'%3E%3Cpath d='M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM40,56H216v94.75l-24.29-24.29a16,16,0,0,0-22.63,0L144,151.51l-25.38-25.38a16,16,0,0,0-22.62,0L40,182.12V56Z'/%3E%3Ccircle cx='100' cy='108' r='20'/%3E%3C/svg%3E");
@@ -54,13 +57,6 @@
54
57
  overflow: hidden;
55
58
  }
56
59
 
57
- /* Image Box Trigger - Images that can be enlarged */
58
- .vd-image-box-trigger {
59
- cursor: zoom-in;
60
- transition: transform var(--image-box-transition-duration) var(--image-box-transition-easing),
61
- box-shadow var(--image-box-transition-duration) var(--image-box-transition-easing);
62
- }
63
-
64
60
  .vd-image-box-trigger:hover {
65
61
  transform: scale(1.02);
66
62
  box-shadow: var(--shadow-lg);
@@ -133,7 +129,7 @@
133
129
  background: rgba(255, 255, 255, 0.1);
134
130
  border: none;
135
131
  border-radius: 50%;
136
- color: var(--color-white);
132
+ color: var(--vd-color-white);
137
133
  font-size: 24px;
138
134
  line-height: 1;
139
135
  cursor: pointer;
@@ -159,7 +155,7 @@
159
155
  }
160
156
 
161
157
  .vd-image-box-close:focus {
162
- outline: 2px solid var(--color-primary);
158
+ outline: 2px solid var(--vd-color-primary);
163
159
  outline-offset: 2px;
164
160
  }
165
161
 
@@ -170,7 +166,7 @@
170
166
  left: 50%;
171
167
  transform: translateX(-50%);
172
168
  background: rgba(0, 0, 0, 0.7);
173
- color: var(--color-white);
169
+ color: var(--vd-color-white);
174
170
  padding: 8px 16px;
175
171
  border-radius: var(--btn-border-radius);
176
172
  font-size: var(--font-size-sm);
@@ -243,7 +239,7 @@
243
239
  /* Active/selected state for gallery thumbnails */
244
240
  .vd-image-box-gallery .vd-image-box-trigger.is-active,
245
241
  .vd-image-box-gallery .vd-image-box-trigger[aria-selected="true"] {
246
- outline: 3px solid var(--color-primary);
242
+ outline: 3px solid var(--vd-color-primary);
247
243
  outline-offset: 2px;
248
244
  transform: scale(1.05);
249
245
  box-shadow: var(--shadow-lg);
@@ -251,7 +247,7 @@
251
247
 
252
248
  /* Keyboard focus for gallery thumbnails */
253
249
  .vd-image-box-gallery .vd-image-box-trigger:focus {
254
- outline: 3px solid var(--color-primary);
250
+ outline: 3px solid var(--vd-color-primary);
255
251
  outline-offset: 2px;
256
252
  }
257
253
 
@@ -262,7 +258,7 @@
262
258
 
263
259
  /* Loading State */
264
260
  .vd-image-box-trigger.is-loading {
265
- background: var(--bg-secondary);
261
+ background: var(--vd-bg-secondary);
266
262
  animation: image-box-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
267
263
  }
268
264
 
@@ -276,4 +272,4 @@
276
272
  50% {
277
273
  opacity: 0.5;
278
274
  }
279
- }
275
+ }