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,835 @@
1
+ /**
2
+ * Vanduo Framework - Theme Customizer
3
+ * A comprehensive theme customization panel for the navbar
4
+ */
5
+
6
+ :root {
7
+ /* Theme Customizer Variables */
8
+ --customizer-width: 320px;
9
+ --customizer-padding: 1rem;
10
+ --customizer-gap: 0.75rem;
11
+ --customizer-swatch-size: 28px;
12
+ --customizer-radius-btn-width: 48px;
13
+ --customizer-bg: var(--bg-primary);
14
+ --customizer-border: var(--border-color);
15
+ --customizer-shadow: var(--shadow-lg);
16
+ --customizer-z-index: 1050;
17
+ }
18
+
19
+ /* ==========================================================================
20
+ Dynamic Panel (appended to body)
21
+ ========================================================================== */
22
+
23
+ body > .vd-theme-customizer-panel {
24
+ position: fixed;
25
+ /* top is set dynamically by JS based on actual navbar height */
26
+ top: 55px;
27
+ right: 0;
28
+ width: var(--customizer-width);
29
+ max-height: calc(100vh - 55px);
30
+ overflow-y: auto;
31
+ padding: 0; /* Override .vd-navbar-fixed ~ * padding-top rule */
32
+ background-color: var(--customizer-bg);
33
+ border: 1px solid var(--customizer-border);
34
+ border-radius: calc(var(--radius-scale, 0.25) * 1rem);
35
+ box-shadow: var(--customizer-shadow);
36
+ z-index: var(--customizer-z-index);
37
+ opacity: 0;
38
+ visibility: hidden;
39
+ transform: translateY(-10px);
40
+ transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s ease;
41
+ }
42
+
43
+ body > .vd-theme-customizer-panel.is-open {
44
+ opacity: 1;
45
+ visibility: visible;
46
+ transform: translateY(0);
47
+ }
48
+
49
+ /* ==========================================================================
50
+ Dynamic Panel Inner Structure (tc-* classes)
51
+ ========================================================================== */
52
+
53
+ .tc-header {
54
+ display: flex;
55
+ align-items: center;
56
+ justify-content: space-between;
57
+ padding: 0.5rem var(--customizer-padding) 0.75rem;
58
+ border-bottom: 1px solid var(--border-color);
59
+ }
60
+
61
+ .tc-title {
62
+ font-size: var(--font-size-base);
63
+ font-weight: var(--font-weight-semibold);
64
+ color: var(--text-primary);
65
+ margin: 0;
66
+ }
67
+
68
+ .tc-body {
69
+ padding: var(--customizer-padding);
70
+ }
71
+
72
+ .tc-footer {
73
+ padding: 0.75rem var(--customizer-padding) 0.5rem;
74
+ border-top: 1px solid var(--border-color);
75
+ }
76
+
77
+ .tc-section {
78
+ margin-bottom: 1.25rem;
79
+ }
80
+
81
+ .tc-section:last-child {
82
+ margin-bottom: 0;
83
+ }
84
+
85
+ .tc-label {
86
+ display: block;
87
+ margin-bottom: 0.5rem;
88
+ font-size: var(--font-size-sm);
89
+ font-weight: var(--font-weight-medium);
90
+ color: var(--text-primary);
91
+ }
92
+
93
+ /* Primary Color Grid */
94
+ .tc-color-grid {
95
+ display: grid;
96
+ grid-template-columns: repeat(6, 1fr);
97
+ gap: 0.375rem;
98
+ }
99
+
100
+ .tc-color-swatch {
101
+ width: 100%;
102
+ aspect-ratio: 1;
103
+ padding: 0;
104
+ background-color: var(--swatch-color);
105
+ border: 2px solid transparent;
106
+ border-radius: calc(var(--radius-scale, 0.25) * 0.5rem);
107
+ cursor: pointer;
108
+ transition: all 0.15s ease;
109
+ }
110
+
111
+ .tc-color-swatch:hover {
112
+ transform: scale(1.1);
113
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
114
+ }
115
+
116
+ .tc-color-swatch:focus-visible {
117
+ outline: 2px solid var(--color-primary);
118
+ outline-offset: 2px;
119
+ }
120
+
121
+ .tc-color-swatch.is-active {
122
+ border-color: var(--text-primary);
123
+ box-shadow: 0 0 0 2px var(--bg-primary);
124
+ }
125
+
126
+ /* Neutral Color Grid */
127
+ .tc-neutral-grid {
128
+ display: grid;
129
+ grid-template-columns: repeat(5, 1fr);
130
+ gap: 0.375rem;
131
+ }
132
+
133
+ .tc-neutral-swatch {
134
+ display: flex;
135
+ flex-direction: column;
136
+ align-items: center;
137
+ gap: 0.25rem;
138
+ padding: 0.5rem 0.25rem;
139
+ background: transparent;
140
+ border: 1px solid var(--border-color);
141
+ border-radius: calc(var(--radius-scale, 0.25) * 0.5rem);
142
+ cursor: pointer;
143
+ transition: all 0.15s ease;
144
+ }
145
+
146
+ .tc-neutral-swatch::before {
147
+ content: '';
148
+ width: 16px;
149
+ height: 16px;
150
+ border-radius: 50%;
151
+ background-color: var(--swatch-color);
152
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
153
+ }
154
+
155
+ .tc-neutral-swatch span {
156
+ font-size: var(--font-size-xs);
157
+ color: var(--text-primary);
158
+ }
159
+
160
+ .tc-neutral-swatch:hover {
161
+ background-color: var(--bg-secondary);
162
+ border-color: var(--border-color-dark);
163
+ }
164
+
165
+ .tc-neutral-swatch:focus-visible {
166
+ outline: 2px solid var(--color-primary);
167
+ outline-offset: 1px;
168
+ }
169
+
170
+ .tc-neutral-swatch.is-active {
171
+ background-color: var(--bg-secondary);
172
+ border-color: var(--text-primary);
173
+ }
174
+
175
+ /* Radius Group */
176
+ .tc-radius-group {
177
+ display: flex;
178
+ gap: 0;
179
+ }
180
+
181
+ .tc-radius-btn {
182
+ flex: 1;
183
+ display: flex;
184
+ align-items: center;
185
+ justify-content: center;
186
+ padding: 0.5rem 0.25rem;
187
+ background: transparent;
188
+ border: 1px solid var(--border-color);
189
+ color: var(--text-primary);
190
+ font-size: var(--font-size-xs);
191
+ font-weight: var(--font-weight-medium);
192
+ cursor: pointer;
193
+ transition: all 0.15s ease;
194
+ }
195
+
196
+ .tc-radius-btn:first-child {
197
+ border-radius: calc(var(--radius-scale, 0.25) * 0.5rem) 0 0 calc(var(--radius-scale, 0.25) * 0.5rem);
198
+ }
199
+
200
+ .tc-radius-btn:last-child {
201
+ border-radius: 0 calc(var(--radius-scale, 0.25) * 0.5rem) calc(var(--radius-scale, 0.25) * 0.5rem) 0;
202
+ }
203
+
204
+ .tc-radius-btn:not(:first-child) {
205
+ margin-left: -1px;
206
+ }
207
+
208
+ .tc-radius-btn:hover {
209
+ background-color: var(--bg-secondary);
210
+ z-index: 1;
211
+ }
212
+
213
+ .tc-radius-btn:focus-visible {
214
+ outline: 2px solid var(--color-primary);
215
+ outline-offset: 1px;
216
+ z-index: 2;
217
+ }
218
+
219
+ .tc-radius-btn.is-active {
220
+ background-color: var(--bg-dark);
221
+ border-color: var(--bg-dark);
222
+ color: var(--text-inverse);
223
+ z-index: 1;
224
+ }
225
+
226
+ /* Font Select */
227
+ .tc-font-select {
228
+ width: 100%;
229
+ padding: 0.5rem 0.75rem;
230
+ background-color: var(--bg-primary);
231
+ border: 1px solid var(--border-color);
232
+ border-radius: calc(var(--radius-scale, 0.25) * 0.5rem);
233
+ color: var(--text-primary);
234
+ font-size: var(--font-size-sm);
235
+ cursor: pointer;
236
+ transition: border-color 0.15s ease;
237
+ }
238
+
239
+ .tc-font-select:hover {
240
+ border-color: var(--border-color-dark);
241
+ }
242
+
243
+ .tc-font-select:focus {
244
+ outline: none;
245
+ border-color: var(--color-primary);
246
+ box-shadow: 0 0 0 3px var(--color-primary-alpha-10);
247
+ }
248
+
249
+ /* Mode Group */
250
+ .tc-mode-group {
251
+ display: flex;
252
+ gap: 0;
253
+ }
254
+
255
+ .tc-mode-btn {
256
+ flex: 1;
257
+ display: flex;
258
+ align-items: center;
259
+ justify-content: center;
260
+ gap: 0.375rem;
261
+ padding: 0.5rem 0.5rem;
262
+ background: transparent;
263
+ border: 1px solid var(--border-color);
264
+ color: var(--text-primary);
265
+ font-size: var(--font-size-xs);
266
+ cursor: pointer;
267
+ transition: all 0.15s ease;
268
+ }
269
+
270
+ .tc-mode-btn:first-child {
271
+ border-radius: calc(var(--radius-scale, 0.25) * 0.5rem) 0 0 calc(var(--radius-scale, 0.25) * 0.5rem);
272
+ }
273
+
274
+ .tc-mode-btn:last-child {
275
+ border-radius: 0 calc(var(--radius-scale, 0.25) * 0.5rem) calc(var(--radius-scale, 0.25) * 0.5rem) 0;
276
+ }
277
+
278
+ .tc-mode-btn:not(:first-child) {
279
+ margin-left: -1px;
280
+ }
281
+
282
+ .tc-mode-btn:hover {
283
+ background-color: var(--bg-secondary);
284
+ z-index: 1;
285
+ }
286
+
287
+ .tc-mode-btn:focus-visible {
288
+ outline: 2px solid var(--color-primary);
289
+ outline-offset: 1px;
290
+ z-index: 2;
291
+ }
292
+
293
+ .tc-mode-btn.is-active {
294
+ background-color: var(--bg-dark);
295
+ border-color: var(--bg-dark);
296
+ color: var(--text-inverse);
297
+ z-index: 1;
298
+ }
299
+
300
+ .tc-mode-btn i {
301
+ font-size: 1rem;
302
+ }
303
+
304
+ /* ==========================================================================
305
+ Trigger Button
306
+ ========================================================================== */
307
+
308
+ .vd-theme-customizer {
309
+ position: relative;
310
+ display: inline-flex;
311
+ align-items: center;
312
+ }
313
+
314
+ .vd-theme-customizer-trigger {
315
+ display: inline-flex;
316
+ align-items: center;
317
+ justify-content: center;
318
+ width: 2.5rem;
319
+ height: 2.5rem;
320
+ padding: 0;
321
+ background: transparent;
322
+ border: 1px solid var(--border-color);
323
+ border-radius: var(--btn-border-radius);
324
+ color: var(--text-primary);
325
+ cursor: pointer;
326
+ transition: all 0.2s ease;
327
+ }
328
+
329
+ .vd-theme-customizer-trigger:hover {
330
+ background-color: var(--bg-secondary);
331
+ border-color: var(--color-primary);
332
+ color: var(--color-primary);
333
+ }
334
+
335
+ .vd-theme-customizer-trigger:focus-visible {
336
+ outline: 2px solid var(--color-primary);
337
+ outline-offset: 2px;
338
+ }
339
+
340
+ .vd-theme-customizer-trigger i {
341
+ font-size: 1.25rem;
342
+ }
343
+
344
+ .vd-theme-customizer-trigger[aria-expanded="true"] {
345
+ background-color: var(--color-primary-alpha-10);
346
+ border-color: var(--color-primary);
347
+ color: var(--color-primary);
348
+ }
349
+
350
+ /* ==========================================================================
351
+ Panel
352
+ ========================================================================== */
353
+
354
+ .vd-theme-customizer-panel {
355
+ position: fixed;
356
+ /* top is set dynamically by JS based on actual navbar height */
357
+ top: 55px;
358
+ right: 0;
359
+ width: var(--customizer-width);
360
+ max-height: calc(100vh - 55px);
361
+ overflow-y: auto;
362
+ padding: 0; /* Override .vd-navbar-fixed ~ * padding-top rule */
363
+ background-color: var(--customizer-bg);
364
+ border: 1px solid var(--customizer-border);
365
+ border-radius: calc(var(--radius-scale, 0.25) * 1rem);
366
+ box-shadow: var(--customizer-shadow);
367
+ z-index: var(--customizer-z-index);
368
+ opacity: 0;
369
+ visibility: hidden;
370
+ transform: translateY(-10px);
371
+ transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s ease;
372
+ }
373
+
374
+ .vd-theme-customizer-panel.is-open {
375
+ opacity: 1;
376
+ visibility: visible;
377
+ transform: translateY(0);
378
+ }
379
+
380
+ .vd-theme-customizer-panel-inner {
381
+ padding: var(--customizer-padding);
382
+ }
383
+
384
+ /* ==========================================================================
385
+ Sections
386
+ ========================================================================== */
387
+
388
+ .customizer-section {
389
+ margin-bottom: 1.25rem;
390
+ }
391
+
392
+ .customizer-section:last-child {
393
+ margin-bottom: 0;
394
+ }
395
+
396
+ .customizer-section-title {
397
+ display: flex;
398
+ align-items: center;
399
+ gap: 0.375rem;
400
+ margin-bottom: 0.625rem;
401
+ font-size: var(--font-size-sm);
402
+ font-weight: var(--font-weight-medium);
403
+ color: var(--text-primary);
404
+ }
405
+
406
+ .customizer-help {
407
+ display: inline-flex;
408
+ align-items: center;
409
+ justify-content: center;
410
+ width: 1rem;
411
+ height: 1rem;
412
+ padding: 0;
413
+ background: transparent;
414
+ border: none;
415
+ color: var(--text-muted);
416
+ cursor: help;
417
+ font-size: 0.75rem;
418
+ }
419
+
420
+ .customizer-help:hover {
421
+ color: var(--text-primary);
422
+ }
423
+
424
+ /* ==========================================================================
425
+ Color Swatches (Primary & Neutral)
426
+ ========================================================================== */
427
+
428
+ .customizer-colors {
429
+ display: grid;
430
+ grid-template-columns: repeat(3, 1fr);
431
+ gap: 0.375rem;
432
+ }
433
+
434
+ .customizer-swatch {
435
+ display: flex;
436
+ align-items: center;
437
+ gap: 0.5rem;
438
+ padding: 0.375rem 0.5rem;
439
+ background: transparent;
440
+ border: 1px solid var(--border-color);
441
+ border-radius: var(--btn-border-radius);
442
+ cursor: pointer;
443
+ transition: all 0.15s ease;
444
+ text-align: left;
445
+ }
446
+
447
+ .customizer-swatch:hover {
448
+ background-color: var(--bg-secondary);
449
+ border-color: var(--border-color-dark);
450
+ }
451
+
452
+ .customizer-swatch:focus-visible {
453
+ outline: 2px solid var(--color-primary);
454
+ outline-offset: 1px;
455
+ }
456
+
457
+ .customizer-swatch.is-active {
458
+ background-color: var(--bg-secondary);
459
+ border-color: var(--text-primary);
460
+ }
461
+
462
+ .customizer-swatch-dot {
463
+ flex-shrink: 0;
464
+ width: 12px;
465
+ height: 12px;
466
+ border-radius: 50%;
467
+ background-color: var(--swatch-color);
468
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
469
+ }
470
+
471
+ .customizer-swatch-label {
472
+ font-size: var(--font-size-xs);
473
+ color: var(--text-primary);
474
+ white-space: nowrap;
475
+ overflow: hidden;
476
+ text-overflow: ellipsis;
477
+ }
478
+
479
+ /* Neutral swatches - 5 columns */
480
+ .customizer-neutral-colors {
481
+ grid-template-columns: repeat(5, 1fr);
482
+ }
483
+
484
+ .customizer-neutral-colors .customizer-swatch {
485
+ flex-direction: column;
486
+ padding: 0.5rem 0.25rem;
487
+ text-align: center;
488
+ }
489
+
490
+ .customizer-neutral-colors .customizer-swatch-dot {
491
+ width: 16px;
492
+ height: 16px;
493
+ }
494
+
495
+ .customizer-neutral-colors .customizer-swatch-label {
496
+ margin-top: 0.25rem;
497
+ }
498
+
499
+ /* ==========================================================================
500
+ Radius Options
501
+ ========================================================================== */
502
+
503
+ .customizer-radius {
504
+ display: flex;
505
+ gap: 0.25rem;
506
+ }
507
+
508
+ .customizer-radius-btn {
509
+ flex: 1;
510
+ display: flex;
511
+ align-items: center;
512
+ justify-content: center;
513
+ padding: 0.5rem 0.25rem;
514
+ background: transparent;
515
+ border: 1px solid var(--border-color);
516
+ color: var(--text-primary);
517
+ font-size: var(--font-size-xs);
518
+ font-weight: var(--font-weight-medium);
519
+ cursor: pointer;
520
+ transition: all 0.15s ease;
521
+ }
522
+
523
+ .customizer-radius-btn:first-child {
524
+ border-radius: var(--btn-border-radius) 0 0 var(--btn-border-radius);
525
+ }
526
+
527
+ .customizer-radius-btn:last-child {
528
+ border-radius: 0 var(--btn-border-radius) var(--btn-border-radius) 0;
529
+ }
530
+
531
+ .customizer-radius-btn:not(:first-child) {
532
+ margin-left: -1px;
533
+ }
534
+
535
+ .customizer-radius-btn:hover {
536
+ background-color: var(--bg-secondary);
537
+ z-index: 1;
538
+ }
539
+
540
+ .customizer-radius-btn:focus-visible {
541
+ outline: 2px solid var(--color-primary);
542
+ outline-offset: 1px;
543
+ z-index: 2;
544
+ }
545
+
546
+ .customizer-radius-btn.is-active {
547
+ background-color: var(--bg-dark);
548
+ border-color: var(--bg-dark);
549
+ color: var(--text-inverse);
550
+ z-index: 1;
551
+ }
552
+
553
+ /* ==========================================================================
554
+ Font Selector
555
+ ========================================================================== */
556
+
557
+ .customizer-font {
558
+ position: relative;
559
+ }
560
+
561
+ .customizer-font .vd-input {
562
+ width: 100%;
563
+ padding-left: 2rem;
564
+ }
565
+
566
+ .customizer-font-icon {
567
+ position: absolute;
568
+ left: 0.625rem;
569
+ top: 50%;
570
+ transform: translateY(-50%);
571
+ color: var(--text-muted);
572
+ pointer-events: none;
573
+ }
574
+
575
+ /* ==========================================================================
576
+ Color Mode Switcher
577
+ ========================================================================== */
578
+
579
+ .customizer-mode {
580
+ display: flex;
581
+ gap: 0.25rem;
582
+ }
583
+
584
+ .customizer-mode-btn {
585
+ flex: 1;
586
+ display: flex;
587
+ align-items: center;
588
+ justify-content: center;
589
+ gap: 0.375rem;
590
+ padding: 0.5rem 0.5rem;
591
+ background: transparent;
592
+ border: 1px solid var(--border-color);
593
+ color: var(--text-primary);
594
+ font-size: var(--font-size-xs);
595
+ cursor: pointer;
596
+ transition: all 0.15s ease;
597
+ }
598
+
599
+ .customizer-mode-btn:first-child {
600
+ border-radius: var(--btn-border-radius) 0 0 var(--btn-border-radius);
601
+ }
602
+
603
+ .customizer-mode-btn:last-child {
604
+ border-radius: 0 var(--btn-border-radius) var(--btn-border-radius) 0;
605
+ }
606
+
607
+ .customizer-mode-btn:not(:first-child) {
608
+ margin-left: -1px;
609
+ }
610
+
611
+ .customizer-mode-btn:hover {
612
+ background-color: var(--bg-secondary);
613
+ z-index: 1;
614
+ }
615
+
616
+ .customizer-mode-btn:focus-visible {
617
+ outline: 2px solid var(--color-primary);
618
+ outline-offset: 1px;
619
+ z-index: 2;
620
+ }
621
+
622
+ .customizer-mode-btn.is-active {
623
+ background-color: var(--bg-dark);
624
+ border-color: var(--bg-dark);
625
+ color: var(--text-inverse);
626
+ z-index: 1;
627
+ }
628
+
629
+ .customizer-mode-btn i {
630
+ font-size: 1rem;
631
+ }
632
+
633
+ /* ==========================================================================
634
+ Dark Theme Overrides
635
+ ========================================================================== */
636
+
637
+ [data-theme="dark"] {
638
+ --customizer-bg: var(--bg-primary);
639
+ --customizer-border: var(--border-color);
640
+ }
641
+
642
+ [data-theme="dark"] .customizer-swatch-dot,
643
+ [data-theme="dark"] .tc-neutral-swatch::before {
644
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1);
645
+ }
646
+
647
+ [data-theme="dark"] .customizer-radius-btn.is-active,
648
+ [data-theme="dark"] .customizer-mode-btn.is-active,
649
+ [data-theme="dark"] .tc-radius-btn.is-active,
650
+ [data-theme="dark"] .tc-mode-btn.is-active {
651
+ background-color: var(--gray-2);
652
+ border-color: var(--gray-2);
653
+ color: var(--gray-9);
654
+ }
655
+
656
+ @media (prefers-color-scheme: dark) {
657
+ :root:not([data-theme]) {
658
+ --customizer-bg: var(--bg-primary);
659
+ --customizer-border: var(--border-color);
660
+ }
661
+
662
+ :root:not([data-theme]) .customizer-swatch-dot,
663
+ :root:not([data-theme]) .tc-neutral-swatch::before {
664
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1);
665
+ }
666
+
667
+ :root:not([data-theme]) .customizer-radius-btn.is-active,
668
+ :root:not([data-theme]) .customizer-mode-btn.is-active,
669
+ :root:not([data-theme]) .tc-radius-btn.is-active,
670
+ :root:not([data-theme]) .tc-mode-btn.is-active {
671
+ background-color: var(--gray-2);
672
+ border-color: var(--gray-2);
673
+ color: var(--gray-9);
674
+ }
675
+ }
676
+
677
+ /* ==========================================================================
678
+ Mobile Responsive
679
+ ========================================================================== */
680
+
681
+ @media (max-width: 767.98px) {
682
+ .vd-theme-customizer-panel,
683
+ body > .vd-theme-customizer-panel {
684
+ position: fixed;
685
+ top: 0;
686
+ right: -100%;
687
+ bottom: 0;
688
+ width: 100%;
689
+ max-width: 320px;
690
+ max-height: none;
691
+ border: none;
692
+ border-left: 1px solid var(--customizer-border);
693
+ border-radius: 0;
694
+ transform: none;
695
+ opacity: 1;
696
+ transition: right 0.3s ease, visibility 0.3s ease;
697
+ }
698
+
699
+ .vd-theme-customizer-panel.is-open,
700
+ body > .vd-theme-customizer-panel.is-open {
701
+ right: 0;
702
+ transform: none;
703
+ visibility: visible;
704
+ }
705
+
706
+ .vd-theme-customizer-panel-inner,
707
+ .tc-body {
708
+ padding: 1.5rem;
709
+ }
710
+
711
+ .tc-header {
712
+ padding: 1rem 1.5rem;
713
+ }
714
+
715
+ .tc-footer {
716
+ padding: 1rem 1.5rem;
717
+ }
718
+
719
+ /* Mobile close button */
720
+ .customizer-mobile-close {
721
+ position: absolute;
722
+ top: 1rem;
723
+ right: 1rem;
724
+ display: flex;
725
+ align-items: center;
726
+ justify-content: center;
727
+ width: 2rem;
728
+ height: 2rem;
729
+ padding: 0;
730
+ background: transparent;
731
+ border: 1px solid var(--border-color);
732
+ border-radius: calc(var(--radius-scale, 0.25) * 0.5rem);
733
+ color: var(--text-primary);
734
+ cursor: pointer;
735
+ }
736
+
737
+ .customizer-mobile-close:hover {
738
+ background-color: var(--bg-secondary);
739
+ }
740
+
741
+ /* Mobile overlay */
742
+ .vd-theme-customizer-overlay {
743
+ position: fixed;
744
+ top: 0;
745
+ left: 0;
746
+ right: 0;
747
+ bottom: 0;
748
+ background-color: rgba(0, 0, 0, 0.5);
749
+ z-index: calc(var(--customizer-z-index) - 1);
750
+ opacity: 0;
751
+ visibility: hidden;
752
+ transition: opacity 0.3s ease, visibility 0.3s ease;
753
+ }
754
+
755
+ .vd-theme-customizer-overlay.is-active {
756
+ opacity: 1;
757
+ visibility: visible;
758
+ }
759
+ }
760
+
761
+ @media (min-width: 768px) {
762
+ .customizer-mobile-close {
763
+ display: none;
764
+ }
765
+
766
+ .vd-theme-customizer-overlay {
767
+ display: none;
768
+ }
769
+ }
770
+
771
+ /* ==========================================================================
772
+ Scrollbar Styling
773
+ ========================================================================== */
774
+
775
+ .vd-theme-customizer-panel::-webkit-scrollbar {
776
+ width: 6px;
777
+ }
778
+
779
+ .vd-theme-customizer-panel::-webkit-scrollbar-track {
780
+ background: transparent;
781
+ }
782
+
783
+ .vd-theme-customizer-panel::-webkit-scrollbar-thumb {
784
+ background-color: var(--border-color);
785
+ border-radius: 3px;
786
+ }
787
+
788
+ .vd-theme-customizer-panel::-webkit-scrollbar-thumb:hover {
789
+ background-color: var(--text-muted);
790
+ }
791
+
792
+ /* ==========================================================================
793
+ Animation for panel header
794
+ ========================================================================== */
795
+
796
+ .customizer-header {
797
+ display: flex;
798
+ align-items: center;
799
+ justify-content: space-between;
800
+ padding-bottom: 0.75rem;
801
+ margin-bottom: 0.75rem;
802
+ border-bottom: 1px solid var(--border-color);
803
+ }
804
+
805
+ .customizer-title {
806
+ font-size: var(--font-size-base);
807
+ font-weight: var(--font-weight-semibold);
808
+ color: var(--text-primary);
809
+ margin: 0;
810
+ }
811
+
812
+ .customizer-reset {
813
+ display: inline-flex;
814
+ align-items: center;
815
+ gap: 0.25rem;
816
+ padding: 0.25rem 0.5rem;
817
+ background: transparent;
818
+ border: 1px solid var(--border-color);
819
+ border-radius: var(--btn-border-radius);
820
+ color: var(--text-muted);
821
+ font-size: var(--font-size-xs);
822
+ cursor: pointer;
823
+ transition: all 0.15s ease;
824
+ }
825
+
826
+ .customizer-reset:hover {
827
+ background-color: var(--bg-secondary);
828
+ color: var(--text-primary);
829
+ border-color: var(--border-color-dark);
830
+ }
831
+
832
+ .customizer-reset:focus-visible {
833
+ outline: 2px solid var(--color-primary);
834
+ outline-offset: 1px;
835
+ }