@vuecs/design 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +57 -0
  3. package/assets/animations.css +506 -0
  4. package/assets/index.css +197 -0
  5. package/assets/palettes.css +303 -0
  6. package/assets/standalone.css +37 -0
  7. package/dist/core/color-mode/bind.d.ts +12 -0
  8. package/dist/core/color-mode/bind.d.ts.map +1 -0
  9. package/dist/core/color-mode/composable.d.ts +13 -0
  10. package/dist/core/color-mode/composable.d.ts.map +1 -0
  11. package/dist/core/color-mode/index.d.ts +4 -0
  12. package/dist/core/color-mode/index.d.ts.map +1 -0
  13. package/dist/core/color-mode/types.d.ts +36 -0
  14. package/dist/core/color-mode/types.d.ts.map +1 -0
  15. package/dist/core/color-palette/apply.d.ts +34 -0
  16. package/dist/core/color-palette/apply.d.ts.map +1 -0
  17. package/dist/core/color-palette/bind.d.ts +14 -0
  18. package/dist/core/color-palette/bind.d.ts.map +1 -0
  19. package/dist/core/color-palette/catalog.d.ts +78 -0
  20. package/dist/core/color-palette/catalog.d.ts.map +1 -0
  21. package/dist/core/color-palette/composable.d.ts +34 -0
  22. package/dist/core/color-palette/composable.d.ts.map +1 -0
  23. package/dist/core/color-palette/index.d.ts +7 -0
  24. package/dist/core/color-palette/index.d.ts.map +1 -0
  25. package/dist/core/color-palette/render.d.ts +16 -0
  26. package/dist/core/color-palette/render.d.ts.map +1 -0
  27. package/dist/core/color-palette/types.d.ts +107 -0
  28. package/dist/core/color-palette/types.d.ts.map +1 -0
  29. package/dist/core/index.d.ts +4 -0
  30. package/dist/core/index.d.ts.map +1 -0
  31. package/dist/core/theme-runtime/capture.d.ts +32 -0
  32. package/dist/core/theme-runtime/capture.d.ts.map +1 -0
  33. package/dist/core/theme-runtime/composable.d.ts +34 -0
  34. package/dist/core/theme-runtime/composable.d.ts.map +1 -0
  35. package/dist/core/theme-runtime/index.d.ts +4 -0
  36. package/dist/core/theme-runtime/index.d.ts.map +1 -0
  37. package/dist/core/theme-runtime/types.d.ts +42 -0
  38. package/dist/core/theme-runtime/types.d.ts.map +1 -0
  39. package/dist/index.d.ts +2 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.mjs +467 -0
  42. package/dist/index.mjs.map +1 -0
  43. package/dist/utils/object.d.ts +2 -0
  44. package/dist/utils/object.d.ts.map +1 -0
  45. package/package.json +83 -0
