vanduo-framework 1.1.8

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 +205 -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,279 @@
1
+ /**
2
+ * Vanduo Framework - Image Box Component
3
+ * Lightbox-style image enlargement with smooth transitions
4
+ */
5
+
6
+ :root {
7
+ /* Image Box Colors */
8
+ --image-box-backdrop-bg: rgba(0, 0, 0, 0.9);
9
+ --image-box-backdrop-blur: 8px;
10
+
11
+ /* Image Box Transitions (Fibonacci-inspired timing) */
12
+ --image-box-transition-duration: 0.3s;
13
+ --image-box-transition-easing: cubic-bezier(0.4, 0, 0.2, 1);
14
+
15
+ /* Image Box Z-index */
16
+ --image-box-z-index: 2000;
17
+
18
+ /* Image Box Padding */
19
+ --image-box-padding: 21px;
20
+ /* Fibonacci number */
21
+
22
+ /* Image Box Scale */
23
+ --image-box-scale-start: 0.9;
24
+ --image-box-scale-end: 1;
25
+
26
+ /* Image Box Max Size */
27
+ --image-box-max-width: 50vw;
28
+ --image-box-max-height: 50vh;
29
+ }
30
+
31
+ /* Broken Image Handling for Triggers */
32
+ .vd-image-box-trigger {
33
+ position: relative;
34
+ min-height: 60px;
35
+ min-width: 60px;
36
+ }
37
+
38
+ /* Hide broken image alt text and show styled placeholder */
39
+ .vd-image-box-trigger.is-broken {
40
+ /* Gradient background for placeholder */
41
+ background: linear-gradient(135deg,
42
+ var(--bg-tertiary, rgba(128, 128, 128, 0.1)) 0%,
43
+ var(--bg-secondary, rgba(128, 128, 128, 0.15)) 100%);
44
+ border: 1px dashed var(--border-color, rgba(128, 128, 128, 0.3));
45
+
46
+ /* Center the icon using background image */
47
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' fill='%23888888' viewBox='0 0 256 256'%3E%3Cpath d='M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM40,56H216v94.75l-24.29-24.29a16,16,0,0,0-22.63,0L144,151.51l-25.38-25.38a16,16,0,0,0-22.62,0L40,182.12V56Z'/%3E%3Ccircle cx='100' cy='108' r='20'/%3E%3C/svg%3E");
48
+ background-repeat: no-repeat;
49
+ background-position: center;
50
+ background-size: 32px 32px;
51
+
52
+ /* Hide the broken image icon and alt text */
53
+ color: transparent;
54
+ overflow: hidden;
55
+ }
56
+
57
+ /* Image Box Trigger - Images that can be enlarged */
58
+ .vd-image-box-trigger {
59
+ cursor: zoom-in;
60
+ transition: transform var(--image-box-transition-duration) var(--image-box-transition-easing),
61
+ box-shadow var(--image-box-transition-duration) var(--image-box-transition-easing);
62
+ }
63
+
64
+ .vd-image-box-trigger:hover {
65
+ transform: scale(1.02);
66
+ box-shadow: var(--shadow-lg);
67
+ }
68
+
69
+ /* Image Box Backdrop */
70
+ .vd-image-box-backdrop {
71
+ position: fixed;
72
+ top: 0;
73
+ left: 0;
74
+ width: 100vw;
75
+ height: 100vh;
76
+ z-index: var(--image-box-z-index);
77
+ background-color: var(--image-box-backdrop-bg);
78
+ backdrop-filter: blur(var(--image-box-backdrop-blur));
79
+ -webkit-backdrop-filter: blur(var(--image-box-backdrop-blur));
80
+ opacity: 0;
81
+ visibility: hidden;
82
+ transition: opacity var(--image-box-transition-duration) var(--image-box-transition-easing),
83
+ visibility var(--image-box-transition-duration) var(--image-box-transition-easing);
84
+ display: flex;
85
+ align-items: center;
86
+ justify-content: center;
87
+ padding: var(--image-box-padding);
88
+ }
89
+
90
+ .vd-image-box-backdrop.is-visible {
91
+ opacity: 1;
92
+ visibility: visible;
93
+ }
94
+
95
+ /* Image Box Container */
96
+ .vd-image-box-container {
97
+ position: relative;
98
+ max-width: var(--image-box-max-width);
99
+ max-height: var(--image-box-max-height);
100
+ display: flex;
101
+ align-items: center;
102
+ justify-content: center;
103
+ transform: scale(var(--image-box-scale-start));
104
+ opacity: 0;
105
+ transition: transform var(--image-box-transition-duration) var(--image-box-transition-easing),
106
+ opacity var(--image-box-transition-duration) var(--image-box-transition-easing);
107
+ }
108
+
109
+ .vd-image-box-backdrop.is-visible .vd-image-box-container {
110
+ transform: scale(var(--image-box-scale-end));
111
+ opacity: 1;
112
+ }
113
+
114
+ /* Image Box Image */
115
+ .vd-image-box-img {
116
+ max-width: 100%;
117
+ max-height: 100%;
118
+ object-fit: contain;
119
+ border-radius: var(--btn-border-radius);
120
+ box-shadow: var(--shadow-2xl);
121
+ cursor: zoom-out;
122
+ user-select: none;
123
+ -webkit-user-drag: none;
124
+ }
125
+
126
+ /* Image Box Close Button (optional) */
127
+ .vd-image-box-close {
128
+ position: absolute;
129
+ top: 21px;
130
+ right: 21px;
131
+ width: 44px;
132
+ height: 44px;
133
+ background: rgba(255, 255, 255, 0.1);
134
+ border: none;
135
+ border-radius: 50%;
136
+ color: var(--color-white);
137
+ font-size: 24px;
138
+ line-height: 1;
139
+ cursor: pointer;
140
+ display: flex;
141
+ align-items: center;
142
+ justify-content: center;
143
+ transition: background-color var(--transition-duration-fast) var(--transition-ease),
144
+ transform var(--transition-duration-fast) var(--transition-ease);
145
+ z-index: calc(var(--image-box-z-index) + 1);
146
+ opacity: 0;
147
+ transform: translateY(-10px);
148
+ }
149
+
150
+ .vd-image-box-backdrop.is-visible .vd-image-box-close {
151
+ opacity: 1;
152
+ transform: translateY(0);
153
+ transition-delay: 0.1s;
154
+ }
155
+
156
+ .vd-image-box-close:hover {
157
+ background: rgba(255, 255, 255, 0.2);
158
+ transform: scale(1.1);
159
+ }
160
+
161
+ .vd-image-box-close:focus {
162
+ outline: 2px solid var(--color-primary);
163
+ outline-offset: 2px;
164
+ }
165
+
166
+ /* Image Box Caption */
167
+ .vd-image-box-caption {
168
+ position: absolute;
169
+ bottom: 21px;
170
+ left: 50%;
171
+ transform: translateX(-50%);
172
+ background: rgba(0, 0, 0, 0.7);
173
+ color: var(--color-white);
174
+ padding: 8px 16px;
175
+ border-radius: var(--btn-border-radius);
176
+ font-size: var(--font-size-sm);
177
+ text-align: center;
178
+ max-width: 80%;
179
+ opacity: 0;
180
+ transition: opacity var(--image-box-transition-duration) var(--image-box-transition-easing);
181
+ }
182
+
183
+ .vd-image-box-backdrop.is-visible .vd-image-box-caption {
184
+ opacity: 1;
185
+ transition-delay: 0.15s;
186
+ }
187
+
188
+ /* Body scroll lock when Image Box is open */
189
+ .body-image-box-open {
190
+ overflow: hidden;
191
+ padding-right: var(--scrollbar-width, 0);
192
+ }
193
+
194
+ /* Reduced Motion Support */
195
+ @media (prefers-reduced-motion: reduce) {
196
+
197
+ .vd-image-box-trigger,
198
+ .vd-image-box-backdrop,
199
+ .vd-image-box-container,
200
+ .vd-image-box-close,
201
+ .vd-image-box-caption {
202
+ transition: none;
203
+ }
204
+
205
+ .vd-image-box-trigger:hover {
206
+ transform: none;
207
+ }
208
+ }
209
+
210
+ /* Mobile Adjustments */
211
+ @media (max-width: 767.98px) {
212
+ :root {
213
+ --image-box-padding: 13px;
214
+ --image-box-max-width: 90vw;
215
+ --image-box-max-height: 80vh;
216
+ }
217
+
218
+ .vd-image-box-close {
219
+ top: 13px;
220
+ right: 13px;
221
+ width: 40px;
222
+ height: 40px;
223
+ font-size: 20px;
224
+ }
225
+ }
226
+
227
+ /* Gallery Grid Support */
228
+ .vd-image-box-gallery {
229
+ display: grid;
230
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
231
+ gap: 13px;
232
+ margin-top: 21px;
233
+ }
234
+
235
+ .vd-image-box-gallery .vd-image-box-trigger {
236
+ width: 100%;
237
+ height: 100%;
238
+ object-fit: cover;
239
+ aspect-ratio: 4 / 3;
240
+ transition: transform 0.2s ease, box-shadow 0.2s ease, outline 0.15s ease;
241
+ }
242
+
243
+ /* Active/selected state for gallery thumbnails */
244
+ .vd-image-box-gallery .vd-image-box-trigger.is-active,
245
+ .vd-image-box-gallery .vd-image-box-trigger[aria-selected="true"] {
246
+ outline: 3px solid var(--color-primary);
247
+ outline-offset: 2px;
248
+ transform: scale(1.05);
249
+ box-shadow: var(--shadow-lg);
250
+ }
251
+
252
+ /* Keyboard focus for gallery thumbnails */
253
+ .vd-image-box-gallery .vd-image-box-trigger:focus {
254
+ outline: 3px solid var(--color-primary);
255
+ outline-offset: 2px;
256
+ }
257
+
258
+ /* Portrait orientation gallery item */
259
+ .vd-image-box-gallery .vd-image-box-trigger[data-orientation="portrait"] {
260
+ aspect-ratio: 3 / 4;
261
+ }
262
+
263
+ /* Loading State */
264
+ .vd-image-box-trigger.is-loading {
265
+ background: var(--bg-secondary);
266
+ animation: image-box-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
267
+ }
268
+
269
+ @keyframes image-box-pulse {
270
+
271
+ 0%,
272
+ 100% {
273
+ opacity: 1;
274
+ }
275
+
276
+ 50% {
277
+ opacity: 0.5;
278
+ }
279
+ }
@@ -0,0 +1,285 @@
1
+ /**
2
+ * Vanduo Framework - Modals
3
+ * Modal dialog component
4
+ */
5
+
6
+ :root {
7
+ /* Modal Colors */
8
+ --modal-bg: var(--color-white);
9
+ --modal-backdrop-bg: rgba(0, 0, 0, 0.5);
10
+ --modal-border-color: var(--border-color);
11
+
12
+ /* Modal Spacing (Fibonacci: 21px) */
13
+ --modal-padding: 1.3125rem;
14
+ --modal-header-padding: 1.3125rem;
15
+ --modal-body-padding: 1.3125rem;
16
+ --modal-footer-padding: 1.3125rem;
17
+
18
+ /* Modal Sizes (all Fibonacci numbers) */
19
+ --modal-width-sm: 233px; /* fib(13) */
20
+ --modal-width: 377px; /* fib(14) */
21
+ --modal-width-lg: 610px; /* fib(15) */
22
+ --modal-width-xl: 987px; /* fib(16) */
23
+
24
+ /* Modal Z-index */
25
+ --modal-z-index: 1050;
26
+ --modal-backdrop-z-index: 1040;
27
+
28
+ /* Modal Transitions */
29
+ --modal-transition: opacity var(--transition-duration-base) var(--transition-ease);
30
+ --modal-dialog-transition: transform var(--transition-duration-base) var(--transition-ease);
31
+ }
32
+
33
+ /* Dark Theme Overrides */
34
+ [data-theme="dark"] {
35
+ --modal-bg: var(--bg-secondary);
36
+ }
37
+
38
+ @media (prefers-color-scheme: dark) {
39
+ :root:not([data-theme]) {
40
+ --modal-bg: var(--bg-secondary);
41
+ }
42
+ }
43
+
44
+ /* Modal Backdrop */
45
+ .vd-modal-backdrop {
46
+ position: fixed;
47
+ top: 0;
48
+ left: 0;
49
+ z-index: var(--modal-backdrop-z-index);
50
+ width: 100vw;
51
+ height: 100vh;
52
+ background-color: var(--modal-backdrop-bg);
53
+ opacity: 0;
54
+ transition: var(--modal-transition);
55
+ pointer-events: none;
56
+ }
57
+
58
+ .vd-modal-backdrop.is-visible {
59
+ opacity: 1;
60
+ pointer-events: all;
61
+ }
62
+
63
+ /* Base Modal */
64
+ .vd-modal {
65
+ position: fixed;
66
+ top: 0;
67
+ left: 0;
68
+ z-index: var(--modal-z-index);
69
+ display: none;
70
+ width: 100%;
71
+ height: 100%;
72
+ overflow-x: hidden;
73
+ overflow-y: auto;
74
+ outline: 0;
75
+ opacity: 0;
76
+ transition: var(--modal-transition);
77
+ }
78
+
79
+ .vd-modal.is-open {
80
+ display: flex;
81
+ align-items: center;
82
+ justify-content: center;
83
+ opacity: 1;
84
+ }
85
+
86
+ /* Modal Dialog */
87
+ .vd-modal-dialog {
88
+ position: relative;
89
+ width: auto;
90
+ margin: 1.75rem auto;
91
+ max-width: var(--modal-width);
92
+ pointer-events: none;
93
+ transform: scale(0.95);
94
+ transition: var(--modal-dialog-transition);
95
+ z-index: 1060;
96
+ }
97
+
98
+ .vd-modal.is-open .vd-modal-dialog {
99
+ transform: scale(1);
100
+ }
101
+
102
+ /* Modal Content */
103
+ .vd-modal-content {
104
+ position: relative;
105
+ display: flex;
106
+ flex-direction: column;
107
+ width: 100%;
108
+ pointer-events: auto;
109
+ background-color: var(--modal-bg);
110
+ background-clip: padding-box;
111
+ border: 1px solid var(--modal-border-color);
112
+ border-radius: var(--btn-border-radius-lg);
113
+ box-shadow: var(--shadow-2xl);
114
+ outline: 0;
115
+ }
116
+
117
+ /* Modal Header */
118
+ .vd-modal-header {
119
+ display: flex;
120
+ align-items: flex-start;
121
+ justify-content: space-between;
122
+ padding: var(--modal-header-padding);
123
+ border-bottom: 1px solid var(--modal-border-color);
124
+ border-top-left-radius: calc(var(--btn-border-radius-lg) - 1px);
125
+ border-top-right-radius: calc(var(--btn-border-radius-lg) - 1px);
126
+ }
127
+
128
+ .vd-modal-title {
129
+ margin-bottom: 0;
130
+ line-height: var(--line-height-normal);
131
+ font-size: var(--font-size-xl);
132
+ font-weight: var(--font-weight-semibold);
133
+ color: var(--text-primary);
134
+ }
135
+
136
+ /* Modal Close Button */
137
+ .vd-modal-close {
138
+ padding: 0.5rem;
139
+ margin: -0.5rem -0.5rem -0.5rem auto;
140
+ background: transparent;
141
+ border: 0;
142
+ border-radius: var(--btn-border-radius);
143
+ opacity: 0.5;
144
+ cursor: pointer;
145
+ font-size: 1.5rem;
146
+ font-weight: var(--font-weight-bold);
147
+ line-height: 1;
148
+ color: var(--text-secondary);
149
+ text-shadow: 0 1px 0 var(--color-white);
150
+ transition: var(--transition-opacity);
151
+ user-select: none;
152
+ }
153
+
154
+ .vd-modal-close:hover,
155
+ .vd-modal-close:focus {
156
+ color: var(--text-primary);
157
+ text-decoration: none;
158
+ opacity: 0.75;
159
+ outline: none;
160
+ }
161
+
162
+ .vd-modal-close:focus {
163
+ outline: 2px solid var(--input-focus-border-color);
164
+ outline-offset: 2px;
165
+ }
166
+
167
+ /* Modal Body */
168
+ .vd-modal-body {
169
+ position: relative;
170
+ flex: 1 1 auto;
171
+ padding: var(--modal-body-padding);
172
+ }
173
+
174
+ /* Modal Footer */
175
+ .vd-modal-footer {
176
+ display: flex;
177
+ flex-wrap: wrap;
178
+ align-items: center;
179
+ justify-content: flex-end;
180
+ padding: var(--modal-footer-padding);
181
+ border-top: 1px solid var(--modal-border-color);
182
+ border-bottom-left-radius: calc(var(--btn-border-radius-lg) - 1px);
183
+ border-bottom-right-radius: calc(var(--btn-border-radius-lg) - 1px);
184
+ gap: 0.5rem;
185
+ }
186
+
187
+ .vd-modal-footer > * {
188
+ margin: 0;
189
+ }
190
+
191
+ /* Modal Sizes */
192
+ .vd-modal-sm .vd-modal-dialog {
193
+ max-width: var(--modal-width-sm);
194
+ }
195
+
196
+ .vd-modal-lg .vd-modal-dialog {
197
+ max-width: var(--modal-width-lg);
198
+ }
199
+
200
+ .vd-modal-xl .vd-modal-dialog {
201
+ max-width: var(--modal-width-xl);
202
+ }
203
+
204
+ .vd-modal-fullscreen .vd-modal-dialog {
205
+ max-width: 100%;
206
+ width: 100%;
207
+ height: 100%;
208
+ margin: 0;
209
+ border-radius: 0;
210
+ }
211
+
212
+ .vd-modal-fullscreen .vd-modal-content {
213
+ height: 100%;
214
+ border: 0;
215
+ border-radius: 0;
216
+ }
217
+
218
+ /* Modal Positioning */
219
+ .vd-modal-top .vd-modal-dialog {
220
+ margin-top: 0;
221
+ margin-bottom: auto;
222
+ }
223
+
224
+ .vd-modal-bottom .vd-modal-dialog {
225
+ margin-top: auto;
226
+ margin-bottom: 0;
227
+ }
228
+
229
+ /* Modal Scrollable */
230
+ .vd-modal-scrollable .vd-modal-body {
231
+ overflow-y: auto;
232
+ max-height: calc(100vh - 200px);
233
+ }
234
+
235
+ /* Modal Centered */
236
+ .vd-modal-centered .vd-modal-dialog {
237
+ display: flex;
238
+ align-items: center;
239
+ min-height: calc(100% - 3.5rem);
240
+ }
241
+
242
+ /* Responsive Behavior */
243
+ @media (max-width: 575.98px) {
244
+ .vd-modal-dialog {
245
+ margin: 0.5rem;
246
+ max-width: calc(100% - 1rem);
247
+ }
248
+
249
+ .vd-modal-fullscreen-sm-down {
250
+ width: 100vw;
251
+ max-width: 100vw;
252
+ height: 100%;
253
+ margin: 0;
254
+ }
255
+
256
+ .vd-modal-fullscreen-sm-down .vd-modal-content {
257
+ height: 100%;
258
+ border: 0;
259
+ border-radius: 0;
260
+ }
261
+ }
262
+
263
+ /* Modal Animation Variants */
264
+ .vd-modal-fade .vd-modal-dialog {
265
+ transform: translateY(-50px);
266
+ }
267
+
268
+ .vd-modal.is-open.vd-modal-fade .vd-modal-dialog {
269
+ transform: translateY(0);
270
+ }
271
+
272
+ .vd-modal-zoom .vd-modal-dialog {
273
+ transform: scale(0.8);
274
+ }
275
+
276
+ .vd-modal.is-open.vd-modal-zoom .vd-modal-dialog {
277
+ transform: scale(1);
278
+ }
279
+
280
+ /* Body Scroll Lock */
281
+ .body-modal-open {
282
+ overflow: hidden;
283
+ padding-right: 0;
284
+ }
285
+