@vvedantb/ui 0.10.1 → 0.12.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.
@@ -0,0 +1,792 @@
1
+ /*
2
+ * @vvedantb/ui/tokens/css/nav-icons.css: hover animations for the animated nav
3
+ * icons (`MemoryIcon`, `BoardIcon`, ...). Also part of tokens/css/index.css.
4
+ *
5
+ * @import "@vvedantb/ui/tokens/css/nav-icons.css";
6
+ *
7
+ * Every icon is an `svg.vv-icon` with:
8
+ * data-animate="hover" animate while an ancestor with the `group` class is hovered (default)
9
+ * data-animate="true" animate all the time
10
+ * data-animate="false" never animate, no hover scale
11
+ * data-hover-scale root scale on group hover: "1.15" (spring) or "1.12" (ease out)
12
+ *
13
+ * Parameters (all optional):
14
+ * --vv-icon-duration-scale multiplies every animation duration and delay
15
+ * (set inline by the `duration` prop; default 1)
16
+ * --motion-ease-out default cubic-bezier(0.22, 1, 0.36, 1)
17
+ * --motion-ease-emphasized default cubic-bezier(0.2, 0.8, 0.2, 1)
18
+ *
19
+ * No reduced-motion overrides: the icons this file was ported from had none.
20
+ */
21
+
22
+ /* ── Root: scale up on group hover */
23
+ .vv-icon {
24
+ transform-origin: center;
25
+ }
26
+ .vv-icon[data-hover-scale="1.15"] {
27
+ transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
28
+ }
29
+ .vv-icon[data-hover-scale="1.12"] {
30
+ transition: transform 0.25s var(--motion-ease-out, cubic-bezier(0.22, 1, 0.36, 1));
31
+ }
32
+ .group:hover .vv-icon[data-hover-scale="1.15"]:not([data-animate="false"]) {
33
+ transform: scale(1.15);
34
+ }
35
+ .group:hover .vv-icon[data-hover-scale="1.12"]:not([data-animate="false"]) {
36
+ transform: scale(1.12);
37
+ }
38
+
39
+ /* ── SVG transforms need an explicit box and origin */
40
+ .vv-icon-files-back,
41
+ .vv-icon-bolt,
42
+ .vv-icon-inbox-letter,
43
+ .vv-icon-gear,
44
+ .vv-icon-gear-turn,
45
+ .vv-icon-memory-core,
46
+ .vv-icon-memory-ring,
47
+ .vv-icon-board-card,
48
+ .vv-icon-flask-bubble,
49
+ .vv-icon-chart-bar,
50
+ .vv-icon-document-line,
51
+ .vv-icon-document-corner,
52
+ .vv-icon-checklist-check,
53
+ .vv-icon-checklist-ring,
54
+ .vv-icon-checklist-line,
55
+ .vv-icon-terminal-cursor,
56
+ .vv-icon-terminal-prompt,
57
+ .vv-icon-terminal-typed,
58
+ .vv-icon-inbox-arrow,
59
+ .vv-icon-inbox-notif,
60
+ .vv-icon-automation-orbit,
61
+ .vv-icon-automation-play,
62
+ .vv-icon-automation-sparks,
63
+ .vv-icon-flask,
64
+ .vv-icon-board-traveler,
65
+ .vv-icon-chart-trend,
66
+ .vv-icon-search,
67
+ .vv-icon-search-glint,
68
+ .vv-icon-sidebar-panel,
69
+ .vv-icon-sidebar-chevron {
70
+ transform-box: fill-box;
71
+ transform-origin: center;
72
+ }
73
+
74
+ .vv-icon-chart-bar {
75
+ transform-origin: bottom center;
76
+ }
77
+
78
+ .vv-icon-document-line,
79
+ .vv-icon-checklist-line,
80
+ .vv-icon-chart-trend {
81
+ transform-origin: left center;
82
+ }
83
+
84
+ .vv-icon-document-corner {
85
+ transform-origin: top right;
86
+ }
87
+
88
+ /* ── MemoryIcon: synapse core pulses, ring pings outward */
89
+ .vv-icon-memory-ring {
90
+ opacity: 0;
91
+ }
92
+ @keyframes vv-icon-memory-core {
93
+ 0%,
94
+ 100% {
95
+ transform: scale(1);
96
+ }
97
+ 45% {
98
+ transform: scale(1.6);
99
+ }
100
+ }
101
+ @keyframes vv-icon-memory-ring {
102
+ 0% {
103
+ transform: scale(0.3);
104
+ opacity: 0.85;
105
+ }
106
+ 100% {
107
+ transform: scale(2.6);
108
+ opacity: 0;
109
+ }
110
+ }
111
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-memory-core,
112
+ .vv-icon[data-animate="true"] .vv-icon-memory-core {
113
+ animation: vv-icon-memory-core calc(1s * var(--vv-icon-duration-scale, 1)) ease-in-out infinite;
114
+ }
115
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-memory-ring,
116
+ .vv-icon[data-animate="true"] .vv-icon-memory-ring {
117
+ animation: vv-icon-memory-ring calc(1s * var(--vv-icon-duration-scale, 1)) ease-out infinite;
118
+ }
119
+
120
+ /* ── BuildingIcon: windows blink in turn */
121
+ .vv-icon-building-window {
122
+ opacity: 0.3;
123
+ }
124
+ @keyframes vv-icon-building-window-blink {
125
+ 0%,
126
+ 70%,
127
+ 100% {
128
+ opacity: 0.3;
129
+ }
130
+ 20%,
131
+ 50% {
132
+ opacity: 1;
133
+ }
134
+ }
135
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-building-window-1,
136
+ .vv-icon[data-animate="true"] .vv-icon-building-window-1 {
137
+ animation: vv-icon-building-window-blink calc(1.6s * var(--vv-icon-duration-scale, 1)) ease-in-out infinite;
138
+ }
139
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-building-window-2,
140
+ .vv-icon[data-animate="true"] .vv-icon-building-window-2 {
141
+ animation: vv-icon-building-window-blink calc(1.6s * var(--vv-icon-duration-scale, 1)) ease-in-out
142
+ calc(0.18s * var(--vv-icon-duration-scale, 1)) infinite;
143
+ }
144
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-building-window-3,
145
+ .vv-icon[data-animate="true"] .vv-icon-building-window-3 {
146
+ animation: vv-icon-building-window-blink calc(1.6s * var(--vv-icon-duration-scale, 1)) ease-in-out
147
+ calc(0.36s * var(--vv-icon-duration-scale, 1)) infinite;
148
+ }
149
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-building-window-4,
150
+ .vv-icon[data-animate="true"] .vv-icon-building-window-4 {
151
+ animation: vv-icon-building-window-blink calc(1.6s * var(--vv-icon-duration-scale, 1)) ease-in-out
152
+ calc(0.54s * var(--vv-icon-duration-scale, 1)) infinite;
153
+ }
154
+
155
+ /* ── FilesIcon: back file slides out and back */
156
+ @keyframes vv-icon-files-slide {
157
+ 0%,
158
+ 100% {
159
+ transform: translate(0, 0);
160
+ }
161
+ 50% {
162
+ transform: translate(2.5px, -2.5px);
163
+ }
164
+ }
165
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-files-back,
166
+ .vv-icon[data-animate="true"] .vv-icon-files-back {
167
+ animation: vv-icon-files-slide calc(1.4s * var(--vv-icon-duration-scale, 1)) ease-in-out infinite;
168
+ }
169
+
170
+ /* ── BoltIcon: flashes big then settles */
171
+ @keyframes vv-icon-bolt-flash {
172
+ 0%,
173
+ 100% {
174
+ transform: scale(1);
175
+ }
176
+ 35% {
177
+ transform: scale(1.22);
178
+ }
179
+ 65% {
180
+ transform: scale(0.94);
181
+ }
182
+ }
183
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-bolt,
184
+ .vv-icon[data-animate="true"] .vv-icon-bolt {
185
+ animation: vv-icon-bolt-flash calc(0.9s * var(--vv-icon-duration-scale, 1)) ease-in-out infinite;
186
+ }
187
+
188
+ /* ── InboxIcon: letter drops into the tray */
189
+ .vv-icon-inbox-letter {
190
+ opacity: 0;
191
+ }
192
+ @keyframes vv-icon-inbox-drop {
193
+ 0% {
194
+ transform: translateY(-7px);
195
+ opacity: 0;
196
+ }
197
+ 20% {
198
+ opacity: 1;
199
+ }
200
+ 70% {
201
+ transform: translateY(1px);
202
+ opacity: 1;
203
+ }
204
+ 100% {
205
+ transform: translateY(4px);
206
+ opacity: 0;
207
+ }
208
+ }
209
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-inbox-letter,
210
+ .vv-icon[data-animate="true"] .vv-icon-inbox-letter {
211
+ animation: vv-icon-inbox-drop calc(1.3s * var(--vv-icon-duration-scale, 1)) ease-in-out infinite;
212
+ }
213
+
214
+ /* ── SettingsIcon (default variant="spin"): continuous spin */
215
+ @keyframes vv-icon-gear-spin {
216
+ to {
217
+ transform: rotate(360deg);
218
+ }
219
+ }
220
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-gear,
221
+ .vv-icon[data-animate="true"] .vv-icon-gear {
222
+ animation: vv-icon-gear-spin calc(2.5s * var(--vv-icon-duration-scale, 1)) linear infinite;
223
+ }
224
+
225
+ /* ── SettingsIcon variant="turn": six-tooth gear clicks round one notch at a time */
226
+ @keyframes vv-icon-gear-turn {
227
+ 0% {
228
+ transform: rotate(0deg);
229
+ }
230
+ 10%,
231
+ 16.66% {
232
+ transform: rotate(60deg);
233
+ }
234
+ 26.66%,
235
+ 33.33% {
236
+ transform: rotate(120deg);
237
+ }
238
+ 43.33%,
239
+ 50% {
240
+ transform: rotate(180deg);
241
+ }
242
+ 60%,
243
+ 66.66% {
244
+ transform: rotate(240deg);
245
+ }
246
+ 76.66%,
247
+ 83.33% {
248
+ transform: rotate(300deg);
249
+ }
250
+ 93.33%,
251
+ 100% {
252
+ transform: rotate(360deg);
253
+ }
254
+ }
255
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-gear-turn,
256
+ .vv-icon[data-animate="true"] .vv-icon-gear-turn {
257
+ animation: vv-icon-gear-turn calc(2.4s * var(--vv-icon-duration-scale, 1))
258
+ var(--motion-ease-emphasized, cubic-bezier(0.2, 0.8, 0.2, 1)) infinite;
259
+ }
260
+
261
+ /* ── BoardIcon: cards drop in, bounce, then bob while a traveller card
262
+ * sweeps across all columns. */
263
+ @keyframes vv-icon-board-card-drop {
264
+ 0% {
265
+ transform: translateY(-9px) scaleY(0.5);
266
+ opacity: 0;
267
+ }
268
+ 45% {
269
+ transform: translateY(2.5px) scaleY(1.4);
270
+ opacity: 1;
271
+ }
272
+ 70% {
273
+ transform: translateY(-1.5px) scaleY(0.9);
274
+ }
275
+ 100% {
276
+ transform: translateY(0) scaleY(1);
277
+ opacity: 1;
278
+ }
279
+ }
280
+ @keyframes vv-icon-board-card-breathe {
281
+ 0%,
282
+ 100% {
283
+ transform: translateY(0) scale(1);
284
+ }
285
+ 50% {
286
+ transform: translateY(-1.2px) scale(1.18);
287
+ }
288
+ }
289
+ @keyframes vv-icon-board-traveler {
290
+ 0% {
291
+ transform: translate(0, 0) scale(0);
292
+ opacity: 0;
293
+ }
294
+ 8% {
295
+ transform: translate(0, 0) scale(1);
296
+ opacity: 1;
297
+ }
298
+ 30% {
299
+ transform: translate(0, 0) scale(1);
300
+ }
301
+ 45% {
302
+ transform: translate(6.25px, 0) scale(1);
303
+ }
304
+ 62% {
305
+ transform: translate(6.25px, 0) scale(1);
306
+ }
307
+ 82% {
308
+ transform: translate(12.5px, 0) scale(1);
309
+ opacity: 1;
310
+ }
311
+ 100% {
312
+ transform: translate(12.5px, 0) scale(0);
313
+ opacity: 0;
314
+ }
315
+ }
316
+ .vv-icon-board-traveler {
317
+ opacity: 0;
318
+ }
319
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-board-card-1,
320
+ .vv-icon[data-animate="true"] .vv-icon-board-card-1 {
321
+ animation:
322
+ vv-icon-board-card-drop calc(0.55s * var(--vv-icon-duration-scale, 1))
323
+ var(--motion-ease-emphasized, cubic-bezier(0.2, 0.8, 0.2, 1)) both,
324
+ vv-icon-board-card-breathe calc(1.2s * var(--vv-icon-duration-scale, 1)) ease-in-out
325
+ calc(0.55s * var(--vv-icon-duration-scale, 1)) infinite;
326
+ }
327
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-board-card-2,
328
+ .vv-icon[data-animate="true"] .vv-icon-board-card-2 {
329
+ animation:
330
+ vv-icon-board-card-drop calc(0.55s * var(--vv-icon-duration-scale, 1))
331
+ var(--motion-ease-emphasized, cubic-bezier(0.2, 0.8, 0.2, 1)) calc(0.1s * var(--vv-icon-duration-scale, 1)) both,
332
+ vv-icon-board-card-breathe calc(1.2s * var(--vv-icon-duration-scale, 1)) ease-in-out
333
+ calc(0.75s * var(--vv-icon-duration-scale, 1)) infinite;
334
+ }
335
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-board-card-3,
336
+ .vv-icon[data-animate="true"] .vv-icon-board-card-3 {
337
+ animation:
338
+ vv-icon-board-card-drop calc(0.55s * var(--vv-icon-duration-scale, 1))
339
+ var(--motion-ease-emphasized, cubic-bezier(0.2, 0.8, 0.2, 1)) calc(0.2s * var(--vv-icon-duration-scale, 1)) both,
340
+ vv-icon-board-card-breathe calc(1.2s * var(--vv-icon-duration-scale, 1)) ease-in-out
341
+ calc(0.95s * var(--vv-icon-duration-scale, 1)) infinite;
342
+ }
343
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-board-traveler,
344
+ .vv-icon[data-animate="true"] .vv-icon-board-traveler {
345
+ animation: vv-icon-board-traveler calc(1.8s * var(--vv-icon-duration-scale, 1)) ease-in-out
346
+ calc(0.5s * var(--vv-icon-duration-scale, 1)) infinite;
347
+ }
348
+
349
+ /* ── ChecklistIcon: checks redraw on a loop, rings burst outward, lines sweep. */
350
+ .vv-icon-checklist-check {
351
+ stroke-dasharray: 9;
352
+ stroke-dashoffset: 0;
353
+ }
354
+ .vv-icon-checklist-ring {
355
+ fill: none;
356
+ stroke: currentColor;
357
+ stroke-width: 1.4;
358
+ opacity: 0;
359
+ }
360
+ @keyframes vv-icon-checklist-check-loop {
361
+ 0%,
362
+ 20% {
363
+ stroke-dashoffset: 9;
364
+ }
365
+ 60%,
366
+ 100% {
367
+ stroke-dashoffset: 0;
368
+ }
369
+ }
370
+ @keyframes vv-icon-checklist-ring-burst {
371
+ 0% {
372
+ transform: scale(0.85);
373
+ opacity: 0.7;
374
+ }
375
+ 100% {
376
+ transform: scale(2.1);
377
+ opacity: 0;
378
+ }
379
+ }
380
+ @keyframes vv-icon-checklist-line-sweep {
381
+ 0%,
382
+ 20% {
383
+ transform: scaleX(0);
384
+ }
385
+ 60%,
386
+ 100% {
387
+ transform: scaleX(1);
388
+ }
389
+ }
390
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-checklist-check-1,
391
+ .vv-icon[data-animate="true"] .vv-icon-checklist-check-1 {
392
+ animation: vv-icon-checklist-check-loop calc(1.6s * var(--vv-icon-duration-scale, 1))
393
+ var(--motion-ease-out, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
394
+ }
395
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-checklist-check-2,
396
+ .vv-icon[data-animate="true"] .vv-icon-checklist-check-2 {
397
+ animation: vv-icon-checklist-check-loop calc(1.6s * var(--vv-icon-duration-scale, 1))
398
+ var(--motion-ease-out, cubic-bezier(0.22, 1, 0.36, 1)) calc(0.25s * var(--vv-icon-duration-scale, 1)) infinite;
399
+ }
400
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-checklist-ring-1,
401
+ .vv-icon[data-animate="true"] .vv-icon-checklist-ring-1 {
402
+ animation: vv-icon-checklist-ring-burst calc(1.6s * var(--vv-icon-duration-scale, 1))
403
+ var(--motion-ease-out, cubic-bezier(0.22, 1, 0.36, 1)) calc(0.4s * var(--vv-icon-duration-scale, 1)) infinite;
404
+ }
405
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-checklist-ring-2,
406
+ .vv-icon[data-animate="true"] .vv-icon-checklist-ring-2 {
407
+ animation: vv-icon-checklist-ring-burst calc(1.6s * var(--vv-icon-duration-scale, 1))
408
+ var(--motion-ease-out, cubic-bezier(0.22, 1, 0.36, 1)) calc(0.65s * var(--vv-icon-duration-scale, 1)) infinite;
409
+ }
410
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-checklist-line-1,
411
+ .vv-icon[data-animate="true"] .vv-icon-checklist-line-1 {
412
+ animation: vv-icon-checklist-line-sweep calc(1.6s * var(--vv-icon-duration-scale, 1))
413
+ var(--motion-ease-out, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
414
+ }
415
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-checklist-line-2,
416
+ .vv-icon[data-animate="true"] .vv-icon-checklist-line-2 {
417
+ animation: vv-icon-checklist-line-sweep calc(1.6s * var(--vv-icon-duration-scale, 1))
418
+ var(--motion-ease-out, cubic-bezier(0.22, 1, 0.36, 1)) calc(0.25s * var(--vv-icon-duration-scale, 1)) infinite;
419
+ }
420
+
421
+ /* ── TerminalIcon: prompt nudges, cursor blinks, three typed characters pop in. */
422
+ @keyframes vv-icon-terminal-prompt-nudge {
423
+ 0%,
424
+ 100% {
425
+ transform: translateX(0);
426
+ }
427
+ 50% {
428
+ transform: translateX(3px);
429
+ }
430
+ }
431
+ @keyframes vv-icon-terminal-cursor-blink {
432
+ 0%,
433
+ 49% {
434
+ opacity: 1;
435
+ transform: scaleX(1);
436
+ }
437
+ 50%,
438
+ 100% {
439
+ opacity: 0;
440
+ transform: scaleX(0.4);
441
+ }
442
+ }
443
+ @keyframes vv-icon-terminal-typed {
444
+ 0%,
445
+ 100% {
446
+ transform: scale(0) translateY(2px);
447
+ opacity: 0;
448
+ }
449
+ 18%,
450
+ 82% {
451
+ transform: scale(1.6) translateY(0);
452
+ opacity: 1;
453
+ }
454
+ }
455
+ .vv-icon-terminal-typed {
456
+ transform: scale(0);
457
+ opacity: 0;
458
+ }
459
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-terminal-prompt,
460
+ .vv-icon[data-animate="true"] .vv-icon-terminal-prompt {
461
+ animation: vv-icon-terminal-prompt-nudge calc(0.7s * var(--vv-icon-duration-scale, 1)) ease-in-out infinite;
462
+ }
463
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-terminal-cursor,
464
+ .vv-icon[data-animate="true"] .vv-icon-terminal-cursor {
465
+ animation: vv-icon-terminal-cursor-blink calc(0.45s * var(--vv-icon-duration-scale, 1)) steps(2, end) infinite;
466
+ }
467
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-terminal-typed-1,
468
+ .vv-icon[data-animate="true"] .vv-icon-terminal-typed-1 {
469
+ animation: vv-icon-terminal-typed calc(1.4s * var(--vv-icon-duration-scale, 1))
470
+ var(--motion-ease-emphasized, cubic-bezier(0.2, 0.8, 0.2, 1)) 0s infinite;
471
+ }
472
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-terminal-typed-2,
473
+ .vv-icon[data-animate="true"] .vv-icon-terminal-typed-2 {
474
+ animation: vv-icon-terminal-typed calc(1.4s * var(--vv-icon-duration-scale, 1))
475
+ var(--motion-ease-emphasized, cubic-bezier(0.2, 0.8, 0.2, 1)) calc(0.2s * var(--vv-icon-duration-scale, 1)) infinite;
476
+ }
477
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-terminal-typed-3,
478
+ .vv-icon[data-animate="true"] .vv-icon-terminal-typed-3 {
479
+ animation: vv-icon-terminal-typed calc(1.4s * var(--vv-icon-duration-scale, 1))
480
+ var(--motion-ease-emphasized, cubic-bezier(0.2, 0.8, 0.2, 1)) calc(0.4s * var(--vv-icon-duration-scale, 1)) infinite;
481
+ }
482
+
483
+ /* ── DocumentIcon, DraftIcon and ReviewIcon: lines draw on a loop, page corner
484
+ * folds. ReviewIcon's marks carry only the -1 and -2 classes, so they keep the
485
+ * svg's own transform box. */
486
+ @keyframes vv-icon-document-line-draw {
487
+ 0%,
488
+ 18% {
489
+ transform: scaleX(0);
490
+ }
491
+ 55%,
492
+ 100% {
493
+ transform: scaleX(1);
494
+ }
495
+ }
496
+ @keyframes vv-icon-document-corner-fold {
497
+ 0%,
498
+ 100% {
499
+ transform: rotate(0) scale(1);
500
+ }
501
+ 50% {
502
+ transform: rotate(-25deg) scale(0.78);
503
+ }
504
+ }
505
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-document-line-1,
506
+ .vv-icon[data-animate="true"] .vv-icon-document-line-1 {
507
+ animation: vv-icon-document-line-draw calc(1.5s * var(--vv-icon-duration-scale, 1))
508
+ var(--motion-ease-out, cubic-bezier(0.22, 1, 0.36, 1)) infinite;
509
+ }
510
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-document-line-2,
511
+ .vv-icon[data-animate="true"] .vv-icon-document-line-2 {
512
+ animation: vv-icon-document-line-draw calc(1.5s * var(--vv-icon-duration-scale, 1))
513
+ var(--motion-ease-out, cubic-bezier(0.22, 1, 0.36, 1)) calc(0.15s * var(--vv-icon-duration-scale, 1)) infinite;
514
+ }
515
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-document-line-3,
516
+ .vv-icon[data-animate="true"] .vv-icon-document-line-3 {
517
+ animation: vv-icon-document-line-draw calc(1.5s * var(--vv-icon-duration-scale, 1))
518
+ var(--motion-ease-out, cubic-bezier(0.22, 1, 0.36, 1)) calc(0.3s * var(--vv-icon-duration-scale, 1)) infinite;
519
+ }
520
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-document-corner,
521
+ .vv-icon[data-animate="true"] .vv-icon-document-corner {
522
+ animation: vv-icon-document-corner-fold calc(1.2s * var(--vv-icon-duration-scale, 1)) ease-in-out
523
+ calc(0.2s * var(--vv-icon-duration-scale, 1)) infinite;
524
+ }
525
+
526
+ /* ── FlaskIcon: flask sloshes, bubbles rise. */
527
+ @keyframes vv-icon-flask-bubble-rise {
528
+ 0% {
529
+ transform: translateY(0) scale(0.4);
530
+ opacity: 0;
531
+ }
532
+ 15% {
533
+ opacity: 1;
534
+ transform: translateY(-1.5px) scale(1.6);
535
+ }
536
+ 60% {
537
+ transform: translateY(-7px) scale(1.2);
538
+ opacity: 1;
539
+ }
540
+ 100% {
541
+ transform: translateY(-13px) scale(0.4);
542
+ opacity: 0;
543
+ }
544
+ }
545
+ @keyframes vv-icon-flask-slosh {
546
+ 0%,
547
+ 100% {
548
+ transform: rotate(-9deg);
549
+ }
550
+ 50% {
551
+ transform: rotate(9deg);
552
+ }
553
+ }
554
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-flask,
555
+ .vv-icon[data-animate="true"] .vv-icon-flask {
556
+ animation: vv-icon-flask-slosh calc(1.4s * var(--vv-icon-duration-scale, 1)) ease-in-out infinite;
557
+ }
558
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-flask-bubble-1,
559
+ .vv-icon[data-animate="true"] .vv-icon-flask-bubble-1 {
560
+ animation: vv-icon-flask-bubble-rise calc(1.1s * var(--vv-icon-duration-scale, 1)) ease-out infinite;
561
+ }
562
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-flask-bubble-2,
563
+ .vv-icon[data-animate="true"] .vv-icon-flask-bubble-2 {
564
+ animation: vv-icon-flask-bubble-rise calc(1.1s * var(--vv-icon-duration-scale, 1)) ease-out
565
+ calc(0.27s * var(--vv-icon-duration-scale, 1)) infinite;
566
+ }
567
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-flask-bubble-3,
568
+ .vv-icon[data-animate="true"] .vv-icon-flask-bubble-3 {
569
+ animation: vv-icon-flask-bubble-rise calc(1.1s * var(--vv-icon-duration-scale, 1)) ease-out
570
+ calc(0.55s * var(--vv-icon-duration-scale, 1)) infinite;
571
+ }
572
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-flask-bubble-4,
573
+ .vv-icon[data-animate="true"] .vv-icon-flask-bubble-4 {
574
+ animation: vv-icon-flask-bubble-rise calc(1.1s * var(--vv-icon-duration-scale, 1)) ease-out
575
+ calc(0.82s * var(--vv-icon-duration-scale, 1)) infinite;
576
+ }
577
+
578
+ /* ── InboxArrowIcon: arrow drops into the tray, notification dot pulses. */
579
+ @keyframes vv-icon-inbox-arrow-drop {
580
+ 0% {
581
+ transform: translateY(-7px) scale(0.7);
582
+ opacity: 0;
583
+ }
584
+ 20% {
585
+ opacity: 1;
586
+ transform: translateY(-3px) scale(1);
587
+ }
588
+ 55% {
589
+ transform: translateY(7px) scale(0.95);
590
+ opacity: 1;
591
+ }
592
+ 100% {
593
+ transform: translateY(7px) scale(0.6);
594
+ opacity: 0;
595
+ }
596
+ }
597
+ @keyframes vv-icon-inbox-notif-pulse {
598
+ 0%,
599
+ 100% {
600
+ transform: scale(1);
601
+ opacity: 1;
602
+ }
603
+ 50% {
604
+ transform: scale(2);
605
+ opacity: 0.4;
606
+ }
607
+ }
608
+ .vv-icon-inbox-notif {
609
+ opacity: 0;
610
+ }
611
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-inbox-arrow,
612
+ .vv-icon[data-animate="true"] .vv-icon-inbox-arrow {
613
+ animation: vv-icon-inbox-arrow-drop calc(1.1s * var(--vv-icon-duration-scale, 1))
614
+ var(--motion-ease-emphasized, cubic-bezier(0.2, 0.8, 0.2, 1)) infinite;
615
+ }
616
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-inbox-notif,
617
+ .vv-icon[data-animate="true"] .vv-icon-inbox-notif {
618
+ animation: vv-icon-inbox-notif-pulse calc(0.7s * var(--vv-icon-duration-scale, 1)) ease-in-out
619
+ calc(0.3s * var(--vv-icon-duration-scale, 1)) infinite;
620
+ opacity: 1;
621
+ }
622
+
623
+ /* ── AutomationIcon: orbit spins, sparks burst, play triangle pumps. */
624
+ @keyframes vv-icon-automation-orbit-spin {
625
+ to {
626
+ transform: rotate(360deg);
627
+ }
628
+ }
629
+ @keyframes vv-icon-automation-play-pulse {
630
+ 0%,
631
+ 100% {
632
+ transform: scale(0.85);
633
+ }
634
+ 50% {
635
+ transform: scale(1.35);
636
+ }
637
+ }
638
+ @keyframes vv-icon-automation-sparks-burst {
639
+ 0%,
640
+ 100% {
641
+ opacity: 0;
642
+ transform: scale(0.3);
643
+ }
644
+ 50% {
645
+ opacity: 1;
646
+ transform: scale(1.6);
647
+ }
648
+ }
649
+ .vv-icon-automation-sparks {
650
+ opacity: 0;
651
+ }
652
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-automation-orbit,
653
+ .vv-icon[data-animate="true"] .vv-icon-automation-orbit {
654
+ animation: vv-icon-automation-orbit-spin calc(1.8s * var(--vv-icon-duration-scale, 1)) linear infinite;
655
+ }
656
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-automation-play,
657
+ .vv-icon[data-animate="true"] .vv-icon-automation-play {
658
+ animation: vv-icon-automation-play-pulse calc(0.9s * var(--vv-icon-duration-scale, 1)) ease-in-out infinite;
659
+ }
660
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-automation-sparks,
661
+ .vv-icon[data-animate="true"] .vv-icon-automation-sparks {
662
+ animation: vv-icon-automation-sparks-burst calc(0.9s * var(--vv-icon-duration-scale, 1)) ease-in-out infinite;
663
+ }
664
+
665
+ /* ── BarChartIcon: bars grow with a bounce, trend line draws. */
666
+ @keyframes vv-icon-chart-bar-grow {
667
+ 0%,
668
+ 10% {
669
+ transform: scaleY(0.05);
670
+ }
671
+ 55% {
672
+ transform: scaleY(1.3);
673
+ }
674
+ 75% {
675
+ transform: scaleY(0.88);
676
+ }
677
+ 100% {
678
+ transform: scaleY(1);
679
+ }
680
+ }
681
+ .vv-icon-chart-trend {
682
+ stroke-dasharray: 16;
683
+ stroke-dashoffset: 16;
684
+ fill: none;
685
+ }
686
+ @keyframes vv-icon-chart-trend-draw {
687
+ 0%,
688
+ 20% {
689
+ stroke-dashoffset: 16;
690
+ }
691
+ 55%,
692
+ 100% {
693
+ stroke-dashoffset: 0;
694
+ }
695
+ }
696
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-chart-bar-1,
697
+ .vv-icon[data-animate="true"] .vv-icon-chart-bar-1 {
698
+ animation: vv-icon-chart-bar-grow calc(1.6s * var(--vv-icon-duration-scale, 1))
699
+ var(--motion-ease-emphasized, cubic-bezier(0.2, 0.8, 0.2, 1)) infinite;
700
+ }
701
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-chart-bar-2,
702
+ .vv-icon[data-animate="true"] .vv-icon-chart-bar-2 {
703
+ animation: vv-icon-chart-bar-grow calc(1.6s * var(--vv-icon-duration-scale, 1))
704
+ var(--motion-ease-emphasized, cubic-bezier(0.2, 0.8, 0.2, 1)) calc(0.12s * var(--vv-icon-duration-scale, 1)) infinite;
705
+ }
706
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-chart-bar-3,
707
+ .vv-icon[data-animate="true"] .vv-icon-chart-bar-3 {
708
+ animation: vv-icon-chart-bar-grow calc(1.6s * var(--vv-icon-duration-scale, 1))
709
+ var(--motion-ease-emphasized, cubic-bezier(0.2, 0.8, 0.2, 1)) calc(0.24s * var(--vv-icon-duration-scale, 1)) infinite;
710
+ }
711
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-chart-trend,
712
+ .vv-icon[data-animate="true"] .vv-icon-chart-trend {
713
+ animation: vv-icon-chart-trend-draw calc(1.6s * var(--vv-icon-duration-scale, 1))
714
+ var(--motion-ease-out, cubic-bezier(0.22, 1, 0.36, 1)) calc(0.4s * var(--vv-icon-duration-scale, 1)) infinite;
715
+ }
716
+
717
+ /* ── SearchIcon: glass scans, lens glint pops. */
718
+ .vv-icon-search-glint {
719
+ opacity: 0;
720
+ }
721
+ @keyframes vv-icon-search-scan {
722
+ 0%,
723
+ 100% {
724
+ transform: rotate(-8deg) translate(0, 0);
725
+ }
726
+ 50% {
727
+ transform: rotate(8deg) translate(0.6px, -0.8px);
728
+ }
729
+ }
730
+ @keyframes vv-icon-search-glint {
731
+ 0%,
732
+ 100% {
733
+ opacity: 0;
734
+ transform: scale(0.4);
735
+ }
736
+ 40% {
737
+ opacity: 1;
738
+ transform: scale(1.6);
739
+ }
740
+ }
741
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-search,
742
+ .vv-icon[data-animate="true"] .vv-icon-search {
743
+ animation: vv-icon-search-scan calc(1.2s * var(--vv-icon-duration-scale, 1)) ease-in-out infinite;
744
+ }
745
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-search-glint,
746
+ .vv-icon[data-animate="true"] .vv-icon-search-glint {
747
+ animation: vv-icon-search-glint calc(1.2s * var(--vv-icon-duration-scale, 1)) ease-in-out infinite;
748
+ }
749
+
750
+ /* ── SidebarToggleIcon: panel squeezes, chevron nudges the way it points. */
751
+ .vv-icon-sidebar-panel {
752
+ transform-origin: left center;
753
+ }
754
+ @keyframes vv-icon-sidebar-squeeze {
755
+ 0%,
756
+ 100% {
757
+ transform: scaleX(1);
758
+ }
759
+ 50% {
760
+ transform: scaleX(0.7);
761
+ }
762
+ }
763
+ @keyframes vv-icon-sidebar-nudge {
764
+ 0%,
765
+ 100% {
766
+ transform: translateX(0);
767
+ }
768
+ 50% {
769
+ transform: translateX(-2.5px);
770
+ }
771
+ }
772
+ @keyframes vv-icon-sidebar-nudge-out {
773
+ 0%,
774
+ 100% {
775
+ transform: translateX(0);
776
+ }
777
+ 50% {
778
+ transform: translateX(2.5px);
779
+ }
780
+ }
781
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-sidebar-panel,
782
+ .vv-icon[data-animate="true"] .vv-icon-sidebar-panel {
783
+ animation: vv-icon-sidebar-squeeze calc(0.9s * var(--vv-icon-duration-scale, 1)) ease-in-out infinite;
784
+ }
785
+ .group:hover .vv-icon[data-animate="hover"] .vv-icon-sidebar-chevron,
786
+ .vv-icon[data-animate="true"] .vv-icon-sidebar-chevron {
787
+ animation: vv-icon-sidebar-nudge calc(0.8s * var(--vv-icon-duration-scale, 1)) ease-in-out infinite;
788
+ }
789
+ .group:hover .vv-icon[data-animate="hover"].vv-icon-sidebar-collapsed .vv-icon-sidebar-chevron,
790
+ .vv-icon[data-animate="true"].vv-icon-sidebar-collapsed .vv-icon-sidebar-chevron {
791
+ animation: vv-icon-sidebar-nudge-out calc(0.8s * var(--vv-icon-duration-scale, 1)) ease-in-out infinite;
792
+ }