vanduo-framework 1.1.8-docs-update

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 (196) hide show
  1. package/LICENSE +35 -0
  2. package/README.md +216 -0
  3. package/css/components/alerts.css +224 -0
  4. package/css/components/avatar.css +275 -0
  5. package/css/components/badges.css +230 -0
  6. package/css/components/breadcrumbs.css +146 -0
  7. package/css/components/button-group.css +82 -0
  8. package/css/components/buttons.css +530 -0
  9. package/css/components/cards.css +304 -0
  10. package/css/components/chips.css +259 -0
  11. package/css/components/code-snippet.css +555 -0
  12. package/css/components/collapsible.css +267 -0
  13. package/css/components/collections.css +253 -0
  14. package/css/components/doc-search.css +464 -0
  15. package/css/components/doc-tabs.css +38 -0
  16. package/css/components/draggable.css +317 -0
  17. package/css/components/dropdown.css +266 -0
  18. package/css/components/footer.css +375 -0
  19. package/css/components/forms.css +1774 -0
  20. package/css/components/image-box.css +279 -0
  21. package/css/components/modals.css +285 -0
  22. package/css/components/navbar.css +530 -0
  23. package/css/components/pagination.css +186 -0
  24. package/css/components/preloader.css +340 -0
  25. package/css/components/progress.css +107 -0
  26. package/css/components/sidenav.css +301 -0
  27. package/css/components/skeleton.css +241 -0
  28. package/css/components/spinner.css +144 -0
  29. package/css/components/tabs.css +327 -0
  30. package/css/components/theme-customizer.css +835 -0
  31. package/css/components/toast.css +357 -0
  32. package/css/components/tooltips.css +270 -0
  33. package/css/core/colors.css +1017 -0
  34. package/css/core/fonts.css +266 -0
  35. package/css/core/grid.css +1699 -0
  36. package/css/core/helpers.css +2202 -0
  37. package/css/core/reset.css +128 -0
  38. package/css/core/tokens.css +213 -0
  39. package/css/core/typography.css +405 -0
  40. package/css/core/vd-aliases.css +47 -0
  41. package/css/effects/parallax.css +113 -0
  42. package/css/icons/icons-all.css +23 -0
  43. package/css/icons/icons.css +25 -0
  44. package/css/utilities/media.css +167 -0
  45. package/css/utilities/print.css +111 -0
  46. package/css/utilities/shadow.css +243 -0
  47. package/css/utilities/table.css +381 -0
  48. package/css/utilities/transforms.css +71 -0
  49. package/css/utilities/transitions.css +87 -0
  50. package/css/vanduo.css +80 -0
  51. package/dist/build-info.json +6 -0
  52. package/dist/fonts/fira-sans/fira-sans-bold.woff2 +0 -0
  53. package/dist/fonts/fira-sans/fira-sans-medium.woff2 +0 -0
  54. package/dist/fonts/fira-sans/fira-sans-regular.woff2 +0 -0
  55. package/dist/fonts/ibm-plex/ibm-plex-sans-bold.woff2 +0 -0
  56. package/dist/fonts/ibm-plex/ibm-plex-sans-medium.woff2 +0 -0
  57. package/dist/fonts/ibm-plex/ibm-plex-sans-regular.woff2 +0 -0
  58. package/dist/fonts/inter/inter-bold.woff2 +0 -0
  59. package/dist/fonts/inter/inter-medium.woff2 +0 -0
  60. package/dist/fonts/inter/inter-regular.woff2 +0 -0
  61. package/dist/fonts/inter/inter-semibold.woff2 +0 -0
  62. package/dist/fonts/jetbrains-mono/jetbrains-mono-bold.woff2 +0 -0
  63. package/dist/fonts/jetbrains-mono/jetbrains-mono-regular.woff2 +0 -0
  64. package/dist/fonts/open-sans/open-sans-bold.woff2 +0 -0
  65. package/dist/fonts/open-sans/open-sans-medium.woff2 +0 -0
  66. package/dist/fonts/open-sans/open-sans-regular.woff2 +0 -0
  67. package/dist/fonts/rubik/rubik-bold.woff2 +0 -0
  68. package/dist/fonts/rubik/rubik-medium.woff2 +0 -0
  69. package/dist/fonts/rubik/rubik-regular.woff2 +0 -0
  70. package/dist/fonts/source-sans/source-sans-bold.woff2 +0 -0
  71. package/dist/fonts/source-sans/source-sans-regular.woff2 +0 -0
  72. package/dist/fonts/source-sans/source-sans-semibold.woff2 +0 -0
  73. package/dist/fonts/titillium-web/titillium-web-bold.woff2 +0 -0
  74. package/dist/fonts/titillium-web/titillium-web-regular.woff2 +0 -0
  75. package/dist/fonts/titillium-web/titillium-web-semibold.woff2 +0 -0
  76. package/dist/fonts/ubuntu/ubuntu-bold.woff2 +0 -0
  77. package/dist/fonts/ubuntu/ubuntu-medium.woff2 +0 -0
  78. package/dist/fonts/ubuntu/ubuntu-regular.woff2 +0 -0
  79. package/dist/icons/phosphor/LICENSE +21 -0
  80. package/dist/icons/phosphor/bold/Phosphor-Bold.ttf +0 -0
  81. package/dist/icons/phosphor/bold/Phosphor-Bold.woff +0 -0
  82. package/dist/icons/phosphor/bold/Phosphor-Bold.woff2 +0 -0
  83. package/dist/icons/phosphor/bold/style.css +4627 -0
  84. package/dist/icons/phosphor/duotone/Phosphor-Duotone.ttf +0 -0
  85. package/dist/icons/phosphor/duotone/Phosphor-Duotone.woff +0 -0
  86. package/dist/icons/phosphor/duotone/Phosphor-Duotone.woff2 +0 -0
  87. package/dist/icons/phosphor/duotone/style.css +12115 -0
  88. package/dist/icons/phosphor/fill/Phosphor-Fill.ttf +0 -0
  89. package/dist/icons/phosphor/fill/Phosphor-Fill.woff +0 -0
  90. package/dist/icons/phosphor/fill/Phosphor-Fill.woff2 +0 -0
  91. package/dist/icons/phosphor/fill/style.css +4627 -0
  92. package/dist/icons/phosphor/light/Phosphor-Light.ttf +0 -0
  93. package/dist/icons/phosphor/light/Phosphor-Light.woff +0 -0
  94. package/dist/icons/phosphor/light/Phosphor-Light.woff2 +0 -0
  95. package/dist/icons/phosphor/light/style.css +4627 -0
  96. package/dist/icons/phosphor/regular/Phosphor.ttf +0 -0
  97. package/dist/icons/phosphor/regular/Phosphor.woff +0 -0
  98. package/dist/icons/phosphor/regular/Phosphor.woff2 +0 -0
  99. package/dist/icons/phosphor/regular/style.css +4627 -0
  100. package/dist/icons/phosphor/thin/Phosphor-Thin.ttf +0 -0
  101. package/dist/icons/phosphor/thin/Phosphor-Thin.woff +0 -0
  102. package/dist/icons/phosphor/thin/Phosphor-Thin.woff2 +0 -0
  103. package/dist/icons/phosphor/thin/style.css +4627 -0
  104. package/dist/vanduo.cjs.js +5569 -0
  105. package/dist/vanduo.cjs.js.map +7 -0
  106. package/dist/vanduo.cjs.min.js +48 -0
  107. package/dist/vanduo.cjs.min.js.map +7 -0
  108. package/dist/vanduo.css +60666 -0
  109. package/dist/vanduo.css.map +1 -0
  110. package/dist/vanduo.esm.js +5548 -0
  111. package/dist/vanduo.esm.js.map +7 -0
  112. package/dist/vanduo.esm.min.js +48 -0
  113. package/dist/vanduo.esm.min.js.map +7 -0
  114. package/dist/vanduo.js +5545 -0
  115. package/dist/vanduo.js.map +7 -0
  116. package/dist/vanduo.min.css +2 -0
  117. package/dist/vanduo.min.css.map +1 -0
  118. package/dist/vanduo.min.js +48 -0
  119. package/dist/vanduo.min.js.map +7 -0
  120. package/fonts/fira-sans/fira-sans-bold.woff2 +0 -0
  121. package/fonts/fira-sans/fira-sans-medium.woff2 +0 -0
  122. package/fonts/fira-sans/fira-sans-regular.woff2 +0 -0
  123. package/fonts/ibm-plex/ibm-plex-sans-bold.woff2 +0 -0
  124. package/fonts/ibm-plex/ibm-plex-sans-medium.woff2 +0 -0
  125. package/fonts/ibm-plex/ibm-plex-sans-regular.woff2 +0 -0
  126. package/fonts/inter/inter-bold.woff2 +0 -0
  127. package/fonts/inter/inter-medium.woff2 +0 -0
  128. package/fonts/inter/inter-regular.woff2 +0 -0
  129. package/fonts/inter/inter-semibold.woff2 +0 -0
  130. package/fonts/jetbrains-mono/jetbrains-mono-bold.woff2 +0 -0
  131. package/fonts/jetbrains-mono/jetbrains-mono-regular.woff2 +0 -0
  132. package/fonts/open-sans/open-sans-bold.woff2 +0 -0
  133. package/fonts/open-sans/open-sans-medium.woff2 +0 -0
  134. package/fonts/open-sans/open-sans-regular.woff2 +0 -0
  135. package/fonts/rubik/rubik-bold.woff2 +0 -0
  136. package/fonts/rubik/rubik-medium.woff2 +0 -0
  137. package/fonts/rubik/rubik-regular.woff2 +0 -0
  138. package/fonts/source-sans/source-sans-bold.woff2 +0 -0
  139. package/fonts/source-sans/source-sans-regular.woff2 +0 -0
  140. package/fonts/source-sans/source-sans-semibold.woff2 +0 -0
  141. package/fonts/titillium-web/titillium-web-bold.woff2 +0 -0
  142. package/fonts/titillium-web/titillium-web-regular.woff2 +0 -0
  143. package/fonts/titillium-web/titillium-web-semibold.woff2 +0 -0
  144. package/fonts/ubuntu/ubuntu-bold.woff2 +0 -0
  145. package/fonts/ubuntu/ubuntu-medium.woff2 +0 -0
  146. package/fonts/ubuntu/ubuntu-regular.woff2 +0 -0
  147. package/icons/phosphor/LICENSE +21 -0
  148. package/icons/phosphor/bold/Phosphor-Bold.ttf +0 -0
  149. package/icons/phosphor/bold/Phosphor-Bold.woff +0 -0
  150. package/icons/phosphor/bold/Phosphor-Bold.woff2 +0 -0
  151. package/icons/phosphor/bold/style.css +4627 -0
  152. package/icons/phosphor/duotone/Phosphor-Duotone.ttf +0 -0
  153. package/icons/phosphor/duotone/Phosphor-Duotone.woff +0 -0
  154. package/icons/phosphor/duotone/Phosphor-Duotone.woff2 +0 -0
  155. package/icons/phosphor/duotone/style.css +12115 -0
  156. package/icons/phosphor/fill/Phosphor-Fill.ttf +0 -0
  157. package/icons/phosphor/fill/Phosphor-Fill.woff +0 -0
  158. package/icons/phosphor/fill/Phosphor-Fill.woff2 +0 -0
  159. package/icons/phosphor/fill/style.css +4627 -0
  160. package/icons/phosphor/light/Phosphor-Light.ttf +0 -0
  161. package/icons/phosphor/light/Phosphor-Light.woff +0 -0
  162. package/icons/phosphor/light/Phosphor-Light.woff2 +0 -0
  163. package/icons/phosphor/light/style.css +4627 -0
  164. package/icons/phosphor/regular/Phosphor.ttf +0 -0
  165. package/icons/phosphor/regular/Phosphor.woff +0 -0
  166. package/icons/phosphor/regular/Phosphor.woff2 +0 -0
  167. package/icons/phosphor/regular/style.css +4627 -0
  168. package/icons/phosphor/thin/Phosphor-Thin.ttf +0 -0
  169. package/icons/phosphor/thin/Phosphor-Thin.woff +0 -0
  170. package/icons/phosphor/thin/Phosphor-Thin.woff2 +0 -0
  171. package/icons/phosphor/thin/style.css +4627 -0
  172. package/js/components/code-snippet.js +639 -0
  173. package/js/components/collapsible.js +226 -0
  174. package/js/components/doc-search.js +936 -0
  175. package/js/components/draggable.js +725 -0
  176. package/js/components/dropdown.js +362 -0
  177. package/js/components/font-switcher.js +253 -0
  178. package/js/components/grid.js +279 -0
  179. package/js/components/image-box.js +372 -0
  180. package/js/components/modals.js +367 -0
  181. package/js/components/navbar.js +264 -0
  182. package/js/components/pagination.js +286 -0
  183. package/js/components/parallax.js +216 -0
  184. package/js/components/preloader.js +183 -0
  185. package/js/components/select.js +444 -0
  186. package/js/components/sidenav.js +303 -0
  187. package/js/components/tabs.js +303 -0
  188. package/js/components/theme-customizer.js +784 -0
  189. package/js/components/theme-switcher.js +183 -0
  190. package/js/components/toast.js +343 -0
  191. package/js/components/tooltips.js +306 -0
  192. package/js/index.js +52 -0
  193. package/js/utils/helpers.js +306 -0
  194. package/js/utils/lifecycle.js +135 -0
  195. package/js/vanduo.js +120 -0
  196. package/package.json +78 -0