@@ -0,0 +1,506 @@
1
+ /*
2
+ * Overlay animations — vanilla-CSS port of tw-animate-css's public class
3
+ * surface so the same classes work for any theme (Tailwind, Bootstrap, custom),
4
+ * not just Tailwind v4.
5
+ *
6
+ * Source: https://github.com/Wombosvideo/tw-animate-css (v1.4.0, MIT)
7
+ *
8
+ * tw-animate-css ships its rules as Tailwind v4 `@utility` / `@theme inline`
9
+ * directives — they only compile inside Tailwind. This file rewrites those
10
+ * same rules as plain class selectors so consumers without Tailwind (e.g.
11
+ * Bootstrap-themed sites) can use them too. Tailwind users keep using the
12
+ * `data-[state=open]:fade-in-0 zoom-in-95 ...` variant pattern unchanged —
13
+ * Tailwind's `data-[state=]` variant prefix points at these CSS classes the
14
+ * same way it would at any other utility.
15
+ *
16
+ * When tw-animate-css adds new animations upstream, port them here using
17
+ * the same naming. Keep this file in lockstep with the upstream version
18
+ * pinned above; bump the version comment when you re-port.
19
+ *
20
+ * Composition model (mirrors tw-animate-css):
21
+ * <element class="animate-in fade-in-0 zoom-in-95 duration-150">
22
+ *
23
+ * - `animate-in` / `animate-out` apply the master `enter` / `exit`
24
+ * keyframes which read these CSS custom properties:
25
+ * --tw-enter-opacity, --tw-enter-scale, --tw-enter-rotate,
26
+ * --tw-enter-translate-x, --tw-enter-translate-y, --tw-enter-blur
27
+ * (and matching --tw-exit-* for animate-out)
28
+ * - Modifier classes (`fade-in`, `zoom-in-95`, `slide-in-from-top`, etc.)
29
+ * set the corresponding custom property; the master keyframe interpolates.
30
+ * - `duration-*` / `delay-*` / `repeat-*` / `direction-*` / `fill-mode-*`
31
+ * tune timing & lifecycle.
32
+ *
33
+ * For our overlays, theme-tailwind already references the relevant subset
34
+ * (animate-in, animate-out, fade-in-0, fade-out-0, zoom-in-95, zoom-out-95)
35
+ * via Tailwind's `data-[state=open|closed]:` variant prefix. Bootstrap
36
+ * theme entries can reference the same classes directly.
37
+ */
38
+
39
+ /* ---------- Custom properties (defaults for the master keyframes) ------- */
40
+
41
+ @property --tw-animation-delay { syntax: "*"; inherits: false; initial-value: 0s; }
42
+ @property --tw-animation-direction { syntax: "*"; inherits: false; initial-value: normal; }
43
+ @property --tw-animation-duration { syntax: "*"; inherits: false; initial-value: 150ms; }
44
+ @property --tw-animation-fill-mode { syntax: "*"; inherits: false; initial-value: none; }
45
+ @property --tw-animation-iteration-count { syntax: "*"; inherits: false; initial-value: 1; }
46
+ @property --tw-ease { syntax: "*"; inherits: false; initial-value: ease; }
47
+
48
+ @property --tw-enter-blur { syntax: "*"; inherits: false; initial-value: 0; }
49
+ @property --tw-enter-opacity { syntax: "*"; inherits: false; initial-value: 1; }
50
+ @property --tw-enter-rotate { syntax: "*"; inherits: false; initial-value: 0; }
51
+ @property --tw-enter-scale { syntax: "*"; inherits: false; initial-value: 1; }
52
+ @property --tw-enter-translate-x { syntax: "*"; inherits: false; initial-value: 0; }
53
+ @property --tw-enter-translate-y { syntax: "*"; inherits: false; initial-value: 0; }
54
+
55
+ @property --tw-exit-blur { syntax: "*"; inherits: false; initial-value: 0; }
56
+ @property --tw-exit-opacity { syntax: "*"; inherits: false; initial-value: 1; }
57
+ @property --tw-exit-rotate { syntax: "*"; inherits: false; initial-value: 0; }
58
+ @property --tw-exit-scale { syntax: "*"; inherits: false; initial-value: 1; }
59
+ @property --tw-exit-translate-x { syntax: "*"; inherits: false; initial-value: 0; }
60
+ @property --tw-exit-translate-y { syntax: "*"; inherits: false; initial-value: 0; }
61
+
62
+ /* Reka-injected vars consumed by accordion / collapsible keyframes.
63
+ Reka's `<AccordionContent>` and `<CollapsibleContent>` runtime sets
64
+ these on mount; declaring them here gives static analysers (and IDE
65
+ inspectors) something to resolve, plus a sensible `auto` fallback when
66
+ no Reka primitive is providing them. tw-animate-css upstream chains
67
+ var() fallbacks through radix / bits / kobalte / ng-primitives
68
+ namespaces too — vuecs only ever pairs with Reka, so we keep just
69
+ the one. If you ever need to swap or layer another radix-clone,
70
+ declare its var here too and chain it in the keyframe `var()` calls. */
71
+ @property --reka-accordion-content-height { syntax: "*"; inherits: false; initial-value: auto; }
72
+ @property --reka-collapsible-content-height { syntax: "*"; inherits: false; initial-value: auto; }
73
+
74
+ /* Reka-injected vars for toast swipe gesture. Reka's `<ToastRoot>` writes
75
+ `--reka-toast-swipe-move-x` while the user drags and
76
+ `--reka-toast-swipe-end-x` when the swipe completes; we read them from
77
+ `.vc-toast-anim[data-swipe=…]` rules. Declared with a `0px` fallback so
78
+ the rules render correctly even before Reka mounts the toast. */
79
+ @property --reka-toast-swipe-move-x { syntax: "*"; inherits: false; initial-value: 0px; }
80
+ @property --reka-toast-swipe-end-x { syntax: "*"; inherits: false; initial-value: 0px; }
81
+
82
+ /* ---------- Master keyframes ------------------------------------------- */
83
+
84
+ @keyframes enter {
85
+ from {
86
+ opacity: var(--tw-enter-opacity, 1);
87
+ transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0)
88
+ scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1))
89
+ rotate(var(--tw-enter-rotate, 0));
90
+ filter: blur(var(--tw-enter-blur, 0));
91
+ }
92
+ }
93
+
94
+ @keyframes exit {
95
+ to {
96
+ opacity: var(--tw-exit-opacity, 1);
97
+ transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0)
98
+ scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1))
99
+ rotate(var(--tw-exit-rotate, 0));
100
+ filter: blur(var(--tw-exit-blur, 0));
101
+ }
102
+ }
103
+
104
+ /* ---------- Specialised keyframes (Reka-driven height transitions) ----- */
105
+
106
+ /* Reka exposes the resolved height as `--reka-accordion-content-height`;
107
+ tw-animate-css also reads radix-/bits-/kobalte-/ng-primitives variants
108
+ so the same animations work across the radix-clone ecosystem. */
109
+ @keyframes accordion-down {
110
+ from { height: 0; }
111
+ to { height: var(--reka-accordion-content-height); }
112
+ }
113
+ @keyframes accordion-up {
114
+ from { height: var(--reka-accordion-content-height); }
115
+ to { height: 0; }
116
+ }
117
+ @keyframes collapsible-down {
118
+ from { height: 0; }
119
+ to { height: var(--reka-collapsible-content-height); }
120
+ }
121
+ @keyframes collapsible-up {
122
+ from { height: var(--reka-collapsible-content-height); }
123
+ to { height: 0; }
124
+ }
125
+ @keyframes caret-blink {
126
+ 0%, 70%, 100% { opacity: 1; }
127
+ 20%, 50% { opacity: 0; }
128
+ }
129
+
130
+ /* ---------- Master triggers -------------------------------------------- */
131
+
132
+ .animate-in {
133
+ animation: enter var(--tw-animation-duration, 150ms)
134
+ var(--tw-ease, ease)
135
+ var(--tw-animation-delay, 0s)
136
+ var(--tw-animation-iteration-count, 1)
137
+ var(--tw-animation-direction, normal)
138
+ var(--tw-animation-fill-mode, none);
139
+ }
140
+ .animate-out {
141
+ animation: exit var(--tw-animation-duration, 150ms)
142
+ var(--tw-ease, ease)
143
+ var(--tw-animation-delay, 0s)
144
+ var(--tw-animation-iteration-count, 1)
145
+ var(--tw-animation-direction, normal)
146
+ var(--tw-animation-fill-mode, none);
147
+ }
148
+
149
+ .animate-accordion-down { animation: accordion-down 200ms ease-out; }
150
+ .animate-accordion-up { animation: accordion-up 200ms ease-out; }
151
+ .animate-collapsible-down { animation: collapsible-down 200ms ease-out; }
152
+ .animate-collapsible-up { animation: collapsible-up 200ms ease-out; }
153
+ .animate-caret-blink { animation: caret-blink 1.25s ease-out infinite; }
154
+
155
+ /* ---------- Fade ------------------------------------------------------- */
156
+
157
+ .fade-in { --tw-enter-opacity: 0; }
158
+ .fade-in-0 { --tw-enter-opacity: 0; }
159
+ .fade-in-25 { --tw-enter-opacity: 0.25; }
160
+ .fade-in-50 { --tw-enter-opacity: 0.5; }
161
+ .fade-in-75 { --tw-enter-opacity: 0.75; }
162
+ .fade-in-90 { --tw-enter-opacity: 0.9; }
163
+ .fade-in-95 { --tw-enter-opacity: 0.95; }
164
+ .fade-in-100 { --tw-enter-opacity: 1; }
165
+
166
+ .fade-out { --tw-exit-opacity: 0; }
167
+ .fade-out-0 { --tw-exit-opacity: 0; }
168
+ .fade-out-25 { --tw-exit-opacity: 0.25; }
169
+ .fade-out-50 { --tw-exit-opacity: 0.5; }
170
+ .fade-out-75 { --tw-exit-opacity: 0.75; }
171
+ .fade-out-90 { --tw-exit-opacity: 0.9; }
172
+ .fade-out-95 { --tw-exit-opacity: 0.95; }
173
+ .fade-out-100 { --tw-exit-opacity: 1; }
174
+
175
+ /* ---------- Zoom ------------------------------------------------------- */
176
+
177
+ .zoom-in { --tw-enter-scale: 0; }
178
+ .zoom-in-0 { --tw-enter-scale: 0; }
179
+ .zoom-in-50 { --tw-enter-scale: 0.5; }
180
+ .zoom-in-75 { --tw-enter-scale: 0.75; }
181
+ .zoom-in-90 { --tw-enter-scale: 0.9; }
182
+ .zoom-in-95 { --tw-enter-scale: 0.95; }
183
+ .zoom-in-100 { --tw-enter-scale: 1; }
184
+ .zoom-in-105 { --tw-enter-scale: 1.05; }
185
+ .zoom-in-110 { --tw-enter-scale: 1.1; }
186
+ .zoom-in-125 { --tw-enter-scale: 1.25; }
187
+ .zoom-in-150 { --tw-enter-scale: 1.5; }
188
+
189
+ .zoom-out { --tw-exit-scale: 0; }
190
+ .zoom-out-0 { --tw-exit-scale: 0; }
191
+ .zoom-out-50 { --tw-exit-scale: 0.5; }
192
+ .zoom-out-75 { --tw-exit-scale: 0.75; }
193
+ .zoom-out-90 { --tw-exit-scale: 0.9; }
194
+ .zoom-out-95 { --tw-exit-scale: 0.95; }
195
+ .zoom-out-100 { --tw-exit-scale: 1; }
196
+ .zoom-out-105 { --tw-exit-scale: 1.05; }
197
+ .zoom-out-110 { --tw-exit-scale: 1.1; }
198
+ .zoom-out-125 { --tw-exit-scale: 1.25; }
199
+ .zoom-out-150 { --tw-exit-scale: 1.5; }
200
+
201
+ /* ---------- Spin ------------------------------------------------------- */
202
+
203
+ .spin-in { --tw-enter-rotate: 30deg; }
204
+ .spin-in-1 { --tw-enter-rotate: 1deg; }
205
+ .spin-in-3 { --tw-enter-rotate: 3deg; }
206
+ .spin-in-6 { --tw-enter-rotate: 6deg; }
207
+ .spin-in-12 { --tw-enter-rotate: 12deg; }
208
+ .spin-in-45 { --tw-enter-rotate: 45deg; }
209
+ .spin-in-90 { --tw-enter-rotate: 90deg; }
210
+ .spin-in-180 { --tw-enter-rotate: 180deg; }
211
+ .\-spin-in { --tw-enter-rotate: -30deg; }
212
+ .\-spin-in-1 { --tw-enter-rotate: -1deg; }
213
+ .\-spin-in-3 { --tw-enter-rotate: -3deg; }
214
+ .\-spin-in-6 { --tw-enter-rotate: -6deg; }
215
+ .\-spin-in-12 { --tw-enter-rotate: -12deg; }
216
+ .\-spin-in-45 { --tw-enter-rotate: -45deg; }
217
+ .\-spin-in-90 { --tw-enter-rotate: -90deg; }
218
+ .\-spin-in-180 { --tw-enter-rotate: -180deg; }
219
+
220
+ .spin-out { --tw-exit-rotate: 30deg; }
221
+ .spin-out-1 { --tw-exit-rotate: 1deg; }
222
+ .spin-out-3 { --tw-exit-rotate: 3deg; }
223
+ .spin-out-6 { --tw-exit-rotate: 6deg; }
224
+ .spin-out-12 { --tw-exit-rotate: 12deg; }
225
+ .spin-out-45 { --tw-exit-rotate: 45deg; }
226
+ .spin-out-90 { --tw-exit-rotate: 90deg; }
227
+ .spin-out-180 { --tw-exit-rotate: 180deg; }
228
+ .\-spin-out { --tw-exit-rotate: -30deg; }
229
+ .\-spin-out-1 { --tw-exit-rotate: -1deg; }
230
+ .\-spin-out-3 { --tw-exit-rotate: -3deg; }
231
+ .\-spin-out-6 { --tw-exit-rotate: -6deg; }
232
+ .\-spin-out-12 { --tw-exit-rotate: -12deg; }
233
+ .\-spin-out-45 { --tw-exit-rotate: -45deg; }
234
+ .\-spin-out-90 { --tw-exit-rotate: -90deg; }
235
+ .\-spin-out-180 { --tw-exit-rotate: -180deg; }
236
+
237
+ /* ---------- Blur ------------------------------------------------------- */
238
+
239
+ .blur-in { --tw-enter-blur: 20px; }
240
+ .blur-in-sm { --tw-enter-blur: 4px; }
241
+ .blur-in-md { --tw-enter-blur: 12px; }
242
+ .blur-in-lg { --tw-enter-blur: 16px; }
243
+ .blur-in-xl { --tw-enter-blur: 24px; }
244
+ .blur-in-2xl { --tw-enter-blur: 40px; }
245
+ .blur-in-3xl { --tw-enter-blur: 64px; }
246
+
247
+ .blur-out { --tw-exit-blur: 20px; }
248
+ .blur-out-sm { --tw-exit-blur: 4px; }
249
+ .blur-out-md { --tw-exit-blur: 12px; }
250
+ .blur-out-lg { --tw-exit-blur: 16px; }
251
+ .blur-out-xl { --tw-exit-blur: 24px; }
252
+ .blur-out-2xl { --tw-exit-blur: 40px; }
253
+ .blur-out-3xl { --tw-exit-blur: 64px; }
254
+
255
+ /* ---------- Slide ------------------------------------------------------ */
256
+
257
+ /* Cardinal directions */
258
+ .slide-in-from-top { --tw-enter-translate-y: -100%; }
259
+ .slide-in-from-top-1 { --tw-enter-translate-y: -0.25rem; }
260
+ .slide-in-from-top-2 { --tw-enter-translate-y: -0.5rem; }
261
+ .slide-in-from-top-4 { --tw-enter-translate-y: -1rem; }
262
+ .slide-in-from-top-8 { --tw-enter-translate-y: -2rem; }
263
+ .slide-in-from-top-full { --tw-enter-translate-y: -100%; }
264
+
265
+ .slide-in-from-bottom { --tw-enter-translate-y: 100%; }
266
+ .slide-in-from-bottom-1 { --tw-enter-translate-y: 0.25rem; }
267
+ .slide-in-from-bottom-2 { --tw-enter-translate-y: 0.5rem; }
268
+ .slide-in-from-bottom-4 { --tw-enter-translate-y: 1rem; }
269
+ .slide-in-from-bottom-8 { --tw-enter-translate-y: 2rem; }
270
+ .slide-in-from-bottom-full { --tw-enter-translate-y: 100%; }
271
+
272
+ .slide-in-from-left { --tw-enter-translate-x: -100%; }
273
+ .slide-in-from-left-1 { --tw-enter-translate-x: -0.25rem; }
274
+ .slide-in-from-left-2 { --tw-enter-translate-x: -0.5rem; }
275
+ .slide-in-from-left-4 { --tw-enter-translate-x: -1rem; }
276
+ .slide-in-from-left-8 { --tw-enter-translate-x: -2rem; }
277
+ .slide-in-from-left-full { --tw-enter-translate-x: -100%; }
278
+
279
+ .slide-in-from-right { --tw-enter-translate-x: 100%; }
280
+ .slide-in-from-right-1 { --tw-enter-translate-x: 0.25rem; }
281
+ .slide-in-from-right-2 { --tw-enter-translate-x: 0.5rem; }
282
+ .slide-in-from-right-4 { --tw-enter-translate-x: 1rem; }
283
+ .slide-in-from-right-8 { --tw-enter-translate-x: 2rem; }
284
+ .slide-in-from-right-full { --tw-enter-translate-x: 100%; }
285
+
286
+ .slide-out-to-top { --tw-exit-translate-y: -100%; }
287
+ .slide-out-to-top-1 { --tw-exit-translate-y: -0.25rem; }
288
+ .slide-out-to-top-2 { --tw-exit-translate-y: -0.5rem; }
289
+ .slide-out-to-top-4 { --tw-exit-translate-y: -1rem; }
290
+ .slide-out-to-top-8 { --tw-exit-translate-y: -2rem; }
291
+ .slide-out-to-top-full { --tw-exit-translate-y: -100%; }
292
+
293
+ .slide-out-to-bottom { --tw-exit-translate-y: 100%; }
294
+ .slide-out-to-bottom-1 { --tw-exit-translate-y: 0.25rem; }
295
+ .slide-out-to-bottom-2 { --tw-exit-translate-y: 0.5rem; }
296
+ .slide-out-to-bottom-4 { --tw-exit-translate-y: 1rem; }
297
+ .slide-out-to-bottom-8 { --tw-exit-translate-y: 2rem; }
298
+ .slide-out-to-bottom-full { --tw-exit-translate-y: 100%; }
299
+
300
+ .slide-out-to-left { --tw-exit-translate-x: -100%; }
301
+ .slide-out-to-left-1 { --tw-exit-translate-x: -0.25rem; }
302
+ .slide-out-to-left-2 { --tw-exit-translate-x: -0.5rem; }
303
+ .slide-out-to-left-4 { --tw-exit-translate-x: -1rem; }
304
+ .slide-out-to-left-8 { --tw-exit-translate-x: -2rem; }
305
+ .slide-out-to-left-full { --tw-exit-translate-x: -100%; }
306
+
307
+ .slide-out-to-right { --tw-exit-translate-x: 100%; }
308
+ .slide-out-to-right-1 { --tw-exit-translate-x: 0.25rem; }
309
+ .slide-out-to-right-2 { --tw-exit-translate-x: 0.5rem; }
310
+ .slide-out-to-right-4 { --tw-exit-translate-x: 1rem; }
311
+ .slide-out-to-right-8 { --tw-exit-translate-x: 2rem; }
312
+ .slide-out-to-right-full { --tw-exit-translate-x: 100%; }
313
+
314
+ /* Logical directions (LTR/RTL aware) */
315
+ .slide-in-from-start:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) { --tw-enter-translate-x: -100%; }
316
+ .slide-in-from-start:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) { --tw-enter-translate-x: 100%; }
317
+ .slide-in-from-end:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) { --tw-enter-translate-x: 100%; }
318
+ .slide-in-from-end:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) { --tw-enter-translate-x: -100%; }
319
+ .slide-out-to-start:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) { --tw-exit-translate-x: -100%; }
320
+ .slide-out-to-start:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) { --tw-exit-translate-x: 100%; }
321
+ .slide-out-to-end:where(:dir(ltr), [dir="ltr"], [dir="ltr"] *) { --tw-exit-translate-x: 100%; }
322
+ .slide-out-to-end:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) { --tw-exit-translate-x: -100%; }
323
+
324
+ /* ---------- Duration --------------------------------------------------- */
325
+
326
+ .duration-0 { --tw-animation-duration: 0s; animation-duration: 0s; }
327
+ .duration-75 { --tw-animation-duration: 75ms; animation-duration: 75ms; }
328
+ .duration-100 { --tw-animation-duration: 100ms; animation-duration: 100ms; }
329
+ .duration-150 { --tw-animation-duration: 150ms; animation-duration: 150ms; }
330
+ .duration-200 { --tw-animation-duration: 200ms; animation-duration: 200ms; }
331
+ .duration-300 { --tw-animation-duration: 300ms; animation-duration: 300ms; }
332
+ .duration-500 { --tw-animation-duration: 500ms; animation-duration: 500ms; }
333
+ .duration-700 { --tw-animation-duration: 700ms; animation-duration: 700ms; }
334
+ .duration-1000 { --tw-animation-duration: 1000ms; animation-duration: 1000ms; }
335
+
336
+ /* ---------- Delay ------------------------------------------------------ */
337
+
338
+ .delay-0 { --tw-animation-delay: 0s; animation-delay: 0s; }
339
+ .delay-75 { --tw-animation-delay: 75ms; animation-delay: 75ms; }
340
+ .delay-100 { --tw-animation-delay: 100ms; animation-delay: 100ms; }
341
+ .delay-150 { --tw-animation-delay: 150ms; animation-delay: 150ms; }
342
+ .delay-200 { --tw-animation-delay: 200ms; animation-delay: 200ms; }
343
+ .delay-300 { --tw-animation-delay: 300ms; animation-delay: 300ms; }
344
+ .delay-500 { --tw-animation-delay: 500ms; animation-delay: 500ms; }
345
+ .delay-700 { --tw-animation-delay: 700ms; animation-delay: 700ms; }
346
+ .delay-1000 { --tw-animation-delay: 1000ms; animation-delay: 1000ms; }
347
+
348
+ /* ---------- Iteration count ------------------------------------------- */
349
+
350
+ .repeat-0 { --tw-animation-iteration-count: 0; animation-iteration-count: 0; }
351
+ .repeat-1 { --tw-animation-iteration-count: 1; animation-iteration-count: 1; }
352
+ .repeat-infinite { --tw-animation-iteration-count: infinite; animation-iteration-count: infinite; }
353
+
354
+ /* ---------- Direction ------------------------------------------------- */
355
+
356
+ .direction-normal { --tw-animation-direction: normal; animation-direction: normal; }
357
+ .direction-reverse { --tw-animation-direction: reverse; animation-direction: reverse; }
358
+ .direction-alternate { --tw-animation-direction: alternate; animation-direction: alternate; }
359
+ .direction-alternate-reverse { --tw-animation-direction: alternate-reverse; animation-direction: alternate-reverse; }
360
+
361
+ /* ---------- Fill mode ------------------------------------------------- */
362
+
363
+ .fill-mode-none { --tw-animation-fill-mode: none; animation-fill-mode: none; }
364
+ .fill-mode-forwards { --tw-animation-fill-mode: forwards; animation-fill-mode: forwards; }
365
+ .fill-mode-backwards { --tw-animation-fill-mode: backwards; animation-fill-mode: backwards; }
366
+ .fill-mode-both { --tw-animation-fill-mode: both; animation-fill-mode: both; }
367
+
368
+ /* ---------- Play state ------------------------------------------------ */
369
+
370
+ .running { animation-play-state: running; }
371
+ .paused { animation-play-state: paused; }
372
+
373
+ /* ---------- Vuecs overlay helpers (NOT in tw-animate-css) ------------- */
374
+
375
+ /*
376
+ * Dual-state helpers for Reka-driven overlays. Apply ONE of these to an
377
+ * element that has a `data-state="open|closed"` attribute and the
378
+ * enter/exit animations fire automatically.
379
+ *
380
+ * Why these exist (vs the tw-animate-css class composition):
381
+ * theme-tailwind reaches the same effect with the more flexible
382
+ * `data-[state=open]:animate-in fade-in-0 zoom-in-95
383
+ * data-[state=closed]:animate-out fade-out-0 zoom-out-95` composition,
384
+ * but Tailwind's `data-[state=]:` variant prefix is what makes that
385
+ * compile to a per-state selector. Themes whose theme-string format is
386
+ * class-names-only (theme-bootstrap, custom CSS-only themes) can't
387
+ * carry an attribute selector inside a class string. These vuecs
388
+ * helpers package the same gating into a single class so any theme
389
+ * can drive overlay animations.
390
+ *
391
+ * Reka's Presence (already wrapping every `*Content` primitive: Dialog,
392
+ * Popover, Tooltip, Menu) reads the element's computed `animation-name`
393
+ * when `data-state` flips and suspends unmount until `animationend` —
394
+ * so exit animations actually play; the element isn't yanked out of the
395
+ * DOM mid-animation.
396
+ */
397
+
398
+ /* Modal/popover/menu content — fade + zoom-95. Default for floating panels. */
399
+ .vc-overlay-anim[data-state="open"] {
400
+ animation: enter var(--tw-animation-duration, 150ms) ease-out;
401
+ --tw-enter-opacity: 0;
402
+ --tw-enter-scale: 0.95;
403
+ }
404
+ .vc-overlay-anim[data-state="closed"] {
405
+ animation: exit var(--tw-animation-duration, 100ms) ease-in;
406
+ --tw-exit-opacity: 0;
407
+ --tw-exit-scale: 0.95;
408
+ }
409
+
410
+ /* Modal backdrop / overlay layer — fade only, no zoom. */
411
+ .vc-overlay-fade-anim[data-state="open"] {
412
+ animation: enter var(--tw-animation-duration, 150ms) ease-out;
413
+ --tw-enter-opacity: 0;
414
+ }
415
+ .vc-overlay-fade-anim[data-state="closed"] {
416
+ animation: exit var(--tw-animation-duration, 100ms) ease-in;
417
+ --tw-exit-opacity: 0;
418
+ }
419
+
420
+ /* Tooltip — Reka uses `delayed-open` (after delayDuration) instead of `open`. */
421
+ .vc-tooltip-anim[data-state="delayed-open"] {
422
+ animation: enter var(--tw-animation-duration, 150ms) ease-out;
423
+ --tw-enter-opacity: 0;
424
+ --tw-enter-scale: 0.95;
425
+ }
426
+ .vc-tooltip-anim[data-state="closed"] {
427
+ animation: exit var(--tw-animation-duration, 100ms) ease-in;
428
+ --tw-exit-opacity: 0;
429
+ --tw-exit-scale: 0.95;
430
+ }
431
+
432
+ /* Collapse — height transition driven by Reka's runtime CSS var
433
+ `--reka-collapsible-content-height`. The collapsible keyframes from
434
+ tw-animate-css interpolate from 0 → height (open) and height → 0
435
+ (close); Reka's `Presence` suspends unmount until `animationend`.
436
+
437
+ Must use the `collapsible-*` keyframes, NOT `accordion-*` —
438
+ `<VCCollapse>` wraps Reka's `CollapsibleContent` which exposes
439
+ `--reka-collapsible-content-height`. The accordion variant reads
440
+ a different runtime var that Reka's Collapsible primitive doesn't
441
+ set, so animations would interpolate from 0 → fallback `auto` (no
442
+ visible animation).
443
+
444
+ themes whose strings can't carry attribute selectors use this
445
+ dual-state helper; theme-tailwind composes the equivalent via
446
+ `data-[state=open]:animate-collapsible-down`. */
447
+ .vc-collapse-anim {
448
+ overflow: hidden;
449
+ }
450
+ .vc-collapse-anim[data-state="open"] {
451
+ animation: collapsible-down 200ms ease-out;
452
+ }
453
+ .vc-collapse-anim[data-state="closed"] {
454
+ animation: collapsible-up 200ms ease-out;
455
+ }
456
+
457
+ /* Toast — slide-in from the right on open; slide-out to the right on close.
458
+ Matches the default `swipeDirection: 'right'` on `<VCToastProvider>`. The
459
+ `swipe-end` data-state is also used by Reka when the user swipes the toast
460
+ off-screen; we mirror it to the close animation so the swipe completes
461
+ visually. */
462
+ .vc-toast-anim[data-state="open"] {
463
+ animation: enter var(--tw-animation-duration, 200ms) ease-out;
464
+ --tw-enter-opacity: 0;
465
+ --tw-enter-translate-x: 100%;
466
+ }
467
+ .vc-toast-anim[data-state="closed"] {
468
+ animation: exit var(--tw-animation-duration, 150ms) ease-in;
469
+ --tw-exit-opacity: 0;
470
+ --tw-exit-translate-x: 100%;
471
+ }
472
+ .vc-toast-anim[data-swipe="move"] {
473
+ transform: translateX(var(--reka-toast-swipe-move-x));
474
+ transition: none;
475
+ }
476
+ .vc-toast-anim[data-swipe="cancel"] {
477
+ transform: translateX(0);
478
+ transition: transform 200ms ease-out;
479
+ }
480
+ .vc-toast-anim[data-swipe="end"] {
481
+ animation: exit var(--tw-animation-duration, 100ms) ease-out;
482
+ --tw-exit-opacity: 0;
483
+ --tw-exit-translate-x: var(--reka-toast-swipe-end-x);
484
+ }
485
+
486
+ /* ---------- Reduced motion ------------------------------------------- */
487
+
488
+ /* Honour OS-level "reduce motion" preferences — kill animations entirely. */
489
+ @media (prefers-reduced-motion: reduce) {
490
+ .animate-in,
491
+ .animate-out,
492
+ .animate-accordion-down,
493
+ .animate-accordion-up,
494
+ .animate-collapsible-down,
495
+ .animate-collapsible-up,
496
+ .animate-caret-blink,
497
+ .vc-overlay-anim[data-state],
498
+ .vc-overlay-fade-anim[data-state],
499
+ .vc-tooltip-anim[data-state],
500
+ .vc-toast-anim[data-state],
501
+ .vc-toast-anim[data-swipe],
502
+ .vc-collapse-anim[data-state] {
503
+ animation: none !important;
504
+ transition: none !important;
505
+ }
506
+ }