@@ -0,0 +1,1774 @@
1
+ /**
2
+ * Vanduo Framework - Forms
3
+ * Form components: inputs, textareas, labels, and validation
4
+ */
5
+
6
+ :root {
7
+ /* Input Padding (Fibonacci pairs: x/y ratio ~ phi)
8
+ * sm: 8px/5px = 1.6 ~ phi
9
+ * base: 13px/8px = 1.625 ~ phi
10
+ * lg: 21px/13px = 1.615 ~ phi */
11
+ --input-padding-x-sm: 0.5rem;
12
+ /* 8px - fib */
13
+ --input-padding-y-sm: 0.3125rem;
14
+ /* 5px - fib */
15
+ --input-padding-x: 0.8125rem;
16
+ /* 13px - fib */
17
+ --input-padding-y: 0.5rem;
18
+ /* 8px - fib */
19
+ --input-padding-x-lg: 1.3125rem;
20
+ /* 21px - fib */
21
+ --input-padding-y-lg: 0.8125rem;
22
+ /* 13px - fib */
23
+
24
+ /* Input Font Sizes */
25
+ --input-font-size-sm: var(--font-size-sm);
26
+ --input-font-size: var(--font-size-base);
27
+ --input-font-size-lg: var(--font-size-lg);
28
+
29
+ /* Input Border */
30
+ --input-border-width: 1px;
31
+ --input-border-color: var(--border-color);
32
+ --input-border-radius: var(--btn-border-radius);
33
+ --input-border-radius-sm: var(--btn-border-radius-sm);
34
+ --input-border-radius-lg: var(--btn-border-radius-lg);
35
+
36
+ /* Input Background */
37
+ --input-bg: var(--color-white);
38
+ --input-bg-disabled: var(--bg-secondary);
39
+
40
+ /* Input Focus */
41
+ --input-focus-border-color: var(--color-primary);
42
+ --input-focus-box-shadow: 0 0 0 3px var(--color-primary-alpha-20);
43
+
44
+ /* Input Transitions */
45
+ --input-transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
46
+ }
47
+
48
+ /* Dark Theme Overrides */
49
+ [data-theme="dark"] {
50
+ --input-bg: var(--bg-secondary);
51
+ --input-bg-disabled: var(--bg-tertiary);
52
+ }
53
+
54
+ @media (prefers-color-scheme: dark) {
55
+ :root:not([data-theme]) {
56
+ --input-bg: var(--bg-secondary);
57
+ --input-bg-disabled: var(--bg-tertiary);
58
+ }
59
+ }
60
+
61
+ /* Base Input */
62
+ .vd-input,
63
+ input[type="text"],
64
+ input[type="email"],
65
+ input[type="password"],
66
+ input[type="number"],
67
+ input[type="tel"],
68
+ input[type="url"],
69
+ input[type="search"],
70
+ input[type="date"],
71
+ input[type="time"],
72
+ input[type="datetime-local"] {
73
+ display: block;
74
+ width: 100%;
75
+ padding: var(--input-padding-y) var(--input-padding-x);
76
+ font-family: var(--font-family-sans);
77
+ font-size: var(--input-font-size);
78
+ font-weight: var(--font-weight-normal);
79
+ line-height: var(--line-height-normal);
80
+ color: var(--text-primary);
81
+ background-color: var(--input-bg);
82
+ border: var(--input-border-width) solid var(--input-border-color);
83
+ border-radius: var(--input-border-radius);
84
+ transition: var(--input-transition);
85
+ appearance: none;
86
+ }
87
+
88
+ .vd-input:focus,
89
+ input[type="text"]:focus,
90
+ input[type="email"]:focus,
91
+ input[type="password"]:focus,
92
+ input[type="number"]:focus,
93
+ input[type="tel"]:focus,
94
+ input[type="url"]:focus,
95
+ input[type="search"]:focus,
96
+ input[type="date"]:focus,
97
+ input[type="time"]:focus,
98
+ input[type="datetime-local"]:focus {
99
+ outline: 0;
100
+ border-color: var(--input-focus-border-color);
101
+ box-shadow: var(--input-focus-box-shadow);
102
+ }
103
+
104
+ .vd-input::placeholder,
105
+ input::placeholder {
106
+ color: var(--text-muted);
107
+ opacity: 1;
108
+ }
109
+
110
+ .vd-input:disabled,
111
+ input:disabled,
112
+ .vd-input.disabled,
113
+ input.disabled {
114
+ background-color: var(--input-bg-disabled);
115
+ opacity: 0.6;
116
+ cursor: not-allowed;
117
+ }
118
+
119
+ /* Textarea */
120
+ .textarea,
121
+ textarea {
122
+ display: block;
123
+ width: 100%;
124
+ padding: var(--input-padding-y) var(--input-padding-x);
125
+ font-family: var(--font-family-sans);
126
+ font-size: var(--input-font-size);
127
+ font-weight: var(--font-weight-normal);
128
+ line-height: var(--line-height-normal);
129
+ color: var(--text-primary);
130
+ background-color: var(--input-bg);
131
+ border: var(--input-border-width) solid var(--input-border-color);
132
+ border-radius: var(--input-border-radius);
133
+ transition: var(--input-transition);
134
+ resize: vertical;
135
+ min-height: 100px;
136
+ }
137
+
138
+ .textarea:focus,
139
+ textarea:focus {
140
+ outline: 0;
141
+ border-color: var(--input-focus-border-color);
142
+ box-shadow: var(--input-focus-box-shadow);
143
+ }
144
+
145
+ .textarea::placeholder,
146
+ textarea::placeholder {
147
+ color: var(--text-muted);
148
+ opacity: 1;
149
+ }
150
+
151
+ .textarea:disabled,
152
+ textarea:disabled,
153
+ .textarea.disabled,
154
+ textarea.disabled {
155
+ background-color: var(--input-bg-disabled);
156
+ opacity: 0.6;
157
+ cursor: not-allowed;
158
+ }
159
+
160
+ .textarea-no-resize,
161
+ textarea.no-resize {
162
+ resize: none;
163
+ }
164
+
165
+ /* Input Sizes - Small */
166
+ .vd-input-sm,
167
+ input.vd-input-sm {
168
+ padding: var(--input-padding-y-sm) var(--input-padding-x-sm);
169
+ font-size: var(--input-font-size-sm);
170
+ border-radius: var(--input-border-radius-sm);
171
+ }
172
+
173
+ .textarea-sm,
174
+ textarea.textarea-sm {
175
+ padding: var(--input-padding-y-sm) var(--input-padding-x-sm);
176
+ font-size: var(--input-font-size-sm);
177
+ border-radius: var(--input-border-radius-sm);
178
+ }
179
+
180
+ /* Input Sizes - Large */
181
+ .vd-input-lg,
182
+ input.vd-input-lg {
183
+ padding: var(--input-padding-y-lg) var(--input-padding-x-lg);
184
+ font-size: var(--input-font-size-lg);
185
+ border-radius: var(--input-border-radius-lg);
186
+ }
187
+
188
+ .textarea-lg,
189
+ textarea.textarea-lg {
190
+ padding: var(--input-padding-y-lg) var(--input-padding-x-lg);
191
+ font-size: var(--input-font-size-lg);
192
+ border-radius: var(--input-border-radius-lg);
193
+ }
194
+
195
+ /* Input States - Error */
196
+ .vd-input-error,
197
+ input.vd-input-error,
198
+ .vd-input.is-error,
199
+ input.is-error {
200
+ border-color: var(--color-error);
201
+ }
202
+
203
+ .vd-input-invalid,
204
+ input.vd-input-invalid {
205
+ border-color: var(--color-error);
206
+ }
207
+
208
+ .vd-input-error:focus,
209
+ input.vd-input-error:focus,
210
+ .vd-input.is-error:focus,
211
+ input.is-error:focus {
212
+ border-color: var(--color-error);
213
+ box-shadow: 0 0 0 3px var(--color-error-alpha-10);
214
+ }
215
+
216
+ .vd-input-invalid:focus,
217
+ input.vd-input-invalid:focus {
218
+ border-color: var(--color-error);
219
+ box-shadow: 0 0 0 3px var(--color-error-alpha-10);
220
+ }
221
+
222
+ .textarea-error,
223
+ textarea.textarea-error,
224
+ .textarea.is-error,
225
+ textarea.is-error {
226
+ border-color: var(--color-error);
227
+ }
228
+
229
+ .textarea-error:focus,
230
+ textarea.textarea-error:focus,
231
+ .textarea.is-error:focus,
232
+ textarea.is-error:focus {
233
+ border-color: var(--color-error);
234
+ box-shadow: 0 0 0 3px var(--color-error-alpha-10);
235
+ }
236
+
237
+ /* Input States - Success */
238
+ .vd-input-success,
239
+ input.vd-input-success,
240
+ .vd-input.is-success,
241
+ input.is-success {
242
+ border-color: var(--color-success);
243
+ }
244
+
245
+ .vd-input-valid,
246
+ input.vd-input-valid {
247
+ border-color: var(--color-success);
248
+ }
249
+
250
+ .vd-input-success:focus,
251
+ input.vd-input-success:focus,
252
+ .vd-input.is-success:focus,
253
+ input.is-success:focus {
254
+ border-color: var(--color-success);
255
+ box-shadow: 0 0 0 3px var(--color-success-alpha-10);
256
+ }
257
+
258
+ .vd-input-valid:focus,
259
+ input.vd-input-valid:focus {
260
+ border-color: var(--color-success);
261
+ box-shadow: 0 0 0 3px var(--color-success-alpha-10);
262
+ }
263
+
264
+ .textarea-success,
265
+ textarea.textarea-success,
266
+ .textarea.is-success,
267
+ textarea.is-success {
268
+ border-color: var(--color-success);
269
+ }
270
+
271
+ .textarea-success:focus,
272
+ textarea.textarea-success:focus,
273
+ .textarea.is-success:focus,
274
+ textarea.is-success:focus {
275
+ border-color: var(--color-success);
276
+ box-shadow: 0 0 0 3px var(--color-success-alpha-10);
277
+ }
278
+
279
+ /* Labels */
280
+ .label,
281
+ label {
282
+ display: inline-block;
283
+ margin-bottom: 0.5rem;
284
+ font-size: var(--font-size-sm);
285
+ font-weight: var(--font-weight-medium);
286
+ color: var(--text-primary);
287
+ line-height: var(--line-height-normal);
288
+ }
289
+
290
+ .label-required::after,
291
+ label.required::after {
292
+ content: " *";
293
+ color: var(--color-error);
294
+ }
295
+
296
+ .label-sm,
297
+ label.label-sm {
298
+ font-size: var(--font-size-xs);
299
+ }
300
+
301
+ .label-lg,
302
+ label.label-lg {
303
+ font-size: var(--font-size-base);
304
+ }
305
+
306
+ /* Form Groups */
307
+ .vd-form-group {
308
+ margin-bottom: 1.3125rem;
309
+ /* 21px - fib */
310
+ }
311
+
312
+ .vd-form-group:last-child {
313
+ margin-bottom: 0;
314
+ }
315
+
316
+ /* Validation Messages */
317
+ .vd-form-error,
318
+ .error-message {
319
+ display: block;
320
+ margin-top: 0.5rem;
321
+ font-size: var(--font-size-sm);
322
+ color: var(--color-error);
323
+ }
324
+
325
+ .vd-form-feedback {
326
+ display: block;
327
+ margin-top: 0.5rem;
328
+ font-size: var(--font-size-sm);
329
+ }
330
+
331
+ .vd-form-feedback-invalid {
332
+ color: var(--color-error);
333
+ }
334
+
335
+ .vd-form-success,
336
+ .success-message {
337
+ display: block;
338
+ margin-top: 0.5rem;
339
+ font-size: var(--font-size-sm);
340
+ color: var(--color-success);
341
+ }
342
+
343
+ .vd-form-feedback-valid {
344
+ color: var(--color-success);
345
+ }
346
+
347
+ .vd-form-help,
348
+ .help-text {
349
+ display: block;
350
+ margin-top: 0.5rem;
351
+ font-size: var(--font-size-sm);
352
+ color: var(--text-muted);
353
+ }
354
+
355
+ /* Input Groups (with prefix/suffix) */
356
+ .vd-input-group {
357
+ display: flex;
358
+ width: 100%;
359
+ align-items: stretch;
360
+ }
361
+
362
+ .vd-input-group>.vd-input,
363
+ .vd-input-group>input {
364
+ position: relative;
365
+ flex: 1 1 auto;
366
+ width: 1%;
367
+ min-width: 0;
368
+ }
369
+
370
+ .vd-input-group>.vd-input:not(:first-child),
371
+ .vd-input-group>input:not(:first-child) {
372
+ border-top-left-radius: 0;
373
+ border-bottom-left-radius: 0;
374
+ margin-left: -1px;
375
+ }
376
+
377
+ .vd-input-group>.vd-input:not(:last-child),
378
+ .vd-input-group>input:not(:last-child) {
379
+ border-top-right-radius: 0;
380
+ border-bottom-right-radius: 0;
381
+ }
382
+
383
+ .vd-input-group-prefix,
384
+ .vd-input-group-suffix {
385
+ display: flex;
386
+ align-items: center;
387
+ padding: var(--input-padding-y) var(--input-padding-x);
388
+ font-size: var(--input-font-size);
389
+ font-weight: var(--font-weight-normal);
390
+ line-height: var(--line-height-normal);
391
+ color: var(--text-secondary);
392
+ text-align: center;
393
+ white-space: nowrap;
394
+ background-color: var(--bg-secondary);
395
+ border: var(--input-border-width) solid var(--input-border-color);
396
+ }
397
+
398
+ .vd-input-group-prefix {
399
+ border-right: 0;
400
+ border-radius: var(--input-border-radius) 0 0 var(--input-border-radius);
401
+ }
402
+
403
+ .vd-input-group-suffix {
404
+ border-left: 0;
405
+ border-radius: 0 var(--input-border-radius) var(--input-border-radius) 0;
406
+ }
407
+
408
+ .vd-input-group>.vd-input-group-prefix+.vd-input,
409
+ .vd-input-group>.vd-input-group-prefix+input {
410
+ border-left: 0;
411
+ }
412
+
413
+ .vd-input-group>.vd-input+.vd-input-group-suffix,
414
+ .vd-input-group>input+.vd-input-group-suffix {
415
+ border-right: 0;
416
+ }
417
+
418
+ /* ============================================
419
+ Phase 4: Custom Form Controls
420
+ ============================================ */
421
+
422
+ /* Checkbox Variables */
423
+ :root {
424
+ --checkbox-size: 1.3125rem;
425
+ /* 21px - fib */
426
+ --checkbox-size-sm: 0.8125rem;
427
+ /* 13px - fib */
428
+ --checkbox-size-lg: 2.125rem;
429
+ /* 34px - fib */
430
+ --checkbox-border-width: 2px;
431
+ /* fib(2) */
432
+ --checkbox-border-radius: var(--radius-fib-3);
433
+ /* 3px */
434
+ --checkbox-check-color: var(--color-white);
435
+ --checkbox-bg-checked: var(--color-primary);
436
+ --checkbox-bg-indeterminate: var(--color-primary);
437
+ --checkbox-border-color: var(--input-border-color);
438
+ --checkbox-transition: var(--transition-base);
439
+ }
440
+
441
+ /* Checkbox Wrapper */
442
+ .checkbox,
443
+ .vd-form-check {
444
+ display: flex;
445
+ align-items: center;
446
+ margin-bottom: 0.8125rem;
447
+ /* 13px - fib */
448
+ position: relative;
449
+ cursor: pointer;
450
+ font-size: var(--input-font-size);
451
+ line-height: var(--line-height-normal);
452
+ color: var(--text-primary);
453
+ user-select: none;
454
+ gap: 0.5rem;
455
+ /* 8px - fib */
456
+ }
457
+
458
+ /* Native checkbox styling (label.checkbox > input + span pattern) */
459
+ .checkbox>input[type="checkbox"],
460
+ .vd-form-check>input[type="checkbox"] {
461
+ appearance: none;
462
+ -webkit-appearance: none;
463
+ width: var(--checkbox-size);
464
+ height: var(--checkbox-size);
465
+ border: var(--checkbox-border-width) solid var(--checkbox-border-color);
466
+ border-radius: var(--checkbox-border-radius);
467
+ background-color: var(--input-bg);
468
+ cursor: pointer;
469
+ flex-shrink: 0;
470
+ margin: 0;
471
+ position: relative;
472
+ transition: var(--checkbox-transition);
473
+ }
474
+
475
+ .checkbox>input[type="checkbox"]:checked,
476
+ .vd-form-check>input[type="checkbox"]:checked {
477
+ background-color: var(--checkbox-bg-checked);
478
+ border-color: var(--checkbox-bg-checked);
479
+ }
480
+
481
+ .checkbox>input[type="checkbox"]:checked::after,
482
+ .vd-form-check>input[type="checkbox"]:checked::after {
483
+ content: '';
484
+ position: absolute;
485
+ left: 50%;
486
+ top: 45%;
487
+ transform: translate(-50%, -50%) rotate(45deg);
488
+ width: 0.3rem;
489
+ height: 0.6rem;
490
+ border: solid var(--checkbox-check-color);
491
+ border-width: 0 2px 2px 0;
492
+ }
493
+
494
+ .checkbox>input[type="checkbox"]:disabled,
495
+ .vd-form-check>input[type="checkbox"]:disabled {
496
+ background-color: var(--input-bg-disabled);
497
+ cursor: not-allowed;
498
+ opacity: 0.6;
499
+ }
500
+
501
+ .checkbox>input[type="checkbox"]:disabled+span,
502
+ .vd-form-check>input[type="checkbox"]:disabled+span {
503
+ opacity: 0.6;
504
+ cursor: not-allowed;
505
+ }
506
+
507
+ .checkbox>input[type="checkbox"]:focus-visible,
508
+ .vd-form-check>input[type="checkbox"]:focus-visible {
509
+ outline: 2px solid var(--input-focus-border-color);
510
+ outline-offset: 2px;
511
+ }
512
+
513
+ .checkbox-inline,
514
+ .vd-form-check-inline {
515
+ display: inline-flex;
516
+ margin-right: 1.5rem;
517
+ margin-bottom: 0;
518
+ vertical-align: middle;
519
+ }
520
+
521
+ /* Checkbox Input (class-based pattern) */
522
+ .checkbox-input,
523
+ .vd-form-check-input {
524
+ position: absolute;
525
+ opacity: 0;
526
+ width: 0;
527
+ height: 0;
528
+ margin: 0;
529
+ cursor: pointer;
530
+ }
531
+
532
+ .checkbox-label,
533
+ .vd-form-check-label {
534
+ display: inline-flex;
535
+ align-items: center;
536
+ cursor: pointer;
537
+ font-size: var(--input-font-size);
538
+ line-height: var(--line-height-normal);
539
+ color: var(--text-primary);
540
+ user-select: none;
541
+ padding-left: calc(var(--checkbox-size) + 0.5rem);
542
+ position: relative;
543
+ min-height: var(--checkbox-size);
544
+ }
545
+
546
+ .checkbox-label::before,
547
+ .vd-form-check-label::before {
548
+ content: '';
549
+ position: absolute;
550
+ left: 0;
551
+ top: 50%;
552
+ transform: translateY(-50%);
553
+ width: var(--checkbox-size);
554
+ height: var(--checkbox-size);
555
+ border: var(--checkbox-border-width) solid var(--checkbox-border-color);
556
+ border-radius: var(--checkbox-border-radius);
557
+ background-color: var(--input-bg);
558
+ transition: var(--checkbox-transition);
559
+ flex-shrink: 0;
560
+ }
561
+
562
+ .checkbox-input:checked+.checkbox-label::before,
563
+ .checkbox-input:checked~.checkbox-label::before,
564
+ .vd-form-check-input:checked+.vd-form-check-label::before {
565
+ background-color: var(--checkbox-bg-checked);
566
+ border-color: var(--checkbox-bg-checked);
567
+ }
568
+
569
+ .checkbox-input:checked+.checkbox-label::after,
570
+ .checkbox-input:checked~.checkbox-label::after,
571
+ .vd-form-check-input:checked+.vd-form-check-label::after {
572
+ content: '';
573
+ position: absolute;
574
+ left: calc(var(--checkbox-size) / 2);
575
+ top: 50%;
576
+ transform: translate(-50%, -60%) rotate(45deg);
577
+ width: 0.375rem;
578
+ height: 0.75rem;
579
+ border: solid var(--checkbox-check-color);
580
+ border-width: 0 2px 2px 0;
581
+ opacity: 1;
582
+ }
583
+
584
+ .checkbox-input:indeterminate+.checkbox-label::before,
585
+ .checkbox-input:indeterminate~.checkbox-label::before,
586
+ .vd-form-check-input:indeterminate+.vd-form-check-label::before {
587
+ background-color: var(--checkbox-bg-indeterminate);
588
+ border-color: var(--checkbox-bg-indeterminate);
589
+ }
590
+
591
+ .checkbox-input:indeterminate+.checkbox-label::after,
592
+ .checkbox-input:indeterminate~.checkbox-label::after,
593
+ .vd-form-check-input:indeterminate+.vd-form-check-label::after {
594
+ content: '';
595
+ position: absolute;
596
+ left: calc(var(--checkbox-size) / 2);
597
+ top: 50%;
598
+ transform: translate(-50%, -50%);
599
+ width: 0.5rem;
600
+ height: 2px;
601
+ background-color: var(--checkbox-check-color);
602
+ border: none;
603
+ opacity: 1;
604
+ }
605
+
606
+ .checkbox-input:focus-visible+.checkbox-label::before,
607
+ .checkbox-input:focus-visible~.checkbox-label::before,
608
+ .vd-form-check-input:focus-visible+.vd-form-check-label::before {
609
+ outline: 2px solid var(--input-focus-border-color);
610
+ outline-offset: 2px;
611
+ }
612
+
613
+ .checkbox-input:disabled+.checkbox-label,
614
+ .checkbox-input:disabled~.checkbox-label,
615
+ .vd-form-check-input:disabled+.vd-form-check-label {
616
+ opacity: 0.6;
617
+ cursor: not-allowed;
618
+ }
619
+
620
+ .checkbox-input:disabled+.checkbox-label::before,
621
+ .checkbox-input:disabled~.checkbox-label::before,
622
+ .vd-form-check-input:disabled+.vd-form-check-label::before {
623
+ background-color: var(--input-bg-disabled);
624
+ border-color: var(--checkbox-border-color);
625
+ cursor: not-allowed;
626
+ }
627
+
628
+ /* Checkbox Sizes */
629
+ .checkbox-sm .checkbox-label,
630
+ .checkbox-sm .vd-form-check-label,
631
+ .vd-form-check-sm .checkbox-label,
632
+ .vd-form-check-sm .vd-form-check-label {
633
+ font-size: var(--input-font-size-sm);
634
+ padding-left: calc(var(--checkbox-size-sm) + 0.625rem);
635
+ min-height: var(--checkbox-size-sm);
636
+ }
637
+
638
+ .checkbox-sm .checkbox-label::before,
639
+ .checkbox-sm .vd-form-check-label::before,
640
+ .vd-form-check-sm .checkbox-label::before,
641
+ .vd-form-check-sm .vd-form-check-label::before {
642
+ width: var(--checkbox-size-sm);
643
+ height: var(--checkbox-size-sm);
644
+ }
645
+
646
+ .checkbox-lg .checkbox-label,
647
+ .checkbox-lg .vd-form-check-label,
648
+ .vd-form-check-lg .checkbox-label,
649
+ .vd-form-check-lg .vd-form-check-label {
650
+ font-size: var(--input-font-size-lg);
651
+ padding-left: calc(var(--checkbox-size-lg) + 0.875rem);
652
+ min-height: var(--checkbox-size-lg);
653
+ }
654
+
655
+ .checkbox-lg .checkbox-label::before,
656
+ .checkbox-lg .vd-form-check-label::before,
657
+ .vd-form-check-lg .checkbox-label::before,
658
+ .vd-form-check-lg .vd-form-check-label::before {
659
+ width: var(--checkbox-size-lg);
660
+ height: var(--checkbox-size-lg);
661
+ }
662
+
663
+ /* Checkbox Groups */
664
+ .checkbox-group,
665
+ .vd-form-check-group {
666
+ display: flex;
667
+ flex-direction: column;
668
+ gap: 0.5rem;
669
+ }
670
+
671
+ .checkbox-group-inline,
672
+ .vd-form-check-group-inline {
673
+ flex-direction: row;
674
+ flex-wrap: wrap;
675
+ }
676
+
677
+ /* Radio Button Variables */
678
+ :root {
679
+ --radio-size: 1.3125rem;
680
+ /* 21px - fib */
681
+ --radio-size-sm: 0.8125rem;
682
+ /* 13px - fib */
683
+ --radio-size-lg: 2.125rem;
684
+ /* 34px - fib */
685
+ --radio-border-width: 2px;
686
+ /* fib(2) */
687
+ --radio-dot-size: 0.5rem;
688
+ /* 8px - fib */
689
+ --radio-dot-size-sm: 0.3125rem;
690
+ /* 5px - fib */
691
+ --radio-dot-size-lg: 0.8125rem;
692
+ /* 13px - fib */
693
+ --radio-bg-checked: var(--color-primary);
694
+ --radio-border-color: var(--input-border-color);
695
+ --radio-transition: var(--transition-base);
696
+ }
697
+
698
+ /* Radio Wrapper */
699
+ .radio,
700
+ .vd-form-radio {
701
+ display: flex;
702
+ align-items: center;
703
+ margin-bottom: 0.75rem;
704
+ position: relative;
705
+ cursor: pointer;
706
+ font-size: var(--input-font-size);
707
+ line-height: var(--line-height-normal);
708
+ color: var(--text-primary);
709
+ user-select: none;
710
+ gap: 0.5rem;
711
+ }
712
+
713
+ /* Native radio styling (label.radio > input + span pattern) */
714
+ .radio>input[type="radio"],
715
+ .vd-form-radio>input[type="radio"] {
716
+ appearance: none;
717
+ -webkit-appearance: none;
718
+ width: var(--radio-size);
719
+ height: var(--radio-size);
720
+ border: var(--radio-border-width) solid var(--radio-border-color);
721
+ border-radius: 50%;
722
+ background-color: var(--input-bg);
723
+ cursor: pointer;
724
+ flex-shrink: 0;
725
+ margin: 0;
726
+ position: relative;
727
+ transition: var(--radio-transition);
728
+ }
729
+
730
+ .radio>input[type="radio"]:checked,
731
+ .vd-form-radio>input[type="radio"]:checked {
732
+ border-color: var(--radio-bg-checked);
733
+ }
734
+
735
+ .radio>input[type="radio"]:checked::after,
736
+ .vd-form-radio>input[type="radio"]:checked::after {
737
+ content: '';
738
+ position: absolute;
739
+ left: 50%;
740
+ top: 50%;
741
+ transform: translate(-50%, -50%);
742
+ width: var(--radio-dot-size);
743
+ height: var(--radio-dot-size);
744
+ border-radius: 50%;
745
+ background-color: var(--radio-bg-checked);
746
+ }
747
+
748
+ .radio>input[type="radio"]:disabled,
749
+ .vd-form-radio>input[type="radio"]:disabled {
750
+ background-color: var(--input-bg-disabled);
751
+ cursor: not-allowed;
752
+ opacity: 0.6;
753
+ }
754
+
755
+ .radio>input[type="radio"]:disabled+span,
756
+ .vd-form-radio>input[type="radio"]:disabled+span {
757
+ opacity: 0.6;
758
+ cursor: not-allowed;
759
+ }
760
+
761
+ .radio>input[type="radio"]:focus-visible,
762
+ .vd-form-radio>input[type="radio"]:focus-visible {
763
+ outline: 2px solid var(--input-focus-border-color);
764
+ outline-offset: 2px;
765
+ }
766
+
767
+ .radio-inline,
768
+ .vd-form-radio-inline {
769
+ display: inline-flex;
770
+ margin-right: 1.5rem;
771
+ margin-bottom: 0;
772
+ vertical-align: middle;
773
+ }
774
+
775
+ /* Radio Input (class-based pattern) */
776
+ .radio-input,
777
+ .vd-form-radio-input {
778
+ position: absolute;
779
+ opacity: 0;
780
+ width: 0;
781
+ height: 0;
782
+ margin: 0;
783
+ cursor: pointer;
784
+ }
785
+
786
+ .radio-label,
787
+ .vd-form-radio-label {
788
+ display: inline-flex;
789
+ align-items: center;
790
+ cursor: pointer;
791
+ font-size: var(--input-font-size);
792
+ line-height: var(--line-height-normal);
793
+ color: var(--text-primary);
794
+ user-select: none;
795
+ padding-left: calc(var(--radio-size) + 0.5rem);
796
+ position: relative;
797
+ min-height: var(--radio-size);
798
+ }
799
+
800
+ .radio-label::before,
801
+ .vd-form-radio-label::before {
802
+ content: '';
803
+ position: absolute;
804
+ left: 0;
805
+ top: 50%;
806
+ transform: translateY(-50%);
807
+ width: var(--radio-size);
808
+ height: var(--radio-size);
809
+ border: var(--radio-border-width) solid var(--radio-border-color);
810
+ border-radius: 50%;
811
+ background-color: var(--input-bg);
812
+ transition: var(--radio-transition);
813
+ flex-shrink: 0;
814
+ }
815
+
816
+ .radio-input:checked+.radio-label::before,
817
+ .radio-input:checked~.radio-label::before,
818
+ .vd-form-radio-input:checked+.vd-form-radio-label::before {
819
+ border-color: var(--radio-bg-checked);
820
+ }
821
+
822
+ .radio-input:checked+.radio-label::after,
823
+ .radio-input:checked~.radio-label::after,
824
+ .vd-form-radio-input:checked+.vd-form-radio-label::after {
825
+ content: '';
826
+ position: absolute;
827
+ left: calc(var(--radio-size) / 2);
828
+ top: 50%;
829
+ transform: translate(-50%, -50%);
830
+ width: var(--radio-dot-size);
831
+ height: var(--radio-dot-size);
832
+ border-radius: 50%;
833
+ background-color: var(--radio-bg-checked);
834
+ opacity: 1;
835
+ }
836
+
837
+ .radio-input:focus-visible+.radio-label::before,
838
+ .radio-input:focus-visible~.radio-label::before,
839
+ .vd-form-radio-input:focus-visible+.vd-form-radio-label::before {
840
+ outline: 2px solid var(--input-focus-border-color);
841
+ outline-offset: 2px;
842
+ }
843
+
844
+ .radio-input:disabled+.radio-label,
845
+ .radio-input:disabled~.radio-label,
846
+ .vd-form-radio-input:disabled+.vd-form-radio-label {
847
+ opacity: 0.6;
848
+ cursor: not-allowed;
849
+ }
850
+
851
+ .radio-input:disabled+.radio-label::before,
852
+ .radio-input:disabled~.radio-label::before,
853
+ .vd-form-radio-input:disabled+.vd-form-radio-label::before {
854
+ background-color: var(--input-bg-disabled);
855
+ border-color: var(--radio-border-color);
856
+ cursor: not-allowed;
857
+ }
858
+
859
+ /* Radio Sizes */
860
+ .radio-sm .radio-label,
861
+ .radio-sm .vd-form-radio-label,
862
+ .vd-form-radio-sm .radio-label,
863
+ .vd-form-radio-sm .vd-form-radio-label {
864
+ font-size: var(--input-font-size-sm);
865
+ padding-left: calc(var(--radio-size-sm) + 0.625rem);
866
+ min-height: var(--radio-size-sm);
867
+ }
868
+
869
+ .radio-sm .radio-label::before,
870
+ .radio-sm .vd-form-radio-label::before,
871
+ .vd-form-radio-sm .radio-label::before,
872
+ .vd-form-radio-sm .vd-form-radio-label::before {
873
+ width: var(--radio-size-sm);
874
+ height: var(--radio-size-sm);
875
+ }
876
+
877
+ .radio-sm .radio-label::after,
878
+ .radio-sm .vd-form-radio-label::after,
879
+ .vd-form-radio-sm .radio-label::after,
880
+ .vd-form-radio-sm .vd-form-radio-label::after {
881
+ width: var(--radio-dot-size-sm);
882
+ height: var(--radio-dot-size-sm);
883
+ }
884
+
885
+ .radio-lg .radio-label,
886
+ .radio-lg .vd-form-radio-label,
887
+ .vd-form-radio-lg .radio-label,
888
+ .vd-form-radio-lg .vd-form-radio-label {
889
+ font-size: var(--input-font-size-lg);
890
+ padding-left: calc(var(--radio-size-lg) + 0.875rem);
891
+ min-height: var(--radio-size-lg);
892
+ }
893
+
894
+ .radio-lg .radio-label::before,
895
+ .radio-lg .vd-form-radio-label::before,
896
+ .vd-form-radio-lg .radio-label::before,
897
+ .vd-form-radio-lg .vd-form-radio-label::before {
898
+ width: var(--radio-size-lg);
899
+ height: var(--radio-size-lg);
900
+ }
901
+
902
+ .radio-lg .radio-label::after,
903
+ .radio-lg .vd-form-radio-label::after,
904
+ .vd-form-radio-lg .radio-label::after,
905
+ .vd-form-radio-lg .vd-form-radio-label::after {
906
+ width: var(--radio-dot-size-lg);
907
+ height: var(--radio-dot-size-lg);
908
+ }
909
+
910
+ /* Radio Groups */
911
+ .radio-group,
912
+ .vd-form-radio-group {
913
+ display: flex;
914
+ flex-direction: column;
915
+ gap: 0.5rem;
916
+ }
917
+
918
+ .radio-group-inline,
919
+ .vd-form-radio-group-inline {
920
+ flex-direction: row;
921
+ flex-wrap: wrap;
922
+ }
923
+
924
+ /* Range Variables */
925
+ :root {
926
+ --range-track-height: 0.5rem;
927
+ --range-track-height-sm: 0.375rem;
928
+ --range-track-height-lg: 0.625rem;
929
+ --range-thumb-size: 1.25rem;
930
+ --range-thumb-size-sm: 1rem;
931
+ --range-thumb-size-lg: 1.5rem;
932
+ --range-track-bg: var(--color-gray-300);
933
+ --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);
937
+ --range-thumb-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
938
+ }
939
+
940
+ /* Dark Theme Range Overrides - more visible track */
941
+ [data-theme="dark"] {
942
+ --range-track-bg: var(--color-gray-400);
943
+ }
944
+
945
+ @media (prefers-color-scheme: dark) {
946
+ :root:not([data-theme]) {
947
+ --range-track-bg: var(--color-gray-400);
948
+ }
949
+ }
950
+
951
+ /* Range Wrapper */
952
+ .range-wrapper,
953
+ .range {
954
+ position: relative;
955
+ width: 100%;
956
+ margin-bottom: 1rem;
957
+ }
958
+
959
+ /* Range Input */
960
+ input[type="range"].range-input,
961
+ input[type="range"] {
962
+ width: 100%;
963
+ height: var(--range-track-height);
964
+ -webkit-appearance: none;
965
+ appearance: none;
966
+ background: transparent;
967
+ cursor: pointer;
968
+ margin: 0;
969
+ padding: 0;
970
+ display: block;
971
+ }
972
+
973
+ input[type="range"].range-input:focus,
974
+ input[type="range"]:focus {
975
+ outline: none;
976
+ }
977
+
978
+ input[type="range"].range-input:focus::-webkit-slider-thumb,
979
+ input[type="range"]:focus::-webkit-slider-thumb {
980
+ box-shadow: var(--range-thumb-shadow), 0 0 0 3px var(--color-primary-alpha-10);
981
+ }
982
+
983
+ input[type="range"].range-input:focus::-moz-range-thumb,
984
+ input[type="range"]:focus::-moz-range-thumb {
985
+ box-shadow: var(--range-thumb-shadow), 0 0 0 3px var(--color-primary-alpha-10);
986
+ }
987
+
988
+ /* Range Track (Webkit - Chrome, Safari, Edge) */
989
+ input[type="range"]::-webkit-slider-runnable-track {
990
+ width: 100%;
991
+ height: var(--range-track-height);
992
+ background: var(--range-track-bg);
993
+ border: var(--range-track-border);
994
+ border-radius: 0.5rem;
995
+ cursor: pointer;
996
+ }
997
+
998
+ input[type="range"].range-input::-webkit-slider-runnable-track {
999
+ width: 100%;
1000
+ height: var(--range-track-height);
1001
+ background: var(--range-track-bg);
1002
+ border: var(--range-track-border);
1003
+ border-radius: 0.5rem;
1004
+ cursor: pointer;
1005
+ }
1006
+
1007
+ /* Range Track (Firefox) */
1008
+ input[type="range"].range-input::-moz-range-track,
1009
+ input[type="range"]::-moz-range-track {
1010
+ width: 100%;
1011
+ height: var(--range-track-height);
1012
+ background: var(--range-track-bg);
1013
+ border: var(--range-track-border);
1014
+ border-radius: 0.5rem;
1015
+ cursor: pointer;
1016
+ }
1017
+
1018
+ /* Range Progress/Fill (Firefox) - uses --range-track-fill */
1019
+ input[type="range"].range-input::-moz-range-progress,
1020
+ input[type="range"]::-moz-range-progress {
1021
+ height: var(--range-track-height);
1022
+ background: var(--range-track-fill);
1023
+ border-radius: 0.5rem 0 0 0.5rem;
1024
+ }
1025
+
1026
+ /* Range Thumb (Webkit) */
1027
+ input[type="range"].range-input::-webkit-slider-thumb,
1028
+ input[type="range"]::-webkit-slider-thumb {
1029
+ -webkit-appearance: none;
1030
+ appearance: none;
1031
+ width: var(--range-thumb-size);
1032
+ height: var(--range-thumb-size);
1033
+ background: var(--range-thumb-bg);
1034
+ border: var(--range-thumb-border);
1035
+ border-radius: 50%;
1036
+ cursor: pointer;
1037
+ box-shadow: var(--range-thumb-shadow);
1038
+ transition: var(--transition-base);
1039
+ margin-top: calc((var(--range-track-height) - var(--range-thumb-size)) / 2);
1040
+ }
1041
+
1042
+ input[type="range"].range-input::-webkit-slider-thumb:hover,
1043
+ input[type="range"]::-webkit-slider-thumb:hover {
1044
+ transform: scale(1.1);
1045
+ }
1046
+
1047
+ /* Range Thumb (Firefox) */
1048
+ input[type="range"].range-input::-moz-range-thumb,
1049
+ input[type="range"]::-moz-range-thumb {
1050
+ width: var(--range-thumb-size);
1051
+ height: var(--range-thumb-size);
1052
+ background: var(--range-thumb-bg);
1053
+ border: var(--range-thumb-border);
1054
+ border-radius: 50%;
1055
+ cursor: pointer;
1056
+ box-shadow: var(--range-thumb-shadow);
1057
+ transition: var(--transition-base);
1058
+ }
1059
+
1060
+ input[type="range"].range-input::-moz-range-thumb:hover,
1061
+ input[type="range"]::-moz-range-thumb:hover {
1062
+ transform: scale(1.1);
1063
+ }
1064
+
1065
+ input[type="range"].range-input:disabled,
1066
+ input[type="range"]:disabled {
1067
+ opacity: 0.6;
1068
+ cursor: not-allowed;
1069
+ }
1070
+
1071
+ input[type="range"].range-input:disabled::-webkit-slider-thumb,
1072
+ input[type="range"]:disabled::-webkit-slider-thumb {
1073
+ cursor: not-allowed;
1074
+ }
1075
+
1076
+ input[type="range"].range-input:disabled::-moz-range-thumb,
1077
+ input[type="range"]:disabled::-moz-range-thumb {
1078
+ cursor: not-allowed;
1079
+ }
1080
+
1081
+ /* Range Sizes */
1082
+ .range-sm input[type="range"],
1083
+ input[type="range"].range-sm {
1084
+ height: var(--range-track-height-sm);
1085
+ }
1086
+
1087
+ .range-sm input[type="range"]::-webkit-slider-track,
1088
+ input[type="range"].range-sm::-webkit-slider-track {
1089
+ height: var(--range-track-height-sm);
1090
+ }
1091
+
1092
+ .range-sm input[type="range"]::-moz-range-track,
1093
+ input[type="range"].range-sm::-moz-range-track {
1094
+ height: var(--range-track-height-sm);
1095
+ }
1096
+
1097
+ .range-sm input[type="range"]::-webkit-slider-thumb,
1098
+ input[type="range"].range-sm::-webkit-slider-thumb {
1099
+ width: var(--range-thumb-size-sm);
1100
+ height: var(--range-thumb-size-sm);
1101
+ margin-top: calc((var(--range-track-height-sm) - var(--range-thumb-size-sm)) / 2);
1102
+ }
1103
+
1104
+ .range-sm input[type="range"]::-moz-range-thumb,
1105
+ input[type="range"].range-sm::-moz-range-thumb {
1106
+ width: var(--range-thumb-size-sm);
1107
+ height: var(--range-thumb-size-sm);
1108
+ }
1109
+
1110
+ .range-lg input[type="range"],
1111
+ input[type="range"].range-lg {
1112
+ height: var(--range-track-height-lg);
1113
+ }
1114
+
1115
+ .range-lg input[type="range"]::-webkit-slider-track,
1116
+ input[type="range"].range-lg::-webkit-slider-track {
1117
+ height: var(--range-track-height-lg);
1118
+ }
1119
+
1120
+ .range-lg input[type="range"]::-moz-range-track,
1121
+ input[type="range"].range-lg::-moz-range-track {
1122
+ height: var(--range-track-height-lg);
1123
+ }
1124
+
1125
+ .range-lg input[type="range"]::-webkit-slider-thumb,
1126
+ input[type="range"].range-lg::-webkit-slider-thumb {
1127
+ width: var(--range-thumb-size-lg);
1128
+ height: var(--range-thumb-size-lg);
1129
+ margin-top: calc((var(--range-track-height-lg) - var(--range-thumb-size-lg)) / 2);
1130
+ }
1131
+
1132
+ .range-lg input[type="range"]::-moz-range-thumb,
1133
+ input[type="range"].range-lg::-moz-range-thumb {
1134
+ width: var(--range-thumb-size-lg);
1135
+ height: var(--range-thumb-size-lg);
1136
+ }
1137
+
1138
+ /* Range Value Display */
1139
+ .range-value {
1140
+ display: inline-block;
1141
+ margin-left: 0.5rem;
1142
+ padding: 0.25rem 0.5rem;
1143
+ background-color: var(--bg-secondary);
1144
+ border-radius: var(--btn-border-radius-sm);
1145
+ font-size: var(--font-size-sm);
1146
+ font-weight: var(--font-weight-medium);
1147
+ color: var(--text-primary);
1148
+ min-width: 3rem;
1149
+ text-align: center;
1150
+ }
1151
+
1152
+ .range-label {
1153
+ display: flex;
1154
+ align-items: center;
1155
+ margin-bottom: 0.5rem;
1156
+ font-size: var(--font-size-sm);
1157
+ font-weight: var(--font-weight-medium);
1158
+ color: var(--text-primary);
1159
+ }
1160
+
1161
+ .range-min-max {
1162
+ display: flex;
1163
+ justify-content: space-between;
1164
+ margin-top: 0.25rem;
1165
+ font-size: var(--font-size-xs);
1166
+ color: var(--text-muted);
1167
+ }
1168
+
1169
+ /* Switch Variables */
1170
+ :root {
1171
+ /* Switch: golden rectangle (55x34 outer, 21px thumb) */
1172
+ --switch-width: 3.4375rem;
1173
+ /* 55px - fib */
1174
+ --switch-width-sm: 2.125rem;
1175
+ /* 34px - fib */
1176
+ --switch-width-lg: 5.5625rem;
1177
+ /* 89px - fib */
1178
+ --switch-height: 2.125rem;
1179
+ /* 34px - fib (55/34 ~ phi) */
1180
+ --switch-height-sm: 1.3125rem;
1181
+ /* 21px - fib (34/21 ~ phi) */
1182
+ --switch-height-lg: 3.4375rem;
1183
+ /* 55px - fib (89/55 ~ phi) */
1184
+ --switch-thumb-size: 1.3125rem;
1185
+ /* 21px - fib */
1186
+ --switch-thumb-size-sm: 0.8125rem;
1187
+ /* 13px - fib */
1188
+ --switch-thumb-size-lg: 2.125rem;
1189
+ /* 34px - fib */
1190
+ --switch-thumb-offset: 0.1875rem;
1191
+ /* 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);
1198
+ --switch-transition: var(--transition-base);
1199
+ }
1200
+
1201
+ /* Dark Theme Switch Overrides */
1202
+ [data-theme="dark"] {
1203
+ --switch-bg-off: var(--color-gray-600);
1204
+ }
1205
+
1206
+ @media (prefers-color-scheme: dark) {
1207
+ :root:not([data-theme]) {
1208
+ --switch-bg-off: var(--color-gray-600);
1209
+ }
1210
+ }
1211
+
1212
+ /* Switch Wrapper */
1213
+ .switch,
1214
+ .vd-form-switch {
1215
+ display: flex;
1216
+ align-items: center;
1217
+ margin-bottom: 0.75rem;
1218
+ position: relative;
1219
+ cursor: pointer;
1220
+ font-size: var(--input-font-size);
1221
+ line-height: var(--line-height-normal);
1222
+ color: var(--text-primary);
1223
+ user-select: none;
1224
+ gap: 0.75rem;
1225
+ }
1226
+
1227
+ /* Native switch styling (label.switch > input + .switch-slider + span pattern) */
1228
+ .switch>input[type="checkbox"] {
1229
+ position: absolute;
1230
+ opacity: 0;
1231
+ width: 0;
1232
+ height: 0;
1233
+ }
1234
+
1235
+ .switch-slider {
1236
+ position: relative;
1237
+ width: var(--switch-width);
1238
+ height: var(--switch-height);
1239
+ background-color: var(--switch-bg-off);
1240
+ border-radius: calc(var(--switch-height) / 2);
1241
+ transition: var(--switch-transition);
1242
+ flex-shrink: 0;
1243
+ }
1244
+
1245
+ .switch-slider::after {
1246
+ content: '';
1247
+ position: absolute;
1248
+ left: var(--switch-thumb-offset);
1249
+ top: 50%;
1250
+ transform: translateY(-50%);
1251
+ width: var(--switch-thumb-size);
1252
+ height: var(--switch-thumb-size);
1253
+ background-color: var(--switch-thumb-bg);
1254
+ border-radius: 50%;
1255
+ box-shadow: var(--shadow-sm);
1256
+ transition: var(--switch-transition);
1257
+ }
1258
+
1259
+ .switch>input[type="checkbox"]:checked+.switch-slider {
1260
+ background-color: var(--switch-bg-on);
1261
+ }
1262
+
1263
+ .switch>input[type="checkbox"]:checked+.switch-slider::after {
1264
+ left: calc(var(--switch-width) - var(--switch-thumb-size) - var(--switch-thumb-offset));
1265
+ }
1266
+
1267
+ .switch>input[type="checkbox"]:focus-visible+.switch-slider {
1268
+ outline: 2px solid var(--input-focus-border-color);
1269
+ outline-offset: 2px;
1270
+ }
1271
+
1272
+ .switch>input[type="checkbox"]:disabled+.switch-slider {
1273
+ opacity: 0.6;
1274
+ cursor: not-allowed;
1275
+ }
1276
+
1277
+ .switch>input[type="checkbox"]:disabled~span {
1278
+ opacity: 0.6;
1279
+ cursor: not-allowed;
1280
+ }
1281
+
1282
+ .switch-inline,
1283
+ .vd-form-switch-inline {
1284
+ display: inline-flex;
1285
+ margin-right: 1.5rem;
1286
+ margin-bottom: 0;
1287
+ vertical-align: middle;
1288
+ }
1289
+
1290
+ /* Switch Input (class-based pattern) */
1291
+ .switch-input,
1292
+ .vd-form-switch-input {
1293
+ position: absolute;
1294
+ opacity: 0;
1295
+ width: 0;
1296
+ height: 0;
1297
+ margin: 0;
1298
+ cursor: pointer;
1299
+ }
1300
+
1301
+ /* Switch Label */
1302
+ .switch-label,
1303
+ .vd-form-switch-label {
1304
+ display: flex;
1305
+ align-items: center;
1306
+ cursor: pointer;
1307
+ font-size: var(--input-font-size);
1308
+ line-height: var(--line-height-normal);
1309
+ color: var(--text-primary);
1310
+ user-select: none;
1311
+ position: relative;
1312
+ }
1313
+
1314
+ /* Switch Track */
1315
+ .switch-label::before,
1316
+ .vd-form-switch-label::before {
1317
+ content: '';
1318
+ position: relative;
1319
+ width: var(--switch-width);
1320
+ height: var(--switch-height);
1321
+ background-color: var(--switch-bg-off);
1322
+ border-radius: calc(var(--switch-height) / 2);
1323
+ transition: var(--switch-transition);
1324
+ flex-shrink: 0;
1325
+ margin-right: 0.75rem;
1326
+ }
1327
+
1328
+ /* Switch Thumb */
1329
+ .switch-label::after,
1330
+ .vd-form-switch-label::after {
1331
+ content: '';
1332
+ position: absolute;
1333
+ left: var(--switch-thumb-offset);
1334
+ top: 50%;
1335
+ transform: translateY(-50%);
1336
+ width: var(--switch-thumb-size);
1337
+ height: var(--switch-thumb-size);
1338
+ background-color: var(--switch-thumb-bg);
1339
+ border-radius: 50%;
1340
+ box-shadow: var(--shadow-sm);
1341
+ transition: var(--switch-transition);
1342
+ pointer-events: none;
1343
+ }
1344
+
1345
+ .switch-input:checked+.switch-label::before,
1346
+ .switch-input:checked~.switch-label::before,
1347
+ .vd-form-switch-input:checked+.vd-form-switch-label::before {
1348
+ background-color: var(--switch-bg-on);
1349
+ }
1350
+
1351
+ .switch-input:checked+.switch-label::after,
1352
+ .switch-input:checked~.switch-label::after,
1353
+ .vd-form-switch-input:checked+.vd-form-switch-label::after {
1354
+ left: calc(var(--switch-width) - var(--switch-thumb-size) - var(--switch-thumb-offset));
1355
+ }
1356
+
1357
+ .switch-input:focus-visible+.switch-label::before,
1358
+ .switch-input:focus-visible~.switch-label::before,
1359
+ .vd-form-switch-input:focus-visible+.vd-form-switch-label::before {
1360
+ outline: 2px solid var(--input-focus-border-color);
1361
+ outline-offset: 2px;
1362
+ }
1363
+
1364
+ .switch-input:disabled+.switch-label,
1365
+ .switch-input:disabled~.switch-label,
1366
+ .vd-form-switch-input:disabled+.vd-form-switch-label {
1367
+ opacity: 0.6;
1368
+ cursor: not-allowed;
1369
+ }
1370
+
1371
+ .switch-input:disabled+.switch-label::before,
1372
+ .switch-input:disabled~.switch-label::before,
1373
+ .vd-form-switch-input:disabled+.vd-form-switch-label::before {
1374
+ background-color: var(--input-bg-disabled);
1375
+ cursor: not-allowed;
1376
+ }
1377
+
1378
+ /* Switch Label Position - Right */
1379
+ .switch-label-right .switch-label,
1380
+ .switch-label-right .vd-form-switch-label {
1381
+ flex-direction: row-reverse;
1382
+ }
1383
+
1384
+ .switch-label-right .switch-label::before,
1385
+ .switch-label-right .vd-form-switch-label::before {
1386
+ margin-right: 0;
1387
+ margin-left: 0.75rem;
1388
+ }
1389
+
1390
+ .switch-label-right .switch-label::after,
1391
+ .switch-label-right .vd-form-switch-label::after {
1392
+ left: auto;
1393
+ right: var(--switch-thumb-offset);
1394
+ }
1395
+
1396
+ .switch-label-right .switch-input:checked+.switch-label::after,
1397
+ .switch-label-right .switch-input:checked~.switch-label::after,
1398
+ .switch-label-right .vd-form-switch-input:checked+.vd-form-switch-label::after {
1399
+ right: calc(var(--switch-width) - var(--switch-thumb-size) - var(--switch-thumb-offset));
1400
+ left: auto;
1401
+ }
1402
+
1403
+ /* Switch Sizes */
1404
+ .switch-sm .switch-label,
1405
+ .switch-sm .vd-form-switch-label,
1406
+ .vd-form-switch-sm .switch-label,
1407
+ .vd-form-switch-sm .vd-form-switch-label {
1408
+ font-size: var(--input-font-size-sm);
1409
+ }
1410
+
1411
+ .switch-sm .switch-label::before,
1412
+ .switch-sm .vd-form-switch-label::before,
1413
+ .vd-form-switch-sm .switch-label::before,
1414
+ .vd-form-switch-sm .vd-form-switch-label::before {
1415
+ width: var(--switch-width-sm);
1416
+ height: var(--switch-height-sm);
1417
+ }
1418
+
1419
+ .switch-sm .switch-label::after,
1420
+ .switch-sm .vd-form-switch-label::after,
1421
+ .vd-form-switch-sm .switch-label::after,
1422
+ .vd-form-switch-sm .vd-form-switch-label::after {
1423
+ width: var(--switch-thumb-size-sm);
1424
+ height: var(--switch-thumb-size-sm);
1425
+ }
1426
+
1427
+ .switch-sm .switch-input:checked+.switch-label::after,
1428
+ .switch-sm .switch-input:checked~.switch-label::after,
1429
+ .vd-form-switch-sm .vd-form-switch-input:checked+.vd-form-switch-label::after {
1430
+ left: calc(var(--switch-width-sm) - var(--switch-thumb-size-sm) - var(--switch-thumb-offset));
1431
+ }
1432
+
1433
+ .switch-lg .switch-label,
1434
+ .switch-lg .vd-form-switch-label,
1435
+ .vd-form-switch-lg .switch-label,
1436
+ .vd-form-switch-lg .vd-form-switch-label {
1437
+ font-size: var(--input-font-size-lg);
1438
+ }
1439
+
1440
+ .switch-lg .switch-label::before,
1441
+ .switch-lg .vd-form-switch-label::before,
1442
+ .vd-form-switch-lg .switch-label::before,
1443
+ .vd-form-switch-lg .vd-form-switch-label::before {
1444
+ width: var(--switch-width-lg);
1445
+ height: var(--switch-height-lg);
1446
+ }
1447
+
1448
+ .switch-lg .switch-label::after,
1449
+ .switch-lg .vd-form-switch-label::after,
1450
+ .vd-form-switch-lg .switch-label::after,
1451
+ .vd-form-switch-lg .vd-form-switch-label::after {
1452
+ width: var(--switch-thumb-size-lg);
1453
+ height: var(--switch-thumb-size-lg);
1454
+ }
1455
+
1456
+ .switch-lg .switch-input:checked+.switch-label::after,
1457
+ .switch-lg .switch-input:checked~.switch-label::after,
1458
+ .vd-form-switch-lg .vd-form-switch-input:checked+.vd-form-switch-label::after {
1459
+ left: calc(var(--switch-width-lg) - var(--switch-thumb-size-lg) - var(--switch-thumb-offset));
1460
+ }
1461
+
1462
+ /* Switch Variants */
1463
+ .switch-success .switch-input:checked+.switch-label::before,
1464
+ .switch-success .switch-input:checked~.switch-label::before,
1465
+ .vd-form-switch-success .vd-form-switch-input:checked+.vd-form-switch-label::before {
1466
+ background-color: var(--switch-bg-on-success);
1467
+ }
1468
+
1469
+ .switch-warning .switch-input:checked+.switch-label::before,
1470
+ .switch-warning .switch-input:checked~.switch-label::before,
1471
+ .vd-form-switch-warning .vd-form-switch-input:checked+.vd-form-switch-label::before {
1472
+ background-color: var(--switch-bg-on-warning);
1473
+ }
1474
+
1475
+ .switch-error .switch-input:checked+.switch-label::before,
1476
+ .switch-error .switch-input:checked~.switch-label::before,
1477
+ .vd-form-switch-error .vd-form-switch-input:checked+.vd-form-switch-label::before {
1478
+ background-color: var(--switch-bg-on-error);
1479
+ }
1480
+
1481
+ /* Select Variables */
1482
+ :root {
1483
+ --select-arrow-size: 16px;
1484
+ --select-arrow-color: var(--text-secondary);
1485
+ --select-arrow-color-focus: var(--color-primary);
1486
+ }
1487
+
1488
+ /* Select Wrapper */
1489
+ .select-wrapper,
1490
+ .custom-select,
1491
+ .custom-select-wrapper {
1492
+ position: relative;
1493
+ display: block;
1494
+ width: 100%;
1495
+ }
1496
+
1497
+ /* Custom Select Button (for JS-enhanced selects) */
1498
+ .custom-select-button {
1499
+ display: block;
1500
+ width: 100%;
1501
+ padding: var(--input-padding-y) var(--input-padding-x);
1502
+ padding-right: calc(var(--input-padding-x) + var(--select-arrow-size) + 0.5rem);
1503
+ font-family: var(--font-family-sans);
1504
+ font-size: var(--input-font-size);
1505
+ font-weight: var(--font-weight-normal);
1506
+ line-height: var(--line-height-normal);
1507
+ color: var(--text-primary);
1508
+ text-align: left;
1509
+ background-color: var(--input-bg);
1510
+ 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");
1511
+ background-repeat: no-repeat;
1512
+ background-position: right 0.75rem center;
1513
+ background-size: var(--select-arrow-size) 12px;
1514
+ border: var(--input-border-width) solid var(--input-border-color);
1515
+ border-radius: var(--input-border-radius);
1516
+ transition: var(--input-transition);
1517
+ cursor: pointer;
1518
+ appearance: none;
1519
+ }
1520
+
1521
+ .custom-select-button:hover {
1522
+ border-color: var(--input-focus-border-color);
1523
+ }
1524
+
1525
+ .custom-select-button:focus {
1526
+ outline: 0;
1527
+ border-color: var(--input-focus-border-color);
1528
+ box-shadow: var(--input-focus-box-shadow);
1529
+ }
1530
+
1531
+ .custom-select-wrapper select {
1532
+ position: absolute;
1533
+ opacity: 0;
1534
+ pointer-events: none;
1535
+ width: 0;
1536
+ height: 0;
1537
+ }
1538
+
1539
+ /* Select (Enhanced Styling) */
1540
+ select.vd-input,
1541
+ select,
1542
+ .select-input,
1543
+ .custom-select-input {
1544
+ display: block;
1545
+ width: 100%;
1546
+ padding: var(--input-padding-y) var(--input-padding-x);
1547
+ padding-right: calc(var(--input-padding-x) + var(--select-arrow-size) + 0.5rem);
1548
+ font-family: var(--font-family-sans);
1549
+ font-size: var(--input-font-size);
1550
+ font-weight: var(--font-weight-normal);
1551
+ line-height: var(--line-height-normal);
1552
+ color: var(--text-primary);
1553
+ background-color: var(--input-bg);
1554
+ 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
+ background-repeat: no-repeat;
1556
+ background-position: right 0.75rem center;
1557
+ background-size: var(--select-arrow-size) 12px;
1558
+ border: var(--input-border-width) solid var(--input-border-color);
1559
+ border-radius: var(--input-border-radius);
1560
+ transition: var(--input-transition);
1561
+ appearance: none;
1562
+ cursor: pointer;
1563
+ }
1564
+
1565
+ select.vd-input:focus,
1566
+ select:focus,
1567
+ .select-input:focus,
1568
+ .custom-select-input:focus {
1569
+ outline: 0;
1570
+ border-color: var(--input-focus-border-color);
1571
+ box-shadow: var(--input-focus-box-shadow);
1572
+ 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='%2322b8cf' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");
1573
+ }
1574
+
1575
+ select.vd-input:disabled,
1576
+ select:disabled,
1577
+ .select-input:disabled,
1578
+ .custom-select-input:disabled {
1579
+ background-color: var(--input-bg-disabled);
1580
+ opacity: 0.6;
1581
+ cursor: not-allowed;
1582
+ 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='%23868e96' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");
1583
+ }
1584
+
1585
+ /* Select States */
1586
+ select.vd-input.vd-input-error,
1587
+ select.vd-input.is-error,
1588
+ .select-input.vd-input-error,
1589
+ .select-input.is-error {
1590
+ border-color: var(--color-error);
1591
+ }
1592
+
1593
+ select.vd-input.vd-input-success,
1594
+ select.vd-input.is-success,
1595
+ .select-input.vd-input-success,
1596
+ .select-input.is-success {
1597
+ border-color: var(--color-success);
1598
+ }
1599
+
1600
+ /* Select Sizes */
1601
+ select.vd-input-sm,
1602
+ .select-input-sm,
1603
+ .custom-select-sm {
1604
+ padding: var(--input-padding-y-sm) var(--input-padding-x-sm);
1605
+ padding-right: calc(var(--input-padding-x-sm) + var(--select-arrow-size) + 0.5rem);
1606
+ font-size: var(--input-font-size-sm);
1607
+ border-radius: var(--input-border-radius-sm);
1608
+ background-size: 14px 10px;
1609
+ }
1610
+
1611
+ select.vd-input-lg,
1612
+ .select-input-lg,
1613
+ .custom-select-lg {
1614
+ padding: var(--input-padding-y-lg) var(--input-padding-x-lg);
1615
+ padding-right: calc(var(--input-padding-x-lg) + var(--select-arrow-size) + 0.5rem);
1616
+ font-size: var(--input-font-size-lg);
1617
+ border-radius: var(--input-border-radius-lg);
1618
+ background-size: 18px 14px;
1619
+ }
1620
+
1621
+ /* Multi-Select */
1622
+ select[multiple].vd-input,
1623
+ select[multiple],
1624
+ .select-input[multiple],
1625
+ .custom-select-input[multiple] {
1626
+ padding: var(--input-padding-y) var(--input-padding-x);
1627
+ padding-right: var(--input-padding-x);
1628
+ background-image: none;
1629
+ min-height: 120px;
1630
+ }
1631
+
1632
+ select[multiple].vd-input option,
1633
+ select[multiple] option,
1634
+ .select-input[multiple] option,
1635
+ .custom-select-input[multiple] option {
1636
+ padding: 0.5rem;
1637
+ }
1638
+
1639
+ /* Select with Custom Dropdown (for JS enhancement) */
1640
+ .custom-select-dropdown {
1641
+ position: absolute;
1642
+ top: 100%;
1643
+ left: 0;
1644
+ right: 0;
1645
+ z-index: 1000;
1646
+ display: none;
1647
+ margin-top: 0.25rem;
1648
+ background-color: var(--input-bg);
1649
+ border: 1px solid var(--input-border-color);
1650
+ border-radius: var(--input-border-radius);
1651
+ box-shadow: var(--shadow-lg);
1652
+ max-height: 300px;
1653
+ overflow-y: auto;
1654
+ }
1655
+
1656
+ .custom-select-dropdown.is-open {
1657
+ display: block;
1658
+ }
1659
+
1660
+ .custom-select-option {
1661
+ display: block;
1662
+ width: 100%;
1663
+ padding: var(--input-padding-y) var(--input-padding-x);
1664
+ font-size: var(--input-font-size);
1665
+ color: var(--text-primary);
1666
+ background-color: transparent;
1667
+ border: none;
1668
+ text-align: left;
1669
+ cursor: pointer;
1670
+ transition: var(--transition-bg);
1671
+ }
1672
+
1673
+ .custom-select-option:hover,
1674
+ .custom-select-option:focus {
1675
+ background-color: var(--color-primary-alpha-10);
1676
+ outline: none;
1677
+ }
1678
+
1679
+ .custom-select-option.is-selected {
1680
+ background-color: var(--color-primary-alpha-10);
1681
+ color: var(--color-primary);
1682
+ font-weight: var(--font-weight-medium);
1683
+ }
1684
+
1685
+ .custom-select-option.is-disabled,
1686
+ .custom-select-option[data-value=""] {
1687
+ opacity: 0.6;
1688
+ cursor: not-allowed;
1689
+ color: var(--text-muted);
1690
+ }
1691
+
1692
+ .custom-select-option-group {
1693
+ padding: 0.5rem var(--input-padding-x);
1694
+ font-size: var(--font-size-sm);
1695
+ font-weight: var(--font-weight-semibold);
1696
+ color: var(--text-muted);
1697
+ text-transform: uppercase;
1698
+ letter-spacing: 0.05em;
1699
+ }
1700
+
1701
+ .custom-select-search {
1702
+ padding: var(--input-padding-y) var(--input-padding-x);
1703
+ border-bottom: 1px solid var(--input-border-color);
1704
+ }
1705
+
1706
+ .custom-select-search input {
1707
+ width: 100%;
1708
+ padding: 0.5rem;
1709
+ font-size: var(--input-font-size-sm);
1710
+ border: 1px solid var(--input-border-color);
1711
+ border-radius: var(--input-border-radius-sm);
1712
+ }
1713
+
1714
+ /* Dark Mode - Select Arrow Colors */
1715
+ [data-theme="dark"] select.vd-input,
1716
+ [data-theme="dark"] select,
1717
+ [data-theme="dark"] .select-input,
1718
+ [data-theme="dark"] .custom-select-input,
1719
+ [data-theme="dark"] .custom-select-button {
1720
+ 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='%23adb5bd' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");
1721
+ }
1722
+
1723
+ [data-theme="dark"] select.vd-input:focus,
1724
+ [data-theme="dark"] select:focus,
1725
+ [data-theme="dark"] .select-input:focus,
1726
+ [data-theme="dark"] .custom-select-input:focus,
1727
+ [data-theme="dark"] .custom-select-button:focus {
1728
+ 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='%233bc9db' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");
1729
+ }
1730
+
1731
+ [data-theme="dark"] select.vd-input:disabled,
1732
+ [data-theme="dark"] select:disabled,
1733
+ [data-theme="dark"] .select-input:disabled,
1734
+ [data-theme="dark"] .custom-select-input:disabled,
1735
+ [data-theme="dark"] .custom-select-button:disabled {
1736
+ 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='%23868e96' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");
1737
+ }
1738
+
1739
+ /* Mobile Touch Target Optimization */
1740
+ @media (max-width: 767px) {
1741
+
1742
+ .vd-input,
1743
+ input[type="text"],
1744
+ input[type="email"],
1745
+ input[type="password"],
1746
+ input[type="number"],
1747
+ input[type="tel"],
1748
+ input[type="url"],
1749
+ input[type="search"],
1750
+ input[type="date"],
1751
+ input[type="time"],
1752
+ input[type="datetime-local"],
1753
+ .textarea,
1754
+ textarea,
1755
+ select,
1756
+ .select-input,
1757
+ .custom-select-input,
1758
+ .custom-select-button {
1759
+ min-height: 44px;
1760
+ padding-top: 0.625rem;
1761
+ padding-bottom: 0.625rem;
1762
+ }
1763
+
1764
+ .checkbox-label,
1765
+ .vd-form-check-label,
1766
+ .radio-label,
1767
+ .vd-form-radio-label,
1768
+ .switch-label,
1769
+ .vd-form-switch-label {
1770
+ min-height: 44px;
1771
+ padding-top: 0.5rem;
1772
+ padding-bottom: 0.5rem;
1773
+ }
1774
+ }